diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c5a2a7d9ce..4d5000ea4b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,6 +55,15 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash + # Lerna does not automatically bump versions + # of Ionic dependencies that have changed, + # so we do that here. + - name: Bump Package Lock + run: | + lerna exec "npm install --package-lock-only --legacy-peer-deps" + git add . + git commit -m "chore(): update package lock files" + git push # Purge the JSDeliver CDN cache so # component playgrounds always load # the latest version of Ionic. diff --git a/CHANGELOG.md b/CHANGELOG.md index 76387c44a8..6a91431cd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.3.1](https://github.com/ionic-team/ionic-framework/compare/v6.3.0...v6.3.1) (2022-10-12) + + +### Bug Fixes + +* **datetime:** setting date async updates calendar grid ([#26070](https://github.com/ionic-team/ionic-framework/issues/26070)) ([0aee328](https://github.com/ionic-team/ionic-framework/commit/0aee328b4b84d5668752e5ae0792334d0173c2bb)), closes [#25776](https://github.com/ionic-team/ionic-framework/issues/25776) +* **datetime:** setting max/min does not increase number of nodes rendered ([#26065](https://github.com/ionic-team/ionic-framework/issues/26065)) ([a5d178f](https://github.com/ionic-team/ionic-framework/commit/a5d178f4c03a0ad2501095afe1f75914b0462ae1)), closes [#26059](https://github.com/ionic-team/ionic-framework/issues/26059) +* **item, card:** aria-label is reflected to the inner button ([#26028](https://github.com/ionic-team/ionic-framework/issues/26028)) ([3c89ebe](https://github.com/ionic-team/ionic-framework/commit/3c89ebe7216b2a19580a4f1ed23d5d1d4c37919d)), closes [#25885](https://github.com/ionic-team/ionic-framework/issues/25885) +* **toolbar:** MD height only applies to MD segment ([#26042](https://github.com/ionic-team/ionic-framework/issues/26042)) ([ab89679](https://github.com/ionic-team/ionic-framework/commit/ab8967936c6bef5fc0a884cb8bf8f2deb7784c13)), closes [#18617](https://github.com/ionic-team/ionic-framework/issues/18617) + + + + + # [6.3.0](https://github.com/ionic-team/ionic-framework/compare/v6.2.9...v6.3.0) (2022-10-05) diff --git a/angular/CHANGELOG.md b/angular/CHANGELOG.md index 89ce7a4172..5ac78e7fa4 100644 --- a/angular/CHANGELOG.md +++ b/angular/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. +## [6.3.1](https://github.com/ionic-team/ionic/compare/v6.3.0...v6.3.1) (2022-10-12) + +**Note:** Version bump only for package @ionic/angular + + + + + # [6.3.0 Manganese](https://github.com/ionic-team/ionic/compare/v6.2.9...v6.3.0) (2022-10-05) diff --git a/angular/package-lock.json b/angular/package-lock.json index cb89c58b16..1f8a11585d 100644 --- a/angular/package-lock.json +++ b/angular/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/angular", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT", "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, @@ -1023,9 +1023,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -7951,9 +7951,9 @@ "dev": true }, "@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "requires": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", diff --git a/angular/package.json b/angular/package.json index b448328115..ee635a6706 100644 --- a/angular/package.json +++ b/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "6.3.0", + "version": "6.3.1", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -45,7 +45,7 @@ "validate": "npm i && npm run lint && npm run test && npm run build" }, "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" }, diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index db1c9897e1..0b314d1092 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.3.1](https://github.com/ionic-team/ionic/compare/v6.3.0...v6.3.1) (2022-10-12) + + +### Bug Fixes + +* **datetime:** setting date async updates calendar grid ([#26070](https://github.com/ionic-team/ionic/issues/26070)) ([0aee328](https://github.com/ionic-team/ionic/commit/0aee328b4b84d5668752e5ae0792334d0173c2bb)), closes [#25776](https://github.com/ionic-team/ionic/issues/25776) +* **datetime:** setting max/min does not increase number of nodes rendered ([#26065](https://github.com/ionic-team/ionic/issues/26065)) ([a5d178f](https://github.com/ionic-team/ionic/commit/a5d178f4c03a0ad2501095afe1f75914b0462ae1)), closes [#26059](https://github.com/ionic-team/ionic/issues/26059) +* **item, card:** aria-label is reflected to the inner button ([#26028](https://github.com/ionic-team/ionic/issues/26028)) ([3c89ebe](https://github.com/ionic-team/ionic/commit/3c89ebe7216b2a19580a4f1ed23d5d1d4c37919d)), closes [#25885](https://github.com/ionic-team/ionic/issues/25885) +* **toolbar:** MD height only applies to MD segment ([#26042](https://github.com/ionic-team/ionic/issues/26042)) ([ab89679](https://github.com/ionic-team/ionic/commit/ab8967936c6bef5fc0a884cb8bf8f2deb7784c13)), closes [#18617](https://github.com/ionic-team/ionic/issues/18617) + + + + + # [6.3.0](https://github.com/ionic-team/ionic/compare/v6.2.9...v6.3.0) (2022-10-05) diff --git a/core/package-lock.json b/core/package-lock.json index 051a54ad3b..b88d9b21db 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/core", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/core", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT", "dependencies": { "@stencil/core": "^2.18.0", diff --git a/core/package.json b/core/package.json index 0794cf819c..3242725f89 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "6.3.0", + "version": "6.3.1", "description": "Base components for Ionic", "keywords": [ "ionic", diff --git a/core/src/components/app/fonts/roboto-bold.ttf b/core/src/components/app/fonts/roboto-bold.ttf deleted file mode 100644 index 4e35166a1f..0000000000 Binary files a/core/src/components/app/fonts/roboto-bold.ttf and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-bold.woff b/core/src/components/app/fonts/roboto-bold.woff deleted file mode 100644 index 3143de2975..0000000000 Binary files a/core/src/components/app/fonts/roboto-bold.woff and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-bold.woff2 b/core/src/components/app/fonts/roboto-bold.woff2 deleted file mode 100644 index e9d591eb60..0000000000 Binary files a/core/src/components/app/fonts/roboto-bold.woff2 and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-light.ttf b/core/src/components/app/fonts/roboto-light.ttf deleted file mode 100644 index 5e26ccdb1e..0000000000 Binary files a/core/src/components/app/fonts/roboto-light.ttf and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-light.woff b/core/src/components/app/fonts/roboto-light.woff deleted file mode 100644 index 1bff3ec454..0000000000 Binary files a/core/src/components/app/fonts/roboto-light.woff and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-light.woff2 b/core/src/components/app/fonts/roboto-light.woff2 deleted file mode 100644 index 94a60b9567..0000000000 Binary files a/core/src/components/app/fonts/roboto-light.woff2 and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-medium.ttf b/core/src/components/app/fonts/roboto-medium.ttf deleted file mode 100644 index 034710638e..0000000000 Binary files a/core/src/components/app/fonts/roboto-medium.ttf and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-medium.woff b/core/src/components/app/fonts/roboto-medium.woff deleted file mode 100644 index d3c82e1846..0000000000 Binary files a/core/src/components/app/fonts/roboto-medium.woff and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-medium.woff2 b/core/src/components/app/fonts/roboto-medium.woff2 deleted file mode 100644 index 74aaff44b3..0000000000 Binary files a/core/src/components/app/fonts/roboto-medium.woff2 and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-regular.ttf b/core/src/components/app/fonts/roboto-regular.ttf deleted file mode 100644 index 05037ed5e5..0000000000 Binary files a/core/src/components/app/fonts/roboto-regular.ttf and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-regular.woff b/core/src/components/app/fonts/roboto-regular.woff deleted file mode 100644 index 5e353cf47a..0000000000 Binary files a/core/src/components/app/fonts/roboto-regular.woff and /dev/null differ diff --git a/core/src/components/app/fonts/roboto-regular.woff2 b/core/src/components/app/fonts/roboto-regular.woff2 deleted file mode 100644 index 96a601550e..0000000000 Binary files a/core/src/components/app/fonts/roboto-regular.woff2 and /dev/null differ diff --git a/core/src/components/app/fonts/roboto.scss b/core/src/components/app/fonts/roboto.scss deleted file mode 100644 index ea297073f6..0000000000 --- a/core/src/components/app/fonts/roboto.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Roboto Font -// Google -// Apache License, version 2.0 -// http://www.apache.org/licenses/LICENSE-2.0.html - -$roboto-font-path: $font-path !default; - -@font-face { - font-family: "Roboto"; - font-style: normal; - font-weight: 300; - src: local("Roboto Light"), local("Roboto-Light"), url("#{$roboto-font-path}/roboto-light.woff2") format("woff2"), url("#{$roboto-font-path}/roboto-light.woff") format("woff"), url("#{$roboto-font-path}/roboto-light.ttf") format("truetype"); -} - -@font-face { - font-family: "Roboto"; - font-style: normal; - font-weight: 400; - src: local("Roboto"), local("Roboto-Regular"), url("#{$roboto-font-path}/roboto-regular.woff2") format("woff2"), url("#{$roboto-font-path}/roboto-regular.woff") format("woff"), url("#{$roboto-font-path}/roboto-regular.ttf") format("truetype"); -} - -@font-face { - font-family: "Roboto"; - font-style: normal; - font-weight: 500; - src: local("Roboto Medium"), local("Roboto-Medium"), url("#{$roboto-font-path}/roboto-medium.woff2") format("woff2"), url("#{$roboto-font-path}/roboto-medium.woff") format("woff"), url("#{$roboto-font-path}/roboto-medium.ttf") format("truetype"); -} - -@font-face { - font-family: "Roboto"; - font-style: normal; - font-weight: 700; - src: local("Roboto Bold"), local("Roboto-Bold"), url("#{$roboto-font-path}/roboto-bold.woff2") format("woff2"), url("#{$roboto-font-path}/roboto-bold.woff") format("woff"), url("#{$roboto-font-path}/roboto-bold.ttf") format("truetype"); -} diff --git a/core/src/components/card/card.tsx b/core/src/components/card/card.tsx index 5756c52ba7..96bb8d2d78 100644 --- a/core/src/components/card/card.tsx +++ b/core/src/components/card/card.tsx @@ -1,9 +1,11 @@ import type { ComponentInterface } from '@stencil/core'; -import { Component, Host, Prop, h } from '@stencil/core'; +import { Element, Component, Host, Prop, h } from '@stencil/core'; import { getIonMode } from '../../global/ionic-global'; import type { AnimationBuilder, Color, Mode, RouterDirection } from '../../interface'; import type { AnchorInterface, ButtonInterface } from '../../utils/element-interface'; +import type { Attributes } from '../../utils/helpers'; +import { inheritAttributes } from '../../utils/helpers'; import { createColorClasses, openURL } from '../../utils/theme'; /** @@ -20,6 +22,9 @@ import { createColorClasses, openURL } from '../../utils/theme'; shadow: true, }) export class Card implements ComponentInterface, AnchorInterface, ButtonInterface { + private inheritedAriaAttributes: Attributes = {}; + + @Element() el!: HTMLElement; /** * The color to use from your application's color palette. * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`. @@ -81,6 +86,10 @@ export class Card implements ComponentInterface, AnchorInterface, ButtonInterfac */ @Prop() target: string | undefined; + componentWillLoad() { + this.inheritedAriaAttributes = inheritAttributes(this.el, ['aria-label']); + } + private isClickable(): boolean { return this.href !== undefined || this.button; } @@ -91,7 +100,7 @@ export class Card implements ComponentInterface, AnchorInterface, ButtonInterfac if (!clickable) { return []; } - const { href, routerAnimation, routerDirection } = this; + const { href, routerAnimation, routerDirection, inheritedAriaAttributes } = this; const TagType = clickable ? (href === undefined ? 'button' : 'a') : ('div' as any); const attrs = TagType === 'button' @@ -106,6 +115,7 @@ export class Card implements ComponentInterface, AnchorInterface, ButtonInterfac return ( { + it('should reflect aria-label to button', async () => { + const page = await newSpecPage({ + components: [Card], + html: ``, + }); + + const button = page.body.querySelector('ion-card')!.shadowRoot!.querySelector('button')!; + const ariaLabel = button.getAttribute('aria-label'); + + expect(ariaLabel).toEqual('Test'); + }); +}); diff --git a/core/src/components/card/test/basic/index.html b/core/src/components/card/test/basic/index.html new file mode 100644 index 0000000000..58c780a49b --- /dev/null +++ b/core/src/components/card/test/basic/index.html @@ -0,0 +1,40 @@ + + + + + Card - Basic + + + + + + + + + + + + + Card - Basic + + + + + + + Card Subtitle + Card Title + + + + Keep close to Nature's heart... and break clear away, once in awhile, and climb a mountain or spend a week + in the woods. Wash your spirit clean. + + + + + + diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx index 665ee76039..a78bf569b8 100644 --- a/core/src/components/datetime/datetime.tsx +++ b/core/src/components/datetime/datetime.tsx @@ -19,7 +19,7 @@ import { isRTL } from '../../utils/rtl'; import { createColorClasses } from '../../utils/theme'; import type { PickerColumnItem } from '../picker-column-internal/picker-column-internal-interfaces'; -import { isSameDay, warnIfValueOutOfBounds } from './utils/comparison'; +import { isSameDay, warnIfValueOutOfBounds, isBefore, isAfter } from './utils/comparison'; import { generateMonths, getDaysOfMonth, @@ -32,7 +32,7 @@ import { getCombinedDateColumnData, } from './utils/data'; import { formatValue, getLocalizedTime, getMonthAndDay, getMonthAndYear } from './utils/format'; -import { is24Hour, isLocaleDayPeriodRTL, isMonthFirstLocale } from './utils/helpers'; +import { is24Hour, isLocaleDayPeriodRTL, isMonthFirstLocale, getNumDaysInMonth } from './utils/helpers'; import { calculateHourFromAMPM, convertDataToISO, @@ -85,17 +85,6 @@ export class Datetime implements ComponentInterface { private calendarBodyRef?: HTMLElement; private popoverRef?: HTMLIonPopoverElement; private clearFocusVisible?: () => void; - - /** - * Whether to highlight the active day with a solid circle (as opposed - * to the outline circle around today). If you don't specify an initial - * value for the datetime, it doesn't automatically init to a default to - * avoid unwanted change events firing. If the solid circle were still - * shown then, it would look like a date had already been selected, which - * is misleading UX. - */ - private highlightActiveParts = false; - private parsedMinuteValues?: number[]; private parsedHourValues?: number[]; private parsedMonthValues?: number[]; @@ -115,18 +104,11 @@ export class Datetime implements ComponentInterface { * Duplicate reference to `activeParts` that does not trigger a re-render of the component. * Allows caching an instance of the `activeParts` in between render cycles. */ - private activePartsClone!: DatetimeParts | DatetimeParts[]; + private activePartsClone: DatetimeParts | DatetimeParts[] = []; @State() showMonthAndYear = false; - @State() activeParts: DatetimeParts | DatetimeParts[] = { - month: 5, - day: 28, - year: 2021, - hour: 13, - minute: 52, - ampm: 'pm', - }; + @State() activeParts: DatetimeParts | DatetimeParts[] = []; @State() workingParts: DatetimeParts = { month: 5, @@ -506,16 +488,12 @@ export class Datetime implements ComponentInterface { */ @Method() async confirm(closeOverlay = false) { - const { highlightActiveParts, isCalendarPicker, activeParts } = this; + const { isCalendarPicker, activeParts } = this; /** - * We only update the value if the presentation is not a calendar picker, - * or if `highlightActiveParts` is true; indicating that the user - * has selected a date from the calendar picker. - * - * Otherwise "today" would accidentally be set as the value. + * We only update the value if the presentation is not a calendar picker. */ - if (highlightActiveParts || !isCalendarPicker) { + if (activeParts !== undefined || !isCalendarPicker) { const activePartsIsArray = Array.isArray(activeParts); if (activePartsIsArray && activeParts.length === 0) { this.value = undefined; @@ -573,6 +551,23 @@ export class Datetime implements ComponentInterface { } } + /** + * Returns the DatetimePart interface + * to use when rendering an initial set of + * data. This should be used when rendering an + * interface in an environment where the `value` + * may not be set. This function works + * by returning the first selected date in + * "activePartsClone" and then falling back to + * today's DatetimeParts if no active date is selected. + */ + private getDefaultPart = () => { + const { activePartsClone, todayParts } = this; + + const firstPart = Array.isArray(activePartsClone) ? activePartsClone[0] : activePartsClone; + return firstPart ?? todayParts; + }; + private closeParentOverlay = () => { const popoverOrModal = this.el.closest('ion-modal, ion-popover') as | HTMLIonModalElement @@ -590,7 +585,7 @@ export class Datetime implements ComponentInterface { }; private setActiveParts = (parts: DatetimeParts, removeDate = false) => { - const { multiple, activePartsClone, highlightActiveParts } = this; + const { multiple, activePartsClone } = this; /** * When setting the active parts, it is possible @@ -618,15 +613,8 @@ export class Datetime implements ComponentInterface { const activePartsArray = Array.isArray(activePartsClone) ? activePartsClone : [activePartsClone]; if (removeDate) { this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts)); - } else if (highlightActiveParts) { - this.activeParts = [...activePartsArray, validatedParts]; } else { - /** - * If highlightActiveParts is false, that means we just have a - * default value of today in activeParts; we need to replace that - * rather than adding to it since it's just a placeholder. - */ - this.activeParts = [validatedParts]; + this.activeParts = [...activePartsArray, validatedParts]; } } else { this.activeParts = { @@ -634,18 +622,6 @@ export class Datetime implements ComponentInterface { }; } - /** - * Now that the user has interacted somehow to select something, we can - * show the solid highlight. This needs to be done after checking it above, - * but before the confirm call below. - * - * Note that for datetimes with confirm/cancel buttons, the value - * isn't updated until you call confirm(). We need to bring the - * solid circle back on day click for UX reasons, rather than only - * show the circle if `value` is truthy. - */ - this.highlightActiveParts = true; - const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null; if (hasSlottedButtons || this.showDefaultButtons) { return; @@ -1178,7 +1154,7 @@ export class Datetime implements ComponentInterface { } private processValue = (value?: string | string[] | null) => { - const hasValue = (this.highlightActiveParts = value !== null && value !== undefined); + const hasValue = value !== null && value !== undefined; let valueToProcess = parseDate(value ?? getToday()); const { minParts, maxParts, multiple } = this; @@ -1219,18 +1195,26 @@ export class Datetime implements ComponentInterface { ampm, }); - if (Array.isArray(valueToProcess)) { - this.activeParts = [...valueToProcess]; - } else { - this.activeParts = { - month, - day, - year, - hour, - minute, - tzOffset, - ampm, - }; + /** + * Since `activeParts` indicates a value that + * been explicitly selected either by the + * user or the app, only update `activeParts` + * if the `value` property is set. + */ + if (hasValue) { + if (Array.isArray(valueToProcess)) { + this.activeParts = [...valueToProcess]; + } else { + this.activeParts = { + month, + day, + year, + hour, + minute, + tzOffset, + ampm, + }; + } } }; @@ -1416,23 +1400,24 @@ export class Datetime implements ComponentInterface { * Previous month, current month, and next month */ const monthsToRender = generateMonths(workingParts); + const lastMonth = monthsToRender[monthsToRender.length - 1]; /** - * generateMonths returns the day data as well, - * but we do not want the day value to act as a max/min - * on the data we are going to generate. + * Ensure that users can select the entire window of dates. */ - for (let i = 0; i <= monthsToRender.length - 1; i++) { - monthsToRender[i].day = null; - } + monthsToRender[0].day = 1; + lastMonth.day = getNumDaysInMonth(lastMonth.month, lastMonth.year); /** - * If developers have provided their own - * min/max values, use that instead. Otherwise, - * fallback to the default range of 3 months. + * Narrow the dates rendered based on min/max dates (if any). + * The `min` date is used if the min is after the generated min month. + * The `max` date is used if the max is before the generated max month. + * This ensures that the sliding window always stays at 3 months + * but still allows future dates to be lazily rendered based on any min/max + * constraints. */ - const min = minParts || monthsToRender[0]; - const max = maxParts || monthsToRender[monthsToRender.length - 1]; + const min = minParts !== undefined && isAfter(minParts, monthsToRender[0]) ? minParts : monthsToRender[0]; + const max = maxParts !== undefined && isBefore(maxParts, lastMonth) ? maxParts : lastMonth; const result = getCombinedDateColumnData( locale, @@ -1442,6 +1427,7 @@ export class Datetime implements ComponentInterface { this.parsedDayValues, this.parsedMonthValues ); + let items = result.items; const parts = result.parts; @@ -1747,13 +1733,15 @@ export class Datetime implements ComponentInterface { } private renderHourPickerColumn(hoursData: PickerColumnItem[]) { - const { workingParts, activePartsClone } = this; + const { workingParts } = this; if (hoursData.length === 0) return []; + const activePart = this.getDefaultPart(); + return ( { @@ -1762,9 +1750,9 @@ export class Datetime implements ComponentInterface { hour: ev.detail.value, }); - if (!Array.isArray(activePartsClone)) { + if (!Array.isArray(activePart)) { this.setActiveParts({ - ...activePartsClone, + ...activePart, hour: ev.detail.value, }); } @@ -1775,13 +1763,15 @@ export class Datetime implements ComponentInterface { ); } private renderMinutePickerColumn(minutesData: PickerColumnItem[]) { - const { workingParts, activePartsClone } = this; + const { workingParts } = this; if (minutesData.length === 0) return []; + const activePart = this.getDefaultPart(); + return ( { @@ -1790,9 +1780,9 @@ export class Datetime implements ComponentInterface { minute: ev.detail.value, }); - if (!Array.isArray(activePartsClone)) { + if (!Array.isArray(activePart)) { this.setActiveParts({ - ...activePartsClone, + ...activePart, minute: ev.detail.value, }); } @@ -1803,18 +1793,19 @@ export class Datetime implements ComponentInterface { ); } private renderDayPeriodPickerColumn(dayPeriodData: PickerColumnItem[]) { - const { workingParts, activePartsClone } = this; + const { workingParts } = this; if (dayPeriodData.length === 0) { return []; } + const activePart = this.getDefaultPart(); const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale); return ( { const hour = calculateHourFromAMPM(workingParts, ev.detail.value); @@ -1825,9 +1816,9 @@ export class Datetime implements ComponentInterface { hour, }); - if (!Array.isArray(activePartsClone)) { + if (!Array.isArray(activePart)) { this.setActiveParts({ - ...activePartsClone, + ...activePart, ampm: ev.detail.value, hour, }); @@ -1901,7 +1892,6 @@ export class Datetime implements ComponentInterface { ); } private renderMonth(month: number, year: number) { - const { highlightActiveParts } = this; const yearAllowed = this.parsedYearValues === undefined || this.parsedYearValues.includes(year); const monthAllowed = this.parsedMonthValues === undefined || this.parsedMonthValues.includes(month); const isCalMonthDisabled = !yearAllowed || !monthAllowed; @@ -1979,7 +1969,7 @@ export class Datetime implements ComponentInterface { class={{ 'calendar-day-padding': day === null, 'calendar-day': true, - 'calendar-day-active': isActive && highlightActiveParts, + 'calendar-day-active': isActive, 'calendar-day-today': isToday, }} aria-selected={ariaSelected} @@ -2004,7 +1994,7 @@ export class Datetime implements ComponentInterface { day, year, }, - isActive && highlightActiveParts + isActive ); } else { this.setActiveParts({ @@ -2052,6 +2042,8 @@ export class Datetime implements ComponentInterface { private renderTimeOverlay() { const use24Hour = is24Hour(this.locale, this.hourCycle); + const activePart = this.getDefaultPart(); + return [
{this.renderTimeLabel()}
, , { * are rendering quirks on Linux * if the datetime is too small. */ - test.describe('datetime: date wheel rendering', () => { - test('should not have visual regressions', async ({ page }) => { + test.describe('datetime: wheel rendering', () => { + test('should not have visual regressions for date wheel', async ({ page }) => { await page.setContent(` `); expect(await page.screenshot()).toMatchSnapshot(`datetime-wheel-date-diff-${page.getSnapshotSettings()}.png`); }); + test('should not have visual regressions for date-time wheel', async ({ page }) => { + await page.setContent(` + + `); + + expect(await page.screenshot()).toMatchSnapshot( + `datetime-wheel-date-time-diff-${page.getSnapshotSettings()}.png` + ); + }); + test('should not have visual regressions for time-date wheel', async ({ page }) => { + await page.setContent(` + + `); + + expect(await page.screenshot()).toMatchSnapshot( + `datetime-wheel-time-date-diff-${page.getSnapshotSettings()}.png` + ); + }); + }); + test.describe('datetime: date wheel', () => { + test.beforeEach(({ skip }) => { + skip.rtl(); + }); test('should respect the min bounds', async ({ page }) => { await page.setContent(` @@ -149,15 +172,9 @@ test.describe('datetime: prefer wheel', () => { }); }); }); - test.describe('datetime: date-time wheel rendering', () => { - test('should not have visual regressions', async ({ page }) => { - await page.setContent(` - - `); - - expect(await page.screenshot()).toMatchSnapshot( - `datetime-wheel-date-time-diff-${page.getSnapshotSettings()}.png` - ); + test.describe('datetime: date-time wheel', () => { + test.beforeEach(({ skip }) => { + skip.rtl(); }); test('should respect the min bounds', async ({ page }) => { await page.setContent(` @@ -249,20 +266,58 @@ test.describe('datetime: prefer wheel', () => { await page.waitForSelector('.datetime-ready'); - const dateValues = page.locator('.date-column .picker-item:not(.picker-item-empty)'); + const dateColumn = page.locator('.date-column'); + const dateValues = dateColumn.locator('.picker-item:not(.picker-item-empty)'); - expect(await dateValues.count()).toBe(397); + expect(await dateValues.count()).toBe(90); + + /** + * Select 1st item to change the dates rendered + */ + await expect(dateValues.nth(0)).toHaveAttribute('data-value', '2022-1-1'); + await dateColumn.evaluate((el: HTMLElement) => (el.scrollTop = 0)); + await page.waitForChanges(); + + await expect(dateValues.nth(0)).toHaveAttribute('data-value', '2021-12-1'); }); - }); - test.describe('datetime: time-date wheel rendering', () => { - test('should not have visual regressions', async ({ page }) => { + test('should keep sliding window if default window is within min and max constraints', async ({ page }) => { await page.setContent(` - + `); - expect(await page.screenshot()).toMatchSnapshot( - `datetime-wheel-time-date-diff-${page.getSnapshotSettings()}.png` - ); + await page.waitForSelector('.datetime-ready'); + + const dayValues = page.locator('.date-column .picker-item:not(.picker-item-empty)'); + + expect(await dayValues.count()).toBe(92); + }); + test('should narrow sliding window if default window is not within min and max constraints', async ({ page }) => { + await page.setContent(` + + `); + + await page.waitForSelector('.datetime-ready'); + + const dayValues = page.locator('.date-column .picker-item:not(.picker-item-empty)'); + + expect(await dayValues.count()).toBe(15); + }); + }); + test.describe('datetime: time-date wheel', () => { + test.beforeEach(({ skip }) => { + skip.rtl(); }); test('should respect the min bounds', async ({ page }) => { await page.setContent(` @@ -354,9 +409,53 @@ test.describe('datetime: prefer wheel', () => { await page.waitForSelector('.datetime-ready'); - const dateValues = page.locator('.date-column .picker-item:not(.picker-item-empty)'); + const dateColumn = page.locator('.date-column'); + const dateValues = dateColumn.locator('.picker-item:not(.picker-item-empty)'); - expect(await dateValues.count()).toBe(397); + expect(await dateValues.count()).toBe(90); + + /** + * Select 1st item to change the dates rendered + */ + await expect(dateValues.nth(0)).toHaveAttribute('data-value', '2022-1-1'); + await dateColumn.evaluate((el: HTMLElement) => (el.scrollTop = 0)); + await page.waitForChanges(); + + await expect(dateValues.nth(0)).toHaveAttribute('data-value', '2021-12-1'); + }); + test('should keep sliding window if default window is within min and max constraints', async ({ page }) => { + await page.setContent(` + + `); + + await page.waitForSelector('.datetime-ready'); + + const dayValues = page.locator('.date-column .picker-item:not(.picker-item-empty)'); + + expect(await dayValues.count()).toBe(92); + }); + test('should narrow sliding window if default window is not within min and max constraints', async ({ page }) => { + await page.setContent(` + + `); + + await page.waitForSelector('.datetime-ready'); + + const dayValues = page.locator('.date-column .picker-item:not(.picker-item-empty)'); + + expect(await dayValues.count()).toBe(15); }); }); }); diff --git a/core/src/components/datetime/test/set-value/datetime.e2e.ts b/core/src/components/datetime/test/set-value/datetime.e2e.ts index 3c5fc86f22..ab98bc5ab4 100644 --- a/core/src/components/datetime/test/set-value/datetime.e2e.ts +++ b/core/src/components/datetime/test/set-value/datetime.e2e.ts @@ -2,11 +2,13 @@ import { expect } from '@playwright/test'; import { test } from '@utils/test/playwright'; test.describe('datetime: set-value', () => { - test.beforeEach(async ({ page }) => { + test.beforeEach(async ({ skip }) => { + skip.rtl(); + }); + test('should update the active date when value is initially set', async ({ page }) => { await page.goto('/src/components/datetime/test/set-value'); await page.waitForSelector('.datetime-ready'); - }); - test('should update the active date', async ({ page }) => { + const datetime = page.locator('ion-datetime'); await datetime.evaluate((el: HTMLIonDatetimeElement) => (el.value = '2021-11-25T12:40:00.000Z')); @@ -15,7 +17,10 @@ test.describe('datetime: set-value', () => { const activeDate = page.locator('ion-datetime .calendar-day-active'); await expect(activeDate).toHaveText('25'); }); - test('should update the active time', async ({ page }) => { + test('should update the active time when value is initially set', async ({ page }) => { + await page.goto('/src/components/datetime/test/set-value'); + await page.waitForSelector('.datetime-ready'); + const datetime = page.locator('ion-datetime'); await datetime.evaluate((el: HTMLIonDatetimeElement) => (el.value = '2021-11-25T12:40:00.000Z')); @@ -24,4 +29,38 @@ test.describe('datetime: set-value', () => { const activeDate = page.locator('ion-datetime .time-body'); await expect(activeDate).toHaveText('12:40 PM'); }); + test('should update active item when value is not initially set', async ({ page }) => { + await page.setContent(` + + `); + await page.waitForSelector('.datetime-ready'); + + const datetime = page.locator('ion-datetime'); + const activeDayButton = page.locator('.calendar-day-active'); + const monthYearButton = page.locator('.calendar-month-year'); + const monthColumn = page.locator('.month-column'); + const yearColumn = page.locator('.year-column'); + + await datetime.evaluate((el: HTMLIonDatetimeElement) => (el.value = '2021-10-05')); + + // Open month/year picker + await monthYearButton.click(); + await page.waitForChanges(); + + // Select October 2021 + await monthColumn.locator('.picker-item[data-value="10"]').click(); + await page.waitForChanges(); + + await yearColumn.locator('.picker-item[data-value="2021"]').click(); + await page.waitForChanges(); + + // Close month/year picker + await monthYearButton.click(); + await page.waitForChanges(); + + // Check that correct day is highlighted + await expect(activeDayButton).toHaveAttribute('data-day', '5'); + await expect(activeDayButton).toHaveAttribute('data-month', '10'); + await expect(activeDayButton).toHaveAttribute('data-year', '2021'); + }); }); diff --git a/core/src/components/datetime/utils/parse.ts b/core/src/components/datetime/utils/parse.ts index ebfe2a94ea..95c05b9be6 100644 --- a/core/src/components/datetime/utils/parse.ts +++ b/core/src/components/datetime/utils/parse.ts @@ -115,6 +115,7 @@ export function parseDate(val: string | string[] | undefined | null): DatetimePa hour: parse[4], minute: parse[5], tzOffset, + ampm: parse[4] < 12 ? 'am' : 'pm', }; } diff --git a/core/src/components/infinite-scroll/test/basic/e2e.ts b/core/src/components/infinite-scroll/test/basic/e2e.ts deleted file mode 100644 index 6995aa318f..0000000000 --- a/core/src/components/infinite-scroll/test/basic/e2e.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { newE2EPage } from '@stencil/core/testing'; -import type { E2EPage } from '@stencil/core/testing'; - -/** - * Scrolls an `ion-content` element to the bottom, triggering the `ionInfinite` event. - * Waits for the custom event to complete. - */ -const scrollIonContentPage = async (page: E2EPage) => { - const content = await page.find('ion-content'); - await content.callMethod('scrollToBottom'); - await page.waitForChanges(); - - const ev = await page.spyOnEvent('ionInfiniteComplete', 'document'); - await ev.next(); -}; - -describe('infinite-scroll: basic', () => { - it('should match existing visual screenshots', async () => { - const page = await newE2EPage({ - url: '/src/components/infinite-scroll/test/basic?ionic:_testing=true', - }); - - const compare = await page.compareScreenshot(); - expect(compare).toMatchScreenshot(); - }); - - describe('when enabled', () => { - it('should load more items when scrolled to the bottom', async () => { - const page = await newE2EPage({ - url: '/src/components/infinite-scroll/test/basic?ionic:_testing=true', - }); - - const initialItems = await page.findAll('ion-item'); - - expect(initialItems.length).toBe(30); - - await scrollIonContentPage(page); - - const updatedItems = await page.findAll('ion-item'); - - expect(updatedItems.length).toBe(60); - }); - }); -}); diff --git a/core/src/components/infinite-scroll/test/basic/index.html b/core/src/components/infinite-scroll/test/basic/index.html index f929c930da..b9990acc1d 100644 --- a/core/src/components/infinite-scroll/test/basic/index.html +++ b/core/src/components/infinite-scroll/test/basic/index.html @@ -47,7 +47,7 @@ infiniteScroll.complete(); appendItems(); // Custom event consumed in the e2e tests - document.dispatchEvent(new CustomEvent('ionInfiniteComplete')); + window.dispatchEvent(new CustomEvent('ionInfiniteComplete')); }); function appendItems() { diff --git a/core/src/components/infinite-scroll/test/basic/infinite-scroll.e2e.ts b/core/src/components/infinite-scroll/test/basic/infinite-scroll.e2e.ts new file mode 100644 index 0000000000..899915d0c1 --- /dev/null +++ b/core/src/components/infinite-scroll/test/basic/infinite-scroll.e2e.ts @@ -0,0 +1,22 @@ +import { expect } from '@playwright/test'; +import { test } from '@utils/test/playwright'; + +test.describe('infinite-scroll: basic', () => { + test.beforeEach(({ skip }) => { + skip.rtl(); + skip.mode('ios'); + }); + test('should load more items when scrolled to the bottom', async ({ page }) => { + await page.goto('/src/components/infinite-scroll/test/basic'); + + const ionInfiniteComplete = await page.spyOnEvent('ionInfiniteComplete'); + const content = page.locator('ion-content'); + const items = page.locator('ion-item'); + expect(await items.count()).toBe(30); + + await content.evaluate((el: HTMLIonContentElement) => el.scrollToBottom(0)); + await ionInfiniteComplete.next(); + + expect(await items.count()).toBe(60); + }); +}); diff --git a/core/src/components/infinite-scroll/test/scroll-target/e2e.ts b/core/src/components/infinite-scroll/test/scroll-target/e2e.ts deleted file mode 100644 index 7688639acb..0000000000 --- a/core/src/components/infinite-scroll/test/scroll-target/e2e.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { newE2EPage } from '@stencil/core/testing'; -import type { E2EPage } from '@stencil/core/testing'; -import { scrollToBottom } from '@utils/test'; - -/** - * Scrolls an `ion-content` element to the bottom, triggering the `ionInfinite` event. - * Waits for the custom event to complete. - */ -async function scrollPage(page: E2EPage) { - await scrollToBottom(page, '#scroll-target'); - await page.waitForChanges(); - - const ev = await page.spyOnEvent('ionInfiniteComplete', 'document'); - await ev.next(); -} - -describe('infinite-scroll: custom scroll target', () => { - it('should load more items when scrolled to the bottom', async () => { - const page = await newE2EPage({ - url: '/src/components/infinite-scroll/test/scroll-target?ionic:_testing=true', - }); - - const initialItems = await page.findAll('ion-item'); - expect(initialItems.length).toBe(30); - - await scrollPage(page); - - const items = await page.findAll('ion-item'); - - expect(items.length).toBe(60); - }); -}); diff --git a/core/src/components/infinite-scroll/test/scroll-target/index.html b/core/src/components/infinite-scroll/test/scroll-target/index.html index 0d255ccf06..842f04f22b 100644 --- a/core/src/components/infinite-scroll/test/scroll-target/index.html +++ b/core/src/components/infinite-scroll/test/scroll-target/index.html @@ -51,7 +51,7 @@ infiniteScroll.complete(); appendItems(); // Custom event consumed in the e2e tests - document.dispatchEvent(new CustomEvent('ionInfiniteComplete')); + window.dispatchEvent(new CustomEvent('ionInfiniteComplete')); }); function appendItems() { diff --git a/core/src/components/infinite-scroll/test/scroll-target/infinite-scroll.e2e.ts b/core/src/components/infinite-scroll/test/scroll-target/infinite-scroll.e2e.ts new file mode 100644 index 0000000000..f4ce8bbad0 --- /dev/null +++ b/core/src/components/infinite-scroll/test/scroll-target/infinite-scroll.e2e.ts @@ -0,0 +1,22 @@ +import { expect } from '@playwright/test'; +import { test } from '@utils/test/playwright'; + +test.describe('infinite-scroll: scroll-target', () => { + test.beforeEach(({ skip }) => { + skip.rtl(); + skip.mode('ios'); + }); + test('should load more items when scroll target is scrolled to the bottom', async ({ page }) => { + await page.goto('/src/components/infinite-scroll/test/scroll-target'); + + const ionInfiniteComplete = await page.spyOnEvent('ionInfiniteComplete'); + const content = page.locator('#scroll-target'); + const items = page.locator('ion-item'); + expect(await items.count()).toBe(30); + + await content.evaluate((el: HTMLElement) => (el.scrollTop = el.scrollHeight)); + await ionInfiniteComplete.next(); + + expect(await items.count()).toBe(60); + }); +}); diff --git a/core/src/components/infinite-scroll/test/top/e2e.ts b/core/src/components/infinite-scroll/test/top/e2e.ts deleted file mode 100644 index 3162d587ac..0000000000 --- a/core/src/components/infinite-scroll/test/top/e2e.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { newE2EPage } from '@stencil/core/testing'; - -test('infinite-scroll: basic', async () => { - const page = await newE2EPage({ - url: '/src/components/infinite-scroll/test/basic?ionic:_testing=true', - }); - - const compare = await page.compareScreenshot(); - expect(compare).toMatchScreenshot(); -}); diff --git a/core/src/components/infinite-scroll/test/top/index.html b/core/src/components/infinite-scroll/test/top/index.html index 477a1de63f..766f1143c5 100644 --- a/core/src/components/infinite-scroll/test/top/index.html +++ b/core/src/components/infinite-scroll/test/top/index.html @@ -47,6 +47,8 @@ await wait(500); infiniteScroll.complete(); appendItems(); + // Custom event consumed in the e2e tests + window.dispatchEvent(new CustomEvent('ionInfiniteComplete')); console.log('Done'); }); diff --git a/core/src/components/infinite-scroll/test/top/infinite-scroll.e2e.ts b/core/src/components/infinite-scroll/test/top/infinite-scroll.e2e.ts new file mode 100644 index 0000000000..0df5558343 --- /dev/null +++ b/core/src/components/infinite-scroll/test/top/infinite-scroll.e2e.ts @@ -0,0 +1,22 @@ +import { expect } from '@playwright/test'; +import { test } from '@utils/test/playwright'; + +test.describe('infinite-scroll: top', () => { + test.beforeEach(({ skip }) => { + skip.rtl(); + skip.mode('ios'); + }); + test('should load more items when scrolled to the top', async ({ page }) => { + await page.goto('/src/components/infinite-scroll/test/top'); + + const ionInfiniteComplete = await page.spyOnEvent('ionInfiniteComplete'); + const content = page.locator('ion-content'); + const items = page.locator('ion-item'); + expect(await items.count()).toBe(30); + + await content.evaluate((el: HTMLIonContentElement) => el.scrollToTop(0)); + await ionInfiniteComplete.next(); + + expect(await items.count()).toBe(60); + }); +}); diff --git a/core/src/components/item-divider/test/spec/e2e.ts b/core/src/components/item-divider/test/spec/e2e.ts deleted file mode 100644 index c3db9eb854..0000000000 --- a/core/src/components/item-divider/test/spec/e2e.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { newE2EPage } from '@stencil/core/testing'; - -test('item-divider: spec', async () => { - const page = await newE2EPage({ - url: '/src/components/item-divider/test/spec?ionic:_testing=true', - }); - - const compare = await page.compareScreenshot(); - expect(compare).toMatchScreenshot(); -}); - -test('item-divider: spec-rtl', async () => { - const page = await newE2EPage({ - url: '/src/components/item-divider/test/spec?ionic:_testing=true&rtl=true', - }); - - const compare = await page.compareScreenshot(); - expect(compare).toMatchScreenshot(); -}); diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts b/core/src/components/item-divider/test/spec/item-divider.e2e.ts new file mode 100644 index 0000000000..b10a6535a2 --- /dev/null +++ b/core/src/components/item-divider/test/spec/item-divider.e2e.ts @@ -0,0 +1,14 @@ +import { expect } from '@playwright/test'; +import { test } from '@utils/test/playwright'; + +test.describe('item-divider: spec', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/src/components/item-divider/test/spec'); + }); + + test('should not have visual regressions', async ({ page }) => { + await page.setIonViewport(); + + expect(await page.screenshot()).toMatchSnapshot(`list-item-divider-${page.getSnapshotSettings()}.png`); + }); +}); diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..80ae167dca Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..0fa4f6fe18 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Safari-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..0c5165cf79 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Chrome-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..ecc6c3c0e8 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Firefox-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..63c296e4bb Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Safari-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..41f0a612d9 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-ios-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Chrome-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..b5c7202640 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Firefox-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..a7331cc123 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Safari-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..e5a2c920f9 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Chrome-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..0d8e0886e6 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Chrome-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Firefox-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..7d58248890 Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Firefox-linux.png differ diff --git a/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Safari-linux.png b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Safari-linux.png new file mode 100644 index 0000000000..edb615701a Binary files /dev/null and b/core/src/components/item-divider/test/spec/item-divider.e2e.ts-snapshots/list-item-divider-md-rtl-Mobile-Safari-linux.png differ diff --git a/core/src/components/item/item.tsx b/core/src/components/item/item.tsx index d58c66e869..f25ac50790 100644 --- a/core/src/components/item/item.tsx +++ b/core/src/components/item/item.tsx @@ -5,7 +5,8 @@ import { chevronForward } from 'ionicons/icons'; import { getIonMode } from '../../global/ionic-global'; import type { AnimationBuilder, Color, CssClassMap, RouterDirection, StyleEventDetail } from '../../interface'; import type { AnchorInterface, ButtonInterface } from '../../utils/element-interface'; -import { raf } from '../../utils/helpers'; +import type { Attributes } from '../../utils/helpers'; +import { inheritAttributes, raf } from '../../utils/helpers'; import { printIonError } from '../../utils/logging'; import { createColorClasses, hostContext, openURL } from '../../utils/theme'; import type { InputChangeEventDetail } from '../input/input-interface'; @@ -38,6 +39,7 @@ export class Item implements ComponentInterface, AnchorInterface, ButtonInterfac private labelColorStyles = {}; private itemStyles = new Map(); private clickListener?: (ev: Event) => void; + private inheritedAriaAttributes: Attributes = {}; @Element() el!: HTMLIonItemElement; @@ -226,6 +228,7 @@ export class Item implements ComponentInterface, AnchorInterface, ButtonInterfac componentDidLoad() { raf(() => { + this.inheritedAriaAttributes = inheritAttributes(this.el, ['aria-label']); this.setMultipleInputs(); this.focusable = this.isFocusable(); }); @@ -359,12 +362,14 @@ export class Item implements ComponentInterface, AnchorInterface, ButtonInterfac target, routerAnimation, routerDirection, + inheritedAriaAttributes, } = this; const childStyles = {} as any; const mode = getIonMode(this); const clickable = this.isClickable(); const canActivate = this.canActivate(); const TagType = clickable ? (href === undefined ? 'button' : 'a') : ('div' as any); + const attrs = TagType === 'button' ? { type: this.type } @@ -390,6 +395,7 @@ export class Item implements ComponentInterface, AnchorInterface, ButtonInterfac const ariaDisabled = disabled || childStyles['item-interactive-disabled'] ? 'true' : null; const fillValue = fill || 'none'; const inList = hostContext('ion-list', this.el); + return ( - +
diff --git a/core/src/components/radio-group/radio-group.tsx b/core/src/components/radio-group/radio-group.tsx index a1d7560150..8dbdcaba87 100644 --- a/core/src/components/radio-group/radio-group.tsx +++ b/core/src/components/radio-group/radio-group.tsx @@ -4,6 +4,12 @@ import { Component, Element, Event, Host, Listen, Prop, Watch, h } from '@stenci import { getIonMode } from '../../global/ionic-global'; import type { RadioGroupChangeEventDetail } from '../../interface'; +/** + * The Radio Group component mandates that only one radio button + * within the group can be selected at any given time. Since `ion-radio` + * is a shadow DOM component, it cannot natively perform this behavior + * using the `name` attribute. + */ @Component({ tag: 'ion-radio-group', }) diff --git a/core/src/components/segment/segment.md.scss b/core/src/components/segment/segment.md.scss index 0f99d548a7..6c299e0ff7 100644 --- a/core/src/components/segment/segment.md.scss +++ b/core/src/components/segment/segment.md.scss @@ -8,10 +8,23 @@ --background: transparent; } +// Segment: In Toolbar +// -------------------------------------------------- + +:host(.in-toolbar) { + /** + * Segment should inherit the + * height of the toolbar. + * Note: --min-height is initially + * set on ion-toolbar, not ion-segment + */ + min-height: var(--min-height); +} + // Segment: Scrollable // -------------------------------------------------- :host(.segment-scrollable) ::slotted(ion-segment-button) { min-width: auto; -} \ No newline at end of file +} diff --git a/core/src/components/segment/test/toolbar/segment.e2e.ts b/core/src/components/segment/test/toolbar/segment.e2e.ts index 917f54b587..17a5c15c18 100644 --- a/core/src/components/segment/test/toolbar/segment.e2e.ts +++ b/core/src/components/segment/test/toolbar/segment.e2e.ts @@ -38,5 +38,33 @@ test.describe('segment: toolbar', () => { expect(await header.screenshot()).toMatchSnapshot(`segment-toolbar-color-${page.getSnapshotSettings()}.png`); }); + + test('should not inherit height when segment is MD and toolbar is iOS', async ({ page, skip }) => { + skip.rtl(); + skip.mode('ios', 'We manually set the mode in this test, so the automatic mode switching is not needed'); + + test.info().annotations.push({ + type: 'issue', + description: 'https://github.com/ionic-team/ionic-framework/issues/18617', + }); + + await page.setContent(` + + + + First + Second + Third + + + + `); + + const header = page.locator('ion-header'); + + expect(await header.screenshot()).toMatchSnapshot( + `segment-toolbar-height-inherit-${page.getSnapshotSettings()}.png` + ); + }); }); }); diff --git a/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Chrome-linux.png b/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Chrome-linux.png new file mode 100644 index 0000000000..58ac72b3e2 Binary files /dev/null and b/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Chrome-linux.png differ diff --git a/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Firefox-linux.png b/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Firefox-linux.png new file mode 100644 index 0000000000..8394553b5c Binary files /dev/null and b/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Firefox-linux.png differ diff --git a/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Safari-linux.png b/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Safari-linux.png new file mode 100644 index 0000000000..f84d4a8c1d Binary files /dev/null and b/core/src/components/segment/test/toolbar/segment.e2e.ts-snapshots/segment-toolbar-height-inherit-md-ltr-Mobile-Safari-linux.png differ diff --git a/core/src/components/toolbar/toolbar.md.scss b/core/src/components/toolbar/toolbar.md.scss index 1f5f528104..9caf76c144 100644 --- a/core/src/components/toolbar/toolbar.md.scss +++ b/core/src/components/toolbar/toolbar.md.scss @@ -27,15 +27,6 @@ max-width: 100%; } - -// Toolbar: Segment -// -------------------------------------------------- - -::slotted(ion-segment) { - min-height: var(--min-height); -} - - // Material Design Toolbar Buttons // -------------------------------------------------- diff --git a/core/src/themes/ionic.globals.scss b/core/src/themes/ionic.globals.scss index cfcc50971d..f1b86c82ca 100644 --- a/core/src/themes/ionic.globals.scss +++ b/core/src/themes/ionic.globals.scss @@ -19,9 +19,6 @@ $font-family-base: var(--ion-font-family, inherit) !default; // Global app direction $app-direction: null !default; -// Global font path -$font-path: "/dist/fonts" !default; - // Hairlines width $hairlines-width: .55px !default; diff --git a/core/src/utils/helpers.spec.ts b/core/src/utils/helpers.spec.ts new file mode 100644 index 0000000000..44dd9d8c3c --- /dev/null +++ b/core/src/utils/helpers.spec.ts @@ -0,0 +1,42 @@ +import { inheritAriaAttributes } from './helpers'; + +describe('inheritAriaAttributes', () => { + it('should inherit aria attributes', () => { + const parent = document.createElement('div'); + parent.setAttribute('aria-label', 'parent'); + parent.setAttribute('aria-hidden', 'true'); + parent.setAttribute('role', 'button'); + + const inheritedAriaAttributes = inheritAriaAttributes(parent); + + expect(inheritedAriaAttributes).toEqual({ + 'aria-label': 'parent', + 'aria-hidden': 'true', + role: 'button', + }); + }); + + it('should not inherit non-aria attributes', () => { + const parent = document.createElement('button'); + parent.setAttribute('type', 'submit'); + + const inheritedAriaAttributes = inheritAriaAttributes(parent); + + expect(inheritedAriaAttributes).toEqual({}); + }); + + it('attributes that are ignored should not be returned', () => { + const parent = document.createElement('div'); + parent.setAttribute('aria-label', 'parent'); + parent.setAttribute('aria-hidden', 'true'); + parent.setAttribute('role', 'button'); + + const ignoreList = ['aria-hidden']; + const inheritedAriaAttributes = inheritAriaAttributes(parent, ignoreList); + + expect(inheritedAriaAttributes).toEqual({ + 'aria-label': 'parent', + role: 'button', + }); + }); +}); diff --git a/core/src/utils/helpers.ts b/core/src/utils/helpers.ts index 740089a4c1..b29e7b92f9 100644 --- a/core/src/utils/helpers.ts +++ b/core/src/utils/helpers.ts @@ -167,9 +167,15 @@ const ariaAttributes = [ * Returns an array of aria attributes that should be copied from * the shadow host element to a target within the light DOM. * @param el The element that the attributes should be copied from. + * @param ignoreList The list of aria-attributes to ignore reflecting and removing from the host. + * Use this in instances where we manually specify aria attributes on the `` element. */ -export const inheritAriaAttributes = (el: HTMLElement) => { - return inheritAttributes(el, ariaAttributes); +export const inheritAriaAttributes = (el: HTMLElement, ignoreList?: string[]) => { + let attributesToInherit = ariaAttributes; + if (ignoreList && ignoreList.length > 0) { + attributesToInherit = attributesToInherit.filter((attr) => !ignoreList.includes(attr)); + } + return inheritAttributes(el, attributesToInherit); }; export const addEventListener = (el: any, eventName: string, callback: any, opts?: any) => { diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 32dc44fa6c..386175139e 100644 --- a/docs/CHANGELOG.md +++ b/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. +## [6.3.1](https://github.com/ionic-team/ionic-docs/compare/v6.3.0...v6.3.1) (2022-10-12) + +**Note:** Version bump only for package @ionic/docs + + + + + # [6.3.0](https://github.com/ionic-team/ionic-docs/compare/v6.2.9...v6.3.0) (2022-10-05) **Note:** Version bump only for package @ionic/docs diff --git a/docs/package-lock.json b/docs/package-lock.json index c3b5515370..449885a1fa 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/docs", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/docs", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT" } } diff --git a/docs/package.json b/docs/package.json index 89ebbe3b72..609f6871ed 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "6.3.0", + "version": "6.3.1", "description": "Pre-packaged API documentation for the Ionic docs.", "main": "core.json", "types": "core.d.ts", diff --git a/lerna.json b/lerna.json index 15befd726c..4f05ea097b 100644 --- a/lerna.json +++ b/lerna.json @@ -5,5 +5,5 @@ "angular", "packages/*" ], - "version": "6.3.0" + "version": "6.3.1" } diff --git a/packages/angular-server/CHANGELOG.md b/packages/angular-server/CHANGELOG.md index af33535490..dd0e20363d 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. +## [6.3.1](https://github.com/ionic-team/ionic/compare/v6.3.0...v6.3.1) (2022-10-12) + +**Note:** Version bump only for package @ionic/angular-server + + + + + # [6.3.0](https://github.com/ionic-team/ionic/compare/v6.2.9...v6.3.0) (2022-10-05) **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 02ca4e18ea..9bff20fea0 100644 --- a/packages/angular-server/package-lock.json +++ b/packages/angular-server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ionic/angular-server", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/angular-server", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT", "devDependencies": { "@angular-eslint/eslint-plugin": "^12.6.1", @@ -18,7 +18,7 @@ "@angular/platform-browser": "^12.0.0", "@angular/platform-browser-dynamic": "^12.2.10", "@angular/platform-server": "^12.0.0", - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", "@typescript-eslint/eslint-plugin": "^5.2.0", @@ -786,9 +786,9 @@ "license": "BSD-3-Clause" }, "node_modules/@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dev": true, "dependencies": { "@stencil/core": "^2.18.0", @@ -7116,9 +7116,9 @@ "dev": true }, "@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dev": true, "requires": { "@stencil/core": "^2.18.0", diff --git a/packages/angular-server/package.json b/packages/angular-server/package.json index d55767c805..b42f04242f 100644 --- a/packages/angular-server/package.json +++ b/packages/angular-server/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular-server", - "version": "6.3.0", + "version": "6.3.1", "description": "Angular SSR Module for Ionic", "keywords": [ "ionic", @@ -56,7 +56,7 @@ "@angular/platform-browser": "^12.0.0", "@angular/platform-browser-dynamic": "^12.2.10", "@angular/platform-server": "^12.0.0", - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "@ionic/eslint-config": "^0.3.0", "@ionic/prettier-config": "^2.0.0", "@typescript-eslint/eslint-plugin": "^5.2.0", diff --git a/packages/react-router/CHANGELOG.md b/packages/react-router/CHANGELOG.md index b1d69c9b2e..b30ec5e556 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. +## [6.3.1](https://github.com/ionic-team/ionic/compare/v6.3.0...v6.3.1) (2022-10-12) + +**Note:** Version bump only for package @ionic/react-router + + + + + # [6.3.0](https://github.com/ionic-team/ionic/compare/v6.2.9...v6.3.0) (2022-10-05) **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 e8339cda2e..989438686e 100644 --- a/packages/react-router/package-lock.json +++ b/packages/react-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react-router", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react-router", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT", "dependencies": { - "@ionic/react": "^6.3.0", + "@ionic/react": "^6.3.1", "tslib": "*" }, "devDependencies": { @@ -147,9 +147,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -157,11 +157,11 @@ } }, "node_modules/@ionic/react": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-6.3.0.tgz", - "integrity": "sha512-h84M4HnhopKA7+vfnmB6zoOGJbun74LP1XtXluGi15Bi/buXCeBtHdgLunzLW50G/JMI6QvksyyQa/bhgRI+Eg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-6.3.1.tgz", + "integrity": "sha512-8Omxifn+b6wXjfm/+OH+AzKpFsR7xn0u8dxaAKeT66txh4fA7DBMgzEPBOe5+VvWarWI6B7cElX/7Xq8qJNwbw==", "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2", "tslib": "*" }, @@ -1157,9 +1157,9 @@ } }, "@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "requires": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -1167,11 +1167,11 @@ } }, "@ionic/react": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-6.3.0.tgz", - "integrity": "sha512-h84M4HnhopKA7+vfnmB6zoOGJbun74LP1XtXluGi15Bi/buXCeBtHdgLunzLW50G/JMI6QvksyyQa/bhgRI+Eg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-6.3.1.tgz", + "integrity": "sha512-8Omxifn+b6wXjfm/+OH+AzKpFsR7xn0u8dxaAKeT66txh4fA7DBMgzEPBOe5+VvWarWI6B7cElX/7Xq8qJNwbw==", "requires": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2", "tslib": "*" } diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 7cc02b444c..0ea8fa77b3 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react-router", - "version": "6.3.0", + "version": "6.3.1", "description": "React Router wrapper for @ionic/react", "keywords": [ "ionic", @@ -37,7 +37,7 @@ "dist/" ], "dependencies": { - "@ionic/react": "^6.3.0", + "@ionic/react": "^6.3.1", "tslib": "*" }, "peerDependencies": { diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index f919fdeaa5..e64b146470 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/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. +## [6.3.1](https://github.com/ionic-team/ionic/compare/v6.3.0...v6.3.1) (2022-10-12) + +**Note:** Version bump only for package @ionic/react + + + + + # [6.3.0](https://github.com/ionic-team/ionic/compare/v6.2.9...v6.3.0) (2022-10-05) **Note:** Version bump only for package @ionic/react diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json index 50e5efc329..55958a634e 100644 --- a/packages/react/package-lock.json +++ b/packages/react/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/react", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/react", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT", "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2", "tslib": "*" }, @@ -607,9 +607,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -9534,9 +9534,9 @@ } }, "@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "requires": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", diff --git a/packages/react/package.json b/packages/react/package.json index 1f0a5558ad..831e4d5b6a 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/react", - "version": "6.3.0", + "version": "6.3.1", "description": "React specific wrapper for @ionic/core", "keywords": [ "ionic", @@ -41,7 +41,7 @@ "css/" ], "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2", "tslib": "*" }, diff --git a/packages/vue-router/CHANGELOG.md b/packages/vue-router/CHANGELOG.md index 2c04edf8ba..3439047e9e 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. +## [6.3.1](https://github.com/ionic-team/ionic/compare/v6.3.0...v6.3.1) (2022-10-12) + +**Note:** Version bump only for package @ionic/vue-router + + + + + # [6.3.0](https://github.com/ionic-team/ionic/compare/v6.2.9...v6.3.0) (2022-10-05) **Note:** Version bump only for package @ionic/vue-router diff --git a/packages/vue-router/package-lock.json b/packages/vue-router/package-lock.json index ef206e0c50..a00addca22 100644 --- a/packages/vue-router/package-lock.json +++ b/packages/vue-router/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue-router", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue-router", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT", "dependencies": { - "@ionic/vue": "^6.3.0" + "@ionic/vue": "^6.3.1" }, "devDependencies": { "@types/jest": "^28.1.1", @@ -578,9 +578,9 @@ "dev": true }, "node_modules/@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -588,11 +588,11 @@ } }, "node_modules/@ionic/vue": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-6.3.0.tgz", - "integrity": "sha512-9D7bK8xZ/qa6gWShgvBRCFSmwkZBN7RkJF1ItmNQXl1msszRjqi7W/++AsTjjGmqpWbupNkwwxZWP7IzN7vcjA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-6.3.1.tgz", + "integrity": "sha512-QFPF9Pshg4Ns3UDrbA+vGA1QyadIvW0r1Gct6Rv9S/eAfHMOXfAiaIqUgTy0BrFjcR+VCgiCZzg1atEvU0XvyA==", "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2" } }, @@ -5233,9 +5233,9 @@ "dev": true }, "@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "requires": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -5243,11 +5243,11 @@ } }, "@ionic/vue": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-6.3.0.tgz", - "integrity": "sha512-9D7bK8xZ/qa6gWShgvBRCFSmwkZBN7RkJF1ItmNQXl1msszRjqi7W/++AsTjjGmqpWbupNkwwxZWP7IzN7vcjA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-6.3.1.tgz", + "integrity": "sha512-QFPF9Pshg4Ns3UDrbA+vGA1QyadIvW0r1Gct6Rv9S/eAfHMOXfAiaIqUgTy0BrFjcR+VCgiCZzg1atEvU0XvyA==", "requires": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2" } }, diff --git a/packages/vue-router/package.json b/packages/vue-router/package.json index 141ffdbc5e..f990db60a5 100644 --- a/packages/vue-router/package.json +++ b/packages/vue-router/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue-router", - "version": "6.3.0", + "version": "6.3.1", "description": "Vue Router integration for @ionic/vue", "scripts": { "prepublishOnly": "npm run build", @@ -44,7 +44,7 @@ }, "homepage": "https://github.com/ionic-team/ionic#readme", "dependencies": { - "@ionic/vue": "^6.3.0" + "@ionic/vue": "^6.3.1" }, "devDependencies": { "@types/jest": "^28.1.1", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 8b9bd9951b..51a1cac0a1 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/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. +## [6.3.1](https://github.com/ionic-team/ionic/compare/v6.3.0...v6.3.1) (2022-10-12) + +**Note:** Version bump only for package @ionic/vue + + + + + # [6.3.0](https://github.com/ionic-team/ionic/compare/v6.2.9...v6.3.0) (2022-10-05) diff --git a/packages/vue/package-lock.json b/packages/vue/package-lock.json index fd383c0482..d24d676411 100644 --- a/packages/vue/package-lock.json +++ b/packages/vue/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ionic/vue", - "version": "6.3.0", + "version": "6.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ionic/vue", - "version": "6.3.0", + "version": "6.3.1", "license": "MIT", "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2" }, "devDependencies": { @@ -59,9 +59,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", @@ -768,9 +768,9 @@ } }, "@ionic/core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.0.tgz", - "integrity": "sha512-6MR0hOdIM6sQyZyXez3/jWAnHScrZKaQxzGT2XiXXIpBrKztNdeAhqDLXoxbDU1PLyDnXXPWBzT6xZ698gG67g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.3.1.tgz", + "integrity": "sha512-OpmGQQ/sGtoXW4PQRvRjYa9mTlAmAWwFMu8g/1rcdAPaTQQAlRnfZ62wYYqmChLSFlVbn6mCleeljzR9FaYrAg==", "requires": { "@stencil/core": "^2.18.0", "ionicons": "^6.0.3", diff --git a/packages/vue/package.json b/packages/vue/package.json index 0fcd063f01..91632f5182 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/vue", - "version": "6.3.0", + "version": "6.3.1", "description": "Vue specific wrapper for @ionic/core", "scripts": { "prepublishOnly": "npm run build", @@ -61,7 +61,7 @@ "vue-router": "^4.0.16" }, "dependencies": { - "@ionic/core": "^6.3.0", + "@ionic/core": "^6.3.1", "ionicons": "^6.0.2" }, "vetur": {