Compare commits

..

43 Commits

Author SHA1 Message Date
Liam DeBeasi
ba2a3b80c1 add scss test 2024-01-05 13:46:28 -05:00
Liam DeBeasi
e29d8e6bae scss test 2024-01-05 11:26:30 -05:00
Liam DeBeasi
4ccc150edf fix(input): slotted buttons are clickable (#28772)
Issue number: resolves #28762

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

Focused inputs have `pointer-events: none`. This code was added in
e27452b789
to address https://github.com/ionic-team/ionic-framework/issues/5536.
However, this causes slotted buttons to not be clickable when the input
is focused because pointer events have been removed.

This also causes the input to blur whenever you tap the label text.

This behavior only exists on `ion-input`. Textarea is not affected.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

This code was added several years ago for the (now) legacy syntax. I
don't have full confidence that this won't break the legacy input
because there's not a lot of context around why specifically this code
was added. As a result, I scoped these styles only to the legacy input.
- Slotted buttons can now be clicked when the input is focused.
- Tapping the label when an input is focused keeps the input focused.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

**Testing:**

1. I manually verified that scroll assist still works with the modern
input.
2. I manually verified that the input remains focused after tapping the
label.

Dev build: `7.6.3-dev.11704229014.12cdc767`
2024-01-03 21:16:26 +00:00
Liam DeBeasi
fbada1d170 merge release-7.6.3
Release 7.6.3
2024-01-03 11:44:05 -05:00
Liam DeBeasi
b2e40cdcb8 chore: update package lock files 2024-01-03 09:57:18 -05:00
ionitron
ebb9ae9c11 v7.6.3 2024-01-03 14:52:37 +00:00
Liam DeBeasi
75ffeee933 fix(radio-group): radio disabled prop can be undefined (#28712)
Issue number: resolves #28677

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

Defining disabled a `@Prop() disabled = false` causes Stencil to mark
this property as optional. This behavior is not desired on our end, but
making the property required would be a breaking change. Additionally,
the root issue is due to how Stencil resolves types.

For example, `disabled` is [optional in the LocalJSX
namespace](e96a1457a3/core/src/components.d.ts (L6921))
but [required in the Components
namespace](e96a1457a3/core/src/components.d.ts (L2239)).
Addressing this inside of Stencil is significant breaking change. As a
result, the team has decided to compromise and support the falsy
`disabled` state for radio for now. Other Ionic components that support
the `disabled` prop also check for falsy values.

Stencil plans to de-risk this in
https://ionic-cloud.atlassian.net/browse/STENCIL-917.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Radio Group now looks at falsy values instead of strictly checking
`false`.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->


Dev build: `7.6.2-dev.11703182244.1165aeec`
2023-12-28 17:14:01 +00:00
Liam DeBeasi
da820b830e chore: start holiday triage 2023 (#28757)
This PR begins holiday triage mode for the Ionic Framework repo.
2023-12-21 21:48:19 +00:00
Liam DeBeasi
878eec6ea2 fix(nav, router-outlet): ios page transition does not cover menu on larger screens (#28745)
Issue number: resolves #28737

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

In https://github.com/ionic-team/ionic-framework/pull/28246 we removed
the overflow on Nav and Router Outlet to allow content to flow outside
of these containers. This allows the translucent tab effect to work
(otherwise content would be clipped and there would be no translucency).
However, this had the unintended side effect of causing page transitions
to flow outside of these components. This is most noticeable on larger
displays when using SplitPane because the page can cover the menu
mid-transition.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Overflow is no longer allowed on the main content. I originally set
the overflow on the router outlet/nav itself, but that caused the
translucent tab bar behavior to regress. Since this issue only happens
with split pane, I decided to apply the fix there.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

### Dev build
`7.6.3-dev.11703103144.148eb1f6`

⚠️ Please test in a physical app too

### Before/After Demo

| `main` | branch |
| - | - |
| <video
src="https://github.com/ionic-team/ionic-framework/assets/2721089/2f3f0d74-9a7e-4ebe-b58a-6e1a6ea3636e"></video>
| <video
src="https://github.com/ionic-team/ionic-framework/assets/2721089/cdbf8fb5-e217-48cf-8c1e-4bdecee4de4c"></video>
|

### Screenshot Diffs

The `menu-custom` screenshot diffs
([Example](https://github.com/ionic-team/ionic-framework/pull/28745/files))
are correct. By adding `overflow: hidden`, the box shadow from the
"Content" header no longer flows outside of the container.

The menu [border on MD has an opacity of
0.18](e5226016a0/core/src/components/menu/menu.md.vars.scss (L7)),
so the border color was mixing with the color of the box shadow from the
header.

Since the shadow no longer flows outside of the container, the border
color does not mix with the box shadow color.

### Does this break translucent tabs when the split pane is inside of a
tab?

No. The [split pane has `contain: strict`
set](e5226016a0/core/src/components/split-pane/split-pane.scss (L24))
which prevents content from flowing under the tab bar, so the
translucent tab bar never worked with this layout.

---------

Co-authored-by: ionitron <hi@ionicframework.com>
2023-12-21 18:17:05 +00:00
dependabot[bot]
e96a1457a3 chore(deps-dev): Bump @capacitor/core from 5.5.1 to 5.6.0 in /core (#28706)
Bumps [@capacitor/core](https://github.com/ionic-team/capacitor) from
5.5.1 to 5.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/capacitor/releases"><code>@​capacitor/core</code>'s
releases</a>.</em></p>
<blockquote>
<h2>5.6.0</h2>
<h1><a
href="https://github.com/ionic-team/capacitor/compare/5.5.1...5.6.0">5.6.0</a>
(2023-12-14)</h1>
<h3>Bug Fixes</h3>
<ul>
<li><strong>cli:</strong> Use latest native-run (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7030">#7030</a>)
(<a
href="1d948d4df6">1d948d4</a>)</li>
<li><strong>http:</strong> properly write form-urlencoded data on
android request body (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7130">#7130</a>)
(<a
href="a745a89e18">a745a89</a>)</li>
<li><strong>http:</strong> set formdata boundary and body when
content-type not explicitly set (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7133">#7133</a>)
(<a
href="3862d6e672">3862d6e</a>)</li>
<li><strong>ios:</strong> add some new cordova-ios classes used by
Cordova plugins (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7115">#7115</a>)
(<a
href="5fb902b232">5fb902b</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>support for Amazon Fire WebView (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/6603">#6603</a>)
(<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7129">#7129</a>)
(<a
href="421d2c02e4">421d2c0</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/capacitor/blob/5.6.0/CHANGELOG.md"><code>@​capacitor/core</code>'s
changelog</a>.</em></p>
<blockquote>
<h1><a
href="https://github.com/ionic-team/capacitor/compare/5.5.1...5.6.0">5.6.0</a>
(2023-12-14)</h1>
<h3>Bug Fixes</h3>
<ul>
<li><strong>cli:</strong> Use latest native-run (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7030">#7030</a>)
(<a
href="1d948d4df6">1d948d4</a>)</li>
<li><strong>http:</strong> properly write form-urlencoded data on
android request body (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7130">#7130</a>)
(<a
href="a745a89e18">a745a89</a>)</li>
<li><strong>http:</strong> set formdata boundary and body when
content-type not explicitly set (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7133">#7133</a>)
(<a
href="3862d6e672">3862d6e</a>)</li>
<li><strong>ios:</strong> add some new cordova-ios classes used by
Cordova plugins (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7115">#7115</a>)
(<a
href="5fb902b232">5fb902b</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>support for Amazon Fire WebView (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/6603">#6603</a>)
(<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7129">#7129</a>)
(<a
href="421d2c02e4">421d2c0</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="12cdab84fc"><code>12cdab8</code></a>
Release 5.6.0</li>
<li><a
href="421d2c02e4"><code>421d2c0</code></a>
feat: support for Amazon Fire WebView (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/6603">#6603</a>)
(<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7129">#7129</a>)</li>
<li><a
href="a745a89e18"><code>a745a89</code></a>
fix(http): properly write form-urlencoded data on android request body
(<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7130">#7130</a>)</li>
<li><a
href="dfc97ee2d8"><code>dfc97ee</code></a>
docs(http): FormData and other complex types do not work on
CapacitorHttp plu...</li>
<li><a
href="3862d6e672"><code>3862d6e</code></a>
fix(http): set formdata boundary and body when content-type not
explicitly se...</li>
<li><a
href="5fb902b232"><code>5fb902b</code></a>
fix(ios): add some new cordova-ios classes used by Cordova plugins (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7115">#7115</a>)</li>
<li><a
href="7977a6da48"><code>7977a6d</code></a>
chore(android): Update json test dependency (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7102">#7102</a>)</li>
<li><a
href="13935f0c3b"><code>13935f0</code></a>
docs: add warning around androidScheme with Android webview 117 (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7098">#7098</a>)</li>
<li><a
href="8d97b800ca"><code>8d97b80</code></a>
chore(android): Mock Log class for tests (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7099">#7099</a>)</li>
<li><a
href="1d948d4df6"><code>1d948d4</code></a>
fix(cli): Use latest native-run (<a
href="https://redirect.github.com/ionic-team/capacitor/issues/7030">#7030</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/ionic-team/capacitor/compare/5.5.1...5.6.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@capacitor/core&package-manager=npm_and_yarn&previous-version=5.5.1&new-version=5.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-21 14:34:26 +00:00
dependabot[bot]
c794583abf chore(deps-dev): Bump @stencil/sass from 3.0.7 to 3.0.8 in /core (#28731)
Bumps [@stencil/sass](https://github.com/ionic-team/stencil-sass) from
3.0.7 to 3.0.8.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/stencil-sass/releases"><code>@​stencil/sass</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v3.0.8</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): update actions/setup-node action to v3.8.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/423">ionic-team/stencil-sass#423</a></li>
<li>chore(deps): update actions/setup-node action to v4 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/425">ionic-team/stencil-sass#425</a></li>
<li>chore(deps): update dependency <code>@​stencil/core</code> to v4.6.0
by <a href="https://github.com/renovate"><code>@​renovate</code></a> in
<a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/424">ionic-team/stencil-sass#424</a></li>
<li>chore(deps): update node.js to v20.9.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/426">ionic-team/stencil-sass#426</a></li>
<li>chore(deps): update dependency rollup to v4.1.5 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/427">ionic-team/stencil-sass#427</a></li>
<li>chore(deps): update dependency rollup to v4.1.6 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/430">ionic-team/stencil-sass#430</a></li>
<li>chore(deps): update dependency <code>@​stencil/core</code> to v4.7.0
by <a href="https://github.com/renovate"><code>@​renovate</code></a> in
<a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/428">ionic-team/stencil-sass#428</a></li>
<li>chore(deps): update dependency terser to v5.23.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/429">ionic-team/stencil-sass#429</a></li>
<li>chore(deps): update dependency terser to v5.24.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/433">ionic-team/stencil-sass#433</a></li>
<li>chore(deps): update dependency rollup to v4.2.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/432">ionic-team/stencil-sass#432</a></li>
<li>chore(deps): update dependency npm to v10.2.3 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/431">ionic-team/stencil-sass#431</a></li>
<li>chore(deps): update dependency rollup to v4.3.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/434">ionic-team/stencil-sass#434</a></li>
<li>chore(deps): update dependency <code>@​stencil/core</code> to v4.7.1
by <a href="https://github.com/renovate"><code>@​renovate</code></a> in
<a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/435">ionic-team/stencil-sass#435</a></li>
<li>chore(deps): update dependency rollup to v4.3.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/436">ionic-team/stencil-sass#436</a></li>
<li>chore(deps): update dependency rollup to v4.4.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/437">ionic-team/stencil-sass#437</a></li>
<li>chore(deps): update dependency prettier to v3.1.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/438">ionic-team/stencil-sass#438</a></li>
<li>chore(deps): update dependency <code>@​stencil/core</code> to v4.7.2
by <a href="https://github.com/renovate"><code>@​renovate</code></a> in
<a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/439">ionic-team/stencil-sass#439</a></li>
<li>chore(deps): update dependency rollup to v4.4.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/440">ionic-team/stencil-sass#440</a></li>
<li>chore(deps): update dependency npm to v10.2.4 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/441">ionic-team/stencil-sass#441</a></li>
<li>chore(deps): update dependency <code>@​stencil/core</code> to v4.8.0
by <a href="https://github.com/renovate"><code>@​renovate</code></a> in
<a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/444">ionic-team/stencil-sass#444</a></li>
<li>chore(deps): update dependency np to v9 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/445">ionic-team/stencil-sass#445</a></li>
<li>chore(deps): update dependency <code>@​stencil/core</code> to v4.8.1
by <a href="https://github.com/renovate"><code>@​renovate</code></a> in
<a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/446">ionic-team/stencil-sass#446</a></li>
<li>chore(deps): update dependency terser to v5.25.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/447">ionic-team/stencil-sass#447</a></li>
<li>chore(deps): update dependency np to v9.1.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/449">ionic-team/stencil-sass#449</a></li>
<li>chore(deps): update dependency npm to v10.2.5 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/448">ionic-team/stencil-sass#448</a></li>
<li>chore(deps): update dependency terser to v5.26.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/450">ionic-team/stencil-sass#450</a></li>
<li>chore(deps): update dependency <code>@​stencil/core</code> to v4.8.2
by <a href="https://github.com/renovate"><code>@​renovate</code></a> in
<a
href="https://redirect.github.com/ionic-team/stencil-sass/pull/453">ionic-team/stencil-sass#453</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/ionic-team/stencil-sass/compare/v3.0.7...v3.0.8">https://github.com/ionic-team/stencil-sass/compare/v3.0.7...v3.0.8</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5132964c48"><code>5132964</code></a>
3.0.8</li>
<li><a
href="9709fe2435"><code>9709fe2</code></a>
chore(deps): update dependency <code>@​stencil/core</code> to v4.8.2 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/453">#453</a>)</li>
<li><a
href="59591b16a3"><code>59591b1</code></a>
chore(deps): update dependency terser to v5.26.0 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/450">#450</a>)</li>
<li><a
href="cc7d97f7d9"><code>cc7d97f</code></a>
chore(deps): update dependency npm to v10.2.5 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/448">#448</a>)</li>
<li><a
href="838cd61da7"><code>838cd61</code></a>
chore(deps): update dependency np to v9.1.0 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/449">#449</a>)</li>
<li><a
href="e53802422e"><code>e538024</code></a>
chore(deps): update dependency terser to v5.25.0 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/447">#447</a>)</li>
<li><a
href="4d7ff18177"><code>4d7ff18</code></a>
chore(deps): update dependency <code>@​stencil/core</code> to v4.8.1 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/446">#446</a>)</li>
<li><a
href="f9b99826db"><code>f9b9982</code></a>
chore(deps): update dependency np to v9 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/445">#445</a>)</li>
<li><a
href="b4d8158a98"><code>b4d8158</code></a>
chore(deps): update dependency <code>@​stencil/core</code> to v4.8.0 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/444">#444</a>)</li>
<li><a
href="d286409521"><code>d286409</code></a>
chore(deps): update dependency npm to v10.2.4 (<a
href="https://redirect.github.com/ionic-team/stencil-sass/issues/441">#441</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/ionic-team/stencil-sass/compare/v3.0.7...v3.0.8">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@stencil/sass&package-manager=npm_and_yarn&previous-version=3.0.7&new-version=3.0.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-20 23:44:44 +00:00
Maria Hutt
204a861b27 test(radio): re-enable keyboard navigation (#28747)
Issue number: internal

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

The keyboard navigation tests for radio were disable due to flakiness
with Safari when it came to the CI.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Re-enabled the tests.

Debugging was done with a saved artifact.

The artifact didn't provide a clear reason of why it flakes. But it did
seem that the test was tabbing before the Safari page finished loading.
I've added a `waitFor()` to verify that the radios have rendered. This
was done for Safari only to prevent any additional wait time.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

There is no great way to test this since it only flakes on GitHub.
2023-12-20 22:47:46 +00:00
dependabot[bot]
dc1dd9c395 chore(deps): Bump ionicons from 7.2.1 to 7.2.2 in /core (#28702)
Bumps [ionicons](https://github.com/ionic-team/ionicons) from 7.2.1 to
7.2.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/ionicons/releases">ionicons's
releases</a>.</em></p>
<blockquote>
<h2>v7.2.2</h2>
<h2><a
href="https://github.com/ionic-team/ionicons/compare/v7.2.1...v7.2.2">7.2.2</a>
(2023-12-13)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>icon:</strong> add better warning when loading icons (<a
href="https://redirect.github.com/ionic-team/ionicons/issues/1297">#1297</a>)
(<a
href="d582e6208e">d582e62</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/ionicons/blob/main/CHANGELOG.md">ionicons's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/ionic-team/ionicons/compare/v7.2.1...v7.2.2">7.2.2</a>
(2023-12-13)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>icon:</strong> add better warning when loading icons (<a
href="https://redirect.github.com/ionic-team/ionicons/issues/1297">#1297</a>)
(<a
href="d582e6208e">d582e62</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fccc260627"><code>fccc260</code></a>
v7.2.2</li>
<li><a
href="d582e6208e"><code>d582e62</code></a>
fix(icon): add better warning when loading icons (<a
href="https://redirect.github.com/ionic-team/ionicons/issues/1297">#1297</a>)</li>
<li><a
href="625d54fdad"><code>625d54f</code></a>
merge release-7.2.1</li>
<li><a
href="841fb96543"><code>841fb96</code></a>
remove duplicate entry</li>
<li><a
href="9dab13aef7"><code>9dab13a</code></a>
chore(): update package lock files</li>
<li>See full diff in <a
href="https://github.com/ionic-team/ionicons/compare/v7.2.1...v7.2.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ionicons&package-manager=npm_and_yarn&previous-version=7.2.1&new-version=7.2.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-20 21:50:34 +00:00
Liam DeBeasi
e5226016a0 fix(refresher): native ios refresher works on iPadOS (#28620)
Issue number: resolves #28617

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

We currently check to see if `webkitOverflowScrolling` is supported on
the refresher's style object in order to enable to native iOS refresher.
This works well for iOS, but it does not work for iPadOS. This is
because this property was removed in iPadOS 13:
https://developer.apple.com/documentation/safari-release-notes/safari-13-release-notes

> Disabled -webkit-overflow-scrolling: touch on iPad. All frames and
scrollable overflow areas now use accelerated one-finger scrolling
without changing stacking.

As a result, the native iOS refresher does not activate on iPadOS.


## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- I think it's safe to assume that `webkitOverflowScrolling` may be
removed on iOS in the future too since it was already removed on iPadOS.
As a result, I implemented a solution that avoids checking this.
- The `CSS.supports` check is required because otherwise the native iOS
refresher would be activated in an emulated environment such as Chrome
dev tools because the user agent is spoofed. The `apple-pay-logo-black`
named image is only supported on Apple devices.

Risks:

- Apple could remove the `apple-pay-logo-black` named image in the
future. However, we currently use this check elsewhere in Ionic too and
it has worked well:
60303aad23/core/src/components/datetime/datetime.ios.scss (L177).
- Apple could add touch emulation to desktop Safari which could cause
the native refresher to activate when using responsive design mode for
testing. However, this would only impact app developer and would not
impact production use cases.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

Dev build: `7.5.8-dev.11703088210.14a72b83`

Co-authored-by: Sean Perkins <sean-perkins@users.noreply.github.com>

---------

Co-authored-by: Sean Perkins <sean-perkins@user.noreply.github.com>
2023-12-20 17:28:27 +00:00
Liam DeBeasi
2f99aeae6f fix(datetime): selected today button renders correctly on ios (#28740)
Issue number: Internal

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

We removed the background color from today's calendar day button if
selected when implementing the calendar-day button shadow part feature:
79b005da70 (diff-8e2912d52559aa44c9c6dc062c8d683e7b51c92c7b7ba420ad6f7587f1e1a61aL139)

We did not catch this because we do not have test coverage for this use
case. We typically avoid rendering datetime on today's date because
"today" could be something totally different depending on the test
machine's locale/configuration.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Adds the background rule that was removed
- Added test coverage. I mocked today's date to be a fixed date so it
never changes

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

---------

Co-authored-by: ionitron <hi@ionicframework.com>
2023-12-20 14:13:00 +00:00
Liam DeBeasi
4cf948fb47 docs: account for this context (#28720)
Issue number: N/A

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

In https://github.com/ionic-team/ionic-framework/issues/28694 there was
some confusion around how to access `this` inside of a callback function
passed to a property on Ionic components. The root issue was due to how
the `this` context is determined with developers being responsible for
setting the appropriate `this` context.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- While this isn't an Ionic bug, I think it's worth calling out this
behavior so developers are aware of how to account for it.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->


Note: The link in the docs will not work until
https://github.com/ionic-team/ionic-docs/pull/3333 is merged.

---------

Co-authored-by: Amanda Johnston <90629384+amandaejohnston@users.noreply.github.com>
2023-12-19 22:33:34 +00:00
Liam DeBeasi
5d3bf9818d chore(ci): package-lock is updated from separate job (#28697)
After each release, we need to update the local `package-lock.json`
dependencies. We do this via a `npm install --package-lock-only`
command. However, this command can fail for reasons such as a connection
timeout. When this happens, the package-lock files do not get updated.

The problem is this action is also done in the same job as generating
the changelog and creating the GitHub release. This operations cannot be
re-done. As a result, we cannot simply re-run this job and try updating
the package-lock files again.

This PR changes the workflow to split the package-lock update out to its
own job. In the event that this job fails, we can re-run only this job
and leave the other jobs untouched.
2023-12-19 16:43:45 +00:00
Liam DeBeasi
16f39d96b7 merge release-7.6.2
Release 7.6.2
2023-12-19 09:59:43 -05:00
ionitron
bfd497f825 chore(): update package lock files 2023-12-19 14:45:31 +00:00
ionitron
8d841b4225 v7.6.2 2023-12-19 14:45:17 +00:00
dependabot[bot]
ee6ba200d1 chore(deps-dev): Bump @capacitor/keyboard from 5.0.6 to 5.0.7 in /core (#28713)
Bumps
[@capacitor/keyboard](https://github.com/ionic-team/capacitor-plugins)
from 5.0.6 to 5.0.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/capacitor-plugins/releases"><code>@​capacitor/keyboard</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​capacitor/keyboard</code><a
href="https://github.com/5"><code>@​5</code></a>.0.7</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/keyboard@5.0.6...@capacitor/keyboard@5.0.7">5.0.7</a>
(2023-12-15)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>keyboard:</strong> Change keyboard style during setStyle (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1935">#1935</a>)
(<a
href="3b520b8455">3b520b8</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c5aab483fe"><code>c5aab48</code></a>
chore(release): publish [skip ci]</li>
<li><a
href="77dc373b41"><code>77dc373</code></a>
fix(camera): reject promise on web input cancel event (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1964">#1964</a>)</li>
<li><a
href="bf7ec3306e"><code>bf7ec33</code></a>
feat(google-maps): Separate mapId for Google Maps Cloud IDs (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1943">#1943</a>)</li>
<li><a
href="3b520b8455"><code>3b520b8</code></a>
fix(keyboard): Change keyboard style during setStyle (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1935">#1935</a>)</li>
<li><a
href="e18f458533"><code>e18f458</code></a>
docs(screen-reader): Use stateChange event in example code (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1934">#1934</a>)</li>
<li><a
href="fb941c7f39"><code>fb941c7</code></a>
feat(filesystem): add removeAllListeners method (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1868">#1868</a>)</li>
<li><a
href="3d20522a7d"><code>3d20522</code></a>
chore(ci): Pin <code>@​actions/http-client</code> version to 2.1.1 (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1870">#1870</a>)</li>
<li><a
href="dc2eb14b7d"><code>dc2eb14</code></a>
chore(release): publish [skip ci]</li>
<li><a
href="73ad64b665"><code>73ad64b</code></a>
fix(google-maps): use URLSession for remote iconUrl on iOS (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1818">#1818</a>)
(<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1824">#1824</a>)</li>
<li><a
href="ef65656451"><code>ef65656</code></a>
fix(google-maps): Apply iconAnchor value to Marker anchor on Android (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/1822">#1822</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/keyboard@5.0.6...@capacitor/keyboard@5.0.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@capacitor/keyboard&package-manager=npm_and_yarn&previous-version=5.0.6&new-version=5.0.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-18 19:56:59 +00:00
Liam DeBeasi
7ce1031c17 fix(refresher): mode property can be used in typescript (#28717)
Issue number: resolves #28716

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

All components that have per-mode stylesheets can have their mode
adjusted by setting `mode` on the component. We use the `setMode`
function to determine which mode to use on the component:
516b84475e/core/src/global/ionic-global.ts (L75)

While this works on refresher, it is missing the `virtualProp` jsdoc
comment which causes it to not have the appropriate type information. As
a result, when developers try to use a JS binding for `mode`, they will
get compilation errors.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Adds virtualProp for mode to refresher

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->


I am considering this a bug fix instead of a feature. In non-TypeScript
environments you can set `mode` on `ion-refresher` and it does change
the mode. What's missing here is the type information associated with
it.

Dev build: `7.6.2-dev.11702914017.1ae72da5`
2023-12-18 18:09:25 +00:00
Amanda Johnston
516b84475e fix(input, textarea, select): reduce padding on slotted buttons (#28676)
Issue number: N/A

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

Buttons slotted in the start/end slots of input, textarea, or select
have a lot of excess padding that can cause them to look misaligned from
other pieces such as the control's label, especially when using
`fill="clear"`.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

Padding removed, and a border radius added so that non-clear buttons as
well as the focus state on clear buttons still look okay. Existing
screenshot tests have also been updated to include buttons (non-clear
ones so you can see the border radius in the screenshots).

Let me know if you think this should go on a feature branch instead. I
chose `main` because the current experience looks somewhat broken and we
just did a minor release recently, but this could be considered a
notable enough behavior change.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

---------

Co-authored-by: ionitron <hi@ionicframework.com>
2023-12-13 22:49:17 +00:00
Liam DeBeasi
bc51dd05cf fix(item): label does not expand indefinitely (#28700)
Issue number: N/A

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->


While working on an unrelated task, I noticed the list items in the list
starter app run off the page. This is due to the text wrapping behavior
in v7.6 where we allows the labels to grow/shrink. However, we do not
set a limit on how much they can grow. This means that child elements
inside of `ion-label` with long text can cause the label container to
grow indefinitely.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Labels in item have a max-width of 100%

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!--
  If this introduces a breaking change:
1. Describe the impact and migration path for existing applications
below.
  2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging.
See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer
for more information.
-->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

Dev build: `7.6.1-dev.11702498225.1ad6eda6`

| before | after |
| - | - |
| ![localhost_8102_home(Samsung Galaxy
S8+)](https://github.com/ionic-team/ionic-framework/assets/2721089/cadf8c5f-5813-4c8d-b236-752fde3d37cc)
| ![localhost_8102_home(Samsung Galaxy S8+)
(1)](https://github.com/ionic-team/ionic-framework/assets/2721089/ccb4277c-046d-46f8-b7f8-eda63c72fdb9)
|

---------

Co-authored-by: ionitron <hi@ionicframework.com>
2023-12-13 22:05:30 +00:00
Liam DeBeasi
ae6c353b51 docs(test): add locale best practice (#28699)
This best practice currently resides in our internal testing process
docs. I think this is valuable information for contributors to have as
well, so I've added it to our public best practices doc.
2023-12-13 18:33:52 +00:00
Liam DeBeasi
ec07e70d99 chore: update PR template for breaking changes (#28698)
The team had feedback during a sprint retro that the breaking change
process documentation was a bit spread out. In particular, some team
members were not clear that you need to a) update the breaking.md file
and b) add the "BREAKING CHANGE" comment to the commit description.

This PR adds both of these things are comments for awareness.
2023-12-13 18:27:12 +00:00
Liam DeBeasi
fb23bf74d5 merge release-7.6.1
Release 7.6.1
2023-12-13 10:28:59 -05:00
Liam DeBeasi
f6531fa2be chore: bump package-lock 2023-12-13 09:31:00 -05:00
ionitron
150ea1a8ad v7.6.1 2023-12-13 14:27:51 +00:00
Sean Perkins
92f1b8627a fix(react): avoid type collision with @types/react@18.2.43 and greater (#28687)
Issue number: N/A

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

Ionic React projects using `@types/react@18.2.43` or greater will run
into a type-check error on build with `IonRouterOutlet` and potentially
other components:

```
Property 'placeholder' is missing in type '{ children: Element[]; }' but required in type 'Pick<IonRouterOutlet & { basePath?: string | undefined; ref?: Ref<any> | undefined; ionPage?: boolean | undefined; } & IonicReactProps & Omit<...>, "color" | ... 254 more ... | "ionPage">'.
```

Definitely typed decided to make a breaking type change in a patch
release:
b954269038


## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Patches the type to allow for compatibility between React v16, 17 and
18.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

### Testing

1. Create a new Ionic react project with the "list" template.
2. Run `npm run build`
3. Observe: Exception posted above
4. Install the dev-build
5. Run `npm run build`
6. Observe: No exception, build passes
7. You can additionally serve the app to verify no runtime
exceptions/broken behavior.

Dev-build: `7.6.1-dev.11702322681.17e39348`
2023-12-12 22:53:55 +00:00
Brandy Carney
8ee23d20d5 fix(menu): allow styling of the box shadow and transform when visible inside of a split pane (#28691)
Issue number: resolves #21530

---------

## What is the current behavior?
The `box-shadow` and `transform` properties cannot be styled on a menu
when it is inside of a split pane and visible due to the following:

1) The `box-shadow` and `transform` properties are set to `none` with
`!important`
2) The menu itself is not on "top" of the split pane content so the
content hides any box shadow

## What is the new behavior?

- Removes all uses of `!important` in split pane and menu
- Developers will need to change the `z-index` from `0` to `1` on the
`ion-menu` so the menu will sit on top of the split pane and show the
`box-shadow`

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

## Other information

I considered putting the test for this in `split-pane` but I thought
since it was styling the `ion-menu` it should go in menu. I can move
this if others think it makes more sense in `split-pane`.

---------

Co-authored-by: ionitron <hi@ionicframework.com>
2023-12-12 17:49:47 +00:00
dependabot[bot]
8f66acdffb chore(deps): Bump @stencil/core from 4.8.1 to 4.8.2 in /core (#28692)
Bumps [@stencil/core](https://github.com/ionic-team/stencil) from 4.8.1
to 4.8.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/stencil/releases"><code>@​stencil/core</code>'s
releases</a>.</em></p>
<blockquote>
<h2>🐳 v4.8.2 (2023-12-11)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>compiler:</strong> make sure typesDir exist before writing
to it (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5109">#5109</a>)
(<a
href="9e4e27e58a">9e4e27e</a>)</li>
<li><strong>compiler:</strong> reapply changes to style import
transformer (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5125">#5125</a>)
(<a
href="https://redirect.github.com/ionic-team/stencil/issues/5131">#5131</a>)
(<a
href="735d45afdd">735d45a</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/5016">#5016</a></li>
<li><strong>runtime:</strong> hide slotted content with no destination
in scoped components (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5135">#5135</a>)
(<a
href="77bce27e02">77bce27</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/4284">#4284</a></li>
<li><strong>runtime:</strong> relocate slotted content when slot parent
element tag changes (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5120">#5120</a>)
(<a
href="4303d6af1b">4303d6a</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/4284">#4284</a></li>
<li><strong>runtime:</strong> update <code>textContent</code> patch to
mimic Shadow Root (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5146">#5146</a>)
(<a
href="55c56d69a6">55c56d6</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/3977">#3977</a></li>
<li><strong>testing:</strong> make Puppeteer an optional dependency (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5145">#5145</a>)
(<a
href="43cf0dc532">43cf0dc</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/stencil/blob/main/CHANGELOG.md"><code>@​stencil/core</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>🐳 <a
href="https://github.com/ionic-team/stencil/compare/v4.8.1...v4.8.2">4.8.2</a>
(2023-12-11)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>compiler:</strong> make sure typesDir exist before writing
to it (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5109">#5109</a>)
(<a
href="9e4e27e58a">9e4e27e</a>)</li>
<li><strong>compiler:</strong> reapply changes to style import
transformer (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5125">#5125</a>)
(<a
href="https://redirect.github.com/ionic-team/stencil/issues/5131">#5131</a>)
(<a
href="735d45afdd">735d45a</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/5016">#5016</a></li>
<li><strong>runtime:</strong> hide slotted content with no destination
in scoped components (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5135">#5135</a>)
(<a
href="77bce27e02">77bce27</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/4284">#4284</a></li>
<li><strong>runtime:</strong> relocate slotted content when slot parent
element tag changes (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5120">#5120</a>)
(<a
href="4303d6af1b">4303d6a</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/4284">#4284</a></li>
<li><strong>runtime:</strong> update <code>textContent</code> patch to
mimic Shadow Root (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5146">#5146</a>)
(<a
href="55c56d69a6">55c56d6</a>),
closes <a
href="https://redirect.github.com/ionic-team/stencil/issues/3977">#3977</a></li>
<li><strong>testing:</strong> make Puppeteer an optional dependency (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5145">#5145</a>)
(<a
href="43cf0dc532">43cf0dc</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="70884f87e8"><code>70884f8</code></a>
Release v4.8.2 (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5157">#5157</a>)</li>
<li><a
href="6abe250702"><code>6abe250</code></a>
fix(compiler): make style getter behavior consistent between default and
nati...</li>
<li><a
href="55c56d69a6"><code>55c56d6</code></a>
fix(runtime): update <code>textContent</code> patch to mimic Shadow Root
(<a
href="https://redirect.github.com/ionic-team/stencil/issues/5146">#5146</a>)</li>
<li><a
href="476c7b6794"><code>476c7b6</code></a>
chore(deps): update dependency cspell to v8.1.3 (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5151">#5151</a>)</li>
<li><a
href="fa5e9f617c"><code>fa5e9f6</code></a>
chore(deps): update dependency terser to v5.26.0 (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5156">#5156</a>)</li>
<li><a
href="15eb129ee5"><code>15eb129</code></a>
chore(deps): update dependency puppeteer to v21.6.0 (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5154">#5154</a>)</li>
<li><a
href="0868b0052c"><code>0868b00</code></a>
chore(deps): update typescript-eslint to v6.13.2 (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5153">#5153</a>)</li>
<li><a
href="d6d5cdae5b"><code>d6d5cda</code></a>
chore(deps): update dependency <code>@​types/node</code> to v20.10.4 (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5150">#5150</a>)</li>
<li><a
href="43cf0dc532"><code>43cf0dc</code></a>
fix(testing): make Puppeteer an optional dependency (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5145">#5145</a>)</li>
<li><a
href="3c5787579c"><code>3c57875</code></a>
chore(esbuild): build mock-doc with esbuild (<a
href="https://redirect.github.com/ionic-team/stencil/issues/5012">#5012</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/ionic-team/stencil/compare/v4.8.1...v4.8.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@stencil/core&package-manager=npm_and_yarn&previous-version=4.8.1&new-version=4.8.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-12 15:41:57 +00:00
Liam DeBeasi
6f9ee6024b chore: add resolves to PR template (#28693)
I've noticed a few instances where the team forgets to add the
"resolves" keyword (or similar "closes"/"fixes" keywords) when linking a
PR to an issue. GitHub will not link the PR with the issue and will not
close the issue on PR merge unless one of these keywords is used.

I've updated the PR template to add the "resolves" keyword so team
members don't need to worry about remembering to add it.
2023-12-12 15:14:21 +00:00
Liam DeBeasi
dc51b33db5 chore: remove safari 11 code (#28690)
Older versions of WebKit used an old `constant()` syntax for safe area
variables: https://caniuse.com/?search=env

As of Safari 11.3, `env()` is supported instead. We haven't supported
Safari 11 in years, so I think this is safe to remove.
2023-12-11 21:15:16 +00:00
Alexander Harding
a17b963182 fix(react): replacing route uses new route direction and animation (#28671)
Issue number: resolves #24260

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?

When replacing a route (`router.push(newRoute, 'none', 'replace')`) the
`RouterDirection` from the route being replaced is being used (if it
exists) instead of the new one the user specifies.

## What is the new behavior?

User-specified `RouteDirection` is used, if it exists. If it doesn't it
falls back to the `RouteDirection` of the route being replaced.

## Does this introduce a breaking change?

- [ ] Yes
- [X] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

Please see the following comment for why I think the current behavior is
incorrect, and why this change is needed:
https://github.com/ionic-team/ionic-framework/issues/24260#issuecomment-1078960780

---------

Co-authored-by: Liam DeBeasi <liamdebeasi@users.noreply.github.com>
2023-12-11 21:09:41 +00:00
Liam DeBeasi
8f7d87c680 fix(input, textarea): clearOnInput ignores key modifiers (#28639)
Issue number: resolves #28633

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

In https://github.com/ionic-team/ionic-framework/pull/28005 I introduced
a fix that causes "clearOnEdit" to not clear input/textarea when the Tab
key was pressed. However, there were several edge cases I missed. For
instance, pressing the "shift" key and then the "tab" key would still
clear the input because "shift" was not explicitly excluded.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Input and textarea now explicitly ignores modifier keys that do not
change the value of the input
- `didInputClearOnEdit` is not set to `true` when an ignored key is
pressed. Otherwise, pressing an ignored key and then an accepted key
would not cause the input to be cleared. For example, pressing "shift",
releasing "shift", then pressing "A" should cause the input to still get
cleared.
- Added test coverage

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

Playwright bug report for
a9f34a54f1:
https://github.com/microsoft/playwright/issues/28495
2023-12-11 20:35:25 +00:00
Liam DeBeasi
fc88613fef fix(react): use custom animation when going back after a replace (#28674)
Issue number: resolves #28673

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

When reviewing https://github.com/ionic-team/ionic-framework/pull/28671
I noticed a bug where the custom animation was not used when going back
after a replace.

`handleNavigate` will override whatever is in `incomingRouteParams`.
Since we were passing `routeAnimation` (which is `undefined`), it was
overriding the animation we set in `handleNavigateBack`.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- `routeAnimation` is no longer overridden

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

Dev build: `7.6.1-dev.11702048520.13c82dad`
2023-12-11 17:31:27 +00:00
Sean Perkins
e886e3ff2f fix(datetime): prefer wheel sets working value on confirmation (#28520)
Issue number: resolves #25839

---------

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

Confirming the working day when a datetime using a wheel picker without
an initial value will result in a value of `undefined` instead of the
displayed working day the user sees.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- `preferWheel` uses the working value on confirmation

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->

Dev-build: `7.5.7-dev.11701896424.13d40ac9`

Co-authored-by: liamdebeasi <liamdebeasi@users.noreply.github.com>
2023-12-08 19:34:49 +00:00
Brandy Carney
37290df7ef test(radio): skip flaky radio tabbing test (#28668)
Skips the keyboard navigation test in the radio a11y due to it being
flaky:
https://github.com/ionic-team/ionic-framework/actions/runs/7131071726
2023-12-07 18:18:26 +00:00
dependabot[bot]
c680ad9988 chore(deps-dev): Bump @axe-core/playwright from 4.8.1 to 4.8.2 in /core (#28658)
Bumps [@axe-core/playwright](https://github.com/dequelabs/axe-core-npm)
from 4.8.1 to 4.8.2.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/dequelabs/axe-core-npm/blob/develop/CHANGELOG.md"><code>@​axe-core/playwright</code>'s
changelog</a>.</em></p>
<blockquote>
<h1>Change Log</h1>
<p>All notable changes to this project will be documented in this file.
See <a href="https://conventionalcommits.org">Conventional Commits</a>
for commit guidelines.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/dequelabs/axe-core-npm/commits">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@axe-core/playwright&package-manager=npm_and_yarn&previous-version=4.8.1&new-version=4.8.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-07 15:23:37 +00:00
Liam DeBeasi
ffa3073211 chore: note item behavior in 7.6 notes (#28664)
We got some feedback in
https://github.com/ionic-team/ionic-framework/pull/28146#issuecomment-1845005089
that it would be helpful to note the new item wrapping behavior in v7.6.
I've updated the Github release, and this PR updates the Changelog file.
2023-12-07 14:49:57 +00:00
Liam DeBeasi
ec9228f54f merge release-7.6.0
Release 7.6.0
2023-12-06 10:45:17 -05:00
ionitron
f3799f332b chore(): update package lock files 2023-12-06 15:33:57 +00:00
170 changed files with 1666 additions and 568 deletions

View File

@@ -1,4 +1,4 @@
Issue number: #
Issue number: resolves #
---------
@@ -21,7 +21,12 @@ Issue number: #
- [ ] Yes
- [ ] No
<!-- If this introduces a breaking change, please describe the impact and migration path for existing applications below. -->
<!--
If this introduces a breaking change:
1. Describe the impact and migration path for existing applications below.
2. Update the BREAKING.md file with the breaking change.
3. Add "BREAKING CHANGE: [...]" to the commit description when merging. See https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#footer for more information.
-->
## Other information

View File

@@ -1,10 +1,15 @@
triage:
label: triage
label: "holiday triage"
removeLabelWhenProjectAssigned: true
dryRun: false
comment:
labels:
- label: "holiday triage"
message: >
Thanks for the issue! This issue has been labeled as `holiday triage`. With the winter holidays quickly approaching, much of the Ionic Team will soon be taking time off. During this time, issue triaging and PR review will be delayed until the team begins to return. After this period, we will work to ensure that all new issues are properly triaged and that new PRs are reviewed.
In the meantime, please read our [Winter Holiday Triage Guide](https://github.com/ionic-team/ionic-framework/issues/22699) for information on how to ensure that your issue is triaged correctly.
Thank you!
- label: "help wanted"
message: >
This issue has been labeled as `help wanted`. This label is added to issues
@@ -40,7 +45,7 @@ comment:
If the requested feature is something you would find useful for your applications, please react to the original post with 👍 (`+1`). If you would like to provide an additional use case for the feature, please post a comment.
The team will review this feedback and make a final decision. Any decision will be posted on this thread, but please note that we may ultimately decide not to pursue this feature.

View File

@@ -1,11 +1,5 @@
name: 'Ionic Nightly Build'
on:
schedule:
# Run every Monday-Friday
# at 6:00 UTC (6:00 am UTC)
- cron: '00 06 * * 1-5'
jobs:
create-nightly-hash:
runs-on: ubuntu-latest

View File

@@ -69,16 +69,25 @@ 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"
git add .
git commit -m "chore(): update package lock files"
git push
shell: bash
update-package-lock:
# This needs to run after finalize-release
# because we also push to the repo in that
# job. If these jobs ran in parallel then it is
# possible for them to push at the same time.
needs: [finalize-release]
runs-on: ubuntu-latest
steps:
# 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"
git add .
git commit -m "chore(): update package lock files"
git push
shell: bash
purge-cdn-cache:
needs: [release-ionic]

View File

@@ -3,6 +3,49 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [7.6.3](https://github.com/ionic-team/ionic-framework/compare/v7.6.2...v7.6.3) (2024-01-03)
### Bug Fixes
* **datetime:** selected today button renders correctly on ios ([#28740](https://github.com/ionic-team/ionic-framework/issues/28740)) ([2f99aea](https://github.com/ionic-team/ionic-framework/commit/2f99aeae6f71d5ffd1880f2c549227ecf71becf3))
* **nav, router-outlet:** ios page transition does not cover menu on larger screens ([#28745](https://github.com/ionic-team/ionic-framework/issues/28745)) ([878eec6](https://github.com/ionic-team/ionic-framework/commit/878eec6ea21d76586466d01e13e5e842e69eaceb)), closes [#28737](https://github.com/ionic-team/ionic-framework/issues/28737)
* **radio-group:** radio disabled prop can be undefined ([#28712](https://github.com/ionic-team/ionic-framework/issues/28712)) ([75ffeee](https://github.com/ionic-team/ionic-framework/commit/75ffeee933ae353d2601670178896116c81923e0)), closes [#28677](https://github.com/ionic-team/ionic-framework/issues/28677)
* **refresher:** native ios refresher works on iPadOS ([#28620](https://github.com/ionic-team/ionic-framework/issues/28620)) ([e522601](https://github.com/ionic-team/ionic-framework/commit/e5226016a0f0b066a7bd7fc9997f905d3b87fbc4)), closes [#28617](https://github.com/ionic-team/ionic-framework/issues/28617)
## [7.6.2](https://github.com/ionic-team/ionic-framework/compare/v7.6.1...v7.6.2) (2023-12-19)
### Bug Fixes
* **input, textarea, select:** reduce padding on slotted buttons ([#28676](https://github.com/ionic-team/ionic-framework/issues/28676)) ([516b844](https://github.com/ionic-team/ionic-framework/commit/516b84475e5d78060f35fa2c4821efc712536353))
* **item:** label does not expand indefinitely ([#28700](https://github.com/ionic-team/ionic-framework/issues/28700)) ([bc51dd0](https://github.com/ionic-team/ionic-framework/commit/bc51dd05cf036656980de584d2367db46054f774))
* **refresher:** mode property can be used in typescript ([#28717](https://github.com/ionic-team/ionic-framework/issues/28717)) ([7ce1031](https://github.com/ionic-team/ionic-framework/commit/7ce1031c177487649c2a698664ec98f10d9002b9)), closes [#28716](https://github.com/ionic-team/ionic-framework/issues/28716)
## [7.6.1](https://github.com/ionic-team/ionic-framework/compare/v7.6.0...v7.6.1) (2023-12-13)
### Bug Fixes
* **datetime:** prefer wheel sets working value on confirmation ([#28520](https://github.com/ionic-team/ionic-framework/issues/28520)) ([e886e3f](https://github.com/ionic-team/ionic-framework/commit/e886e3ff2fcb8a3586a62881c5fc848f3074235d)), closes [#25839](https://github.com/ionic-team/ionic-framework/issues/25839)
* **input, textarea:** clearOnInput ignores key modifiers ([#28639](https://github.com/ionic-team/ionic-framework/issues/28639)) ([8f7d87c](https://github.com/ionic-team/ionic-framework/commit/8f7d87c6803b1600a3ca21785df0e9bac49f74a3)), closes [#28633](https://github.com/ionic-team/ionic-framework/issues/28633)
* **menu:** allow styling of the box shadow and transform when visible inside of a split pane ([#28691](https://github.com/ionic-team/ionic-framework/issues/28691)) ([8ee23d2](https://github.com/ionic-team/ionic-framework/commit/8ee23d20d5cc7419ce15f047b92d2f826d3eb681)), closes [#21530](https://github.com/ionic-team/ionic-framework/issues/21530)
* **react:** avoid type collision with @types/react@18.2.43 and greater ([#28687](https://github.com/ionic-team/ionic-framework/issues/28687)) ([92f1b86](https://github.com/ionic-team/ionic-framework/commit/92f1b8627a240c93891205f75adcb5ce3d46596d))
* **react:** replacing route uses new route direction and animation ([#28671](https://github.com/ionic-team/ionic-framework/issues/28671)) ([a17b963](https://github.com/ionic-team/ionic-framework/commit/a17b9631829c36c2daf1d5227f5afa69f99f8743)), closes [#24260](https://github.com/ionic-team/ionic-framework/issues/24260)
* **react:** use custom animation when going back after a replace ([#28674](https://github.com/ionic-team/ionic-framework/issues/28674)) ([fc88613](https://github.com/ionic-team/ionic-framework/commit/fc88613fefa019a3b695a2c6e10c85cd3ce79ae8)), closes [#28673](https://github.com/ionic-team/ionic-framework/issues/28673)
# [7.6.0](https://github.com/ionic-team/ionic-framework/compare/v7.5.8...v7.6.0) (2023-12-06)
@@ -28,6 +71,8 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
* **toast:** add swipe to dismiss functionality ([#28442](https://github.com/ionic-team/ionic-framework/issues/28442)) ([30c21aa](https://github.com/ionic-team/ionic-framework/commit/30c21aab3ed40d73c28e7d60d0952d8891b0a9d3)), closes [#21769](https://github.com/ionic-team/ionic-framework/issues/21769)
* **toggle:** expose label wrapper as shadow part ([#28585](https://github.com/ionic-team/ionic-framework/issues/28585)) ([a34188f](https://github.com/ionic-team/ionic-framework/commit/a34188f7dbec4a16e4f2043ed3dc096e337725a7))
Note: Text inside of `ion-item` can now wrap to resolve accessibility issues related to readability. We recommend evaluating your application to account for text wrapping.

View File

@@ -3,6 +3,46 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [7.6.3](https://github.com/ionic-team/ionic-framework/compare/v7.6.2...v7.6.3) (2024-01-03)
### Bug Fixes
* **datetime:** selected today button renders correctly on ios ([#28740](https://github.com/ionic-team/ionic-framework/issues/28740)) ([2f99aea](https://github.com/ionic-team/ionic-framework/commit/2f99aeae6f71d5ffd1880f2c549227ecf71becf3))
* **nav, router-outlet:** ios page transition does not cover menu on larger screens ([#28745](https://github.com/ionic-team/ionic-framework/issues/28745)) ([878eec6](https://github.com/ionic-team/ionic-framework/commit/878eec6ea21d76586466d01e13e5e842e69eaceb)), closes [#28737](https://github.com/ionic-team/ionic-framework/issues/28737)
* **radio-group:** radio disabled prop can be undefined ([#28712](https://github.com/ionic-team/ionic-framework/issues/28712)) ([75ffeee](https://github.com/ionic-team/ionic-framework/commit/75ffeee933ae353d2601670178896116c81923e0)), closes [#28677](https://github.com/ionic-team/ionic-framework/issues/28677)
* **refresher:** native ios refresher works on iPadOS ([#28620](https://github.com/ionic-team/ionic-framework/issues/28620)) ([e522601](https://github.com/ionic-team/ionic-framework/commit/e5226016a0f0b066a7bd7fc9997f905d3b87fbc4)), closes [#28617](https://github.com/ionic-team/ionic-framework/issues/28617)
## [7.6.2](https://github.com/ionic-team/ionic-framework/compare/v7.6.1...v7.6.2) (2023-12-19)
### Bug Fixes
* **input, textarea, select:** reduce padding on slotted buttons ([#28676](https://github.com/ionic-team/ionic-framework/issues/28676)) ([516b844](https://github.com/ionic-team/ionic-framework/commit/516b84475e5d78060f35fa2c4821efc712536353))
* **item:** label does not expand indefinitely ([#28700](https://github.com/ionic-team/ionic-framework/issues/28700)) ([bc51dd0](https://github.com/ionic-team/ionic-framework/commit/bc51dd05cf036656980de584d2367db46054f774))
* **refresher:** mode property can be used in typescript ([#28717](https://github.com/ionic-team/ionic-framework/issues/28717)) ([7ce1031](https://github.com/ionic-team/ionic-framework/commit/7ce1031c177487649c2a698664ec98f10d9002b9)), closes [#28716](https://github.com/ionic-team/ionic-framework/issues/28716)
## [7.6.1](https://github.com/ionic-team/ionic-framework/compare/v7.6.0...v7.6.1) (2023-12-13)
### Bug Fixes
* **datetime:** prefer wheel sets working value on confirmation ([#28520](https://github.com/ionic-team/ionic-framework/issues/28520)) ([e886e3f](https://github.com/ionic-team/ionic-framework/commit/e886e3ff2fcb8a3586a62881c5fc848f3074235d)), closes [#25839](https://github.com/ionic-team/ionic-framework/issues/25839)
* **input, textarea:** clearOnInput ignores key modifiers ([#28639](https://github.com/ionic-team/ionic-framework/issues/28639)) ([8f7d87c](https://github.com/ionic-team/ionic-framework/commit/8f7d87c6803b1600a3ca21785df0e9bac49f74a3)), closes [#28633](https://github.com/ionic-team/ionic-framework/issues/28633)
* **menu:** allow styling of the box shadow and transform when visible inside of a split pane ([#28691](https://github.com/ionic-team/ionic-framework/issues/28691)) ([8ee23d2](https://github.com/ionic-team/ionic-framework/commit/8ee23d20d5cc7419ce15f047b92d2f826d3eb681)), closes [#21530](https://github.com/ionic-team/ionic-framework/issues/21530)
# [7.6.0](https://github.com/ionic-team/ionic-framework/compare/v7.5.8...v7.6.0) (2023-12-06)

View File

@@ -1087,6 +1087,7 @@ ion-range,part,tick-active
ion-refresher,none
ion-refresher,prop,closeDuration,string,'280ms',false,false
ion-refresher,prop,disabled,boolean,false,false,false
ion-refresher,prop,mode,"ios" | "md",undefined,false,false
ion-refresher,prop,pullFactor,number,1,false,false
ion-refresher,prop,pullMax,number,this.pullMin + 60,false,false
ion-refresher,prop,pullMin,number,60,false,false

88
core/package-lock.json generated
View File

@@ -1,23 +1,23 @@
{
"name": "@ionic/core",
"version": "7.6.0",
"version": "7.6.3",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@ionic/core",
"version": "7.6.0",
"version": "7.6.3",
"license": "MIT",
"dependencies": {
"@stencil/core": "^4.8.1",
"ionicons": "^7.2.1",
"@stencil/core": "^4.8.2",
"ionicons": "^7.2.2",
"tslib": "^2.1.0"
},
"devDependencies": {
"@axe-core/playwright": "^4.8.1",
"@capacitor/core": "^5.5.1",
"@axe-core/playwright": "^4.8.2",
"@capacitor/core": "^5.6.0",
"@capacitor/haptics": "^5.0.6",
"@capacitor/keyboard": "^5.0.6",
"@capacitor/keyboard": "^5.0.7",
"@capacitor/status-bar": "^5.0.6",
"@ionic/eslint-config": "^0.3.0",
"@ionic/prettier-config": "^2.0.0",
@@ -26,7 +26,7 @@
"@rollup/plugin-virtual": "^2.0.3",
"@stencil/angular-output-target": "^0.8.3",
"@stencil/react-output-target": "^0.5.3",
"@stencil/sass": "^3.0.7",
"@stencil/sass": "^3.0.8",
"@stencil/vue-output-target": "^0.8.7",
"@types/jest": "^29.5.6",
"@types/node": "^14.6.0",
@@ -56,9 +56,9 @@
"dev": true
},
"node_modules/@axe-core/playwright": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.8.1.tgz",
"integrity": "sha512-KC1X++UdRAwMLRvB+BIKFheyLHUnbJTL0t0Wbv6TJMozn2V2QyEtAcN6jyUiudtGiLUGhHCtj/eWorBnVZ4dAA==",
"version": "4.8.2",
"resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.8.2.tgz",
"integrity": "sha512-9KOhX2tNuvqn9DzpBNyqoqNKRZBrexeSiN9irQ0sEdq8zH13JnatepCJxobuXn4UopNy6iIpP4342beMiH+MSQ==",
"dev": true,
"dependencies": {
"axe-core": "~4.8.2"
@@ -634,9 +634,9 @@
"dev": true
},
"node_modules/@capacitor/core": {
"version": "5.5.1",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.5.1.tgz",
"integrity": "sha512-VG6Iv8Q7ZAbvjodxpvjcSe0jfxUwZXnvjbi93ehuJ6eYP8U926qLSXyrT/DToZq+F6v/HyGyVgn3mrE/9jW2Tg==",
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.6.0.tgz",
"integrity": "sha512-xJhCOUGPHw0QYDA3YH+CmL6qiV9DH4Ij3yPxSenymjrtLuXI197u9ddCZwGEwgVIkh9kGZBBKzsNkn89SZ2gdQ==",
"dev": true,
"dependencies": {
"tslib": "^2.1.0"
@@ -652,9 +652,9 @@
}
},
"node_modules/@capacitor/keyboard": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.6.tgz",
"integrity": "sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==",
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.7.tgz",
"integrity": "sha512-+6lW8z2nXTM2NOG7D7pOasCfIGicz26+EeDRXIj5AtJibbjwtE1Q5GIY+qGHgzpmwOF0qmcrGJBz4zagDwUapg==",
"dev": true,
"peerDependencies": {
"@capacitor/core": "^5.0.0"
@@ -1825,9 +1825,9 @@
}
},
"node_modules/@stencil/core": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.8.1.tgz",
"integrity": "sha512-KG1H10j24rlyxIqOI4CG8/h9T7ObTv7giW2H3u1qXV4KKrLykDOpMcLzpqNXqL2Fki3s1QvHyl/oaRvi5waWVw==",
"version": "4.8.2",
"resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.8.2.tgz",
"integrity": "sha512-KdZEAtz9VnqMtXOkf51+8mphyRt0fN/LYgtj5M8gnveGspG8KzoyTDzlWt0wsstWIsJJ21RA1yd3AgMMZiu3MA==",
"bin": {
"stencil": "bin/stencil"
},
@@ -1846,9 +1846,9 @@
}
},
"node_modules/@stencil/sass": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@stencil/sass/-/sass-3.0.7.tgz",
"integrity": "sha512-HcBjrh2CJ6aJnkOrBNSVyf1+x3FnUneYFk44rcx/jDK6Lx7R4w0dXMEsIR5MXqtROYWonZt7WtR8wsM1vcD+6w==",
"version": "3.0.8",
"resolved": "https://registry.npmjs.org/@stencil/sass/-/sass-3.0.8.tgz",
"integrity": "sha512-QJUG4Dr/b3wSizViwQXorrk1PJzxOsKkq5hSqtUHc3NNG3iomC4DQFYGeu15yNfoCDBtt4qkyHSCynsekQ8F6A==",
"dev": true,
"engines": {
"node": ">=12.0.0",
@@ -5785,9 +5785,9 @@
}
},
"node_modules/ionicons": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.2.1.tgz",
"integrity": "sha512-2pvCM7DGVEtbbj48PJzQrCADCQrqjU1nUYX9l9PyEWz3ZfdnLdAouqwPxLdl8tbaF9cE7OZRSlyQD7oLOLnGoQ==",
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.2.2.tgz",
"integrity": "sha512-I3iYIfc9Q9FRifWyFSwTAvbEABWlWY32i0sAVDDPGYnaIZVugkLCZFbEcrphW6ixVPg8tt1oLwalo/JJwbEqnA==",
"dependencies": {
"@stencil/core": "^4.0.3"
}
@@ -10899,9 +10899,9 @@
},
"dependencies": {
"@axe-core/playwright": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.8.1.tgz",
"integrity": "sha512-KC1X++UdRAwMLRvB+BIKFheyLHUnbJTL0t0Wbv6TJMozn2V2QyEtAcN6jyUiudtGiLUGhHCtj/eWorBnVZ4dAA==",
"version": "4.8.2",
"resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.8.2.tgz",
"integrity": "sha512-9KOhX2tNuvqn9DzpBNyqoqNKRZBrexeSiN9irQ0sEdq8zH13JnatepCJxobuXn4UopNy6iIpP4342beMiH+MSQ==",
"dev": true,
"requires": {
"axe-core": "~4.8.2"
@@ -11324,9 +11324,9 @@
"dev": true
},
"@capacitor/core": {
"version": "5.5.1",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.5.1.tgz",
"integrity": "sha512-VG6Iv8Q7ZAbvjodxpvjcSe0jfxUwZXnvjbi93ehuJ6eYP8U926qLSXyrT/DToZq+F6v/HyGyVgn3mrE/9jW2Tg==",
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.6.0.tgz",
"integrity": "sha512-xJhCOUGPHw0QYDA3YH+CmL6qiV9DH4Ij3yPxSenymjrtLuXI197u9ddCZwGEwgVIkh9kGZBBKzsNkn89SZ2gdQ==",
"dev": true,
"requires": {
"tslib": "^2.1.0"
@@ -11340,9 +11340,9 @@
"requires": {}
},
"@capacitor/keyboard": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.6.tgz",
"integrity": "sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==",
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.7.tgz",
"integrity": "sha512-+6lW8z2nXTM2NOG7D7pOasCfIGicz26+EeDRXIj5AtJibbjwtE1Q5GIY+qGHgzpmwOF0qmcrGJBz4zagDwUapg==",
"dev": true,
"requires": {}
},
@@ -12184,9 +12184,9 @@
"requires": {}
},
"@stencil/core": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.8.1.tgz",
"integrity": "sha512-KG1H10j24rlyxIqOI4CG8/h9T7ObTv7giW2H3u1qXV4KKrLykDOpMcLzpqNXqL2Fki3s1QvHyl/oaRvi5waWVw=="
"version": "4.8.2",
"resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.8.2.tgz",
"integrity": "sha512-KdZEAtz9VnqMtXOkf51+8mphyRt0fN/LYgtj5M8gnveGspG8KzoyTDzlWt0wsstWIsJJ21RA1yd3AgMMZiu3MA=="
},
"@stencil/react-output-target": {
"version": "0.5.3",
@@ -12196,9 +12196,9 @@
"requires": {}
},
"@stencil/sass": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@stencil/sass/-/sass-3.0.7.tgz",
"integrity": "sha512-HcBjrh2CJ6aJnkOrBNSVyf1+x3FnUneYFk44rcx/jDK6Lx7R4w0dXMEsIR5MXqtROYWonZt7WtR8wsM1vcD+6w==",
"version": "3.0.8",
"resolved": "https://registry.npmjs.org/@stencil/sass/-/sass-3.0.8.tgz",
"integrity": "sha512-QJUG4Dr/b3wSizViwQXorrk1PJzxOsKkq5hSqtUHc3NNG3iomC4DQFYGeu15yNfoCDBtt4qkyHSCynsekQ8F6A==",
"dev": true,
"requires": {}
},
@@ -15056,9 +15056,9 @@
}
},
"ionicons": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.2.1.tgz",
"integrity": "sha512-2pvCM7DGVEtbbj48PJzQrCADCQrqjU1nUYX9l9PyEWz3ZfdnLdAouqwPxLdl8tbaF9cE7OZRSlyQD7oLOLnGoQ==",
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.2.2.tgz",
"integrity": "sha512-I3iYIfc9Q9FRifWyFSwTAvbEABWlWY32i0sAVDDPGYnaIZVugkLCZFbEcrphW6ixVPg8tt1oLwalo/JJwbEqnA==",
"requires": {
"@stencil/core": "^4.0.3"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@ionic/core",
"version": "7.6.0",
"version": "7.6.3",
"description": "Base components for Ionic",
"keywords": [
"ionic",
@@ -31,15 +31,15 @@
"loader/"
],
"dependencies": {
"@stencil/core": "^4.8.1",
"ionicons": "^7.2.1",
"@stencil/core": "^4.8.2",
"ionicons": "^7.2.2",
"tslib": "^2.1.0"
},
"devDependencies": {
"@axe-core/playwright": "^4.8.1",
"@capacitor/core": "^5.5.1",
"@axe-core/playwright": "^4.8.2",
"@capacitor/core": "^5.6.0",
"@capacitor/haptics": "^5.0.6",
"@capacitor/keyboard": "^5.0.6",
"@capacitor/keyboard": "^5.0.7",
"@capacitor/status-bar": "^5.0.6",
"@ionic/eslint-config": "^0.3.0",
"@ionic/prettier-config": "^2.0.0",
@@ -48,7 +48,7 @@
"@rollup/plugin-virtual": "^2.0.3",
"@stencil/angular-output-target": "^0.8.3",
"@stencil/react-output-target": "^0.5.3",
"@stencil/sass": "^3.0.7",
"@stencil/sass": "^3.0.8",
"@stencil/vue-output-target": "^0.8.7",
"@types/jest": "^29.5.6",
"@types/node": "^14.6.0",

View File

@@ -943,7 +943,7 @@ export namespace Components {
*/
"size": 'cover' | 'fixed';
/**
* A callback used to format the header text that shows how many dates are selected. Only used if there are 0 or more than 1 selected (i.e. unused for exactly 1). By default, the header text is set to "numberOfDates days".
* A callback used to format the header text that shows how many dates are selected. Only used if there are 0 or more than 1 selected (i.e. unused for exactly 1). By default, the header text is set to "numberOfDates days". See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"titleSelectedDatesFormatter"?: TitleSelectedDatesFormatter;
/**
@@ -1182,7 +1182,7 @@ export namespace Components {
*/
"counter": boolean;
/**
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength".
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength". See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"counterFormatter"?: (inputLength: number, maxLength: number) => string;
/**
@@ -1701,7 +1701,7 @@ export namespace Components {
*/
"breakpoints"?: number[];
/**
* Determines whether or not a modal can dismiss when calling the `dismiss` method. If the value is `true` or the value's function returns `true`, the modal will close when trying to dismiss. If the value is `false` or the value's function returns `false`, the modal will not close when trying to dismiss.
* Determines whether or not a modal can dismiss when calling the `dismiss` method. If the value is `true` or the value's function returns `true`, the modal will close when trying to dismiss. If the value is `false` or the value's function returns `false`, the modal will not close when trying to dismiss. See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"canDismiss": boolean | ((data?: any, role?: string) => Promise<boolean>);
/**
@@ -2336,7 +2336,7 @@ export namespace Components {
*/
"pin": boolean;
/**
* A callback used to format the pin text. By default the pin text is set to `Math.round(value)`.
* A callback used to format the pin text. By default the pin text is set to `Math.round(value)`. See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"pinFormatter": PinFormatter;
/**
@@ -2377,6 +2377,10 @@ export namespace Components {
* A number representing how far down the user has pulled. The number `0` represents the user hasn't pulled down at all. The number `1`, and anything greater than `1`, represents that the user has pulled far enough down that when they let go then the refresh will happen. If they let go and the number is less than `1`, then the refresh will not happen, and the content will return to it's original position.
*/
"getProgress": () => Promise<number>;
/**
* The mode determines which platform styles to use.
*/
"mode"?: "ios" | "md";
/**
* How much to multiply the pull speed by. To slow the pull animation down, pass a number less than `1`. To speed up the pull, pass a number greater than `1`. The default value is `1` which is equal to the speed of the cursor. If a negative value is passed in, the factor will be `1` instead. For example: If the value passed is `1.2` and the content is dragged by `10` pixels, instead of `10` pixels the content will be pulled by `12` pixels (an increase of 20 percent). If the value passed is `0.8`, the dragged amount will be `8` pixels, less than the amount the cursor has moved. Does not apply when the refresher content uses a spinner, enabling the native refresher.
*/
@@ -2974,7 +2978,7 @@ export namespace Components {
*/
"counter": boolean;
/**
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength".
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength". See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"counterFormatter"?: (inputLength: number, maxLength: number) => string;
/**
@@ -5646,7 +5650,7 @@ declare namespace LocalJSX {
*/
"size"?: 'cover' | 'fixed';
/**
* A callback used to format the header text that shows how many dates are selected. Only used if there are 0 or more than 1 selected (i.e. unused for exactly 1). By default, the header text is set to "numberOfDates days".
* A callback used to format the header text that shows how many dates are selected. Only used if there are 0 or more than 1 selected (i.e. unused for exactly 1). By default, the header text is set to "numberOfDates days". See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"titleSelectedDatesFormatter"?: TitleSelectedDatesFormatter;
/**
@@ -5897,7 +5901,7 @@ declare namespace LocalJSX {
*/
"counter"?: boolean;
/**
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength".
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength". See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"counterFormatter"?: (inputLength: number, maxLength: number) => string;
/**
@@ -6428,7 +6432,7 @@ declare namespace LocalJSX {
*/
"breakpoints"?: number[];
/**
* Determines whether or not a modal can dismiss when calling the `dismiss` method. If the value is `true` or the value's function returns `true`, the modal will close when trying to dismiss. If the value is `false` or the value's function returns `false`, the modal will not close when trying to dismiss.
* Determines whether or not a modal can dismiss when calling the `dismiss` method. If the value is `true` or the value's function returns `true`, the modal will close when trying to dismiss. If the value is `false` or the value's function returns `false`, the modal will not close when trying to dismiss. See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"canDismiss"?: boolean | ((data?: any, role?: string) => Promise<boolean>);
/**
@@ -7060,7 +7064,7 @@ declare namespace LocalJSX {
*/
"pin"?: boolean;
/**
* A callback used to format the pin text. By default the pin text is set to `Math.round(value)`.
* A callback used to format the pin text. By default the pin text is set to `Math.round(value)`. See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"pinFormatter"?: PinFormatter;
/**
@@ -7089,6 +7093,10 @@ declare namespace LocalJSX {
* If `true`, the refresher will be hidden.
*/
"disabled"?: boolean;
/**
* The mode determines which platform styles to use.
*/
"mode"?: "ios" | "md";
/**
* Emitted while the user is pulling down the content and exposing the refresher.
*/
@@ -7750,7 +7758,7 @@ declare namespace LocalJSX {
*/
"counter"?: boolean;
/**
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength".
* A callback used to format the counter text. By default the counter text is set to "itemLength / maxLength". See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this if you need to access `this` from within the callback.
*/
"counterFormatter"?: (inputLength: number, maxLength: number) => string;
/**

View File

@@ -1,6 +1,8 @@
@import "./chip";
@use "./chip" as b;
@import "./chip.vars";
@include b.base;
:host {
/**
* Main content should be prioritized on iOS,

View File

@@ -1,6 +1,7 @@
@import "./chip";
@import "./chip.vars";
:host {
font-size: $chip-base-font-size-rem;
@mixin md2 {
:host {
font-size: $chip-base-font-size-rem;
}
}

View File

@@ -0,0 +1,9 @@
@use 'chip.md.scss' as c;
@use 'chip.scss' as b;
@use '../../utils/md-controller/index.scss' as controller;
@if controller.$md2 {
@include b.base;
@include c.md2;
}

View File

@@ -0,0 +1,9 @@
@use 'chip.md3.scss' as c;
@use 'chip.scss' as b;
@use '../../utils/md-controller/index.scss' as controller;
@if controller.$md3 {
@include b.base;
@include c.md3;
}

View File

@@ -0,0 +1,7 @@
@import "./chip.vars";
@mixin md3 {
:host {
background: green;
}
}

View File

@@ -1,156 +1,158 @@
@import "../../themes/ionic.globals";
@import "./chip.vars";
:host {
/**
* @prop --background: Background of the chip
* @prop --color: Color of the chip
*/
--background: #{rgba($text-color-rgb, 0.12)};
--color: #{rgba($text-color-rgb, 0.87)};
@mixin base {
:host {
/**
* @prop --background: Background of the chip
* @prop --color: Color of the chip
*/
--background: #{rgba($text-color-rgb, 0.12)};
--color: #{rgba($text-color-rgb, 0.87)};
@include border-radius(16px);
@include font-smoothing();
@include margin(4px);
@include padding(6px, 12px);
@include border-radius(16px);
@include font-smoothing();
@include margin(4px);
@include padding(6px, 12px);
display: inline-flex;
display: inline-flex;
position: relative;
position: relative;
align-items: center;
align-items: center;
min-height: 32px;
min-height: 32px;
background: var(--background);
color: var(--color);
background: var(--background);
color: var(--color);
font-family: $font-family-base;
font-family: $font-family-base;
cursor: pointer;
cursor: pointer;
overflow: hidden;
overflow: hidden;
vertical-align: middle;
box-sizing: border-box;
}
:host(.chip-disabled) {
cursor: default;
opacity: 0.4;
pointer-events: none;
}
// Chip Colors
// ---------------------------------------------
:host(.ion-color) {
background: current-color(base, 0.08);
color: current-color(shade);
}
:host(.ion-color:focus) {
background: current-color(base, 0.12);
}
:host(.ion-color.ion-activated) {
background: current-color(base, 0.16);
}
// Outline Chip
// ---------------------------------------------
:host(.chip-outline) {
border-width: 1px;
border-style: solid;
}
:host(.chip-outline) {
border-color: rgba($text-color-rgb, 0.32);
background: transparent;
}
:host(.chip-outline.ion-color) {
border-color: current-color(base, 0.32);
}
:host(.chip-outline:not(.ion-color):focus) {
background: rgba($text-color-rgb, 0.04);
}
:host(.chip-outline.ion-activated:not(.ion-color)) {
background: rgba($text-color-rgb, 0.08);
}
// Chip Icon
// ---------------------------------------------
::slotted(ion-icon) {
font-size: $chip-icon-size;
}
:host(:not(.ion-color)) ::slotted(ion-icon) {
color: rgba($text-color-rgb, 0.54);
}
::slotted(ion-icon:first-child) {
@include margin(-4px, 8px, -4px, -4px);
}
::slotted(ion-icon:last-child) {
@include margin(-4px, -4px, -4px, 8px);
}
// Chip Avatar
// ---------------------------------------------
::slotted(ion-avatar) {
flex-shrink: 0;
width: $chip-avatar-size;
height: $chip-avatar-size;
}
::slotted(ion-avatar:first-child) {
@include margin(-4px, 8px, -4px, -8px);
}
::slotted(ion-avatar:last-child) {
@include margin(-4px, -8px, -4px, 8px);
}
// Chip: Focus
// ---------------------------------------------
:host(:focus) {
outline: none;
}
:host(:focus) {
--background: #{rgba($text-color-rgb, 0.16)};
}
// Chip: Activated
// ---------------------------------------------
:host(.ion-activated) {
--background: #{rgba($text-color-rgb, 0.2)};
}
// Chip: Hover
// ---------------------------------------------
@media (any-hover: hover) {
:host(:hover) {
--background: #{rgba($text-color-rgb, 0.16)};
vertical-align: middle;
box-sizing: border-box;
}
:host(.ion-color:hover) {
:host(.chip-disabled) {
cursor: default;
opacity: 0.4;
pointer-events: none;
}
// Chip Colors
// ---------------------------------------------
:host(.ion-color) {
background: current-color(base, 0.08);
color: current-color(shade);
}
:host(.ion-color:focus) {
background: current-color(base, 0.12);
}
:host(.chip-outline:not(.ion-color):hover) {
:host(.ion-color.ion-activated) {
background: current-color(base, 0.16);
}
// Outline Chip
// ---------------------------------------------
:host(.chip-outline) {
border-width: 1px;
border-style: solid;
}
:host(.chip-outline) {
border-color: rgba($text-color-rgb, 0.32);
background: transparent;
}
:host(.chip-outline.ion-color) {
border-color: current-color(base, 0.32);
}
:host(.chip-outline:not(.ion-color):focus) {
background: rgba($text-color-rgb, 0.04);
}
:host(.chip-outline.ion-activated:not(.ion-color)) {
background: rgba($text-color-rgb, 0.08);
}
// Chip Icon
// ---------------------------------------------
::slotted(ion-icon) {
font-size: $chip-icon-size;
}
:host(:not(.ion-color)) ::slotted(ion-icon) {
color: rgba($text-color-rgb, 0.54);
}
::slotted(ion-icon:first-child) {
@include margin(-4px, 8px, -4px, -4px);
}
::slotted(ion-icon:last-child) {
@include margin(-4px, -4px, -4px, 8px);
}
// Chip Avatar
// ---------------------------------------------
::slotted(ion-avatar) {
flex-shrink: 0;
width: $chip-avatar-size;
height: $chip-avatar-size;
}
::slotted(ion-avatar:first-child) {
@include margin(-4px, 8px, -4px, -8px);
}
::slotted(ion-avatar:last-child) {
@include margin(-4px, -8px, -4px, 8px);
}
// Chip: Focus
// ---------------------------------------------
:host(:focus) {
outline: none;
}
:host(:focus) {
--background: #{rgba($text-color-rgb, 0.16)};
}
// Chip: Activated
// ---------------------------------------------
:host(.ion-activated) {
--background: #{rgba($text-color-rgb, 0.2)};
}
// Chip: Hover
// ---------------------------------------------
@media (any-hover: hover) {
:host(:hover) {
--background: #{rgba($text-color-rgb, 0.16)};
}
:host(.ion-color:hover) {
background: current-color(base, 0.12);
}
:host(.chip-outline:not(.ion-color):hover) {
background: rgba($text-color-rgb, 0.04);
}
}
}

View File

@@ -5,6 +5,14 @@ import { createColorClasses } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface';
/**
styleUrls: {
ios: 'chip.ios.scss',
md: 'chip.md2.scss',
md3: Build.isDev ? 'chip.md3.scss' : undefined
},
*/
/**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
*/
@@ -12,7 +20,8 @@ import type { Color } from '../../interface';
tag: 'ion-chip',
styleUrls: {
ios: 'chip.ios.scss',
md: 'chip.md.scss',
md: 'chip.md2.flag.scss',
md3: 'chip.md3.flag.scss'
},
shadow: true,
})

View File

@@ -23,82 +23,19 @@
</ion-header>
<ion-content class="ion-padding" id="content" style="text-align: center">
<h2>Basic Chips</h2>
<h2>Default Chip</h2>
<ion-chip>
<ion-label>Default</ion-label>
</ion-chip>
<ion-chip style="border-radius: 4px">
<ion-label>Border Radius</ion-label>
</ion-chip>
<ion-chip>
<ion-icon name="checkmark-circle"></ion-icon>
<ion-label>With Icon</ion-label>
</ion-chip>
<ion-chip>
<ion-avatar>
<img
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBmaWxsPSIjYzVkYmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48cGF0aCBkPSJNMjU2IDMwNGM2MS42IDAgMTEyLTUwLjQgMTEyLTExMlMzMTcuNiA4MCAyNTYgODBzLTExMiA1MC40LTExMiAxMTIgNTAuNCAxMTIgMTEyIDExMnptMCA0MGMtNzQuMiAwLTIyNCAzNy44LTIyNCAxMTJ2NTZoNDQ4di01NmMwLTc0LjItMTQ5LjgtMTEyLTIyNC0xMTJ6IiBmaWxsPSIjODJhZWZmIi8+PC9zdmc+"
/>
</ion-avatar>
<ion-label>With Avatar</ion-label>
</ion-chip>
<ion-chip>
<ion-avatar>
<img
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBmaWxsPSIjYzVkYmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48cGF0aCBkPSJNMjU2IDMwNGM2MS42IDAgMTEyLTUwLjQgMTEyLTExMlMzMTcuNiA4MCAyNTYgODBzLTExMiA1MC40LTExMiAxMTIgNTAuNCAxMTIgMTEyIDExMnptMCA0MGMtNzQuMiAwLTIyNCAzNy44LTIyNCAxMTJ2NTZoNDQ4di01NmMwLTc0LjItMTQ5LjgtMTEyLTIyNC0xMTJ6IiBmaWxsPSIjODJhZWZmIi8+PC9zdmc+"
/>
</ion-avatar>
<ion-label>With Icon and Avatar</ion-label>
<ion-icon name="close-circle"></ion-icon>
<h2>MD2 Chip</h2>
<ion-chip mode="md">
<ion-label>MD2</ion-label>
</ion-chip>
<h2>Color Chips</h2>
<ion-chip color="primary">
<ion-label>Primary</ion-label>
</ion-chip>
<ion-chip color="danger">
<ion-label>Danger</ion-label>
</ion-chip>
<ion-chip color="tertiary">
<ion-icon name="checkmark-circle"></ion-icon>
<ion-label>Tertiary with Icon</ion-label>
</ion-chip>
<ion-chip color="primary">
<ion-avatar>
<img
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBmaWxsPSIjYzVkYmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48cGF0aCBkPSJNMjU2IDMwNGM2MS42IDAgMTEyLTUwLjQgMTEyLTExMlMzMTcuNiA4MCAyNTYgODBzLTExMiA1MC40LTExMiAxMTIgNTAuNCAxMTIgMTEyIDExMnptMCA0MGMtNzQuMiAwLTIyNCAzNy44LTIyNCAxMTJ2NTZoNDQ4di01NmMwLTc0LjItMTQ5LjgtMTEyLTIyNC0xMTJ6IiBmaWxsPSIjODJhZWZmIi8+PC9zdmc+"
/>
</ion-avatar>
<ion-label>Primary with Avatar</ion-label>
</ion-chip>
<ion-chip color="success">
<ion-label>Success with Icon</ion-label>
<ion-icon name="calendar"></ion-icon>
</ion-chip>
<h2>Outline Chips</h2>
<ion-chip outline>
<ion-label>Outline</ion-label>
</ion-chip>
<ion-chip outline color="danger">
<ion-label>Danger Outline</ion-label>
</ion-chip>
<ion-chip outline color="secondary">
<ion-icon name="checkmark-circle"></ion-icon>
<ion-label>Secondary Outline with Icon</ion-label>
</ion-chip>
<ion-chip outline color="primary">
<ion-label>Primary Outline with Avatar</ion-label>
<ion-avatar>
<img
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBmaWxsPSIjYzVkYmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48cGF0aCBkPSJNMjU2IDMwNGM2MS42IDAgMTEyLTUwLjQgMTEyLTExMlMzMTcuNiA4MCAyNTYgODBzLTExMiA1MC40LTExMiAxMTIgNTAuNCAxMTIgMTEyIDExMnptMCA0MGMtNzQuMiAwLTIyNCAzNy44LTIyNCAxMTJ2NTZoNDQ4di01NmMwLTc0LjItMTQ5LjgtMTEyLTIyNC0xMTJ6IiBmaWxsPSIjODJhZWZmIi8+PC9zdmc+"
/>
</ion-avatar>
</ion-chip>
<ion-chip outline>
<ion-icon name="git-pull-request"></ion-icon>
<ion-label>Outline with Icon and Avatar</ion-label>
<ion-icon name="close-circle"></ion-icon>
<h2>MD3 Chip</h2>
<ion-chip mode="md3">
<ion-label>MD3</ion-label>
</ion-chip>
</ion-content>
</ion-app>

View File

@@ -249,9 +249,11 @@
/**
* Day that is selected and is today
* should have white color.
* should have base background color
* with contrast text.
*/
:host .calendar-day.calendar-day-today.calendar-day-active {
background: current-color(base);
color: current-color(contrast);
}

View File

@@ -341,6 +341,9 @@ export class Datetime implements ComponentInterface {
* dates are selected. Only used if there are 0 or more than 1
* selected (i.e. unused for exactly 1). By default, the header
* text is set to "numberOfDates days".
*
* See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
* if you need to access `this` from within the callback.
*/
@Prop() titleSelectedDatesFormatter?: TitleSelectedDatesFormatter;
@@ -492,7 +495,7 @@ export class Datetime implements ComponentInterface {
*/
@Method()
async confirm(closeOverlay = false) {
const { isCalendarPicker, activeParts } = this;
const { isCalendarPicker, activeParts, preferWheel, workingParts } = this;
/**
* We only update the value if the presentation is not a calendar picker.
@@ -500,7 +503,16 @@ export class Datetime implements ComponentInterface {
if (activeParts !== undefined || !isCalendarPicker) {
const activePartsIsArray = Array.isArray(activeParts);
if (activePartsIsArray && activeParts.length === 0) {
this.setValue(undefined);
if (preferWheel) {
/**
* If the datetime is using a wheel picker, but the
* active parts are empty, then the user has confirmed the
* initial value (working parts) presented to them.
*/
this.setValue(convertDataToISO(workingParts));
} else {
this.setValue(undefined);
}
} else {
this.setValue(convertDataToISO(activeParts));
}
@@ -1356,11 +1368,21 @@ export class Datetime implements ComponentInterface {
const dayValues = (this.parsedDayValues = convertToArrayOfNumbers(this.dayValues));
const todayParts = (this.todayParts = parseDate(getToday())!);
this.defaultParts = getClosestValidDate(todayParts, monthValues, dayValues, yearValues, hourValues, minuteValues);
this.processMinParts();
this.processMaxParts();
this.defaultParts = getClosestValidDate({
refParts: todayParts,
monthValues,
dayValues,
yearValues,
hourValues,
minuteValues,
minParts: this.minParts,
maxParts: this.maxParts,
});
this.processValue(this.value);
this.emitStyle();

View File

@@ -458,6 +458,44 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
});
});
configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('datetime: today button rendering'), () => {
test('should render today button correctly when selected', async ({ page }) => {
test.info().annotations.push({
type: 'issue',
description: 'FW-5808',
});
await page.setContent(
`
<ion-datetime presentation="date" value="2022-01-02"></ion-datetime>
<script>
const mockToday = '2022-01-02T16:22';
Date = class extends Date {
constructor(...args) {
if (args.length === 0) {
super(mockToday)
} else {
super(...args);
}
}
}
</script>
`,
config
);
const datetime = page.locator('ion-datetime');
await page.waitForSelector('.datetime-ready');
await expect(datetime.locator('.calendar-day-today')).toHaveScreenshot(
screenshot(`datetime-today-calendar-button`)
);
});
});
});
/**
* The calendar day highlight does not render
* on iOS and has the same behavior across directions.

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 973 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -16,6 +16,7 @@ import {
subtractDays,
addDays,
validateParts,
getClosestValidDate,
} from '../utils/manipulation';
describe('addDays()', () => {
@@ -558,3 +559,160 @@ describe('validateParts()', () => {
).toEqual({ month: 1, day: 1, year: 2022, hour: 9, minute: 30 });
});
});
describe('getClosestValidDate()', () => {
it('should match a date with only month/day/year', () => {
// October 10, 2023
const refParts = { month: 10, day: 10, year: 2023 };
// April 10, 2021
const minParts = { month: 4, day: 10, year: 2021 };
// September 14, 2021
const maxParts = { month: 9, day: 14, year: 2021 };
// September 4, 2021
const expected = { month: 9, day: 4, year: 2021, dayOfWeek: undefined };
expect(
getClosestValidDate({
refParts,
monthValues: [2, 3, 7, 9, 10],
dayValues: [4, 15, 25],
yearValues: [2020, 2021, 2023],
maxParts,
minParts,
})
).toEqual(expected);
});
it('should match a date when the reference date is before the min', () => {
// April 2, 2020 3:20 PM
const refParts = { month: 4, day: 2, year: 2020, hour: 15, minute: 20 };
// September 10, 2021 10:10 AM
const minParts = { month: 9, day: 10, year: 2021, hour: 10, minute: 10 };
// September 14, 2021 10:11 AM
const maxParts = { month: 9, day: 14, year: 2021, hour: 10, minute: 11 };
// September 11, 2021 11:15 AM
const expected = {
year: 2021,
day: 11,
month: 9,
hour: 11,
minute: 15,
ampm: 'am',
dayOfWeek: undefined,
};
expect(
getClosestValidDate({
refParts,
monthValues: [4, 9, 11],
dayValues: [11, 12, 13, 14],
yearValues: [2020, 2021, 2023],
hourValues: [9, 10, 11],
minuteValues: [11, 12, 13, 14, 15],
maxParts,
minParts,
})
).toEqual(expected);
});
it('should match a date when the reference date is before the min', () => {
// April 2, 2020 3:20 PM
const refParts = { month: 4, day: 2, year: 2020, hour: 15, minute: 20 };
// September 10, 2021 10:10 AM
const minParts = { month: 9, day: 10, year: 2021, hour: 10, minute: 10 };
// September 10, 2021 10:15 AM
const maxParts = { month: 9, day: 10, year: 2021, hour: 10, minute: 15 };
// September 10, 2021 10:15 AM
const expected = {
month: 9,
day: 10,
year: 2021,
hour: 10,
minute: 15,
ampm: 'am',
dayOfWeek: undefined,
};
expect(
getClosestValidDate({
refParts,
monthValues: [4, 9, 11],
dayValues: [10, 12, 13, 14],
yearValues: [2020, 2021, 2023],
hourValues: [9, 10, 11],
minuteValues: [11, 12, 13, 14, 15],
minParts,
maxParts,
})
).toEqual(expected);
});
it('should only clamp minutes if within the same day and hour as min/max', () => {
// April 2, 2020 9:16 AM
const refParts = { month: 4, day: 2, year: 2020, hour: 9, minute: 16 };
// September 10, 2021 10:10 AM
const minParts = { month: 9, day: 10, year: 2021, hour: 10, minute: 10 };
// September 10, 2021 11:15 AM
const maxParts = { month: 9, day: 10, year: 2021, hour: 11, minute: 15 };
// September 10, 2021 10:16 AM
const expected = {
month: 9,
day: 10,
year: 2021,
hour: 10,
minute: 16,
ampm: 'am',
dayOfWeek: undefined,
};
expect(
getClosestValidDate({
refParts,
monthValues: [4, 9, 11],
dayValues: [10, 12, 13, 14],
yearValues: [2020, 2021, 2023],
hourValues: [9, 10, 11],
minuteValues: [10, 15, 16],
minParts,
maxParts,
})
).toEqual(expected);
});
it('should return the closest valid date after adjusting the allowed year', () => {
// April 2, 2022 9:16 AM
const refParts = { month: 4, day: 2, year: 2022, hour: 9, minute: 16 };
// September 10, 2021 10:10 AM
const minParts = { month: 9, day: 10, year: 2021, hour: 10, minute: 10 };
// September 10, 2023 11:15 AM
const maxParts = { month: 9, day: 10, year: 2023, hour: 11, minute: 15 };
// April 2, 2022 9:16 AM
const expected = {
month: 4,
day: 2,
year: 2022,
hour: 9,
minute: 16,
ampm: 'am',
dayOfWeek: undefined,
};
expect(
getClosestValidDate({
refParts,
monthValues: [4, 9, 11],
dayValues: [2, 10, 12, 13, 14],
yearValues: [2020, 2021, 2022, 2023],
hourValues: [9, 10, 11],
minuteValues: [10, 15, 16],
minParts,
maxParts,
})
).toEqual(expected);
});
});

View File

@@ -0,0 +1,31 @@
import { newSpecPage } from '@stencil/core/testing';
import { Datetime } from '../../datetime';
describe('datetime: preferWheel', () => {
beforeEach(() => {
const mockIntersectionObserver = jest.fn();
mockIntersectionObserver.mockReturnValue({
observe: () => null,
unobserve: () => null,
disconnect: () => null,
});
global.IntersectionObserver = mockIntersectionObserver;
});
it('should select the working day when clicking the confirm button', async () => {
const page = await newSpecPage({
components: [Datetime],
html: '<ion-datetime prefer-wheel="true" max="2021" show-default-buttons="true"></ion-datetime>',
});
const datetime = page.body.querySelector<HTMLIonDatetimeElement>('ion-datetime')!;
const confirmButton = datetime.shadowRoot!.querySelector<HTMLIonButtonElement>('#confirm-button')!;
confirmButton.click();
await page.waitForChanges();
expect(datetime.value).toBe('2021-12-31T23:59:00');
});
});

View File

@@ -1,6 +1,6 @@
import type { DatetimeParts } from '../datetime-interface';
import { isSameDay } from './comparison';
import { isAfter, isBefore, isSameDay } from './comparison';
import { getNumDaysInMonth } from './helpers';
import { clampDate, parseAmPm } from './parse';
@@ -424,44 +424,137 @@ export const validateParts = (
* Returns the closest date to refParts
* that also meets the constraints of
* the *Values params.
* @param refParts The reference date
* @param monthValues The allowed month values
* @param dayValues The allowed day (of the month) values
* @param yearValues The allowed year values
* @param hourValues The allowed hour values
* @param minuteValues The allowed minute values
*/
export const getClosestValidDate = (
refParts: DatetimeParts,
monthValues?: number[],
dayValues?: number[],
yearValues?: number[],
hourValues?: number[],
minuteValues?: number[]
) => {
export const getClosestValidDate = ({
refParts,
monthValues,
dayValues,
yearValues,
hourValues,
minuteValues,
minParts,
maxParts,
}: {
/**
* The reference date
*/
refParts: DatetimeParts;
/**
* The allowed month values
*/
monthValues?: number[];
/**
* The allowed day (of the month) values
*/
dayValues?: number[];
/**
* The allowed year values
*/
yearValues?: number[];
/**
* The allowed hour values
*/
hourValues?: number[];
/**
* The allowed minute values
*/
minuteValues?: number[];
/**
* The minimum date that can be returned
*/
minParts?: DatetimeParts;
/**
* The maximum date that can be returned
*/
maxParts?: DatetimeParts;
}) => {
const { hour, minute, day, month, year } = refParts;
const copyParts = { ...refParts, dayOfWeek: undefined };
if (yearValues !== undefined) {
// Filters out years that are out of the min/max bounds
const filteredYears = yearValues.filter((year) => {
if (minParts !== undefined && year < minParts.year) {
return false;
}
if (maxParts !== undefined && year > maxParts.year) {
return false;
}
return true;
});
copyParts.year = findClosestValue(year, filteredYears);
}
if (monthValues !== undefined) {
copyParts.month = findClosestValue(month, monthValues);
// Filters out months that are out of the min/max bounds
const filteredMonths = monthValues.filter((month) => {
if (minParts !== undefined && copyParts.year === minParts.year && month < minParts.month) {
return false;
}
if (maxParts !== undefined && copyParts.year === maxParts.year && month > maxParts.month) {
return false;
}
return true;
});
copyParts.month = findClosestValue(month, filteredMonths);
}
// Day is nullable but cannot be undefined
if (day !== null && dayValues !== undefined) {
copyParts.day = findClosestValue(day, dayValues);
}
if (yearValues !== undefined) {
copyParts.year = findClosestValue(year, yearValues);
// Filters out days that are out of the min/max bounds
const filteredDays = dayValues.filter((day) => {
if (minParts !== undefined && isBefore({ ...copyParts, day }, minParts)) {
return false;
}
if (maxParts !== undefined && isAfter({ ...copyParts, day }, maxParts)) {
return false;
}
return true;
});
copyParts.day = findClosestValue(day, filteredDays);
}
if (hour !== undefined && hourValues !== undefined) {
copyParts.hour = findClosestValue(hour, hourValues);
// Filters out hours that are out of the min/max bounds
const filteredHours = hourValues.filter((hour) => {
if (minParts?.hour !== undefined && isSameDay(copyParts, minParts) && hour < minParts.hour) {
return false;
}
if (maxParts?.hour !== undefined && isSameDay(copyParts, maxParts) && hour > maxParts.hour) {
return false;
}
return true;
});
copyParts.hour = findClosestValue(hour, filteredHours);
copyParts.ampm = parseAmPm(copyParts.hour);
}
if (minute !== undefined && minuteValues !== undefined) {
copyParts.minute = findClosestValue(minute, minuteValues);
// Filters out minutes that are out of the min/max bounds
const filteredMinutes = minuteValues.filter((minute) => {
if (
minParts?.minute !== undefined &&
isSameDay(copyParts, minParts) &&
copyParts.hour === minParts.hour &&
minute < minParts.minute
) {
return false;
}
if (
maxParts?.minute !== undefined &&
isSameDay(copyParts, maxParts) &&
copyParts.hour === maxParts.hour &&
minute > maxParts.minute
) {
return false;
}
return true;
});
copyParts.minute = findClosestValue(minute, filteredMinutes);
}
return copyParts;

View File

@@ -37,3 +37,25 @@
:host(.input-disabled) {
opacity: #{$input-ios-disabled-opacity};
}
// Start/End Slots
// ----------------------------------------------------------------
/**
* Slotted buttons have a lot of default padding that can
* cause them to look misaligned from other pieces such
* as the control's label, especially when using a clear
* fill. We also make them circular to ensure that non-
* clear buttons and the focus/hover state on clear ones
* don't look too crowded.
*/
::slotted(ion-button[slot="start"].button-has-icon-only),
::slotted(ion-button[slot="end"].button-has-icon-only) {
--border-radius: 50%;
--padding-start: 0;
--padding-end: 0;
--padding-top: 0;
--padding-bottom: 0;
aspect-ratio: 1;
}

View File

@@ -117,3 +117,27 @@
:host(.input-shape-round) {
--border-radius: 16px;
}
// Start/End Slots
// ----------------------------------------------------------------
/**
* Slotted buttons have a lot of default padding that can
* cause them to look misaligned from other pieces such
* as the control's label, especially when using a clear
* fill. We also make them circular to ensure that non-
* clear buttons and the focus/hover state on clear ones
* don't look too crowded.
*/
::slotted(ion-button[slot="start"].button-has-icon-only),
::slotted(ion-button[slot="end"].button-has-icon-only) {
--border-radius: 50%;
--padding-start: 8px;
--padding-end: 8px;
--padding-top: 8px;
--padding-bottom: 8px;
aspect-ratio: 1;
min-height: 40px;
}

View File

@@ -259,15 +259,16 @@
// Input Has focus
// --------------------------------------------------
// When the input has focus, then the input cover should be hidden
:host(.has-focus) {
// TODO FW-2764 Remove this
:host(.has-focus.legacy-input) {
pointer-events: none;
}
:host(.has-focus) input,
:host(.has-focus) a,
:host(.has-focus) button {
// TODO FW-2764 Remove this
:host(.has-focus.legacy-input) input,
:host(.has-focus.legacy-input) a,
:host(.has-focus.legacy-input) button {
pointer-events: auto;
}
@@ -659,8 +660,10 @@
::slotted([slot="start"]) {
margin-inline-end: $form-control-label-margin;
margin-inline-start: 0;
}
::slotted([slot="end"]) {
margin-inline-start: $form-control-label-margin;
margin-inline-end: 0;
}

View File

@@ -121,6 +121,9 @@ export class Input implements ComponentInterface {
/**
* A callback used to format the counter text.
* By default the counter text is set to "itemLength / maxLength".
*
* See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
* if you need to access `this` from within the callback.
*/
@Prop() counterFormatter?: (inputLength: number, maxLength: number) => string;
@@ -549,15 +552,37 @@ export class Input implements ComponentInterface {
if (!this.shouldClearOnEdit()) {
return;
}
/**
* The following keys do not modify the
* contents of the input. As a result, pressing
* them should not edit the input.
*
* We can't check to see if the value of the input
* was changed because we call checkClearOnEdit
* in a keydown listener, and the key has not yet
* been added to the input.
*/
const IGNORED_KEYS = ['Enter', 'Tab', 'Shift', 'Meta', 'Alt', 'Control'];
const pressedIgnoredKey = IGNORED_KEYS.includes(ev.key);
/**
* Clear the input if the control has not been previously cleared during focus.
* Do not clear if the user hitting enter to submit a form.
*/
if (!this.didInputClearOnEdit && this.hasValue() && ev.key !== 'Enter' && ev.key !== 'Tab') {
if (!this.didInputClearOnEdit && this.hasValue() && !pressedIgnoredKey) {
this.value = '';
this.emitInputChange(ev);
}
this.didInputClearOnEdit = true;
/**
* Pressing an IGNORED_KEYS first and
* then an allowed key will cause the input to not
* be cleared.
*/
if (!pressedIgnoredKey) {
this.didInputClearOnEdit = true;
}
}
private onCompositionStart = () => {

View File

@@ -1,6 +1,8 @@
import { expect } from '@playwright/test';
import { test, configs } from '@utils/test/playwright';
const IGNORED_KEYS = ['Enter', 'Tab', 'Shift', 'Meta', 'Alt', 'Control'];
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => {
test.describe(title('input: clearOnEdit'), () => {
test('should clear when typed into', async ({ page }) => {
@@ -16,28 +18,57 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
await expect(input).toHaveJSProperty('value', 'h');
});
test('should not clear when enter is pressed', async ({ page }) => {
await page.setContent(`<ion-input value="abc" clear-on-edit="true" aria-label="input"></ion-input>`, config);
test('should not clear the input if it does not have an initial value when typing', async ({ page }) => {
await page.setContent(`<ion-input label="input" value="" clear-on-edit="true"></ion-input>`, config);
const input = page.locator('ion-input');
await input.locator('input').focus();
await page.keyboard.press('Enter');
await page.waitForChanges();
await input.click();
await input.type('hello world');
await expect(input).toHaveJSProperty('value', 'abc');
await expect(input).toHaveJSProperty('value', 'hello world');
});
test('should not clear when tab is pressed', async ({ page }) => {
IGNORED_KEYS.forEach((ignoredKey: string) => {
test(`should not clear when ${ignoredKey} is pressed`, async ({ page, skip }) => {
skip.browser(
(browserName: string) => browserName === 'firefox' && ignoredKey === 'Meta',
'Firefox incorrectly adds "OS" to the input when pressing the Meta key on Linux'
);
await page.setContent(`<ion-input value="abc" clear-on-edit="true" aria-label="input"></ion-input>`, config);
const input = page.locator('ion-input');
await input.locator('input').focus();
await page.keyboard.press(ignoredKey);
await page.waitForChanges();
await expect(input).toHaveJSProperty('value', 'abc');
});
});
test('should clear after when pressing valid key after pressing ignored key', async ({ page }) => {
test.info().annotations.push({
type: 'issue',
description: 'https://github.com/ionic-team/ionic-framework/issues/28633',
});
await page.setContent(`<ion-input value="abc" clear-on-edit="true" aria-label="input"></ion-input>`, config);
const input = page.locator('ion-input');
await input.locator('input').focus();
await page.keyboard.press('Tab');
// ignored
await page.keyboard.press('Shift');
await page.waitForChanges();
await expect(input).toHaveJSProperty('value', 'abc');
// allowed
await page.keyboard.press('a');
await page.waitForChanges();
await expect(input).toHaveJSProperty('value', 'a');
});
});
});

View File

@@ -8,7 +8,9 @@ configs().forEach(({ title, screenshot, config }) => {
`
<ion-input label-placement="start" fill="solid" value="100" label="Weight" clear-input="true">
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
<ion-label slot="end">lbs</ion-label>
<ion-button slot="end" aria-label="Show/hide password">
<ion-icon slot="icon-only" name="lock-closed" aria-hidden="true"></ion-icon>
</ion-button>
</ion-input>
`,
config
@@ -23,7 +25,9 @@ configs().forEach(({ title, screenshot, config }) => {
`
<ion-input label-placement="floating" fill="solid" value="100" label="Weight" clear-input="true">
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
<ion-label slot="end">lbs</ion-label>
<ion-button slot="end" aria-label="Show/hide password">
<ion-icon slot="icon-only" name="lock-closed" aria-hidden="true"></ion-icon>
</ion-button>
</ion-input>
`,
config

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -426,6 +426,13 @@ button, a {
// shrink and wrap its text instead of moving to its
// own row if there are slotted elements next to it
width: min-content;
/**
* We allow labels in the default
* slot to grow. However, we do not
* want them to grow indefinitely.
*/
max-width: 100%;
}
// Item Input

View File

@@ -82,3 +82,34 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
});
});
});
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('label: text wrapping in item'), () => {
test('long text should not cause label to expand infinitely', async ({ page }) => {
await page.setContent(
`
<style>
div {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
</style>
<ion-item>
<ion-label>
<!-- This text should be truncated with ellipses -->
<div>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
</ion-label>
</ion-item>
`,
config
);
const item = page.locator('ion-item');
await expect(item).toHaveScreenshot(screenshot(`label-item-wrap`));
});
});
});

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -190,13 +190,12 @@ ion-backdrop {
width: auto;
/* stylelint-disable declaration-no-important */
transform: none !important;
transform: none;
box-shadow: none !important;
box-shadow: none;
}
:host(.menu-pane-visible) ion-backdrop {
/* stylelint-disable-next-line declaration-no-important */
display: hidden !important;
/* stylelint-enable declaration-no-important */
}

View File

@@ -0,0 +1,65 @@
import { expect } from '@playwright/test';
import { configs, test } from '@utils/test/playwright';
/**
* This behavior does not vary across directions.
*/
configs({ directions: ['ltr'] }).forEach(({ title, config, screenshot }) => {
test.describe(title('menu: custom'), () => {
test('should allow styling the menu box shadow when inside a split pane', async ({ page }) => {
test.info().annotations.push({
type: 'issue',
description: 'https://github.com/ionic-team/ionic-framework/issues/21530',
});
await page.setContent(
`
<style>
ion-split-pane {
--side-width: 200px;
--side-min-width: 200px;
}
ion-menu {
box-shadow: 10px 5px 5px red;
z-index: 1;
}
</style>
<ion-app>
<ion-split-pane when="xs" id="splitPane" content-id="split-content">
<ion-menu side="start" content-id="split-content">
<ion-header>
<ion-toolbar color="secondary">
<ion-title>Menu</ion-title>
</ion-toolbar>
</ion-header>
<ion-content class="ion-padding">Menu Content</ion-content>
</ion-menu>
<div class="ion-page" id="split-content">
<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-menu-button></ion-menu-button>
</ion-buttons>
<ion-title>Content</ion-title>
</ion-toolbar>
</ion-header>
<ion-content class="ion-padding">Main Content</ion-content>
</div>
</ion-split-pane>
</ion-app>
`,
config
);
const app = page.locator('ion-app');
await expect(app).toHaveScreenshot(screenshot(`menu-custom-split-pane`));
});
});
});

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -264,6 +264,9 @@ export class Modal implements ComponentInterface, OverlayInterface {
*
* If the value is `true` or the value's function returns `true`, the modal will close when trying to dismiss.
* If the value is `false` or the value's function returns `false`, the modal will not close when trying to dismiss.
*
* See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
* if you need to access `this` from within the callback.
*/
@Prop() canDismiss: boolean | ((data?: any, role?: string) => Promise<boolean>) = true;

View File

@@ -130,7 +130,15 @@ export class RadioGroup implements ComponentInterface {
* using the `name` attribute.
*/
const selectedRadio = ev.target && (ev.target as HTMLElement).closest('ion-radio');
if (selectedRadio && selectedRadio.disabled === false) {
/**
* Our current disabled prop definition causes Stencil to mark it
* as optional. While this is not desired, fixing this behavior
* in Stencil is a significant breaking change, so this effort is
* being de-risked in STENCIL-917. Until then, we compromise
* here by checking for falsy `disabled` values instead of strictly
* checking `disabled === false`.
*/
if (selectedRadio && !selectedRadio.disabled) {
const currentValue = this.value;
const newValue = selectedRadio.value;
if (newValue !== currentValue) {

View File

@@ -16,7 +16,7 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
});
test.describe(title('radio: keyboard navigation'), () => {
test.beforeEach(async ({ page }) => {
test.beforeEach(async ({ page, browserName }) => {
await page.setContent(
`
<ion-app>
@@ -58,6 +58,21 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
`,
config
);
if (browserName === 'webkit') {
const radio = page.locator('#first-group ion-radio').first();
/**
* Sometimes Safari does not focus the first radio.
* This is a workaround to ensure the first radio is focused.
*
* Wait for the first radio to be rendered before tabbing.
* This is necessary because the first radio may not be rendered
* when the page first loads.
*
* This would cause the first radio to be skipped when tabbing.
*/
await radio.waitFor();
}
});
test('tabbing should switch between radio groups', async ({ page, pageUtils }) => {

View File

@@ -6,9 +6,23 @@ import { configs, test } from '@utils/test/playwright';
*/
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => {
test.describe(title('radio: a11y'), () => {
test.beforeEach(async ({ page, skip }) => {
skip.browser('webkit', 'Tabbing is flaky in Safari');
test.beforeEach(async ({ page, browserName }) => {
await page.goto(`/src/components/radio/test/legacy/a11y`, config);
if (browserName === 'webkit') {
const radio = page.locator('#first-group ion-radio').first();
/**
* Sometimes Safari does not focus the first radio.
* This is a workaround to ensure the first radio is focused.
*
* Wait for the first radio to be rendered before tabbing.
* This is necessary because the first radio may not be rendered
* when the page first loads.
*
* This would cause the first radio to be skipped when tabbing.
*/
await radio.waitFor();
}
});
test('tabbing should switch between radio groups', async ({ page, pageUtils }) => {
const firstGroupRadios = page.locator('#first-group ion-radio');

View File

@@ -141,6 +141,9 @@ export class Range implements ComponentInterface {
/**
* A callback used to format the pin text.
* By default the pin text is set to `Math.round(value)`.
*
* See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
* if you need to access `this` from within the callback.
*/
@Prop() pinFormatter: PinFormatter = (value: number): number => Math.round(value);

View File

@@ -1,13 +1,13 @@
import type { ComponentInterface } from '@stencil/core';
import { Component, Element, Host, Prop, h } from '@stencil/core';
import { ENABLE_HTML_CONTENT_DEFAULT } from '@utils/config';
import { isPlatform } from '@utils/platform';
import { sanitizeDOMString } from '@utils/sanitization';
import { arrowDown, caretBackSharp } from 'ionicons/icons';
import { config } from '../../global/config';
import { getIonMode } from '../../global/ionic-global';
import type { IonicSafeString } from '../../utils/sanitization';
import { supportsRubberBandScrolling } from '../refresher/refresher.utils';
import type { SpinnerTypes } from '../spinner/spinner-configs';
import { SPINNERS } from '../spinner/spinner-configs';
@@ -63,11 +63,17 @@ export class RefresherContent implements ComponentInterface {
componentWillLoad() {
if (this.pullingIcon === undefined) {
/**
* The native iOS refresher uses a spinner instead of
* an icon, so we need to see if this device supports
* the native iOS refresher.
*/
const hasRubberBandScrolling = supportsRubberBandScrolling();
const mode = getIonMode(this);
const overflowRefresher = (this.el.style as any).webkitOverflowScrolling !== undefined ? 'lines' : arrowDown;
const overflowRefresher = hasRubberBandScrolling ? 'lines' : arrowDown;
this.pullingIcon = config.get(
'refreshingIcon',
mode === 'ios' && isPlatform('mobile') ? config.get('spinner', overflowRefresher) : 'circular'
mode === 'ios' && hasRubberBandScrolling ? config.get('spinner', overflowRefresher) : 'circular'
);
}
if (this.refreshingSpinner === undefined) {

View File

@@ -25,6 +25,9 @@ import {
translateElement,
} from './refresher.utils';
/**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
*/
@Component({
tag: 'ion-refresher',
styleUrls: {

View File

@@ -1,7 +1,6 @@
import { writeTask } from '@stencil/core';
import { createAnimation } from '@utils/animation/animation';
import { clamp, componentOnReady, transitionEndAsync } from '@utils/helpers';
import { isPlatform } from '@utils/platform';
// MD Native Refresher
// -----------------------------
@@ -195,6 +194,25 @@ export const translateElement = (el?: HTMLElement, value?: string, duration = 20
// Utils
// -----------------------------
/**
* In order to use the native iOS refresher the device must support rubber band scrolling.
* As part of this, we need to exclude Desktop Safari because it has a slightly different rubber band effect that is not compatible with the native refresher in Ionic.
*
* We also need to be careful not to include devices that spoof their user agent.
* For example, when using iOS emulation in Chrome the user agent will be spoofed such that
* navigator.maxTouchPointer > 0. To work around this,
* we check to see if the apple-pay-logo is supported as a named image which is only
* true on Apple devices.
*
* We previously checked referencEl.style.webkitOverflowScrolling to explicitly check
* for rubber band support. However, this property was removed on iPadOS and it's possible
* that this will be removed on iOS in the future too.
*
*/
export const supportsRubberBandScrolling = () => {
return navigator.maxTouchPoints > 0 && CSS.supports('background: -webkit-named-image(apple-pay-logo-black)');
};
export const shouldUseNativeRefresher = async (referenceEl: HTMLIonRefresherElement, mode: string) => {
const refresherContent = referenceEl.querySelector('ion-refresher-content');
if (!refresherContent) {
@@ -209,15 +227,6 @@ export const shouldUseNativeRefresher = async (referenceEl: HTMLIonRefresherElem
return (
pullingSpinner !== null &&
refreshingSpinner !== null &&
/**
* We use webkitOverflowScrolling for feature detection with rubber band scrolling
* on iOS. When doing referenceEl.style, webkitOverflowScrolling is undefined on non-iOS platforms.
* However, it will be the empty string on iOS.
* Note that we do not use getPropertyValue (and thus need to cast as any) because calling
* getPropertyValue('-webkit-overflow-scrolling') will return the empty string if it is not
* set on the element, even if the platform does not support that.
*/
((mode === 'ios' && isPlatform('mobile') && (referenceEl.style as any).webkitOverflowScrolling !== undefined) ||
mode === 'md')
((mode === 'ios' && supportsRubberBandScrolling()) || mode === 'md')
);
};

View File

@@ -38,3 +38,25 @@
:host(.select-disabled) {
opacity: $select-ios-disabled-opacity;
}
// Start/End Slots
// ----------------------------------------------------------------
/**
* Slotted buttons have a lot of default padding that can
* cause them to look misaligned from other pieces such
* as the control's label, especially when using a clear
* fill. We also make them circular to ensure that non-
* clear buttons and the focus/hover state on clear ones
* don't look too crowded.
*/
::slotted(ion-button[slot="start"].button-has-icon-only),
::slotted(ion-button[slot="end"].button-has-icon-only) {
--border-radius: 50%;
--padding-start: 0;
--padding-end: 0;
--padding-top: 0;
--padding-bottom: 0;
aspect-ratio: 1;
}

View File

@@ -155,3 +155,27 @@
:host(.select-disabled) {
opacity: $select-md-disabled-opacity;
}
// Start/End Slots
// ----------------------------------------------------------------
/**
* Slotted buttons have a lot of default padding that can
* cause them to look misaligned from other pieces such
* as the control's label, especially when using a clear
* fill. We also make them circular to ensure that non-
* clear buttons and the focus/hover state on clear ones
* don't look too crowded.
*/
::slotted(ion-button[slot="start"].button-has-icon-only),
::slotted(ion-button[slot="end"].button-has-icon-only) {
--border-radius: 50%;
--padding-start: 8px;
--padding-end: 8px;
--padding-top: 8px;
--padding-bottom: 8px;
aspect-ratio: 1;
min-height: 40px;
}

View File

@@ -592,8 +592,10 @@ button {
::slotted([slot="start"]) {
margin-inline-end: $form-control-label-margin;
margin-inline-start: 0;
}
::slotted([slot="end"]) {
margin-inline-start: $form-control-label-margin;
margin-inline-end: 0;
}

View File

@@ -8,7 +8,9 @@ configs().forEach(({ title, screenshot, config }) => {
`
<ion-select label-placement="start" fill="solid" placeholder="Select weight" label="Weight">
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
<ion-label slot="end">lbs</ion-label>
<ion-button slot="end" aria-label="Show/hide password">
<ion-icon slot="icon-only" name="lock-closed" aria-hidden="true"></ion-icon>
</ion-button>
</ion-select>
`,
config
@@ -23,7 +25,9 @@ configs().forEach(({ title, screenshot, config }) => {
`
<ion-select label-placement="floating" fill="solid" placeholder="Select weight" label="Weight">
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
<ion-label slot="end">lbs</ion-label>
<ion-button slot="end" aria-label="Show/hide password">
<ion-icon slot="icon-only" name="lock-closed" aria-hidden="true"></ion-icon>
</ion-button>
</ion-select>
`,
config

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Some files were not shown because too many files have changed in this diff Show More