From ee2fa19a1e9f09d492c7c08340d95ba6a56ebb2b Mon Sep 17 00:00:00 2001 From: Brandy Carney Date: Tue, 22 Oct 2024 10:55:45 -0400 Subject: [PATCH 1/6] feat(menu): pass role to ionWillClose and ionDidClose events (#29954) - Adds the `MenuCloseEventDetail` interface which includes an optional `role` property - The `ionWillClose` and `ionDidClose` emit the `role` property for the following scenarios: - A role of `'gesture'` when dragging the menu closed - A role of `'backdrop'` when clicking on the backdrop to close the menu - A role of `'backdrop'` when the the menu is closed using the escape key - A role of `undefined` when the menu is closed from a button inside of the menu --- core/api.txt | 8 +- core/src/components.d.ts | 16 ++-- core/src/components/menu/menu-interface.ts | 8 +- core/src/components/menu/menu.tsx | 40 ++++---- .../src/components/menu/test/basic/index.html | 17 +++- .../components/menu/test/basic/menu.e2e.ts | 93 ++++++++++++++++++- .../components/modal/test/sheet/index.html | 7 ++ core/src/utils/menu-controller/index.ts | 4 +- packages/angular/src/directives/proxies.ts | 6 +- .../standalone/src/directives/proxies.ts | 6 +- 10 files changed, 163 insertions(+), 42 deletions(-) diff --git a/core/api.txt b/core/api.txt index bd0490e45f..de7c353197 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1000,15 +1000,15 @@ ion-menu,prop,menuId,string | undefined,undefined,false,true ion-menu,prop,side,"end" | "start",'start',false,true ion-menu,prop,swipeGesture,boolean,true,false,false ion-menu,prop,type,"overlay" | "push" | "reveal" | undefined,undefined,false,false -ion-menu,method,close,close(animated?: boolean) => Promise +ion-menu,method,close,close(animated?: boolean, role?: string) => Promise ion-menu,method,isActive,isActive() => Promise ion-menu,method,isOpen,isOpen() => Promise ion-menu,method,open,open(animated?: boolean) => Promise -ion-menu,method,setOpen,setOpen(shouldOpen: boolean, animated?: boolean) => Promise +ion-menu,method,setOpen,setOpen(shouldOpen: boolean, animated?: boolean, role?: string) => Promise ion-menu,method,toggle,toggle(animated?: boolean) => Promise -ion-menu,event,ionDidClose,void,true +ion-menu,event,ionDidClose,MenuCloseEventDetail,true ion-menu,event,ionDidOpen,void,true -ion-menu,event,ionWillClose,void,true +ion-menu,event,ionWillClose,MenuCloseEventDetail,true ion-menu,event,ionWillOpen,void,true ion-menu,css-prop,--background,ios ion-menu,css-prop,--background,md diff --git a/core/src/components.d.ts b/core/src/components.d.ts index db9530b340..f0cd3d081a 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -18,7 +18,7 @@ import { ScrollBaseDetail, ScrollDetail } from "./components/content/content-int import { DatetimeChangeEventDetail, DatetimeHighlight, DatetimeHighlightCallback, DatetimeHourCycle, DatetimePresentation, FormatOptions, TitleSelectedDatesFormatter } from "./components/datetime/datetime-interface"; import { SpinnerTypes } from "./components/spinner/spinner-configs"; import { InputChangeEventDetail, InputInputEventDetail } from "./components/input/input-interface"; -import { MenuChangeEventDetail, MenuType, Side } from "./components/menu/menu-interface"; +import { MenuChangeEventDetail, MenuCloseEventDetail, MenuType, Side } from "./components/menu/menu-interface"; import { ModalBreakpointChangeEventDetail, ModalHandleBehavior } from "./components/modal/modal-interface"; import { NavComponent, NavComponentWithProps, NavOptions, RouterOutletOptions, SwipeGestureHandler, TransitionDoneFn, TransitionInstruction } from "./components/nav/nav-interface"; import { ViewController } from "./components/nav/view-controller"; @@ -53,7 +53,7 @@ export { ScrollBaseDetail, ScrollDetail } from "./components/content/content-int export { DatetimeChangeEventDetail, DatetimeHighlight, DatetimeHighlightCallback, DatetimeHourCycle, DatetimePresentation, FormatOptions, TitleSelectedDatesFormatter } from "./components/datetime/datetime-interface"; export { SpinnerTypes } from "./components/spinner/spinner-configs"; export { InputChangeEventDetail, InputInputEventDetail } from "./components/input/input-interface"; -export { MenuChangeEventDetail, MenuType, Side } from "./components/menu/menu-interface"; +export { MenuChangeEventDetail, MenuCloseEventDetail, MenuType, Side } from "./components/menu/menu-interface"; export { ModalBreakpointChangeEventDetail, ModalHandleBehavior } from "./components/modal/modal-interface"; export { NavComponent, NavComponentWithProps, NavOptions, RouterOutletOptions, SwipeGestureHandler, TransitionDoneFn, TransitionInstruction } from "./components/nav/nav-interface"; export { ViewController } from "./components/nav/view-controller"; @@ -1596,7 +1596,7 @@ export namespace Components { /** * Closes the menu. If the menu is already closed or it can't be closed, it returns `false`. */ - "close": (animated?: boolean) => Promise; + "close": (animated?: boolean, role?: string) => Promise; /** * The `id` of the main content. When using a router this is typically `ion-router-outlet`. When not using a router, this is typically your main view's `ion-content`. This is not the id of the `ion-content` inside of your `ion-menu`. */ @@ -1628,7 +1628,7 @@ export namespace Components { /** * Opens or closes the button. If the operation can't be completed successfully, it returns `false`. */ - "setOpen": (shouldOpen: boolean, animated?: boolean) => Promise; + "setOpen": (shouldOpen: boolean, animated?: boolean, role?: string) => Promise; /** * Which side of the view the menu should be placed. */ @@ -3969,9 +3969,9 @@ declare global { }; interface HTMLIonMenuElementEventMap { "ionWillOpen": void; - "ionWillClose": void; + "ionWillClose": MenuCloseEventDetail; "ionDidOpen": void; - "ionDidClose": void; + "ionDidClose": MenuCloseEventDetail; "ionMenuChange": MenuChangeEventDetail; } interface HTMLIonMenuElement extends Components.IonMenu, HTMLStencilElement { @@ -6364,7 +6364,7 @@ declare namespace LocalJSX { /** * Emitted when the menu is closed. */ - "onIonDidClose"?: (event: IonMenuCustomEvent) => void; + "onIonDidClose"?: (event: IonMenuCustomEvent) => void; /** * Emitted when the menu is open. */ @@ -6376,7 +6376,7 @@ declare namespace LocalJSX { /** * Emitted when the menu is about to be closed. */ - "onIonWillClose"?: (event: IonMenuCustomEvent) => void; + "onIonWillClose"?: (event: IonMenuCustomEvent) => void; /** * Emitted when the menu is about to be opened. */ diff --git a/core/src/components/menu/menu-interface.ts b/core/src/components/menu/menu-interface.ts index f7aba9d830..44ef985f0c 100644 --- a/core/src/components/menu/menu-interface.ts +++ b/core/src/components/menu/menu-interface.ts @@ -22,7 +22,7 @@ export interface MenuI { close(animated?: boolean): Promise; toggle(animated?: boolean): Promise; setOpen(shouldOpen: boolean, animated?: boolean): Promise; - _setOpen(shouldOpen: boolean, animated?: boolean): Promise; + _setOpen(shouldOpen: boolean, animated?: boolean, role?: string): Promise; } export interface MenuControllerI { @@ -42,7 +42,7 @@ export interface MenuControllerI { _createAnimation(type: string, menuCmp: MenuI): Promise; _register(menu: MenuI): void; _unregister(menu: MenuI): void; - _setOpen(menu: MenuI, shouldOpen: boolean, animated: boolean): Promise; + _setOpen(menu: MenuI, shouldOpen: boolean, animated: boolean, role?: string): Promise; } export interface MenuChangeEventDetail { @@ -50,6 +50,10 @@ export interface MenuChangeEventDetail { open: boolean; } +export interface MenuCloseEventDetail { + role?: string; +} + export interface MenuCustomEvent extends CustomEvent { detail: T; target: HTMLIonMenuElement; diff --git a/core/src/components/menu/menu.tsx b/core/src/components/menu/menu.tsx index 622d1d3e89..d83e53abb3 100644 --- a/core/src/components/menu/menu.tsx +++ b/core/src/components/menu/menu.tsx @@ -7,14 +7,14 @@ import { shouldUseCloseWatcher } from '@utils/hardware-back-button'; import type { Attributes } from '@utils/helpers'; import { inheritAriaAttributes, assert, clamp, isEndSide as isEnd } from '@utils/helpers'; import { menuController } from '@utils/menu-controller'; -import { getPresentedOverlay } from '@utils/overlays'; +import { BACKDROP, GESTURE, getPresentedOverlay } from '@utils/overlays'; import { hostContext } from '@utils/theme'; import { config } from '../../global/config'; import { getIonMode } from '../../global/ionic-global'; import type { Animation, Gesture, GestureDetail } from '../../interface'; -import type { MenuChangeEventDetail, MenuI, MenuType, Side } from './menu-interface'; +import type { MenuChangeEventDetail, MenuCloseEventDetail, MenuI, MenuType, Side } from './menu-interface'; const iosEasing = 'cubic-bezier(0.32,0.72,0,1)'; const mdEasing = 'cubic-bezier(0.0,0.0,0.2,1)'; @@ -179,7 +179,7 @@ export class Menu implements ComponentInterface, MenuI { /** * Emitted when the menu is about to be closed. */ - @Event() ionWillClose!: EventEmitter; + @Event() ionWillClose!: EventEmitter; /** * Emitted when the menu is open. */ @@ -188,7 +188,7 @@ export class Menu implements ComponentInterface, MenuI { /** * Emitted when the menu is closed. */ - @Event() ionDidClose!: EventEmitter; + @Event() ionDidClose!: EventEmitter; /** * Emitted when the menu state is changed. @@ -331,14 +331,14 @@ export class Menu implements ComponentInterface, MenuI { if (shouldClose) { ev.preventDefault(); ev.stopPropagation(); - this.close(); + this.close(undefined, BACKDROP); } } } onKeydown(ev: KeyboardEvent) { if (ev.key === 'Escape') { - this.close(); + this.close(undefined, BACKDROP); } } @@ -375,8 +375,8 @@ export class Menu implements ComponentInterface, MenuI { * it returns `false`. */ @Method() - close(animated = true): Promise { - return this.setOpen(false, animated); + close(animated = true, role?: string): Promise { + return this.setOpen(false, animated, role); } /** @@ -393,8 +393,8 @@ export class Menu implements ComponentInterface, MenuI { * If the operation can't be completed successfully, it returns `false`. */ @Method() - setOpen(shouldOpen: boolean, animated = true): Promise { - return menuController._setOpen(this, shouldOpen, animated); + setOpen(shouldOpen: boolean, animated = true, role?: string): Promise { + return menuController._setOpen(this, shouldOpen, animated, role); } private trapKeyboardFocus(ev: Event, doc: Document) { @@ -438,13 +438,13 @@ export class Menu implements ComponentInterface, MenuI { } } - async _setOpen(shouldOpen: boolean, animated = true): Promise { + async _setOpen(shouldOpen: boolean, animated = true, role?: string): Promise { // If the menu is disabled or it is currently being animated, let's do nothing if (!this._isActive() || this.isAnimating || shouldOpen === this._isOpen) { return false; } - this.beforeAnimation(shouldOpen); + this.beforeAnimation(shouldOpen, role); await this.loadAnimation(); await this.startAnimation(shouldOpen, animated); @@ -459,7 +459,7 @@ export class Menu implements ComponentInterface, MenuI { return false; } - this.afterAnimation(shouldOpen); + this.afterAnimation(shouldOpen, role); return true; } @@ -542,7 +542,7 @@ export class Menu implements ComponentInterface, MenuI { } private onWillStart(): Promise { - this.beforeAnimation(!this._isOpen); + this.beforeAnimation(!this._isOpen, GESTURE); return this.loadAnimation(); } @@ -624,11 +624,11 @@ export class Menu implements ComponentInterface, MenuI { this.animation .easing('cubic-bezier(0.4, 0.0, 0.6, 1)') - .onFinish(() => this.afterAnimation(shouldOpen), { oneTimeCallback: true }) + .onFinish(() => this.afterAnimation(shouldOpen, GESTURE), { oneTimeCallback: true }) .progressEnd(playTo ? 1 : 0, this._isOpen ? 1 - newStepValue : newStepValue, 300); } - private beforeAnimation(shouldOpen: boolean) { + private beforeAnimation(shouldOpen: boolean, role?: string) { assert(!this.isAnimating, '_before() should not be called while animating'); // this places the menu into the correct location before it animates in @@ -671,11 +671,11 @@ export class Menu implements ComponentInterface, MenuI { if (shouldOpen) { this.ionWillOpen.emit(); } else { - this.ionWillClose.emit(); + this.ionWillClose.emit({ role }); } } - private afterAnimation(isOpen: boolean) { + private afterAnimation(isOpen: boolean, role?: string) { // keep opening/closing the menu disabled for a touch more yet // only add listeners/css if it's enabled and isOpen // and only remove listeners/css if it's not open @@ -731,7 +731,7 @@ export class Menu implements ComponentInterface, MenuI { } // emit close event - this.ionDidClose.emit(); + this.ionDidClose.emit({ role }); // undo focus trapping so multiple menus don't collide document.removeEventListener('focus', this.handleFocus, true); @@ -767,7 +767,7 @@ export class Menu implements ComponentInterface, MenuI { * If the menu is disabled then we should * forcibly close the menu even if it is open. */ - this.afterAnimation(false); + this.afterAnimation(false, GESTURE); } } diff --git a/core/src/components/menu/test/basic/index.html b/core/src/components/menu/test/basic/index.html index 34a90240ab..4e79a4fbb2 100644 --- a/core/src/components/menu/test/basic/index.html +++ b/core/src/components/menu/test/basic/index.html @@ -51,7 +51,9 @@ - Button + + Button + Menu Item Menu Item Menu Item @@ -125,6 +127,19 @@ + + + + + + + + + Select Modal - Basic + + + + + + + + + + + + + diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts b/core/src/components/select-modal/test/basic/select-modal.e2e.ts new file mode 100644 index 0000000000..126082712c --- /dev/null +++ b/core/src/components/select-modal/test/basic/select-modal.e2e.ts @@ -0,0 +1,101 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +import type { SelectModalOption } from '../../select-modal-interface'; +import { SelectModalPage } from '../fixtures'; + +const options: SelectModalOption[] = [ + { value: 'apple', text: 'Apple', disabled: false, checked: false }, + { value: 'banana', text: 'Banana', disabled: false, checked: false }, +]; + +const checkedOptions: SelectModalOption[] = [ + { value: 'apple', text: 'Apple', disabled: false, checked: true }, + { value: 'banana', text: 'Banana', disabled: false, checked: false }, +]; + +/** + * This behavior does not vary across modes/directions. + */ +configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('select-modal: basic'), () => { + test.beforeEach(({ browserName }) => { + test.skip(browserName === 'webkit', 'ROU-5437'); + }); + + test.describe('single selection', () => { + let selectModalPage: SelectModalPage; + + test.beforeEach(async ({ page }) => { + selectModalPage = new SelectModalPage(page); + }); + + test('clicking an unselected option should dismiss the modal', async () => { + await selectModalPage.setup(config, options, false); + + await selectModalPage.clickOption('apple'); + await selectModalPage.ionModalDidDismiss.next(); + await expect(selectModalPage.modal).not.toBeVisible(); + }); + + test('clicking a selected option should dismiss the modal', async () => { + await selectModalPage.setup(config, checkedOptions, false); + + await selectModalPage.clickOption('apple'); + await selectModalPage.ionModalDidDismiss.next(); + await expect(selectModalPage.modal).not.toBeVisible(); + }); + + test('pressing Space on an unselected option should dismiss the modal', async () => { + await selectModalPage.setup(config, options, false); + + await selectModalPage.pressSpaceOnOption('apple'); + await selectModalPage.ionModalDidDismiss.next(); + await expect(selectModalPage.modal).not.toBeVisible(); + }); + + test('pressing Space on a selected option should dismiss the modal', async ({ browserName }) => { + test.skip(browserName === 'firefox', 'Same behavior as ROU-5437'); + + await selectModalPage.setup(config, checkedOptions, false); + + await selectModalPage.pressSpaceOnOption('apple'); + await selectModalPage.ionModalDidDismiss.next(); + await expect(selectModalPage.modal).not.toBeVisible(); + }); + + test('clicking the close button should dismiss the modal', async () => { + await selectModalPage.setup(config, options, false); + + const closeButton = selectModalPage.modal.locator('ion-header ion-toolbar ion-button'); + await closeButton.click(); + await selectModalPage.ionModalDidDismiss.next(); + await expect(selectModalPage.modal).not.toBeVisible(); + }); + }); + }); +}); + +/** + * This behavior does not vary across directions. + * The components used inside of `ion-select-modal` + * do have RTL logic, but those are tested in their + * respective component test files. + */ +configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => { + test.describe(title('select-modal: rendering'), () => { + let selectModalPage: SelectModalPage; + + test.beforeEach(async ({ page }) => { + selectModalPage = new SelectModalPage(page); + }); + test('should not have visual regressions with single selection', async () => { + await selectModalPage.setup(config, checkedOptions, false); + await selectModalPage.screenshot(screenshot, 'select-modal-diff'); + }); + test('should not have visual regressions with multiple selection', async () => { + await selectModalPage.setup(config, checkedOptions, true); + await selectModalPage.screenshot(screenshot, 'select-modal-multiple-diff'); + }); + }); +}); diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..72f5453ea82e5a783286f860ae0d9ff4df6c4881 GIT binary patch literal 5626 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 Z_ueC-T+Uzcz+tX|zi;4i;?WB^{{@3BZ887= literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..b69898dc6dc76c73e4a0a63ae0bd8eb1160a5285 GIT binary patch literal 11684 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 C8L007 literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-ios-ltr-Mobile-Safari-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-ios-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..05425333c5f209db3974534a77fbd7d7a50521d3 GIT binary patch literal 5427 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 J{e15FKLB@PJcR%N literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-md-ltr-Mobile-Chrome-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..7613855bd6de08d7d922b803b4b7e8cfc0938c72 GIT binary patch literal 5474 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 CQ~3J; literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-md-ltr-Mobile-Safari-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-diff-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..c190809cd815f88fc045dca13e2a5cc686f8911a GIT binary patch literal 5090 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 literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..084a1cd1dc4ef79ed45e451fb39e29a4bb9b0d8f GIT binary patch literal 6759 zcmeI1Xm_&pylQ0O#5I}}R2oRZv0Kt%f%x8P<=i7Te-Vf%(UOU;pz1LdrdY=FLuAO@q zTpTsF>26a~Q`3N)`_)ZNZPPt9wau(=HUqzi2M@0S%_g*)qk|f`ckiN_n(ltcufKRi z=dO%nvpi<=K7Mi^79?!V`SIvq8c;0cc*|dz!{5&~kAFjO{orf7iLi%-`vDUZWxSnl z_*;Ncmc{PWFmdPHF{AzWGJg&@rup=bGfyAABHa7+-tI@IfB635=@3%Cps4Nzc@(@2 zMEWVp^R{v;xB%?znHQ_Y1550ACnI|oJrD@Q=I@-PqD<Ts(~7twy3GpVaZ5z(7}e)=fGdmToMZO{Z_vHydj}RV!jp^3kIxzH|7vA}{K3z^M}x?X9+)dsfgZ5y|(Rkup32}zhO`h zRt^O|wUto*Uuf>?Li z+WtkX3bB$h&&rQ;h?PDS!Bvy}4hwg&mKaJ`yl~nIc0{-GdXy03brmI_cMcmw6?DTC zG7%>E<;G&)9*wn(`03k^u^4wM@|O~Xs`L5jPY@a zA%w8*0s(KZ$EX+t^JedST`C#|feXlI60s?&a@lh6eX7qo4A}{$9^{M>z(V~}jy;QF z3HuzZQ!CH!ld#g*OF}p7z(o3kz0&)_u6Ko{H_b*G=|`9D43Y4DmN!F}^5Ob&aCgO- zV0VMMC;ax5p$EGO4MX{r*S2wdvK!am-)`*CB!@Yx@9nME8{qgo9A}5l>&vH+lrv=M=+#S}Z|a5GtRI(8UU>29oXe~82O-B^7*VfBF){;(Z;m~ttM1)a z$y9*_>{R?h1yx9eK(Fy7TEo8Rw)YL^x-9hfRx4$KmktC$Zn;@kq_H=?WLY-Uwa_grRvZGeKD8E;St<`83 z;2}L<@se_)`pt$Y2V@Djm>GX9^wSETS}Vasg^akLBRmg_UNTVD11lVn%PR%h+?4fQULM)YJ&mYT;u4`iNAS7cXN15^RxL&9zg zfH_-f!b&&`(WSGe35K0(`x8foMqNK(pY$I+;)ko@F9(@M%%`T_Eq0RP)?QbB`}aGE z(Z7B|ZvJWDziOUtg4qd&eC*V3d7szbrih(5(Nz91OY`q@#9My@5Bp!6tpdCb1G|3S z8?jHOXy%~$?C3THhMig8FJf$VWQBVTtDC*pXX&84MG$i1>lFG4Twai@w>7U;K1sju z$K#&Hn;)SS>RNj~@aV~!4S8vtVx*}=JRumcWY?t{LSjX(&KC+$Itme@yC9MTcVO3aV1vBXq~X|$iHQO$oR(*U%t{uWW{3` zCm0^uMHrfF8FDZ4AnYQTV)+KjM8!A-y}-hNFsr`hSI!!xF7lFN|ELL_6tdv>U6^kK z@RP{8S)~ZCXl*`&a>Lm@7JO*G4fkWZwu4#hmW1skE_tyWoLGnkHzG$X7sYgy!gXwa zKmK5KkXR{aoM)%b%xb&CpKI!iaf|R#AI&uUQe#;ecLK{p-ndb>-V5rU_;wBD(8>Bv zz5uU3Rnf+5_$7O*SCPHAc~nnXs_2(F3}hUVuTN*IP9ZPFpm87nR1dEm``l5fdr1g~ z)>v3rh!}ixt^2nJyDh?|-X`vgz216PV?Gz%+mmfMxEKMiqB&U;{i<$`)J1aJAMCM2 z&-FY$;Fw|K^91Zl`X8G^qM}$Q$M)4*Z<0Sl(=s82kF+^`JXtieA6aITc^d~CIU$*cp#h(A} zz+rE)T+)YE-ZqdwN%6tPt)dIMXTyos$T}WP#-zaUod+{}@<6Nu!;=i}aH9VWUgUVw z zT=P_XX#D`n)MVGT^BG6}czx*?KR-W$p|-a6`g|X}K5B(Y^64g8UZ^6l(_-6HKo%Gi zR!3GCvv$F?NKn#-1J0*7RPt1jXyCspoWzWUIR*qwSJM?MsQ7gvFb~_wJ3IZU5xU^` zI9@d(FOpf&XV2~+odrcLFDxu%f$_>0nT;w14@Q`wa=uEY68aM80oP-@^W%8yPyqUp z#reC%?wz+`Q3`(hP7!sUgPy+Z<=nRa0QYcL)-0d|CfN_WT05^?O9UT@KX&Eq-v`fU zjKy+E>FMchu+h=cSgoMo;KOEk=^N_xcaQc%2uFNtLc7uqHG;vjY3^NFmi-2R$gjB1 zX4v^PvY_-hBP=i-Gik@+)nU`2y8EWM5dYD-hIxfB-al{q4P-Nd*xR z5w_wnben4vv2-S&j&56G0wEY464=iQl7u6B;1hK6Nt@|8McxSOq>kq~f?*7=aPr{7 z>MBjPT907lq%TFD{xCEY@&2rikk)@FwKGoe%)qZYWV{$kw3l?kLdI&sn*aJ5H#Ryg z`HGi)U{QGrgJ{ER(}C}`zWF=B&_MoCy(3v4 z6vLlkGMRuS&HU;jTJC&n2e;=l_j$u{kyxy(1guzu#ZB!5YL?i=qV7y{mQnP2I-0^W z6=UK=t5we*8A1wS#?|oT530KGHTfRuEL8CBzV}g_xSqq9Uk9Y9YjwkeQ@xK_g=8;r zx$0W`;*JDvZzv33Eg^!RiCQpTMx{2iQP~aOG(P3`~#>Jq+sEF z%U7tv@KFz|fBhlNF4Slpu(RpXSB97P8(1fwQ*Go(?+1wfP8)OqA$zhcW|3cSKIPPx zAzL5J@sF`Q53JBthv{3hHbW_=np=stXiGfH7_bV4RBcoouuB!=8>&U^DVls||0jlu z8}9GFS7tP;tDeRRLc0$>x$0O5RddWctMQLzxNB!$hL2(+$3AZR6Zlxg=3i(2i=^d5 zD_Er-%kD`sr+om_{{H>@;o)>cNMvLr5{dNl8wZSk_Eg&C}C30)vM!WSM%e=fi2w{ir@fS22jZ6;tk8$>%2z^4O zMsjGlm6a9XD)1c;+VJqOBbMJ3R@P%pt*%CWc)g#~sFZ*RYQ_ik%EQYKnqFc^|J z+RK+quPS*0Qs*v#S&YG1=*6AWDMLT61y4Ke$6FU#$)L!i*0Evt8pmEcu^oIML zffa2Bdp?v0$TswRp-={JmgL$USaFSEd2;%JnY=oa3R{)ENQK$g78Ml%vneXNHuS=^NcpVM)7u+XV2_(m1D_RblZubjo(@r&lIuWi;wj^|1-xXS!HdZ`b z=1sXseMusbhW-Q&WnQFU|(*{z@C+VtLyZ{cT_c{ty} zB=S<&xv=OxA|8hx{b_1yAF!m>v4RC5mj%l`QC<`I{^?me4#1la&mpPSsEM)l&dQ*{ z2_YGy4e!gcm%H37CMpPh^PHK2HDXRqe)QD6DXv3dsBEPgFP}Cr zu(8kaG7!(@8hAl?^K_L9!Gf=->fc=4jkiOD;L5bKb!jpd5I zc&-n}M484MA8!P*oMoTw`a5j2rQ@a|lUk@yDEzDoU>$XJb=^um3>>w$CHU1xX(wjd zcRt_!46a!6Zfot-2SvqA>v0yAmU1i+E(F7e4<7>kCh3^luT&25C2}45Mw>z=rcY{e zdR$MJI?+V@w>x34Uc7h*DAeY$;4B)AHcBmh^=cXSLx~|^<5Xi z$x}Q9P-{^z-l3{U42HhevK>gP;gIU(#_VUeXouJRIf(q2V!%S?VrdnCmC?%5iV8G< zA)qrcKJbZoSKMzvHHecgmT=bg9AZ}?u}aB&Qs24k6Jbw{dp6-B1O=wvKkovN2uKeO zq@3hr&AyB+UHudUe=fXsZf*{!)F!{->;aMrpqg8o94DJ+n%Iu?QICi_^lL}sHa>%U z$NzvE&iLn@gAxGo00wJ$8pr|C+q`&o}(jHss5-f83>g3D1}Cd@<+M+G{M4pL{lGs*YLK%ozmgp;{q=9ulfk|K literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..73ad71200738eadf5ccfcf48e2e9a38d799502a8 GIT binary patch literal 12959 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 literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-md-ltr-Mobile-Chrome-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..8482f64dbaaf660dd11b1d3706aeac075f3a4162 GIT binary patch literal 5918 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 JejWM4zX9x_7%Kn( literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-md-ltr-Mobile-Firefox-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..29c3709ef58e7b6b2b5fb2b4d82aeeaddbc98ade GIT binary patch literal 11793 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 CHCdYg literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-md-ltr-Mobile-Safari-linux.png b/core/src/components/select-modal/test/basic/select-modal.e2e.ts-snapshots/select-modal-multiple-diff-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..b55b7bc77e5fb2f0112fc0fd89f3628f77342abe GIT binary patch literal 5564 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 literal 0 HcmV?d00001 diff --git a/core/src/components/select-modal/test/fixtures.ts b/core/src/components/select-modal/test/fixtures.ts new file mode 100644 index 0000000000..2058848aa8 --- /dev/null +++ b/core/src/components/select-modal/test/fixtures.ts @@ -0,0 +1,73 @@ +import { expect } from '@playwright/test'; +import type { E2EPage, E2ELocator, EventSpy, E2EPageOptions, ScreenshotFn } from '@utils/test/playwright'; + +import type { SelectModalOption } from '../select-modal-interface'; + +export class SelectModalPage { + private page: E2EPage; + private multiple?: boolean; + private options: SelectModalOption[] = []; + + // Locators + modal!: E2ELocator; + selectModal!: E2ELocator; + + // Event spies + ionModalDidDismiss!: EventSpy; + + constructor(page: E2EPage) { + this.page = page; + } + + async setup(config: E2EPageOptions, options: SelectModalOption[], multiple = false) { + const { page } = this; + + await page.setContent( + ` + + + + + `, + config + ); + + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + this.ionModalDidDismiss = await page.spyOnEvent('ionModalDidDismiss'); + + this.modal = page.locator('ion-modal'); + this.selectModal = page.locator('ion-select-modal'); + this.multiple = multiple; + this.options = options; + + await this.modal.evaluate((modal: HTMLIonModalElement) => modal.present()); + + await ionModalDidPresent.next(); + } + + async screenshot(screenshot: ScreenshotFn, name: string) { + await expect(this.selectModal).toHaveScreenshot(screenshot(name)); + } + + async clickOption(value: string) { + const option = this.getOption(value); + await option.click(); + } + + async pressSpaceOnOption(value: string) { + const option = this.getOption(value); + await option.press('Space'); + } + + private getOption(value: string) { + const { multiple, selectModal } = this; + const selector = multiple ? 'ion-checkbox' : 'ion-radio'; + const index = this.options.findIndex((o) => o.value === value); + + return selectModal.locator(selector).nth(index); + } +} diff --git a/core/src/components/select/select-interface.ts b/core/src/components/select/select-interface.ts index 4fa2a18828..8e65377a82 100644 --- a/core/src/components/select/select-interface.ts +++ b/core/src/components/select/select-interface.ts @@ -1,4 +1,4 @@ -export type SelectInterface = 'action-sheet' | 'popover' | 'alert'; +export type SelectInterface = 'action-sheet' | 'popover' | 'alert' | 'modal'; export type SelectCompareFn = (currentValue: any, compareValue: any) => boolean; diff --git a/core/src/components/select/select.tsx b/core/src/components/select/select.tsx index bdd8cc0b2e..3b4ef84f26 100644 --- a/core/src/components/select/select.tsx +++ b/core/src/components/select/select.tsx @@ -4,7 +4,7 @@ import type { NotchController } from '@utils/forms'; import { compareOptions, createNotchController, isOptionSelected } from '@utils/forms'; import { focusVisibleElement, renderHiddenInput, inheritAttributes } from '@utils/helpers'; import type { Attributes } from '@utils/helpers'; -import { actionSheetController, alertController, popoverController } from '@utils/overlays'; +import { actionSheetController, alertController, popoverController, modalController } from '@utils/overlays'; import type { OverlaySelect } from '@utils/overlays-interface'; import { isRTL } from '@utils/rtl'; import { createColorClasses, hostContext } from '@utils/theme'; @@ -19,6 +19,7 @@ import type { CssClassMap, PopoverOptions, StyleEventDetail, + ModalOptions, } from '../../interface'; import type { ActionSheetButton } from '../action-sheet/action-sheet-interface'; import type { AlertInput } from '../alert/alert-interface'; @@ -98,15 +99,15 @@ export class Select implements ComponentInterface { @Prop() fill?: 'outline' | 'solid'; /** - * The interface the select should use: `action-sheet`, `popover` or `alert`. + * The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`. */ @Prop() interface: SelectInterface = 'alert'; /** * Any additional options that the `alert`, `action-sheet` or `popover` interface * can take. See the [ion-alert docs](./alert), the - * [ion-action-sheet docs](./action-sheet) and the - * [ion-popover docs](./popover) for the + * [ion-action-sheet docs](./action-sheet), the + * [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the * create options for each interface. * * Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface. @@ -318,9 +319,9 @@ export class Select implements ComponentInterface { await overlay.present(); - // focus selected option for popovers - if (this.interface === 'popover') { - const indexOfSelected = this.childOpts.map((o) => o.value).indexOf(this.value); + // focus selected option for popovers and modals + if (this.interface === 'popover' || this.interface === 'modal') { + const indexOfSelected = this.childOpts.findIndex((o) => o.value === this.value); if (indexOfSelected > -1) { const selectedItem = overlay.querySelector( @@ -328,8 +329,6 @@ export class Select implements ComponentInterface { ); if (selectedItem) { - focusVisibleElement(selectedItem); - /** * Browsers such as Firefox do not * correctly delegate focus when manually @@ -341,10 +340,17 @@ export class Select implements ComponentInterface { * we only need to worry about those two components * when focusing. */ - const interactiveEl = selectedItem.querySelector('ion-radio, ion-checkbox'); + const interactiveEl = selectedItem.querySelector('ion-radio, ion-checkbox') as + | HTMLIonRadioElement + | HTMLIonCheckboxElement + | null; if (interactiveEl) { - interactiveEl.focus(); + // Needs to be called before `focusVisibleElement` to prevent issue with focus event bubbling + // and removing `ion-focused` style + interactiveEl.setFocus(); } + + focusVisibleElement(selectedItem); } } else { /** @@ -352,14 +358,18 @@ export class Select implements ComponentInterface { */ const firstEnabledOption = overlay.querySelector( 'ion-radio:not(.radio-disabled), ion-checkbox:not(.checkbox-disabled)' - ); - if (firstEnabledOption) { - focusVisibleElement(firstEnabledOption.closest('ion-item')!); + ) as HTMLIonRadioElement | HTMLIonCheckboxElement | null; + if (firstEnabledOption) { /** * Focus the option for the same reason as we do above. + * + * Needs to be called before `focusVisibleElement` to prevent issue with focus event bubbling + * and removing `ion-focused` style */ - firstEnabledOption.focus(); + firstEnabledOption.setFocus(); + + focusVisibleElement(firstEnabledOption.closest('ion-item')!); } } } @@ -389,6 +399,9 @@ export class Select implements ComponentInterface { if (selectInterface === 'popover') { return this.openPopover(ev!); } + if (selectInterface === 'modal') { + return this.openModal(); + } return this.openAlert(); } @@ -406,7 +419,13 @@ export class Select implements ComponentInterface { case 'popover': const popover = overlay.querySelector('ion-select-popover'); if (popover) { - popover.options = this.createPopoverOptions(childOpts, value); + popover.options = this.createOverlaySelectOptions(childOpts, value); + } + break; + case 'modal': + const modal = overlay.querySelector('ion-select-modal'); + if (modal) { + modal.options = this.createOverlaySelectOptions(childOpts, value); } break; case 'alert': @@ -475,7 +494,7 @@ export class Select implements ComponentInterface { return alertInputs; } - private createPopoverOptions(data: HTMLIonSelectOptionElement[], selectValue: any): SelectPopoverOption[] { + private createOverlaySelectOptions(data: HTMLIonSelectOptionElement[], selectValue: any): SelectPopoverOption[] { const popoverOptions = data.map((option) => { const value = getOptionValue(option); @@ -553,7 +572,7 @@ export class Select implements ComponentInterface { message: interfaceOptions.message, multiple, value, - options: this.createPopoverOptions(this.childOpts, value), + options: this.createOverlaySelectOptions(this.childOpts, value), }, }; @@ -647,6 +666,40 @@ export class Select implements ComponentInterface { return alertController.create(alertOpts); } + private openModal() { + const { multiple, value, interfaceOptions } = this; + const mode = getIonMode(this); + + const modalOpts: ModalOptions = { + ...interfaceOptions, + mode, + + cssClass: ['select-modal', interfaceOptions.cssClass], + component: 'ion-select-modal', + componentProps: { + header: interfaceOptions.header, + multiple, + value, + options: this.createOverlaySelectOptions(this.childOpts, value), + }, + }; + + /** + * Workaround for Stencil to autodefine + * ion-select-modal and ion-modal when + * using Custom Elements build. + */ + // eslint-disable-next-line + if (false) { + // eslint-disable-next-line + // @ts-ignore + document.createElement('ion-select-modal'); + document.createElement('ion-modal'); + } + + return modalController.create(modalOpts); + } + /** * Close the select interface. */ diff --git a/core/src/components/select/test/basic/index.html b/core/src/components/select/test/basic/index.html index 421dd4505f..c958d08f90 100644 --- a/core/src/components/select/test/basic/index.html +++ b/core/src/components/select/test/basic/index.html @@ -51,6 +51,14 @@ Pears + + + + Apples + Oranges + Pears + + @@ -76,6 +84,15 @@ Honey Badger + + + + Bird + Cat + Dog + Honey Badger + + @@ -124,6 +141,16 @@ Onions + + + + Pepperoni + Bacon + Extra Cheese + Mushrooms + Onions + + @@ -152,6 +179,14 @@ message: '$1.50 charge for every topping', }; customActionSheetSelect.interfaceOptions = customActionSheetOptions; + + var customModalSelect = document.getElementById('customModalSelect'); + var customModalSheetOptions = { + header: 'Pizza Toppings', + breakpoints: [0.5], + initialBreakpoint: 0.5, + }; + customModalSelect.interfaceOptions = customModalSheetOptions; diff --git a/core/src/components/select/test/basic/select.e2e.ts b/core/src/components/select/test/basic/select.e2e.ts index d44c8ca761..3574772849 100644 --- a/core/src/components/select/test/basic/select.e2e.ts +++ b/core/src/components/select/test/basic/select.e2e.ts @@ -58,6 +58,24 @@ configs({ directions: ['ltr'] }).forEach(({ title, config }) => { await expect(popover).toBeVisible(); }); }); + + test.describe('select: modal', () => { + test('it should open a modal select', async ({ page }) => { + const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + + await page.click('#customModalSelect'); + + await ionModalDidPresent.next(); + + const modal = page.locator('ion-modal'); + + // select has no value, so first option should be focused by default + const modalOption1 = modal.locator('.select-interface-option:first-of-type ion-radio'); + await expect(modalOption1).toBeFocused(); + + await expect(modal).toBeVisible(); + }); + }); }); }); diff --git a/core/src/utils/overlays-interface.ts b/core/src/utils/overlays-interface.ts index 4a37fca71a..63f70baac8 100644 --- a/core/src/utils/overlays-interface.ts +++ b/core/src/utils/overlays-interface.ts @@ -46,4 +46,8 @@ export interface HTMLIonOverlayElement extends HTMLStencilElement { present: () => Promise; } -export type OverlaySelect = HTMLIonActionSheetElement | HTMLIonAlertElement | HTMLIonPopoverElement; +export type OverlaySelect = + | HTMLIonActionSheetElement + | HTMLIonAlertElement + | HTMLIonPopoverElement + | HTMLIonModalElement; diff --git a/packages/angular/src/directives/proxies-list.ts b/packages/angular/src/directives/proxies-list.ts index 1874d0bfe2..93d0cc13ad 100644 --- a/packages/angular/src/directives/proxies-list.ts +++ b/packages/angular/src/directives/proxies-list.ts @@ -70,6 +70,7 @@ export const DIRECTIVES = [ d.IonSegment, d.IonSegmentButton, d.IonSelect, + d.IonSelectModal, d.IonSelectOption, d.IonSkeletonText, d.IonSpinner, diff --git a/packages/angular/src/directives/proxies.ts b/packages/angular/src/directives/proxies.ts index 89558cb46a..e384f56c53 100644 --- a/packages/angular/src/directives/proxies.ts +++ b/packages/angular/src/directives/proxies.ts @@ -2057,6 +2057,28 @@ This event will not emit when programmatically setting the `value` property. } +@ProxyCmp({ + inputs: ['header', 'multiple', 'options'] +}) +@Component({ + selector: 'ion-select-modal', + changeDetection: ChangeDetectionStrategy.OnPush, + template: '', + // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property + inputs: ['header', 'multiple', 'options'], +}) +export class IonSelectModal { + protected el: HTMLElement; + constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { + c.detach(); + this.el = r.nativeElement; + } +} + + +export declare interface IonSelectModal extends Components.IonSelectModal {} + + @ProxyCmp({ inputs: ['disabled', 'value'] }) diff --git a/packages/angular/standalone/src/directives/proxies.ts b/packages/angular/standalone/src/directives/proxies.ts index b0426e5696..5fac940a66 100644 --- a/packages/angular/standalone/src/directives/proxies.ts +++ b/packages/angular/standalone/src/directives/proxies.ts @@ -65,6 +65,7 @@ import { defineCustomElement as defineIonReorderGroup } from '@ionic/core/compon import { defineCustomElement as defineIonRippleEffect } from '@ionic/core/components/ion-ripple-effect.js'; import { defineCustomElement as defineIonRow } from '@ionic/core/components/ion-row.js'; import { defineCustomElement as defineIonSegmentButton } from '@ionic/core/components/ion-segment-button.js'; +import { defineCustomElement as defineIonSelectModal } from '@ionic/core/components/ion-select-modal.js'; import { defineCustomElement as defineIonSelectOption } from '@ionic/core/components/ion-select-option.js'; import { defineCustomElement as defineIonSkeletonText } from '@ionic/core/components/ion-skeleton-text.js'; import { defineCustomElement as defineIonSpinner } from '@ionic/core/components/ion-spinner.js'; @@ -1841,6 +1842,30 @@ export class IonSegmentButton { export declare interface IonSegmentButton extends Components.IonSegmentButton {} +@ProxyCmp({ + defineCustomElementFn: defineIonSelectModal, + inputs: ['header', 'multiple', 'options'] +}) +@Component({ + selector: 'ion-select-modal', + changeDetection: ChangeDetectionStrategy.OnPush, + template: '', + // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property + inputs: ['header', 'multiple', 'options'], + standalone: true +}) +export class IonSelectModal { + protected el: HTMLElement; + constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { + c.detach(); + this.el = r.nativeElement; + } +} + + +export declare interface IonSelectModal extends Components.IonSelectModal {} + + @ProxyCmp({ defineCustomElementFn: defineIonSelectOption, inputs: ['disabled', 'value'] diff --git a/packages/react/src/components/proxies.ts b/packages/react/src/components/proxies.ts index 05800f3877..14f81d30eb 100644 --- a/packages/react/src/components/proxies.ts +++ b/packages/react/src/components/proxies.ts @@ -62,6 +62,7 @@ import { defineCustomElement as defineIonSearchbar } from '@ionic/core/component import { defineCustomElement as defineIonSegment } from '@ionic/core/components/ion-segment.js'; import { defineCustomElement as defineIonSegmentButton } from '@ionic/core/components/ion-segment-button.js'; import { defineCustomElement as defineIonSelect } from '@ionic/core/components/ion-select.js'; +import { defineCustomElement as defineIonSelectModal } from '@ionic/core/components/ion-select-modal.js'; import { defineCustomElement as defineIonSelectOption } from '@ionic/core/components/ion-select-option.js'; import { defineCustomElement as defineIonSkeletonText } from '@ionic/core/components/ion-skeleton-text.js'; import { defineCustomElement as defineIonSpinner } from '@ionic/core/components/ion-spinner.js'; @@ -131,6 +132,7 @@ export const IonSearchbar = /*@__PURE__*/createReactComponent('ion-segment', undefined, undefined, defineIonSegment); export const IonSegmentButton = /*@__PURE__*/createReactComponent('ion-segment-button', undefined, undefined, defineIonSegmentButton); export const IonSelect = /*@__PURE__*/createReactComponent('ion-select', undefined, undefined, defineIonSelect); +export const IonSelectModal = /*@__PURE__*/createReactComponent('ion-select-modal', undefined, undefined, defineIonSelectModal); export const IonSelectOption = /*@__PURE__*/createReactComponent('ion-select-option', undefined, undefined, defineIonSelectOption); export const IonSkeletonText = /*@__PURE__*/createReactComponent('ion-skeleton-text', undefined, undefined, defineIonSkeletonText); export const IonSpinner = /*@__PURE__*/createReactComponent('ion-spinner', undefined, undefined, defineIonSpinner); diff --git a/packages/vue/src/proxies.ts b/packages/vue/src/proxies.ts index 347673a746..0d93a32c46 100644 --- a/packages/vue/src/proxies.ts +++ b/packages/vue/src/proxies.ts @@ -68,6 +68,7 @@ import { defineCustomElement as defineIonSearchbar } from '@ionic/core/component import { defineCustomElement as defineIonSegment } from '@ionic/core/components/ion-segment.js'; import { defineCustomElement as defineIonSegmentButton } from '@ionic/core/components/ion-segment-button.js'; import { defineCustomElement as defineIonSelect } from '@ionic/core/components/ion-select.js'; +import { defineCustomElement as defineIonSelectModal } from '@ionic/core/components/ion-select-modal.js'; import { defineCustomElement as defineIonSelectOption } from '@ionic/core/components/ion-select-option.js'; import { defineCustomElement as defineIonSkeletonText } from '@ionic/core/components/ion-skeleton-text.js'; import { defineCustomElement as defineIonSpinner } from '@ionic/core/components/ion-spinner.js'; @@ -782,6 +783,13 @@ export const IonSelect = /*@__PURE__*/ defineContainer('ion-select-modal', defineIonSelectModal, [ + 'header', + 'multiple', + 'options' +]); + + export const IonSelectOption = /*@__PURE__*/ defineContainer('ion-select-option', defineIonSelectOption, [ 'disabled', 'value' From 89508fb89172900b1d11cc3fc18883f57a7fbab6 Mon Sep 17 00:00:00 2001 From: Tanner Reits <47483144+tanner-reits@users.noreply.github.com> Date: Thu, 31 Oct 2024 12:20:02 -0400 Subject: [PATCH 4/6] feat(segment-view): adds support for new `ion-segment-view` component (#29969) Issue number: resolves internal --------- ## What is the current behavior? Segments can only be changed by clicking a segment button, or dragging the indicator ## What is the new behavior? The segment/segment buttons can now be linked to segment content within a segment view component. This content is scrollable/swipeable. Changing the content will update the segment/indicator and vice-versa. ## Does this introduce a breaking change? - [ ] Yes - [x] No ## Other information **Limitations:** - Segment buttons **cannot** be disabled when connected ton `ion-segment-content` instances - The `ion-segment` **cannot** be without a value when linked with an `ion-segment-view`. If no value is provided, the value will default to the value of the first `ion-segment-content` [Preview](https://ionic-framework-jlt8by2io-ionic1.vercel.app/src/components/segment-view/test/basic) [Preview (disabled state)](https://ionic-framework-jlt8by2io-ionic1.vercel.app/src/components/segment-view/test/disabled) --------- Co-authored-by: Brandy Carney --- core/api.txt | 7 + core/src/components.d.ts | 68 +++++++ .../segment-button/segment-button.tsx | 37 +++- .../segment-content/segment-content.scss | 11 ++ .../segment-content/segment-content.tsx | 17 ++ .../segment-view/segment-view-interface.ts | 4 + .../segment-view/segment-view.ios.scss | 9 + .../segment-view/segment-view.md.scss | 9 + .../components/segment-view/segment-view.scss | 31 ++++ .../components/segment-view/segment-view.tsx | 153 ++++++++++++++++ .../segment-view/test/basic/index.html | 164 +++++++++++++++++ .../test/basic/segment-view.e2e.ts | 173 ++++++++++++++++++ .../segment-view/test/disabled/index.html | 103 +++++++++++ .../test/disabled/segment-view.e2e.ts | 49 +++++ ...w-disabled-ios-ltr-Mobile-Chrome-linux.png | Bin 0 -> 16516 bytes ...-disabled-ios-ltr-Mobile-Firefox-linux.png | Bin 0 -> 23115 bytes ...w-disabled-ios-ltr-Mobile-Safari-linux.png | Bin 0 -> 16069 bytes ...ew-disabled-md-ltr-Mobile-Chrome-linux.png | Bin 0 -> 15634 bytes ...w-disabled-md-ltr-Mobile-Firefox-linux.png | Bin 0 -> 23920 bytes ...ew-disabled-md-ltr-Mobile-Safari-linux.png | Bin 0 -> 15953 bytes core/src/components/segment/segment.tsx | 150 +++++++++++++-- .../angular/src/directives/proxies-list.ts | 2 + packages/angular/src/directives/proxies.ts | 55 +++++- .../standalone/src/directives/proxies.ts | 61 +++++- packages/react/src/components/proxies.ts | 4 + packages/vue/src/proxies.ts | 12 ++ 26 files changed, 1096 insertions(+), 23 deletions(-) create mode 100644 core/src/components/segment-content/segment-content.scss create mode 100644 core/src/components/segment-content/segment-content.tsx create mode 100644 core/src/components/segment-view/segment-view-interface.ts create mode 100644 core/src/components/segment-view/segment-view.ios.scss create mode 100644 core/src/components/segment-view/segment-view.md.scss create mode 100644 core/src/components/segment-view/segment-view.scss create mode 100644 core/src/components/segment-view/segment-view.tsx create mode 100644 core/src/components/segment-view/test/basic/index.html create mode 100644 core/src/components/segment-view/test/basic/segment-view.e2e.ts create mode 100644 core/src/components/segment-view/test/disabled/index.html create mode 100644 core/src/components/segment-view/test/disabled/segment-view.e2e.ts create mode 100644 core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-ios-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-ios-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-ios-ltr-Mobile-Safari-linux.png create mode 100644 core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-md-ltr-Mobile-Chrome-linux.png create mode 100644 core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-md-ltr-Mobile-Firefox-linux.png create mode 100644 core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-md-ltr-Mobile-Safari-linux.png diff --git a/core/api.txt b/core/api.txt index 3aff52a1cf..67d4941755 100644 --- a/core/api.txt +++ b/core/api.txt @@ -1542,6 +1542,7 @@ ion-segment,css-prop,--background,ios ion-segment,css-prop,--background,md ion-segment-button,shadow +ion-segment-button,prop,contentId,string | undefined,undefined,false,true ion-segment-button,prop,disabled,boolean,false,false,false ion-segment-button,prop,layout,"icon-bottom" | "icon-end" | "icon-hide" | "icon-start" | "icon-top" | "label-hide" | undefined,'icon-top',false,false ion-segment-button,prop,mode,"ios" | "md",undefined,false,false @@ -1607,6 +1608,12 @@ ion-segment-button,part,indicator ion-segment-button,part,indicator-background ion-segment-button,part,native +ion-segment-content,shadow + +ion-segment-view,shadow +ion-segment-view,prop,disabled,boolean,false,false,false +ion-segment-view,event,ionSegmentViewScroll,SegmentViewScrollEvent,true + ion-select,shadow ion-select,prop,cancelText,string,'Cancel',false,false ion-select,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record | undefined,undefined,false,true diff --git a/core/src/components.d.ts b/core/src/components.d.ts index 48ceedfa8a..2e5163329d 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -34,6 +34,7 @@ import { NavigationHookCallback } from "./components/route/route-interface"; import { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface"; import { SegmentChangeEventDetail, SegmentValue } from "./components/segment/segment-interface"; import { SegmentButtonLayout } from "./components/segment-button/segment-button-interface"; +import { SegmentViewScrollEvent } from "./components/segment-view/segment-view-interface"; import { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface"; import { SelectModalOption } from "./components/select-modal/select-modal-interface"; import { SelectPopoverOption } from "./components/select-popover/select-popover-interface"; @@ -70,6 +71,7 @@ export { NavigationHookCallback } from "./components/route/route-interface"; export { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface"; export { SegmentChangeEventDetail, SegmentValue } from "./components/segment/segment-interface"; export { SegmentButtonLayout } from "./components/segment-button/segment-button-interface"; +export { SegmentViewScrollEvent } from "./components/segment-view/segment-view-interface"; export { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface"; export { SelectModalOption } from "./components/select-modal/select-modal-interface"; export { SelectPopoverOption } from "./components/select-popover/select-popover-interface"; @@ -2696,6 +2698,10 @@ export namespace Components { "value"?: SegmentValue; } interface IonSegmentButton { + /** + * The `id` of the segment content. + */ + "contentId"?: string; /** * If `true`, the user cannot interact with the segment button. */ @@ -2718,6 +2724,19 @@ export namespace Components { */ "value": SegmentValue; } + interface IonSegmentContent { + } + interface IonSegmentView { + /** + * If `true`, the segment view cannot be interacted with. + */ + "disabled": boolean; + /** + * @param id : The id of the segment content to display. + * @param smoothScroll : Whether to animate the scroll transition. + */ + "setContent": (id: string, smoothScroll?: boolean) => Promise; + } interface IonSelect { /** * The text to display on the cancel button. @@ -3424,6 +3443,10 @@ export interface IonSegmentCustomEvent extends CustomEvent { detail: T; target: HTMLIonSegmentElement; } +export interface IonSegmentViewCustomEvent extends CustomEvent { + detail: T; + target: HTMLIonSegmentViewElement; +} export interface IonSelectCustomEvent extends CustomEvent { detail: T; target: HTMLIonSelectElement; @@ -4420,6 +4443,29 @@ declare global { prototype: HTMLIonSegmentButtonElement; new (): HTMLIonSegmentButtonElement; }; + interface HTMLIonSegmentContentElement extends Components.IonSegmentContent, HTMLStencilElement { + } + var HTMLIonSegmentContentElement: { + prototype: HTMLIonSegmentContentElement; + new (): HTMLIonSegmentContentElement; + }; + interface HTMLIonSegmentViewElementEventMap { + "ionSegmentViewScroll": SegmentViewScrollEvent; + } + interface HTMLIonSegmentViewElement extends Components.IonSegmentView, HTMLStencilElement { + addEventListener(type: K, listener: (this: HTMLIonSegmentViewElement, ev: IonSegmentViewCustomEvent) => any, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; + removeEventListener(type: K, listener: (this: HTMLIonSegmentViewElement, ev: IonSegmentViewCustomEvent) => any, options?: boolean | EventListenerOptions): void; + removeEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void; + removeEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; + } + var HTMLIonSegmentViewElement: { + prototype: HTMLIonSegmentViewElement; + new (): HTMLIonSegmentViewElement; + }; interface HTMLIonSelectElementEventMap { "ionChange": SelectChangeEventDetail; "ionCancel": void; @@ -4735,6 +4781,8 @@ declare global { "ion-searchbar": HTMLIonSearchbarElement; "ion-segment": HTMLIonSegmentElement; "ion-segment-button": HTMLIonSegmentButtonElement; + "ion-segment-content": HTMLIonSegmentContentElement; + "ion-segment-view": HTMLIonSegmentViewElement; "ion-select": HTMLIonSelectElement; "ion-select-modal": HTMLIonSelectModalElement; "ion-select-option": HTMLIonSelectOptionElement; @@ -7465,6 +7513,10 @@ declare namespace LocalJSX { "value"?: SegmentValue; } interface IonSegmentButton { + /** + * The `id` of the segment content. + */ + "contentId"?: string; /** * If `true`, the user cannot interact with the segment button. */ @@ -7486,6 +7538,18 @@ declare namespace LocalJSX { */ "value"?: SegmentValue; } + interface IonSegmentContent { + } + interface IonSegmentView { + /** + * If `true`, the segment view cannot be interacted with. + */ + "disabled"?: boolean; + /** + * Emitted when the segment view is scrolled. + */ + "onIonSegmentViewScroll"?: (event: IonSegmentViewCustomEvent) => void; + } interface IonSelect { /** * The text to display on the cancel button. @@ -8182,6 +8246,8 @@ declare namespace LocalJSX { "ion-searchbar": IonSearchbar; "ion-segment": IonSegment; "ion-segment-button": IonSegmentButton; + "ion-segment-content": IonSegmentContent; + "ion-segment-view": IonSegmentView; "ion-select": IonSelect; "ion-select-modal": IonSelectModal; "ion-select-option": IonSelectOption; @@ -8282,6 +8348,8 @@ declare module "@stencil/core" { "ion-searchbar": LocalJSX.IonSearchbar & JSXBase.HTMLAttributes; "ion-segment": LocalJSX.IonSegment & JSXBase.HTMLAttributes; "ion-segment-button": LocalJSX.IonSegmentButton & JSXBase.HTMLAttributes; + "ion-segment-content": LocalJSX.IonSegmentContent & JSXBase.HTMLAttributes; + "ion-segment-view": LocalJSX.IonSegmentView & JSXBase.HTMLAttributes; "ion-select": LocalJSX.IonSelect & JSXBase.HTMLAttributes; "ion-select-modal": LocalJSX.IonSelectModal & JSXBase.HTMLAttributes; "ion-select-option": LocalJSX.IonSelectOption & JSXBase.HTMLAttributes; diff --git a/core/src/components/segment-button/segment-button.tsx b/core/src/components/segment-button/segment-button.tsx index 26954fb6cb..d860735f72 100644 --- a/core/src/components/segment-button/segment-button.tsx +++ b/core/src/components/segment-button/segment-button.tsx @@ -36,6 +36,11 @@ export class SegmentButton implements ComponentInterface, ButtonInterface { @State() checked = false; + /** + * The `id` of the segment content. + */ + @Prop({ reflect: true }) contentId?: string; + /** * If `true`, the user cannot interact with the segment button. */ @@ -67,6 +72,30 @@ export class SegmentButton implements ComponentInterface, ButtonInterface { addEventListener(segmentEl, 'ionSelect', this.updateState); addEventListener(segmentEl, 'ionStyle', this.updateStyle); } + + // Return if there is no contentId defined + if (!this.contentId) return; + + // Attempt to find the Segment Content by its contentId + const segmentContent = document.getElementById(this.contentId) as HTMLIonSegmentContentElement | null; + + // If no associated Segment Content exists, log an error and return + if (!segmentContent) { + console.error(`Segment Button: Unable to find Segment Content with id="${this.contentId}".`); + return; + } + + // Ensure the found element is a valid ION-SEGMENT-CONTENT + if (segmentContent.tagName !== 'ION-SEGMENT-CONTENT') { + console.error(`Segment Button: Element with id="${this.contentId}" is not an element.`); + return; + } + + // Prevent buttons from being disabled when associated with segment content + if (this.disabled) { + console.warn(`Segment Button: Segment buttons cannot be disabled when associated with an .`); + this.disabled = false; + } } disconnectedCallback() { @@ -161,13 +190,7 @@ export class SegmentButton implements ComponentInterface, ButtonInterface { {mode === 'md' && } -
+
diff --git a/core/src/components/segment-content/segment-content.scss b/core/src/components/segment-content/segment-content.scss new file mode 100644 index 0000000000..464402b41f --- /dev/null +++ b/core/src/components/segment-content/segment-content.scss @@ -0,0 +1,11 @@ +// Segment Content +// -------------------------------------------------- + +:host { + scroll-snap-align: center; + scroll-snap-stop: always; + + flex-shrink: 0; + + width: 100%; +} diff --git a/core/src/components/segment-content/segment-content.tsx b/core/src/components/segment-content/segment-content.tsx new file mode 100644 index 0000000000..2b5fefebff --- /dev/null +++ b/core/src/components/segment-content/segment-content.tsx @@ -0,0 +1,17 @@ +import type { ComponentInterface } from '@stencil/core'; +import { Component, Host, h } from '@stencil/core'; + +@Component({ + tag: 'ion-segment-content', + styleUrl: 'segment-content.scss', + shadow: true, +}) +export class SegmentContent implements ComponentInterface { + render() { + return ( + + + + ); + } +} diff --git a/core/src/components/segment-view/segment-view-interface.ts b/core/src/components/segment-view/segment-view-interface.ts new file mode 100644 index 0000000000..c6212152ed --- /dev/null +++ b/core/src/components/segment-view/segment-view-interface.ts @@ -0,0 +1,4 @@ +export interface SegmentViewScrollEvent { + scrollRatio: number; + isManualScroll: boolean; +} diff --git a/core/src/components/segment-view/segment-view.ios.scss b/core/src/components/segment-view/segment-view.ios.scss new file mode 100644 index 0000000000..a8c5130456 --- /dev/null +++ b/core/src/components/segment-view/segment-view.ios.scss @@ -0,0 +1,9 @@ +@import "./segment-view"; +@import "../segment-button/segment-button.ios.vars"; + +// iOS Segment View +// -------------------------------------------------- + +:host(.segment-view-disabled) { + opacity: $segment-button-ios-opacity-disabled; +} diff --git a/core/src/components/segment-view/segment-view.md.scss b/core/src/components/segment-view/segment-view.md.scss new file mode 100644 index 0000000000..4a141cf5c8 --- /dev/null +++ b/core/src/components/segment-view/segment-view.md.scss @@ -0,0 +1,9 @@ +@import "./segment-view"; +@import "../segment-button/segment-button.md.vars"; + +// Material Design Segment View +// -------------------------------------------------- + +:host(.segment-view-disabled) { + opacity: $segment-button-md-opacity-disabled; +} diff --git a/core/src/components/segment-view/segment-view.scss b/core/src/components/segment-view/segment-view.scss new file mode 100644 index 0000000000..a41030992f --- /dev/null +++ b/core/src/components/segment-view/segment-view.scss @@ -0,0 +1,31 @@ +// Segment View +// -------------------------------------------------- + +:host { + display: flex; + + height: 100%; + + overflow-x: scroll; + scroll-snap-type: x mandatory; + + /* Hide scrollbar in Firefox */ + scrollbar-width: none; + + /* Hide scrollbar in IE and Edge */ + -ms-overflow-style: none; +} + +/* Hide scrollbar in webkit */ +:host::-webkit-scrollbar { + display: none; +} + +:host(.segment-view-disabled) { + touch-action: none; + overflow-x: hidden; +} + +:host(.segment-view-scroll-disabled) { + pointer-events: none; +} diff --git a/core/src/components/segment-view/segment-view.tsx b/core/src/components/segment-view/segment-view.tsx new file mode 100644 index 0000000000..633d9a37d3 --- /dev/null +++ b/core/src/components/segment-view/segment-view.tsx @@ -0,0 +1,153 @@ +import type { ComponentInterface, EventEmitter } from '@stencil/core'; +import { Component, Element, Event, Host, Listen, Method, Prop, State, h } from '@stencil/core'; + +import type { SegmentViewScrollEvent } from './segment-view-interface'; + +@Component({ + tag: 'ion-segment-view', + styleUrls: { + ios: 'segment-view.ios.scss', + md: 'segment-view.md.scss', + }, + shadow: true, +}) +export class SegmentView implements ComponentInterface { + private scrollEndTimeout: ReturnType | null = null; + private isTouching = false; + + @Element() el!: HTMLElement; + + /** + * If `true`, the segment view cannot be interacted with. + */ + @Prop() disabled = false; + + /** + * @internal + * + * If `true`, the segment view is scrollable. + * If `false`, pointer events will be disabled. This is to prevent issues with + * quickly scrolling after interacting with a segment button. + */ + @State() isManualScroll?: boolean; + + /** + * Emitted when the segment view is scrolled. + */ + @Event() ionSegmentViewScroll!: EventEmitter; + + @Listen('scroll') + handleScroll(ev: Event) { + const { scrollLeft, scrollWidth, clientWidth } = ev.target as HTMLElement; + const scrollRatio = scrollLeft / (scrollWidth - clientWidth); + + this.ionSegmentViewScroll.emit({ + scrollRatio, + isManualScroll: this.isManualScroll ?? true, + }); + + // Reset the timeout to check for scroll end + this.resetScrollEndTimeout(); + } + + /** + * Handle touch start event to know when the user is actively dragging the segment view. + */ + @Listen('touchstart') + handleScrollStart() { + if (this.scrollEndTimeout) { + clearTimeout(this.scrollEndTimeout); + this.scrollEndTimeout = null; + } + + this.isTouching = true; + } + + /** + * Handle touch end event to know when the user is no longer dragging the segment view. + */ + @Listen('touchend') + handleTouchEnd() { + this.isTouching = false; + } + + /** + * Reset the scroll end detection timer. This is called on every scroll event. + */ + private resetScrollEndTimeout() { + if (this.scrollEndTimeout) { + clearTimeout(this.scrollEndTimeout); + this.scrollEndTimeout = null; + } + this.scrollEndTimeout = setTimeout( + () => { + this.checkForScrollEnd(); + }, + // Setting this to a lower value may result in inconsistencies in behavior + // across browsers (particularly Firefox). + // Ideally, all of this logic is removed once the scroll end event is + // supported on all browsers (https://caniuse.com/?search=scrollend) + 100 + ); + } + + /** + * Check if the scroll has ended and the user is not actively touching. + * If the conditions are met (active content is enabled and no active touch), + * reset the scroll position and emit the scroll end event. + */ + private checkForScrollEnd() { + // Only emit scroll end event if the active content is not disabled and + // the user is not touching the segment view + if (!this.isTouching) { + this.isManualScroll = undefined; + } + } + + /** + * @internal + * + * This method is used to programmatically set the displayed segment content + * in the segment view. Calling this method will update the `value` of the + * corresponding segment button. + * + * @param id: The id of the segment content to display. + * @param smoothScroll: Whether to animate the scroll transition. + */ + @Method() + async setContent(id: string, smoothScroll = true) { + const contents = this.getSegmentContents(); + const index = contents.findIndex((content) => content.id === id); + + if (index === -1) return; + + this.isManualScroll = false; + this.resetScrollEndTimeout(); + + const contentWidth = this.el.offsetWidth; + this.el.scrollTo({ + top: 0, + left: index * contentWidth, + behavior: smoothScroll ? 'smooth' : 'instant', + }); + } + + private getSegmentContents(): HTMLIonSegmentContentElement[] { + return Array.from(this.el.querySelectorAll('ion-segment-content')); + } + + render() { + const { disabled, isManualScroll } = this; + + return ( + + + + ); + } +} diff --git a/core/src/components/segment-view/test/basic/index.html b/core/src/components/segment-view/test/basic/index.html new file mode 100644 index 0000000000..69d36d4a6c --- /dev/null +++ b/core/src/components/segment-view/test/basic/index.html @@ -0,0 +1,164 @@ + + + + + Segment View - Basic + + + + + + + + + + + + + + + Segment View - Basic + + + + + + + No + + + Value + + + + No + Value + + + + + Paid + + + Free + + + Top + + + + + Free + Top + + + + + Orange + + + Banana + + + Pear + + + Peach + + + Grape + + + Mango + + + Apple + + + Strawberry + + + Cherry + + + + Orange + Banana + Pear + Peach + Grape + Mango + Apple + Strawberry + Cherry + + + + + + + + + + Footer + + + + + + + diff --git a/core/src/components/segment-view/test/basic/segment-view.e2e.ts b/core/src/components/segment-view/test/basic/segment-view.e2e.ts new file mode 100644 index 0000000000..447a60be30 --- /dev/null +++ b/core/src/components/segment-view/test/basic/segment-view.e2e.ts @@ -0,0 +1,173 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +/** + * This behavior does not vary across modes/directions + */ +configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('segment-view: basic'), () => { + test('should show the first content with no initial value', async ({ page }) => { + await page.setContent( + ` + + + Paid + + + Free + + + Top + + + + + Free + Top + + `, + config + ); + + const segmentContent = page.locator('ion-segment-content[id="paid"]'); + await expect(segmentContent).toBeInViewport(); + }); + + test('should show the content matching the initial value', async ({ page }) => { + await page.setContent( + ` + + + Paid + + + Free + + + Top + + + + + Free + Top + + `, + config + ); + + const segmentContent = page.locator('ion-segment-content[id="free"]'); + await expect(segmentContent).toBeInViewport(); + }); + + test('should update the content when changing the value by clicking a segment button', async ({ page }) => { + await page.setContent( + ` + + + Paid + + + Free + + + Top + + + + + Free + Top + + `, + config + ); + + await page.locator('ion-segment-button[value="top"]').click(); + + const segmentContent = page.locator('ion-segment-content[id="top"]'); + await expect(segmentContent).toBeInViewport(); + }); + }); + + test('should set correct segment button as checked when changing the value by scrolling the segment content', async ({ + page, + }) => { + await page.setContent( + ` + + + Paid + + + Free + + + Top + + + + + Free + Top + + `, + config + ); + + await page + .locator('ion-segment-view') + .evaluate( + (segmentView: HTMLIonSegmentViewElement) => !segmentView.classList.contains('segment-view-scroll-disabled') + ); + + await page.waitForChanges(); + + await page.locator('ion-segment-content[id="top"]').scrollIntoViewIfNeeded(); + + const segmentButton = page.locator('ion-segment-button[value="top"]'); + await expect(segmentButton).toHaveClass(/segment-button-checked/); + }); + + test('should set correct segment button as checked and show correct content when programmatically setting the segment vale', async ({ + page, + }) => { + await page.setContent( + ` + + + Paid + + + Free + + + Top + + + + + Free + Top + + `, + config + ); + + await page + .locator('ion-segment-view') + .evaluate( + (segmentView: HTMLIonSegmentViewElement) => !segmentView.classList.contains('segment-view-scroll-disabled') + ); + + await page.waitForChanges(); + + await page.locator('ion-segment').evaluate((segment: HTMLIonSegmentElement) => (segment.value = 'top')); + + const segmentButton = page.locator('ion-segment-button[value="top"]'); + await expect(segmentButton).toHaveClass(/segment-button-checked/); + + const segmentContent = page.locator('ion-segment-content[id="top"]'); + await expect(segmentContent).toBeInViewport(); + }); +}); diff --git a/core/src/components/segment-view/test/disabled/index.html b/core/src/components/segment-view/test/disabled/index.html new file mode 100644 index 0000000000..d19722de6d --- /dev/null +++ b/core/src/components/segment-view/test/disabled/index.html @@ -0,0 +1,103 @@ + + + + + Segment View - Disabled + + + + + + + + + + + + + + + Segment View - Disabled + + + + + + + All + + + Favorites + + + + All + Favorites + + + + + Paid + + + Free + + + Top + + + + + Free + Top + + + + + Bookmarks + + + Reading List + + + Shared Links + + + + Bookmarks + Reading List + Shared Links + + + + + diff --git a/core/src/components/segment-view/test/disabled/segment-view.e2e.ts b/core/src/components/segment-view/test/disabled/segment-view.e2e.ts new file mode 100644 index 0000000000..c7dead8943 --- /dev/null +++ b/core/src/components/segment-view/test/disabled/segment-view.e2e.ts @@ -0,0 +1,49 @@ +import { expect } from '@playwright/test'; +import { configs, test } from '@utils/test/playwright'; + +/** + * This behavior does not vary across directions + */ +configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => { + test.describe(title('segment-view: disabled'), () => { + test('should not have visual regressions', async ({ page }) => { + await page.goto('/src/components/segment-view/test/disabled', config); + + await expect(page).toHaveScreenshot(screenshot(`segment-view-disabled`)); + }); + }); +}); + +/** + * This behavior does not vary across modes/directions + */ +configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => { + test.describe(title('segment-view: disabled'), () => { + test('should keep button enabled even when disabled prop is set', async ({ page }) => { + await page.setContent( + ` + + + Paid + + + Free + + + Top + + + + + Free + Top + + `, + config + ); + + const segmentButton = page.locator('ion-segment-button[value="free"]'); + await expect(segmentButton).not.toHaveClass(/segment-button-disabled/); + }); + }); +}); diff --git a/core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..58fa6b0d0ab679e48ed22800a2ef8b91cf5a2767 GIT binary patch literal 16516 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

>+8L?RTvbid~qKFvg3R6Pl15Lx07 zelqkE-tw4B61^_=T=R8Ya#wHg43wM+0tvXs6SJ9M)A7OJtJi6yLi!&9WL6o77M>R zRl9)r5^X!|$NcrFwzso%n^4jVGvR>k=SB?VIUc#6>f{s2a}FYxJ*ywGqKBGk6HxAm z(n*=}?Mkx8obOnw_0dB+MUGaH>7KQb+X;=GDr|*OSAE#*9A;BfpMywGyNlzp(7rL- zVUu6%*&`H!`PuOQHJmXwBSgsS7qgZlpYcL&B{)h1{OZ~K=A2(*!G!*6pP2FKF)i{w zW7uMAY8_|xDom95qmJ3?puXX7B;D?2{CM@C>oaM^!MA0<7{XtTu7*Yd*QR-p3<75@9b+AoJ0uNP;e9NwI)WC1bR!Sm&^V2CExZhGXar@!2d4IfnWfBNnJZzO0L zLvLL&i{_B|4!Zif`

w*Ml|{{rU! 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⪒n1%koUpY) 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 literal 0 HcmV?d00001 diff --git a/core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-md-ltr-Mobile-Firefox-linux.png b/core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..1d84031d3e4e12c4b76450ff85da7b23c902c79a GIT binary patch literal 23920 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 So&h{box#)9&t;ucLK6VQ2g$Vn literal 0 HcmV?d00001 diff --git a/core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-md-ltr-Mobile-Safari-linux.png b/core/src/components/segment-view/test/disabled/segment-view.e2e.ts-snapshots/segment-view-disabled-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..697b8ebfe9ef2f8440a4f523efe386916d0cc145 GIT binary patch literal 15953 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 XDpGOmtxfPyHkRxwB`8wb!1uoa;1YN> literal 0 HcmV?d00001 diff --git a/core/src/components/segment/segment.tsx b/core/src/components/segment/segment.tsx index 3ddf864589..074c2586b8 100644 --- a/core/src/components/segment/segment.tsx +++ b/core/src/components/segment/segment.tsx @@ -7,6 +7,7 @@ import { createColorClasses, hostContext } from '@utils/theme'; import { getIonMode } from '../../global/ionic-global'; import type { Color, StyleEventDetail } from '../../interface'; +import type { SegmentViewScrollEvent } from '../segment-view/segment-view-interface'; import type { SegmentChangeEventDetail, SegmentValue } from './segment-interface'; @@ -27,6 +28,16 @@ export class Segment implements ComponentInterface { // Value before the segment is dragged private valueBeforeGesture?: SegmentValue; + private segmentViewEl?: HTMLIonSegmentViewElement | null = null; + private lastNextIndex?: number; + + /** + * Whether to update the segment view, if exists, when the value changes. + * This behavior is enabled by default, but is set false when scrolling content views + * since we don't want to "double scroll" the segment view. + */ + private triggerScrollOnValueChange?: boolean; + @Element() el!: HTMLIonSegmentElement; @State() activated = false; @@ -78,13 +89,41 @@ export class Segment implements ComponentInterface { @Prop({ mutable: true }) value?: SegmentValue; @Watch('value') - protected valueChanged(value: SegmentValue | undefined) { + protected valueChanged(value: SegmentValue | undefined, oldValue?: SegmentValue | undefined) { + // Force a value to exist if we're using a segment view + if (this.segmentViewEl && value === undefined) { + this.value = this.getButtons()[0].value; + return; + } + + if (oldValue !== undefined && value !== undefined) { + const buttons = this.getButtons(); + const previous = buttons.find((button) => button.value === oldValue); + const current = buttons.find((button) => button.value === value); + + if (previous && current) { + if (!this.segmentViewEl) { + this.checkButton(previous, current); + } else if (this.triggerScrollOnValueChange !== false) { + this.updateSegmentView(); + } + } + } else if (value !== undefined && oldValue === undefined && this.segmentViewEl) { + this.updateSegmentView(); + } + /** * `ionSelect` is emitted every time the value changes (internal or external changes). * Used by `ion-segment-button` to determine if the button should be checked. */ this.ionSelect.emit({ value }); - this.scrollActiveButtonIntoView(); + + // The scroll listener should handle scrolling the active button into view as needed + if (!this.segmentViewEl) { + this.scrollActiveButtonIntoView(); + } + + this.triggerScrollOnValueChange = undefined; } /** @@ -118,9 +157,13 @@ export class Segment implements ComponentInterface { disabledChanged() { this.gestureChanged(); - const buttons = this.getButtons(); - for (const button of buttons) { - button.disabled = this.disabled; + if (!this.segmentViewEl) { + const buttons = this.getButtons(); + for (const button of buttons) { + button.disabled = this.disabled; + } + } else { + this.segmentViewEl.disabled = this.disabled; } } @@ -132,6 +175,12 @@ export class Segment implements ComponentInterface { connectedCallback() { this.emitStyle(); + + this.segmentViewEl = this.getSegmentView(); + } + + disconnectedCallback() { + this.segmentViewEl = null; } componentWillLoad() { @@ -170,6 +219,10 @@ export class Segment implements ComponentInterface { if (this.disabled) { this.disabledChanged(); } + + // Update segment view based on the initial value, + // but do not animate the scroll + this.updateSegmentView(false); } onStart(detail: GestureDetail) { @@ -192,6 +245,7 @@ export class Segment implements ComponentInterface { if (value !== undefined) { if (this.valueBeforeGesture !== value) { this.emitValueChange(); + this.updateSegmentView(); } } this.valueBeforeGesture = undefined; @@ -208,7 +262,7 @@ export class Segment implements ComponentInterface { this.ionChange.emit({ value }); } - private getButtons() { + private getButtons(): HTMLIonSegmentButtonElement[] { return Array.from(this.el.querySelectorAll('ion-segment-button')); } @@ -224,11 +278,7 @@ export class Segment implements ComponentInterface { const buttons = this.getButtons(); buttons.forEach((button) => { - if (activated) { - button.classList.add('segment-button-activated'); - } else { - button.classList.remove('segment-button-activated'); - } + button.classList.toggle('segment-button-activated', activated); }); this.activated = activated; } @@ -293,6 +343,8 @@ export class Segment implements ComponentInterface { // Remove the transform to slide the indicator back to the button clicked currentIndicator.style.setProperty('transform', ''); + + this.scrollActiveButtonIntoView(true); }); this.value = current.value; @@ -312,6 +364,74 @@ export class Segment implements ComponentInterface { } } + private getSegmentView() { + const buttons = this.getButtons(); + // Get the first button with a contentId + const firstContentId = buttons.find((button: HTMLIonSegmentButtonElement) => button.contentId); + // Get the segment content with an id matching the button's contentId + const segmentContent = document.querySelector(`ion-segment-content[id="${firstContentId?.contentId}"]`); + // Return the segment view for that matching segment content + return segmentContent?.closest('ion-segment-view'); + } + + @Listen('ionSegmentViewScroll', { target: 'body' }) + handleSegmentViewScroll(ev: CustomEvent) { + const { scrollRatio, isManualScroll } = ev.detail; + + if (!isManualScroll) { + return; + } + + const dispatchedFrom = ev.target as HTMLElement; + const segmentViewEl = this.segmentViewEl as EventTarget; + const segmentEl = this.el; + + // Only update the indicator if the event was dispatched from the correct segment view + if (ev.composedPath().includes(segmentViewEl) || dispatchedFrom?.contains(segmentEl)) { + const buttons = this.getButtons(); + + // If no buttons are found or there is no value set then do nothing + if (!buttons.length) return; + + const index = buttons.findIndex((button) => button.value === this.value); + const current = buttons[index]; + + const nextIndex = Math.round(scrollRatio * (buttons.length - 1)); + + if (this.lastNextIndex === undefined || this.lastNextIndex !== nextIndex) { + this.lastNextIndex = nextIndex; + this.triggerScrollOnValueChange = false; + + this.checkButton(current, buttons[nextIndex]); + this.emitValueChange(); + } + } + } + + /** + * Finds the related segment view and sets its current content + * based on the selected segment button. This method + * should be called on initial load of the segment, + * after the gesture is completed (if dragging between segments) + * and when a segment button is clicked directly. + */ + private updateSegmentView(smoothScroll = true) { + const buttons = this.getButtons(); + const button = buttons.find((btn) => btn.value === this.value); + + // If the button does not have a contentId then there is + // no associated segment view to update + if (!button?.contentId) { + return; + } + + const segmentView = this.segmentViewEl; + + if (segmentView) { + segmentView.setContent(button.contentId, smoothScroll); + } + } + private scrollActiveButtonIntoView(smoothScroll = true) { const { scrollable, value, el } = this; @@ -492,7 +612,13 @@ export class Segment implements ComponentInterface { this.emitValueChange(); } - if (this.scrollable || !this.swipeGesture) { + if (this.segmentViewEl) { + this.updateSegmentView(); + + if (this.scrollable && previous) { + this.checkButton(previous, current); + } + } else if (this.scrollable || !this.swipeGesture) { if (previous) { this.checkButton(previous, current); } else { diff --git a/packages/angular/src/directives/proxies-list.ts b/packages/angular/src/directives/proxies-list.ts index 93d0cc13ad..b61d09669c 100644 --- a/packages/angular/src/directives/proxies-list.ts +++ b/packages/angular/src/directives/proxies-list.ts @@ -69,6 +69,8 @@ export const DIRECTIVES = [ d.IonSearchbar, d.IonSegment, d.IonSegmentButton, + d.IonSegmentContent, + d.IonSegmentView, d.IonSelect, d.IonSelectModal, d.IonSelectOption, diff --git a/packages/angular/src/directives/proxies.ts b/packages/angular/src/directives/proxies.ts index e384f56c53..675c37bd1c 100644 --- a/packages/angular/src/directives/proxies.ts +++ b/packages/angular/src/directives/proxies.ts @@ -1987,14 +1987,14 @@ This event will not emit when programmatically setting the `value` property. @ProxyCmp({ - inputs: ['disabled', 'layout', 'mode', 'type', 'value'] + inputs: ['contentId', 'disabled', 'layout', 'mode', 'type', 'value'] }) @Component({ selector: 'ion-segment-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['disabled', 'layout', 'mode', 'type', 'value'], + inputs: ['contentId', 'disabled', 'layout', 'mode', 'type', 'value'], }) export class IonSegmentButton { protected el: HTMLElement; @@ -2008,6 +2008,57 @@ export class IonSegmentButton { export declare interface IonSegmentButton extends Components.IonSegmentButton {} +@ProxyCmp({ +}) +@Component({ + selector: 'ion-segment-content', + changeDetection: ChangeDetectionStrategy.OnPush, + template: '', + // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property + inputs: [], +}) +export class IonSegmentContent { + protected el: HTMLElement; + constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { + c.detach(); + this.el = r.nativeElement; + } +} + + +export declare interface IonSegmentContent extends Components.IonSegmentContent {} + + +@ProxyCmp({ + inputs: ['disabled'] +}) +@Component({ + selector: 'ion-segment-view', + changeDetection: ChangeDetectionStrategy.OnPush, + template: '', + // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property + inputs: ['disabled'], +}) +export class IonSegmentView { + protected el: HTMLElement; + constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { + c.detach(); + this.el = r.nativeElement; + proxyOutputs(this, this.el, ['ionSegmentViewScroll']); + } +} + + +import type { SegmentViewScrollEvent as IIonSegmentViewSegmentViewScrollEvent } from '@ionic/core'; + +export declare interface IonSegmentView extends Components.IonSegmentView { + /** + * Emitted when the segment view is scrolled. + */ + ionSegmentViewScroll: EventEmitter>; +} + + @ProxyCmp({ inputs: ['cancelText', 'color', 'compareWith', 'disabled', 'expandedIcon', 'fill', 'interface', 'interfaceOptions', 'justify', 'label', 'labelPlacement', 'mode', 'multiple', 'name', 'okText', 'placeholder', 'selectedText', 'shape', 'toggleIcon', 'value'], methods: ['open'] diff --git a/packages/angular/standalone/src/directives/proxies.ts b/packages/angular/standalone/src/directives/proxies.ts index 5fac940a66..a30385ead5 100644 --- a/packages/angular/standalone/src/directives/proxies.ts +++ b/packages/angular/standalone/src/directives/proxies.ts @@ -65,6 +65,8 @@ import { defineCustomElement as defineIonReorderGroup } from '@ionic/core/compon import { defineCustomElement as defineIonRippleEffect } from '@ionic/core/components/ion-ripple-effect.js'; import { defineCustomElement as defineIonRow } from '@ionic/core/components/ion-row.js'; import { defineCustomElement as defineIonSegmentButton } from '@ionic/core/components/ion-segment-button.js'; +import { defineCustomElement as defineIonSegmentContent } from '@ionic/core/components/ion-segment-content.js'; +import { defineCustomElement as defineIonSegmentView } from '@ionic/core/components/ion-segment-view.js'; import { defineCustomElement as defineIonSelectModal } from '@ionic/core/components/ion-select-modal.js'; import { defineCustomElement as defineIonSelectOption } from '@ionic/core/components/ion-select-option.js'; import { defineCustomElement as defineIonSkeletonText } from '@ionic/core/components/ion-skeleton-text.js'; @@ -1820,14 +1822,14 @@ export declare interface IonRow extends Components.IonRow {} @ProxyCmp({ defineCustomElementFn: defineIonSegmentButton, - inputs: ['disabled', 'layout', 'mode', 'type', 'value'] + inputs: ['contentId', 'disabled', 'layout', 'mode', 'type', 'value'] }) @Component({ selector: 'ion-segment-button', changeDetection: ChangeDetectionStrategy.OnPush, template: '', // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['disabled', 'layout', 'mode', 'type', 'value'], + inputs: ['contentId', 'disabled', 'layout', 'mode', 'type', 'value'], standalone: true }) export class IonSegmentButton { @@ -1842,6 +1844,61 @@ export class IonSegmentButton { export declare interface IonSegmentButton extends Components.IonSegmentButton {} +@ProxyCmp({ + defineCustomElementFn: defineIonSegmentContent +}) +@Component({ + selector: 'ion-segment-content', + changeDetection: ChangeDetectionStrategy.OnPush, + template: '', + // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property + inputs: [], + standalone: true +}) +export class IonSegmentContent { + protected el: HTMLElement; + constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { + c.detach(); + this.el = r.nativeElement; + } +} + + +export declare interface IonSegmentContent extends Components.IonSegmentContent {} + + +@ProxyCmp({ + defineCustomElementFn: defineIonSegmentView, + inputs: ['disabled'] +}) +@Component({ + selector: 'ion-segment-view', + changeDetection: ChangeDetectionStrategy.OnPush, + template: '', + // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property + inputs: ['disabled'], + standalone: true +}) +export class IonSegmentView { + protected el: HTMLElement; + constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) { + c.detach(); + this.el = r.nativeElement; + proxyOutputs(this, this.el, ['ionSegmentViewScroll']); + } +} + + +import type { SegmentViewScrollEvent as IIonSegmentViewSegmentViewScrollEvent } from '@ionic/core/components'; + +export declare interface IonSegmentView extends Components.IonSegmentView { + /** + * Emitted when the segment view is scrolled. + */ + ionSegmentViewScroll: EventEmitter>; +} + + @ProxyCmp({ defineCustomElementFn: defineIonSelectModal, inputs: ['header', 'multiple', 'options'] diff --git a/packages/react/src/components/proxies.ts b/packages/react/src/components/proxies.ts index 14f81d30eb..a9f1416ee2 100644 --- a/packages/react/src/components/proxies.ts +++ b/packages/react/src/components/proxies.ts @@ -61,6 +61,8 @@ import { defineCustomElement as defineIonRow } from '@ionic/core/components/ion- import { defineCustomElement as defineIonSearchbar } from '@ionic/core/components/ion-searchbar.js'; import { defineCustomElement as defineIonSegment } from '@ionic/core/components/ion-segment.js'; import { defineCustomElement as defineIonSegmentButton } from '@ionic/core/components/ion-segment-button.js'; +import { defineCustomElement as defineIonSegmentContent } from '@ionic/core/components/ion-segment-content.js'; +import { defineCustomElement as defineIonSegmentView } from '@ionic/core/components/ion-segment-view.js'; import { defineCustomElement as defineIonSelect } from '@ionic/core/components/ion-select.js'; import { defineCustomElement as defineIonSelectModal } from '@ionic/core/components/ion-select-modal.js'; import { defineCustomElement as defineIonSelectOption } from '@ionic/core/components/ion-select-option.js'; @@ -131,6 +133,8 @@ export const IonRow = /*@__PURE__*/createReactComponent('ion-searchbar', undefined, undefined, defineIonSearchbar); export const IonSegment = /*@__PURE__*/createReactComponent('ion-segment', undefined, undefined, defineIonSegment); export const IonSegmentButton = /*@__PURE__*/createReactComponent('ion-segment-button', undefined, undefined, defineIonSegmentButton); +export const IonSegmentContent = /*@__PURE__*/createReactComponent('ion-segment-content', undefined, undefined, defineIonSegmentContent); +export const IonSegmentView = /*@__PURE__*/createReactComponent('ion-segment-view', undefined, undefined, defineIonSegmentView); export const IonSelect = /*@__PURE__*/createReactComponent('ion-select', undefined, undefined, defineIonSelect); export const IonSelectModal = /*@__PURE__*/createReactComponent('ion-select-modal', undefined, undefined, defineIonSelectModal); export const IonSelectOption = /*@__PURE__*/createReactComponent('ion-select-option', undefined, undefined, defineIonSelectOption); diff --git a/packages/vue/src/proxies.ts b/packages/vue/src/proxies.ts index 0d93a32c46..7dd5812ebb 100644 --- a/packages/vue/src/proxies.ts +++ b/packages/vue/src/proxies.ts @@ -67,6 +67,8 @@ import { defineCustomElement as defineIonRow } from '@ionic/core/components/ion- import { defineCustomElement as defineIonSearchbar } from '@ionic/core/components/ion-searchbar.js'; import { defineCustomElement as defineIonSegment } from '@ionic/core/components/ion-segment.js'; import { defineCustomElement as defineIonSegmentButton } from '@ionic/core/components/ion-segment-button.js'; +import { defineCustomElement as defineIonSegmentContent } from '@ionic/core/components/ion-segment-content.js'; +import { defineCustomElement as defineIonSegmentView } from '@ionic/core/components/ion-segment-view.js'; import { defineCustomElement as defineIonSelect } from '@ionic/core/components/ion-select.js'; import { defineCustomElement as defineIonSelectModal } from '@ionic/core/components/ion-select-modal.js'; import { defineCustomElement as defineIonSelectOption } from '@ionic/core/components/ion-select-option.js'; @@ -745,6 +747,7 @@ export const IonSegment = /*@__PURE__*/ defineContainer('ion-segment-button', defineIonSegmentButton, [ + 'contentId', 'disabled', 'layout', 'type', @@ -753,6 +756,15 @@ export const IonSegmentButton = /*@__PURE__*/ defineContainer('ion-segment-content', defineIonSegmentContent); + + +export const IonSegmentView = /*@__PURE__*/ defineContainer('ion-segment-view', defineIonSegmentView, [ + 'disabled', + 'ionSegmentViewScroll' +]); + + export const IonSelect = /*@__PURE__*/ defineContainer('ion-select', defineIonSelect, [ 'cancelText', 'color', From fcc728faf259d07357bf99c19fe39e0c2ad88504 Mon Sep 17 00:00:00 2001 From: ionitron Date: Mon, 4 Nov 2024 21:29:16 +0000 Subject: [PATCH 5/6] v8.4.0 --- CHANGELOG.md | 18 ++++++++++++++++++ core/CHANGELOG.md | 18 ++++++++++++++++++ core/package-lock.json | 6 +++--- core/package.json | 2 +- lerna.json | 2 +- packages/angular-server/CHANGELOG.md | 8 ++++++++ packages/angular-server/package-lock.json | 8 ++++---- packages/angular-server/package.json | 4 ++-- packages/angular/CHANGELOG.md | 13 +++++++++++++ packages/angular/package-lock.json | 8 ++++---- packages/angular/package.json | 4 ++-- packages/docs/CHANGELOG.md | 8 ++++++++ packages/docs/package-lock.json | 6 +++--- packages/docs/package.json | 2 +- packages/react-router/CHANGELOG.md | 8 ++++++++ packages/react-router/package-lock.json | 8 ++++---- packages/react-router/package.json | 4 ++-- packages/react/CHANGELOG.md | 12 ++++++++++++ packages/react/package-lock.json | 8 ++++---- packages/react/package.json | 4 ++-- packages/vue-router/CHANGELOG.md | 8 ++++++++ packages/vue-router/package-lock.json | 8 ++++---- packages/vue-router/package.json | 4 ++-- packages/vue/CHANGELOG.md | 12 ++++++++++++ packages/vue/package-lock.json | 8 ++++---- packages/vue/package.json | 4 ++-- 26 files changed, 150 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6e49112c0..fe2edcce96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + + +### Bug Fixes + +* **alert:** use correct heading structure for subHeader when header exists ([#29964](https://github.com/ionic-team/ionic-framework/issues/29964)) ([0fdcb32](https://github.com/ionic-team/ionic-framework/commit/0fdcb32ce0f99b284b314f79f7d0b071bc37faec)) + + +### Features + +* **menu:** pass role to ionWillClose and ionDidClose events ([#29954](https://github.com/ionic-team/ionic-framework/issues/29954)) ([ee2fa19](https://github.com/ionic-team/ionic-framework/commit/ee2fa19a1e9f09d492c7c08340d95ba6a56ebb2b)) +* **segment-view:** adds support for new `ion-segment-view` component ([#29969](https://github.com/ionic-team/ionic-framework/issues/29969)) ([89508fb](https://github.com/ionic-team/ionic-framework/commit/89508fb89172900b1d11cc3fc18883f57a7fbab6)) +* **select:** add `modal` as interface ([#29972](https://github.com/ionic-team/ionic-framework/issues/29972)) ([3628ea8](https://github.com/ionic-team/ionic-framework/commit/3628ea875a66a717783de5e0a4df440872339040)) + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 9f8cea162c..07089bd960 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + + +### Bug Fixes + +* **alert:** use correct heading structure for subHeader when header exists ([#29964](https://github.com/ionic-team/ionic-framework/issues/29964)) ([0fdcb32](https://github.com/ionic-team/ionic-framework/commit/0fdcb32ce0f99b284b314f79f7d0b071bc37faec)) + + +### Features + +* **menu:** pass role to ionWillClose and ionDidClose events ([#29954](https://github.com/ionic-team/ionic-framework/issues/29954)) ([ee2fa19](https://github.com/ionic-team/ionic-framework/commit/ee2fa19a1e9f09d492c7c08340d95ba6a56ebb2b)) +* **segment-view:** adds support for new `ion-segment-view` component ([#29969](https://github.com/ionic-team/ionic-framework/issues/29969)) ([89508fb](https://github.com/ionic-team/ionic-framework/commit/89508fb89172900b1d11cc3fc18883f57a7fbab6)) +* **select:** add `modal` as interface ([#29972](https://github.com/ionic-team/ionic-framework/issues/29972)) ([3628ea8](https://github.com/ionic-team/ionic-framework/commit/3628ea875a66a717783de5e0a4df440872339040)) + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) diff --git a/core/package-lock.json b/core/package-lock.json index 3a4608f31e..4bf85b0b5f 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT", "dependencies": { "@stencil/core": "4.20.0", @@ -17767,4 +17767,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/core/package.json b/core/package.json index cc99b374d6..2d92d1411e 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "8.3.4", + "version": "8.4.0", "description": "Base components for Ionic", "keywords": [ "ionic", diff --git a/lerna.json b/lerna.json index 6b73eec8d4..9573d91b5e 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "core", "packages/*" ], - "version": "8.3.4" + "version": "8.4.0" } \ No newline at end of file diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index 8e18462ddf..f76d843625 100644 --- a/packages/angular-server/CHANGELOG.md +++ b/packages/angular-server/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + +**Note:** Version bump only for package @ionic/angular-server + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) **Note:** Version bump only for package @ionic/angular-server diff --git a/packages/angular-server/package-lock.json b/packages/angular-server/package-lock.json index 3a9a06112a..e2342e534f 100644 --- a/packages/angular-server/package-lock.json +++ b/packages/angular-server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular-server", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT", "dependencies": { - "@ionic/core": "^8.3.4" + "@ionic/core": "^8.4.0" }, "devDependencies": { "@angular-eslint/eslint-plugin": "^16.0.0", @@ -11110,4 +11110,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json index ceb075f4a7..2ab94afe04 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "8.3.4", + "version": "8.4.0", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -62,6 +62,6 @@ }, "prettier": "@ionic/prettier-config", "dependencies": { - "@ionic/core": "^8.3.4" + "@ionic/core": "^8.4.0" } } diff --git a/packages/angular/CHANGELOG.md b/packages/angular/CHANGELOG.md index 5899927ba3..623f30b8ae 100644 --- a/packages/angular/CHANGELOG.md +++ b/packages/angular/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + + +### Features + +* **menu:** pass role to ionWillClose and ionDidClose events ([#29954](https://github.com/ionic-team/ionic-framework/issues/29954)) ([ee2fa19](https://github.com/ionic-team/ionic-framework/commit/ee2fa19a1e9f09d492c7c08340d95ba6a56ebb2b)) +* **segment-view:** adds support for new `ion-segment-view` component ([#29969](https://github.com/ionic-team/ionic-framework/issues/29969)) ([89508fb](https://github.com/ionic-team/ionic-framework/commit/89508fb89172900b1d11cc3fc18883f57a7fbab6)) +* **select:** add `modal` as interface ([#29972](https://github.com/ionic-team/ionic-framework/issues/29972)) ([3628ea8](https://github.com/ionic-team/ionic-framework/commit/3628ea875a66a717783de5e0a4df440872339040)) + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index aaf40af261..45b1ae34d2 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT", "dependencies": { - "@ionic/core": "^8.3.4", + "@ionic/core": "^8.4.0", "ionicons": "^7.0.0", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -15020,4 +15020,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/angular/package.json b/packages/angular/package.json index cf3edb1374..e717fcb1fd 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "8.3.4", + "version": "8.4.0", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -47,7 +47,7 @@ } }, "dependencies": { - "@ionic/core": "^8.3.4", + "@ionic/core": "^8.4.0", "ionicons": "^7.0.0", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" diff --git a/packages/docs/CHANGELOG.md b/packages/docs/CHANGELOG.md index 01d59dbdfa..b4fa7afd0f 100644 --- a/packages/docs/CHANGELOG.md +++ b/packages/docs/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + +**Note:** Version bump only for package @ionic/docs + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) **Note:** Version bump only for package @ionic/docs diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index b2ec110251..ed84cbe16c 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -1,13 +1,13 @@ { "name": "@ionic/docs", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT" } } -} +} \ No newline at end of file diff --git a/packages/docs/package.json b/packages/docs/package.json index 9402ac8627..ecfb015d6e 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "8.3.4", + "version": "8.4.0", "description": "Pre-packaged API documentation for the Ionic docs.", "main": "core.json", "types": "core.d.ts", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index 182220662a..d4fbfb89f7 100644 --- a/packages/react-router/CHANGELOG.md +++ b/packages/react-router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + +**Note:** Version bump only for package @ionic/react-router + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) **Note:** Version bump only for package @ionic/react-router diff --git a/packages/react-router/package-lock.json b/packages/react-router/package-lock.json index 597890f036..8b62f45f7a 100644 --- a/packages/react-router/package-lock.json +++ b/packages/react-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react-router", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT", "dependencies": { - "@ionic/react": "^8.3.4", + "@ionic/react": "^8.4.0", "tslib": "*" }, "devDependencies": { @@ -6666,4 +6666,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 79225e3bfb..cfcd1a4e45 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "8.3.4", + "version": "8.4.0", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -36,7 +36,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^8.3.4", + "@ionic/react": "^8.4.0", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index f9f691caab..bcb4d07e5c 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + + +### Features + +* **segment-view:** adds support for new `ion-segment-view` component ([#29969](https://github.com/ionic-team/ionic-framework/issues/29969)) ([89508fb](https://github.com/ionic-team/ionic-framework/commit/89508fb89172900b1d11cc3fc18883f57a7fbab6)) +* **select:** add `modal` as interface ([#29972](https://github.com/ionic-team/ionic-framework/issues/29972)) ([3628ea8](https://github.com/ionic-team/ionic-framework/commit/3628ea875a66a717783de5e0a4df440872339040)) + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 232c3805ca..84d27ab941 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT", "dependencies": { - "@ionic/core": "^8.3.4", + "@ionic/core": "^8.4.0", "ionicons": "^7.0.0", "tslib": "*" }, @@ -20498,4 +20498,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/react/package.json b/packages/react/package.json index 59b96e911f..42b40b1483 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "8.3.4", + "version": "8.4.0", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -39,7 +39,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^8.3.4", + "@ionic/core": "^8.4.0", "ionicons": "^7.0.0", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index b8e456b3ce..a761ceda1e 100644 --- a/packages/vue-router/CHANGELOG.md +++ b/packages/vue-router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + +**Note:** Version bump only for package @ionic/vue-router + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index 6e3138dc0d..1cefd98eba 100644 --- a/packages/vue-router/package-lock.json +++ b/packages/vue-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue-router", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT", "dependencies": { - "@ionic/vue": "^8.3.4" + "@ionic/vue": "^8.4.0" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", @@ -12798,4 +12798,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index f6a6991066..7cb544beab 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "8.3.4", + "version": "8.4.0", "description": "Vue Router integration for @ionic/vue", "scripts": { "test.spec": "jest", @@ -44,7 +44,7 @@ }, "homepage": "https://github.com/ionic-team/ionic-framework#readme", "dependencies": { - "@ionic/vue": "^8.3.4" + "@ionic/vue": "^8.4.0" }, "devDependencies": { "@ionic/eslint-config": "^0.3.0", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 59e84626d9..f7db26db10 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/ionic-framework/compare/v8.3.4...v8.4.0) (2024-11-04) + + +### Features + +* **segment-view:** adds support for new `ion-segment-view` component ([#29969](https://github.com/ionic-team/ionic-framework/issues/29969)) ([89508fb](https://github.com/ionic-team/ionic-framework/commit/89508fb89172900b1d11cc3fc18883f57a7fbab6)) +* **select:** add `modal` as interface ([#29972](https://github.com/ionic-team/ionic-framework/issues/29972)) ([3628ea8](https://github.com/ionic-team/ionic-framework/commit/3628ea875a66a717783de5e0a4df440872339040)) + + + + + ## [8.3.4](https://github.com/ionic-team/ionic-framework/compare/v8.3.3...v8.3.4) (2024-10-30) **Note:** Version bump only for package @ionic/vue diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 2adae2a2ac..0bea689ba8 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "8.3.4", + "version": "8.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "8.3.4", + "version": "8.4.0", "license": "MIT", "dependencies": { - "@ionic/core": "^8.3.4", + "@ionic/core": "^8.4.0", "ionicons": "^7.0.0" }, "devDependencies": { @@ -6562,4 +6562,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/packages/vue/package.json b/packages/vue/package.json index 86f48a1a0a..e3920d69df 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "8.3.4", + "version": "8.4.0", "description": "Vue specific wrapper for @ionic/core", "scripts": { "eslint": "eslint src", @@ -66,7 +66,7 @@ "vue-router": "^4.0.16" }, "dependencies": { - "@ionic/core": "^8.3.4", + "@ionic/core": "^8.4.0", "ionicons": "^7.0.0" }, "vetur": { From ec14e137800e4812a6769117626aedb0375eb4f1 Mon Sep 17 00:00:00 2001 From: ionitron Date: Mon, 4 Nov 2024 21:29:59 +0000 Subject: [PATCH 6/6] chore(): update package lock files --- core/package-lock.json | 2 +- packages/angular-server/package-lock.json | 14 +++++------ packages/angular/package-lock.json | 14 +++++------ packages/docs/package-lock.json | 2 +- packages/react-router/package-lock.json | 30 +++++++++++------------ packages/react/package-lock.json | 14 +++++------ packages/vue-router/package-lock.json | 30 +++++++++++------------ packages/vue/package-lock.json | 14 +++++------ 8 files changed, 60 insertions(+), 60 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 4bf85b0b5f..7105341c21 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -17767,4 +17767,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/angular-server/package-lock.json b/packages/angular-server/package-lock.json index e2342e534f..d076c1944e 100644 --- a/packages/angular-server/package-lock.json +++ b/packages/angular-server/package-lock.json @@ -1031,9 +1031,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "dependencies": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -7188,9 +7188,9 @@ "dev": true }, "@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -11110,4 +11110,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index 45b1ae34d2..99ae2425d5 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -1398,9 +1398,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "dependencies": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -9820,9 +9820,9 @@ "dev": true }, "@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -15020,4 +15020,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/docs/package-lock.json b/packages/docs/package-lock.json index ed84cbe16c..cecd55ac06 100644 --- a/packages/docs/package-lock.json +++ b/packages/docs/package-lock.json @@ -10,4 +10,4 @@ "license": "MIT" } } -} \ No newline at end of file +} diff --git a/packages/react-router/package-lock.json b/packages/react-router/package-lock.json index 8b62f45f7a..eec354f3d5 100644 --- a/packages/react-router/package-lock.json +++ b/packages/react-router/package-lock.json @@ -238,9 +238,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "dependencies": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -414,11 +414,11 @@ } }, "node_modules/@ionic/react": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.3.4.tgz", - "integrity": "sha512-CIoTHg/1nJJN11IjmsUqeQB1nIP4SxQyo2nBH+MhzeVCMv8Tj00Y4rU/9RYzKfRI7Zfsi9MOwVrwpGhPWi4KWA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.4.0.tgz", + "integrity": "sha512-wCtixCwf673Qnes1uGxmRoyUP4FnGtEyUVwtkcfj9IBrPUbw641Ws8J4jRjQ2rOO1WkWkSCeHKnd+KYCqyulZg==", "dependencies": { - "@ionic/core": "8.3.4", + "@ionic/core": "8.4.0", "ionicons": "^7.0.0", "tslib": "*" }, @@ -4057,9 +4057,9 @@ "dev": true }, "@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -4163,11 +4163,11 @@ "requires": {} }, "@ionic/react": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.3.4.tgz", - "integrity": "sha512-CIoTHg/1nJJN11IjmsUqeQB1nIP4SxQyo2nBH+MhzeVCMv8Tj00Y4rU/9RYzKfRI7Zfsi9MOwVrwpGhPWi4KWA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.4.0.tgz", + "integrity": "sha512-wCtixCwf673Qnes1uGxmRoyUP4FnGtEyUVwtkcfj9IBrPUbw641Ws8J4jRjQ2rOO1WkWkSCeHKnd+KYCqyulZg==", "requires": { - "@ionic/core": "8.3.4", + "@ionic/core": "8.4.0", "ionicons": "^7.0.0", "tslib": "*" } @@ -6666,4 +6666,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 84d27ab941..05689bce96 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -736,9 +736,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "dependencies": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -12315,9 +12315,9 @@ "dev": true }, "@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -20498,4 +20498,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index 1cefd98eba..de31e28449 100644 --- a/packages/vue-router/package-lock.json +++ b/packages/vue-router/package-lock.json @@ -661,9 +661,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "dependencies": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -852,11 +852,11 @@ } }, "node_modules/@ionic/vue": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.3.4.tgz", - "integrity": "sha512-s7P5mTd078CbPK2dpIxxWGNirQacG3sXhJulJ1L0J6+6VI+HHHLKy4ueTRgPl5GLDmjGgdMCBuYu1n4K2nNXFg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.4.0.tgz", + "integrity": "sha512-mtSerl9oC21d6xv1q+QuGm61IzJbqpkWbt0lQryXZ3kK1/aVVOnHAN5bX8tPPUN2ALA7CyTWXaCvhxceRV/paA==", "dependencies": { - "@ionic/core": "8.3.4", + "@ionic/core": "8.4.0", "ionicons": "^7.0.0" } }, @@ -7878,9 +7878,9 @@ "dev": true }, "@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -7993,11 +7993,11 @@ "requires": {} }, "@ionic/vue": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.3.4.tgz", - "integrity": "sha512-s7P5mTd078CbPK2dpIxxWGNirQacG3sXhJulJ1L0J6+6VI+HHHLKy4ueTRgPl5GLDmjGgdMCBuYu1n4K2nNXFg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-8.4.0.tgz", + "integrity": "sha512-mtSerl9oC21d6xv1q+QuGm61IzJbqpkWbt0lQryXZ3kK1/aVVOnHAN5bX8tPPUN2ALA7CyTWXaCvhxceRV/paA==", "requires": { - "@ionic/core": "8.3.4", + "@ionic/core": "8.4.0", "ionicons": "^7.0.0" } }, @@ -12798,4 +12798,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index 0bea689ba8..5733d9b5a6 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -208,9 +208,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "dependencies": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -3970,9 +3970,9 @@ "dev": true }, "@ionic/core": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.3.4.tgz", - "integrity": "sha512-MkgaQ9+oQwj3AK/i25MkLgKUUH3/nvNjd4YlmUyFjPG7l2IBHsrLlSmuFGCyniB+doI9Hynu3T9CZP7NS4RjRQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.0.tgz", + "integrity": "sha512-mZ2Ni9QByFGWBNr5W/F/nyPV+cXLhK+6W5BRziy7QPX6YIS57KH8FpY+CjE7BEcpE78anyY49bZt3eOWcES02g==", "requires": { "@stencil/core": "4.20.0", "ionicons": "^7.2.2", @@ -6562,4 +6562,4 @@ "dev": true } } -} \ No newline at end of file +}