Merge remote-tracking branch 'origin/main' into sp/sync-7.2-with-main-7-12

This commit is contained in:
Sean Perkins
2023-07-12 22:09:54 -04:00
964 changed files with 4072 additions and 1169 deletions

4
.github/CODEOWNERS vendored
View File

@ -15,9 +15,9 @@
## Angular ## Angular
/angular/ @sean-perkins /packages/angular/ @sean-perkins
/packages/angular-server @sean-perkins /packages/angular-server @sean-perkins
/angular/test /packages/angular/test
## React ## React

View File

@ -295,7 +295,7 @@ See [Ionic's E2E testing guide](../core/src/utils/test/playwright/docs/README.md
#### Modifying Files #### Modifying Files
1. Locate the files inside the relevant root directory: 1. Locate the files inside the relevant root directory:
- Angular: [`/angular/src`](/angular/src) - Angular: [`/packages/angular/src`](/packages/angular/src)
- React: [`/packages/react/src`](/packages/react/src) - React: [`/packages/react/src`](/packages/react/src)
- Vue: [`/packages/vue/src`](/packages/vue/src) - Vue: [`/packages/vue/src`](/packages/vue/src)
2. Make your changes to the files. If the change is overly complex or out of the ordinary, add comments so we can understand the changes. 2. Make your changes to the files. If the change is overly complex or out of the ordinary, add comments so we can understand the changes.
@ -311,7 +311,7 @@ See [Ionic's E2E testing guide](../core/src/utils/test/playwright/docs/README.md
##### Previewing in this repository ##### Previewing in this repository
Follow the steps in the test directory for each framework: Follow the steps in the test directory for each framework:
- Angular: [`/angular/test`](/angular/test/README.md) - Angular: [`/packages/angular/test`](/packages/angular/test/README.md)
- React: [`/packages/react/test`](/packages/react/test/README.md) - React: [`/packages/react/test`](/packages/react/test/README.md)
- Vue: [`/packages/vue/test`](/packages/vue/test/README.md) - Vue: [`/packages/vue/test`](/packages/vue/test/README.md)
@ -322,7 +322,7 @@ Follow the steps to [preview changes in core](#preview-changes).
#### Lint Changes #### Lint Changes
1. Run `npm run lint` to lint the TypeScript in the relevant directory: 1. Run `npm run lint` to lint the TypeScript in the relevant directory:
- Angular: [`/angular/src`](/angular/src) - Angular: [`/packages/angular/src`](/packages/angular/src)
- React: [`/packages/react/src`](/packages/react/src) - React: [`/packages/react/src`](/packages/react/src)
- Vue: [`/packages/vue/src`](/packages/vue/src) - Vue: [`/packages/vue/src`](/packages/vue/src)
2. If there are lint errors, run `npm run lint.fix` to automatically fix any errors. Repeat step 1 to ensure the errors have been fixed, and manually fix them if not. 2. If there are lint errors, run `npm run lint.fix` to automatically fix any errors. Repeat step 1 to ensure the errors have been fixed, and manually fix them if not.
@ -330,7 +330,7 @@ Follow the steps to [preview changes in core](#preview-changes).
#### Modifying Tests #### Modifying Tests
1. Locate the e2e test to modify inside the relevant test app directory: 1. Locate the e2e test to modify inside the relevant test app directory:
- Angular: [`/angular/test/base/e2e/src`](/angular/test/base/e2e/src) - Angular: [`/packages/angular/test/base/e2e/src`](/packages/angular/test/base/e2e/src)
- React: [`/packages/react/test/base/tests/e2e/specs`](/packages/react/test/base/tests/e2e/specs) - React: [`/packages/react/test/base/tests/e2e/specs`](/packages/react/test/base/tests/e2e/specs)
- Vue: [`/packages/vue/test/base/tests/e2e/specs`](/packages/vue/test/base/tests/e2e/specs) - Vue: [`/packages/vue/test/base/tests/e2e/specs`](/packages/vue/test/base/tests/e2e/specs)
2. If a test exists, modify the test by adding an example to reproduce the problem fixed or feature added. 2. If a test exists, modify the test by adding an example to reproduce the problem fixed or feature added.

2
.github/labeler.yml vendored
View File

@ -9,7 +9,7 @@
- core/**/* - core/**/*
'package: angular': 'package: angular':
- angular/**/* - packages/angular/**/*
- packages/angular-*/**/* - packages/angular-*/**/*
'package: react': 'package: react':

View File

@ -14,25 +14,25 @@ runs:
- name: Install Angular Dependencies - name: Install Angular Dependencies
run: npm ci run: npm ci
shell: bash shell: bash
working-directory: ./angular working-directory: ./packages/angular
- name: Sync - name: Sync
run: npm run sync run: npm run sync
shell: bash shell: bash
working-directory: ./angular working-directory: ./packages/angular
- name: Lint - name: Lint
run: npm run lint run: npm run lint
shell: bash shell: bash
working-directory: ./angular working-directory: ./packages/angular
- name: Build - name: Build
run: npm run build run: npm run build
shell: bash shell: bash
working-directory: ./angular working-directory: ./packages/angular
- name: Check Diff - name: Check Diff
run: git diff --exit-code run: git diff --exit-code
shell: bash shell: bash
working-directory: ./angular working-directory: ./packages/angular
- uses: ./.github/workflows/actions/upload-archive - uses: ./.github/workflows/actions/upload-archive
with: with:
name: ionic-angular name: ionic-angular
output: ./angular/AngularBuild.zip output: ./packages/angular/AngularBuild.zip
paths: ./angular/dist paths: ./packages/angular/dist

View File

@ -22,6 +22,10 @@ runs:
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
with: with:
node-version: 16.x node-version: 16.x
# Provenance requires npm 9.5.0+
- name: Install latest npm
run: npm install -g npm@latest
shell: bash
# This ensures the local version of Lerna is installed # This ensures the local version of Lerna is installed
# and that we do not use the global Lerna version # and that we do not use the global Lerna version
- name: Install root dependencies - name: Install root dependencies

View File

@ -27,16 +27,16 @@ runs:
- name: Create Test App - name: Create Test App
run: ./build.sh ${{ inputs.app }} run: ./build.sh ${{ inputs.app }}
shell: bash shell: bash
working-directory: ./angular/test working-directory: ./packages/angular/test
- name: Install Dependencies - name: Install Dependencies
run: npm install run: npm install
shell: bash shell: bash
working-directory: ./angular/test/build/${{ inputs.app }} working-directory: ./packages/angular/test/build/${{ inputs.app }}
- name: Sync Built Changes - name: Sync Built Changes
run: npm run sync run: npm run sync
shell: bash shell: bash
working-directory: ./angular/test/build/${{ inputs.app }} working-directory: ./packages/angular/test/build/${{ inputs.app }}
- name: Run Tests - name: Run Tests
run: npm run test run: npm run test
shell: bash shell: bash
working-directory: ./angular/test/build/${{ inputs.app }} working-directory: ./packages/angular/test/build/${{ inputs.app }}

View File

@ -122,7 +122,7 @@ jobs:
- uses: ./.github/workflows/actions/build-angular - uses: ./.github/workflows/actions/build-angular
build-angular-server: build-angular-server:
needs: [build-angular] needs: [build-core]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3

View File

@ -81,15 +81,15 @@ jobs:
tag: ${{ inputs.tag }} tag: ${{ inputs.tag }}
version: ${{ inputs.version }} version: ${{ inputs.version }}
preid: ${{ inputs.preid }} preid: ${{ inputs.preid }}
working-directory: 'angular' working-directory: 'packages/angular'
folder: './dist' folder: './dist'
token: ${{ secrets.NPM_TOKEN }} token: ${{ secrets.NPM_TOKEN }}
- name: Cache Built @ionic/angular - name: Cache Built @ionic/angular
uses: ./.github/workflows/actions/upload-archive uses: ./.github/workflows/actions/upload-archive
with: with:
name: ionic-angular name: ionic-angular
output: ./angular/AngularBuild.zip output: packages/angular/AngularBuild.zip
paths: ./angular/dist paths: packages/angular/dist
release-react: release-react:
needs: [release-core] needs: [release-core]
@ -144,7 +144,7 @@ jobs:
paths: packages/vue/dist packages/vue/css paths: packages/vue/dist packages/vue/css
release-angular-server: release-angular-server:
needs: [release-angular] needs: [release-core]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
@ -154,12 +154,6 @@ jobs:
name: ionic-core name: ionic-core
path: ./core path: ./core
filename: CoreBuild.zip filename: CoreBuild.zip
- name: Restore @ionic/angular built cache
uses: ./.github/workflows/actions/download-archive
with:
name: ionic-angular
path: ./angular
filename: AngularBuild.zip
- uses: ./.github/workflows/actions/publish-npm - uses: ./.github/workflows/actions/publish-npm
with: with:
scope: '@ionic/angular-server' scope: '@ionic/angular-server'

View File

@ -133,7 +133,7 @@ jobs:
- uses: ./.github/workflows/actions/build-angular - uses: ./.github/workflows/actions/build-angular
build-angular-server: build-angular-server:
needs: [build-angular] needs: [build-core-with-stencil-nightly]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3

View File

@ -1,220 +0,0 @@
# This workflow is intended to run against the `HEAD` of Stencil's primary branch.
# See https://github.com/ionic-team/stencil for contents of the repository
name: 'Stencil v4 Build'
on:
schedule:
# Run every Monday-Friday
# at 6:00 UTC (6:00 am UTC)
- cron: '00 06 * * 1-5'
workflow_dispatch:
# allows for manual invocations in the GitHub UI
# When pushing a new commit we should
# cancel the previous test run to not
# consume more runners than we need to.
concurrency:
group: ${{ github.ref }}
cancel-in-progress: false
jobs:
build-core-with-stencil-v4:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/build-core-stencil-prerelease
with:
stencil-version: v4-next
test-core-clean-build:
needs: [build-core-with-stencil-v4]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-core-clean-build
test-core-lint:
needs: [build-core-with-stencil-v4]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-core-lint
test-core-spec:
needs: [build-core-with-stencil-v4]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-core-spec
test-core-screenshot:
strategy:
# This ensures that all screenshot shard
# failures are reported so the dev can
# review everything at once.
fail-fast: false
matrix:
# Divide the tests into n buckets
# and run those buckets in parallel.
# To increase the number of shards,
# add new items to the shard array
# and change the value of totalShards
# to be the length of the shard array.
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
totalShards: [20]
needs: [build-core-with-stencil-v4]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-core-screenshot
with:
shard: ${{ matrix.shard }}
totalShards: ${{ matrix.totalShards }}
# Screenshots are required to pass
# in order for the branch to be merge
# eligible. However, the screenshot tests
# are run on n runners where n can change
# over time. The verify-screenshots step allows
# us to have a required status check for screenshot
# results without having to manually add each
# matrix run in the branch protection rules
# Source: https://github.community/t/status-check-for-a-matrix-jobs/127354
verify-screenshots:
if: ${{ always() }}
needs: test-core-screenshot
runs-on: ubuntu-latest
steps:
- name: Check build matrix status
if: ${{ needs.test-core-screenshot.result != 'success' }}
run: exit 1
build-vue:
needs: [build-core-with-stencil-v4]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/build-vue
build-vue-router:
needs: [build-vue]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/build-vue-router
test-vue-e2e:
strategy:
fail-fast: false
matrix:
apps: [vue3]
needs: [build-vue, build-vue-router]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-vue-e2e
with:
app: ${{ matrix.apps }}
verify-test-vue-e2e:
if: ${{ always() }}
needs: test-vue-e2e
runs-on: ubuntu-latest
steps:
- name: Check build matrix status
if: ${{ needs.test-vue-e2e.result != 'success' }}
run: exit 1
build-angular:
needs: [build-core-with-stencil-v4]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/build-angular
build-angular-server:
needs: [build-angular]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/build-angular-server
test-angular-e2e:
strategy:
fail-fast: false
matrix:
apps: [ng12, ng13, ng14, ng15]
needs: [build-angular, build-angular-server]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-angular-e2e
with:
app: ${{ matrix.apps }}
verify-test-angular-e2e:
if: ${{ always() }}
needs: test-angular-e2e
runs-on: ubuntu-latest
steps:
- name: Check build matrix status
if: ${{ needs.test-angular-e2e.result != 'success' }}
run: exit 1
build-react:
needs: [build-core-with-stencil-v4]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/build-react
build-react-router:
needs: [build-react]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/build-react-router
test-react-router-e2e:
strategy:
fail-fast: false
matrix:
apps: [reactrouter5]
needs: [build-react, build-react-router]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-react-router-e2e
with:
app: ${{ matrix.apps }}
verify-test-react-router-e2e:
if: ${{ always() }}
needs: test-react-router-e2e
runs-on: ubuntu-latest
steps:
- name: Check build matrix status
if: ${{ needs.test-react-router-e2e.result != 'success' }}
run: exit 1
test-react-e2e:
strategy:
fail-fast: false
matrix:
apps: [react17, react18]
needs: [build-react, build-react-router]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/workflows/actions/test-react-e2e
with:
app: ${{ matrix.apps }}
verify-test-react-e2e:
if: ${{ always() }}
needs: test-react-e2e
runs-on: ubuntu-latest
steps:
- name: Check build matrix status
if: ${{ needs.test-react-e2e.result != 'success' }}
run: exit 1

4
.gitignore vendored
View File

@ -71,8 +71,8 @@ core/playwright-report/
core/**/*-snapshots core/**/*-snapshots
# angular # angular
angular/css/ packages/angular/css/
angular/test/build/ packages/angular/test/build/
.angular/ .angular/
# vue # vue

View File

@ -3,6 +3,70 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [7.1.3](https://github.com/ionic-team/ionic-framework/compare/v7.1.2...v7.1.3) (2023-07-12)
### Bug Fixes
* avoid unresolved import warning on stencil apps ([#27765](https://github.com/ionic-team/ionic-framework/issues/27765)) ([2085025](https://github.com/ionic-team/ionic-framework/commit/2085025644f075e63d04bece56eca4f2beeadbb6)), closes [#27762](https://github.com/ionic-team/ionic-framework/issues/27762)
* **overlays:** first button is not focused on backdrop tap ([#27774](https://github.com/ionic-team/ionic-framework/issues/27774)) ([82c568b](https://github.com/ionic-team/ionic-framework/commit/82c568b8c8e1e9934e1928452aa5216619290e7b)), closes [#27773](https://github.com/ionic-team/ionic-framework/issues/27773)
## [7.1.2](https://github.com/ionic-team/ionic-framework/compare/v7.1.1...v7.1.2) (2023-07-06)
### Bug Fixes
* **back-button:** show correct background on focus + hover with ios ([#27723](https://github.com/ionic-team/ionic-framework/issues/27723)) ([db9a001](https://github.com/ionic-team/ionic-framework/commit/db9a0010df3c7fd0fcd0dbcd8c4ad3b30d022b5c)), closes [#27722](https://github.com/ionic-team/ionic-framework/issues/27722)
* **nav:** root component is mounted with root params ([#27676](https://github.com/ionic-team/ionic-framework/issues/27676)) ([1f06be4](https://github.com/ionic-team/ionic-framework/commit/1f06be4a31965f2a949b4866a585aee6af0af29d)), closes [#27146](https://github.com/ionic-team/ionic-framework/issues/27146)
## [7.1.1](https://github.com/ionic-team/ionic-framework/compare/v7.1.0...v7.1.1) (2023-06-26)
### Bug Fixes
* **textarea:** autogrow resizes correctly ([#27691](https://github.com/ionic-team/ionic-framework/issues/27691)) ([f263611](https://github.com/ionic-team/ionic-framework/commit/f263611260c465bfeefc2db7b1ea04bfa5b54303)), closes [#27688](https://github.com/ionic-team/ionic-framework/issues/27688)
# [7.1.0](https://github.com/ionic-team/ionic-framework/compare/v7.0.14...v7.1.0) (2023-06-21)
### Bug Fixes
* **angular:** tabs supports conditional slot bindings ([#27582](https://github.com/ionic-team/ionic-framework/issues/27582)) ([d20bea5](https://github.com/ionic-team/ionic-framework/commit/d20bea561c362eacd250cdedbc9b79159eb2c95f)), closes [#19484](https://github.com/ionic-team/ionic-framework/issues/19484)
* **datetime:** ascending order for years ([#27551](https://github.com/ionic-team/ionic-framework/issues/27551)) ([2098806](https://github.com/ionic-team/ionic-framework/commit/209880622a4600f88c4878e82975ad0492bd55db)), closes [#27422](https://github.com/ionic-team/ionic-framework/issues/27422)
* import paths ([d10509f](https://github.com/ionic-team/ionic-framework/commit/d10509f84099515f62c895dcd736cc387e382bde))
* **select:** hide notch cutout if no visible label provided ([#27649](https://github.com/ionic-team/ionic-framework/issues/27649)) ([606a892](https://github.com/ionic-team/ionic-framework/commit/606a892e400a531cac5c413dc7492a54ae0e1fea))
### Features
* **datetime:** add part for month/year button ([#27618](https://github.com/ionic-team/ionic-framework/issues/27618)) ([d44422e](https://github.com/ionic-team/ionic-framework/commit/d44422e224374804010746a12f398d3c0d6a9f2c)), closes [#26596](https://github.com/ionic-team/ionic-framework/issues/26596)
* **datetime:** add shadow parts and CSS variables for styling wheel pickers ([#27529](https://github.com/ionic-team/ionic-framework/issues/27529)) ([f2c1845](https://github.com/ionic-team/ionic-framework/commit/f2c1845fba11d8273331c601052f0f34457b6649)), closes [#25945](https://github.com/ionic-team/ionic-framework/issues/25945)
* **input:** add experimental label slot ([#27650](https://github.com/ionic-team/ionic-framework/issues/27650)) ([a45395c](https://github.com/ionic-team/ionic-framework/commit/a45395cc02b2617b80e6c2389fa745e7c20540fc)), closes [#27061](https://github.com/ionic-team/ionic-framework/issues/27061)
* **range:** add label prop ([#27408](https://github.com/ionic-team/ionic-framework/issues/27408)) ([368add2](https://github.com/ionic-team/ionic-framework/commit/368add2a5ca3820a1f9623c96d29bcccfa693fdc))
* return if the pop on NavController was successful ([#27404](https://github.com/ionic-team/ionic-framework/issues/27404)) ([e80f0b2](https://github.com/ionic-team/ionic-framework/commit/e80f0b240968de0d642463e95a35adf8dbffd2e1)), closes [#27403](https://github.com/ionic-team/ionic-framework/issues/27403)
* **segment, segment-button:** update segment value property to accept numbers ([#27222](https://github.com/ionic-team/ionic-framework/issues/27222)) ([ec95ae5](https://github.com/ionic-team/ionic-framework/commit/ec95ae5cd38e3d2b9ec9fdbc9e237fa1241f7a4e)), closes [#27221](https://github.com/ionic-team/ionic-framework/issues/27221)
* **segment:** display segment as a grid and add an ellipsis to overflowing text in a segment button ([#27457](https://github.com/ionic-team/ionic-framework/issues/27457)) ([448e63f](https://github.com/ionic-team/ionic-framework/commit/448e63fef0aca603214cb357dec37e1db2a0f052)), closes [#16532](https://github.com/ionic-team/ionic-framework/issues/16532)
* **select:** add label slot ([#27545](https://github.com/ionic-team/ionic-framework/issues/27545)) ([af92cb2](https://github.com/ionic-team/ionic-framework/commit/af92cb28c8819c88b40192b5dcbafedc1eb2064a)), closes [#26838](https://github.com/ionic-team/ionic-framework/issues/26838)
* **select:** add props to customize toggle icons ([#27648](https://github.com/ionic-team/ionic-framework/issues/27648)) ([95e28b6](https://github.com/ionic-team/ionic-framework/commit/95e28b6629843af7dce62f20bc8e31adfb391990)), closes [#17248](https://github.com/ionic-team/ionic-framework/issues/17248)
* **select:** expose container and label as CSS parts ([#27541](https://github.com/ionic-team/ionic-framework/issues/27541)) ([5c10f88](https://github.com/ionic-team/ionic-framework/commit/5c10f88b2eb4d869966ea9a6d1db34185cefe676)), closes [#27112](https://github.com/ionic-team/ionic-framework/issues/27112)
* **textarea:** add experimental label slot ([#27677](https://github.com/ionic-team/ionic-framework/issues/27677)) ([8bcd9e8](https://github.com/ionic-team/ionic-framework/commit/8bcd9e8b35f252a4efaec7a7be7d69a70beefa9f)), closes [#27061](https://github.com/ionic-team/ionic-framework/issues/27061)
## [7.0.14](https://github.com/ionic-team/ionic-framework/compare/v7.0.13...v7.0.14) (2023-06-15) ## [7.0.14](https://github.com/ionic-team/ionic-framework/compare/v7.0.13...v7.0.14) (2023-06-15)

View File

@ -1,10 +0,0 @@
import { NgModule } from "@angular/core";
import { RouterModule } from "@angular/router";
@NgModule({
imports: [
RouterModule.forChild([])
],
exports: [RouterModule]
})
export class VersionTestRoutingModule { }

View File

@ -3,6 +3,67 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [7.1.3](https://github.com/ionic-team/ionic-framework/compare/v7.1.2...v7.1.3) (2023-07-12)
### Bug Fixes
* avoid unresolved import warning on stencil apps ([#27765](https://github.com/ionic-team/ionic-framework/issues/27765)) ([2085025](https://github.com/ionic-team/ionic-framework/commit/2085025644f075e63d04bece56eca4f2beeadbb6)), closes [#27762](https://github.com/ionic-team/ionic-framework/issues/27762)
* **overlays:** first button is not focused on backdrop tap ([#27774](https://github.com/ionic-team/ionic-framework/issues/27774)) ([82c568b](https://github.com/ionic-team/ionic-framework/commit/82c568b8c8e1e9934e1928452aa5216619290e7b)), closes [#27773](https://github.com/ionic-team/ionic-framework/issues/27773)
## [7.1.2](https://github.com/ionic-team/ionic-framework/compare/v7.1.1...v7.1.2) (2023-07-06)
### Bug Fixes
* **back-button:** show correct background on focus + hover with ios ([#27723](https://github.com/ionic-team/ionic-framework/issues/27723)) ([db9a001](https://github.com/ionic-team/ionic-framework/commit/db9a0010df3c7fd0fcd0dbcd8c4ad3b30d022b5c)), closes [#27722](https://github.com/ionic-team/ionic-framework/issues/27722)
* **nav:** root component is mounted with root params ([#27676](https://github.com/ionic-team/ionic-framework/issues/27676)) ([1f06be4](https://github.com/ionic-team/ionic-framework/commit/1f06be4a31965f2a949b4866a585aee6af0af29d)), closes [#27146](https://github.com/ionic-team/ionic-framework/issues/27146)
## [7.1.1](https://github.com/ionic-team/ionic-framework/compare/v7.1.0...v7.1.1) (2023-06-26)
### Bug Fixes
* **textarea:** autogrow resizes correctly ([#27691](https://github.com/ionic-team/ionic-framework/issues/27691)) ([f263611](https://github.com/ionic-team/ionic-framework/commit/f263611260c465bfeefc2db7b1ea04bfa5b54303)), closes [#27688](https://github.com/ionic-team/ionic-framework/issues/27688)
# [7.1.0](https://github.com/ionic-team/ionic-framework/compare/v7.0.14...v7.1.0) (2023-06-21)
### Bug Fixes
* **datetime:** ascending order for years ([#27551](https://github.com/ionic-team/ionic-framework/issues/27551)) ([2098806](https://github.com/ionic-team/ionic-framework/commit/209880622a4600f88c4878e82975ad0492bd55db)), closes [#27422](https://github.com/ionic-team/ionic-framework/issues/27422)
* **select:** hide notch cutout if no visible label provided ([#27649](https://github.com/ionic-team/ionic-framework/issues/27649)) ([606a892](https://github.com/ionic-team/ionic-framework/commit/606a892e400a531cac5c413dc7492a54ae0e1fea))
### Features
* **datetime:** add part for month/year button ([#27618](https://github.com/ionic-team/ionic-framework/issues/27618)) ([d44422e](https://github.com/ionic-team/ionic-framework/commit/d44422e224374804010746a12f398d3c0d6a9f2c)), closes [#26596](https://github.com/ionic-team/ionic-framework/issues/26596)
* **datetime:** add shadow parts and CSS variables for styling wheel pickers ([#27529](https://github.com/ionic-team/ionic-framework/issues/27529)) ([f2c1845](https://github.com/ionic-team/ionic-framework/commit/f2c1845fba11d8273331c601052f0f34457b6649)), closes [#25945](https://github.com/ionic-team/ionic-framework/issues/25945)
* **input:** add experimental label slot ([#27650](https://github.com/ionic-team/ionic-framework/issues/27650)) ([a45395c](https://github.com/ionic-team/ionic-framework/commit/a45395cc02b2617b80e6c2389fa745e7c20540fc)), closes [#27061](https://github.com/ionic-team/ionic-framework/issues/27061)
* **range:** add label prop ([#27408](https://github.com/ionic-team/ionic-framework/issues/27408)) ([368add2](https://github.com/ionic-team/ionic-framework/commit/368add2a5ca3820a1f9623c96d29bcccfa693fdc))
* **segment, segment-button:** update segment value property to accept numbers ([#27222](https://github.com/ionic-team/ionic-framework/issues/27222)) ([ec95ae5](https://github.com/ionic-team/ionic-framework/commit/ec95ae5cd38e3d2b9ec9fdbc9e237fa1241f7a4e)), closes [#27221](https://github.com/ionic-team/ionic-framework/issues/27221)
* **segment:** display segment as a grid and add an ellipsis to overflowing text in a segment button ([#27457](https://github.com/ionic-team/ionic-framework/issues/27457)) ([448e63f](https://github.com/ionic-team/ionic-framework/commit/448e63fef0aca603214cb357dec37e1db2a0f052)), closes [#16532](https://github.com/ionic-team/ionic-framework/issues/16532)
* **select:** add label slot ([#27545](https://github.com/ionic-team/ionic-framework/issues/27545)) ([af92cb2](https://github.com/ionic-team/ionic-framework/commit/af92cb28c8819c88b40192b5dcbafedc1eb2064a)), closes [#26838](https://github.com/ionic-team/ionic-framework/issues/26838)
* **select:** add props to customize toggle icons ([#27648](https://github.com/ionic-team/ionic-framework/issues/27648)) ([95e28b6](https://github.com/ionic-team/ionic-framework/commit/95e28b6629843af7dce62f20bc8e31adfb391990)), closes [#17248](https://github.com/ionic-team/ionic-framework/issues/17248)
* **select:** expose container and label as CSS parts ([#27541](https://github.com/ionic-team/ionic-framework/issues/27541)) ([5c10f88](https://github.com/ionic-team/ionic-framework/commit/5c10f88b2eb4d869966ea9a6d1db34185cefe676)), closes [#27112](https://github.com/ionic-team/ionic-framework/issues/27112)
* **textarea:** add experimental label slot ([#27677](https://github.com/ionic-team/ionic-framework/issues/27677)) ([8bcd9e8](https://github.com/ionic-team/ionic-framework/commit/8bcd9e8b35f252a4efaec7a7be7d69a70beefa9f)), closes [#27061](https://github.com/ionic-team/ionic-framework/issues/27061)
## [7.0.14](https://github.com/ionic-team/ionic-framework/compare/v7.0.13...v7.0.14) (2023-06-15) ## [7.0.14](https://github.com/ionic-team/ionic-framework/compare/v7.0.13...v7.0.14) (2023-06-15)

View File

@ -425,6 +425,13 @@ ion-datetime,event,ionFocus,void,true
ion-datetime,css-prop,--background ion-datetime,css-prop,--background
ion-datetime,css-prop,--background-rgb ion-datetime,css-prop,--background-rgb
ion-datetime,css-prop,--title-color ion-datetime,css-prop,--title-color
ion-datetime,css-prop,--wheel-fade-background-rgb
ion-datetime,css-prop,--wheel-highlight-background
ion-datetime,part,month-year-button
ion-datetime,part,time-button
ion-datetime,part,time-button active
ion-datetime,part,wheel-item
ion-datetime,part,wheel-item active
ion-datetime-button,shadow ion-datetime-button,shadow
ion-datetime-button,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record<never, never> | undefined,'primary',false,true ion-datetime-button,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record<never, never> | undefined,'primary',false,true
@ -1030,6 +1037,7 @@ ion-range,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secon
ion-range,prop,debounce,number | undefined,undefined,false,false ion-range,prop,debounce,number | undefined,undefined,false,false
ion-range,prop,disabled,boolean,false,false,false ion-range,prop,disabled,boolean,false,false,false
ion-range,prop,dualKnobs,boolean,false,false,false ion-range,prop,dualKnobs,boolean,false,false,false
ion-range,prop,label,string | undefined,undefined,false,false
ion-range,prop,labelPlacement,"end" | "fixed" | "start",'start',false,false ion-range,prop,labelPlacement,"end" | "fixed" | "start",'start',false,false
ion-range,prop,legacy,boolean | undefined,undefined,false,false ion-range,prop,legacy,boolean | undefined,undefined,false,false
ion-range,prop,max,number,100,false,false ion-range,prop,max,number,100,false,false
@ -1183,7 +1191,7 @@ ion-segment,prop,mode,"ios" | "md",undefined,false,false
ion-segment,prop,scrollable,boolean,false,false,false ion-segment,prop,scrollable,boolean,false,false,false
ion-segment,prop,selectOnFocus,boolean,false,false,false ion-segment,prop,selectOnFocus,boolean,false,false,false
ion-segment,prop,swipeGesture,boolean,true,false,false ion-segment,prop,swipeGesture,boolean,true,false,false
ion-segment,prop,value,string | undefined,undefined,false,false ion-segment,prop,value,number | string | undefined,undefined,false,false
ion-segment,event,ionChange,SegmentChangeEventDetail,true ion-segment,event,ionChange,SegmentChangeEventDetail,true
ion-segment,css-prop,--background ion-segment,css-prop,--background
@ -1192,7 +1200,7 @@ ion-segment-button,prop,disabled,boolean,false,false,false
ion-segment-button,prop,layout,"icon-bottom" | "icon-end" | "icon-hide" | "icon-start" | "icon-top" | "label-hide" | undefined,'icon-top',false,false ion-segment-button,prop,layout,"icon-bottom" | "icon-end" | "icon-hide" | "icon-start" | "icon-top" | "label-hide" | undefined,'icon-top',false,false
ion-segment-button,prop,mode,"ios" | "md",undefined,false,false ion-segment-button,prop,mode,"ios" | "md",undefined,false,false
ion-segment-button,prop,type,"button" | "reset" | "submit",'button',false,false ion-segment-button,prop,type,"button" | "reset" | "submit",'button',false,false
ion-segment-button,prop,value,string,'ion-sb-' + ids++,false,false ion-segment-button,prop,value,number | string,'ion-sb-' + ids++,false,false
ion-segment-button,css-prop,--background ion-segment-button,css-prop,--background
ion-segment-button,css-prop,--background-checked ion-segment-button,css-prop,--background-checked
ion-segment-button,css-prop,--background-focused ion-segment-button,css-prop,--background-focused
@ -1230,6 +1238,7 @@ ion-select,prop,cancelText,string,'Cancel',false,false
ion-select,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record<never, never> | undefined,undefined,false,true ion-select,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record<never, never> | undefined,undefined,false,true
ion-select,prop,compareWith,((currentValue: any, compareValue: any) => boolean) | null | string | undefined,undefined,false,false ion-select,prop,compareWith,((currentValue: any, compareValue: any) => boolean) | null | string | undefined,undefined,false,false
ion-select,prop,disabled,boolean,false,false,false ion-select,prop,disabled,boolean,false,false,false
ion-select,prop,expandedIcon,string | undefined,undefined,false,false
ion-select,prop,fill,"outline" | "solid" | undefined,undefined,false,false ion-select,prop,fill,"outline" | "solid" | undefined,undefined,false,false
ion-select,prop,interface,"action-sheet" | "alert" | "popover",'alert',false,false ion-select,prop,interface,"action-sheet" | "alert" | "popover",'alert',false,false
ion-select,prop,interfaceOptions,any,{},false,false ion-select,prop,interfaceOptions,any,{},false,false
@ -1244,6 +1253,7 @@ ion-select,prop,okText,string,'OK',false,false
ion-select,prop,placeholder,string | undefined,undefined,false,false ion-select,prop,placeholder,string | undefined,undefined,false,false
ion-select,prop,selectedText,null | string | undefined,undefined,false,false ion-select,prop,selectedText,null | string | undefined,undefined,false,false
ion-select,prop,shape,"round" | undefined,undefined,false,false ion-select,prop,shape,"round" | undefined,undefined,false,false
ion-select,prop,toggleIcon,string | undefined,undefined,false,false
ion-select,prop,value,any,undefined,false,false ion-select,prop,value,any,undefined,false,false
ion-select,method,open,open(event?: UIEvent) => Promise<any> ion-select,method,open,open(event?: UIEvent) => Promise<any>
ion-select,event,ionBlur,void,true ion-select,event,ionBlur,void,true
@ -1266,7 +1276,9 @@ ion-select,css-prop,--padding-top
ion-select,css-prop,--placeholder-color ion-select,css-prop,--placeholder-color
ion-select,css-prop,--placeholder-opacity ion-select,css-prop,--placeholder-opacity
ion-select,css-prop,--ripple-color ion-select,css-prop,--ripple-color
ion-select,part,container
ion-select,part,icon ion-select,part,icon
ion-select,part,label
ion-select,part,placeholder ion-select,part,placeholder
ion-select,part,text ion-select,part,text

36
core/package-lock.json generated
View File

@ -1,16 +1,16 @@
{ {
"name": "@ionic/core", "name": "@ionic/core",
"version": "7.0.14", "version": "7.1.3",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@ionic/core", "name": "@ionic/core",
"version": "7.0.14", "version": "7.1.3",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@stencil/core": "^3.4.0", "@stencil/core": "^3.4.0",
"ionicons": "^7.1.0", "ionicons": "7.1.0",
"tslib": "^2.1.0" "tslib": "^2.1.0"
}, },
"devDependencies": { "devDependencies": {
@ -18,7 +18,7 @@
"@ionic/eslint-config": "^0.3.0", "@ionic/eslint-config": "^0.3.0",
"@ionic/prettier-config": "^2.0.0", "@ionic/prettier-config": "^2.0.0",
"@jest/core": "^27.5.1", "@jest/core": "^27.5.1",
"@playwright/test": "^1.35.1", "@playwright/test": "^1.36.0",
"@rollup/plugin-node-resolve": "^8.4.0", "@rollup/plugin-node-resolve": "^8.4.0",
"@rollup/plugin-virtual": "^2.0.3", "@rollup/plugin-virtual": "^2.0.3",
"@stencil/angular-output-target": "^0.7.1", "@stencil/angular-output-target": "^0.7.1",
@ -1501,13 +1501,13 @@
} }
}, },
"node_modules/@playwright/test": { "node_modules/@playwright/test": {
"version": "1.35.1", "version": "1.36.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.35.1.tgz", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.0.tgz",
"integrity": "sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA==", "integrity": "sha512-yN+fvMYtiyLFDCQos+lWzoX4XW3DNuaxjBu68G0lkgLgC6BP+m/iTxJQoSicz/x2G5EsrqlZTqTIP9sTgLQerg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node": "*", "@types/node": "*",
"playwright-core": "1.35.1" "playwright-core": "1.36.0"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -8150,9 +8150,9 @@
} }
}, },
"node_modules/playwright-core": { "node_modules/playwright-core": {
"version": "1.35.1", "version": "1.36.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.35.1.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.0.tgz",
"integrity": "sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==", "integrity": "sha512-7RTr8P6YJPAqB+8j5ATGHqD6LvLLM39sYVNsslh78g8QeLcBs5750c6+msjrHUwwGt+kEbczBj1XB22WMwn+WA==",
"dev": true, "dev": true,
"bin": { "bin": {
"playwright-core": "cli.js" "playwright-core": "cli.js"
@ -11381,14 +11381,14 @@
} }
}, },
"@playwright/test": { "@playwright/test": {
"version": "1.35.1", "version": "1.36.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.35.1.tgz", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.0.tgz",
"integrity": "sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA==", "integrity": "sha512-yN+fvMYtiyLFDCQos+lWzoX4XW3DNuaxjBu68G0lkgLgC6BP+m/iTxJQoSicz/x2G5EsrqlZTqTIP9sTgLQerg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/node": "*", "@types/node": "*",
"fsevents": "2.3.2", "fsevents": "2.3.2",
"playwright-core": "1.35.1" "playwright-core": "1.36.0"
} }
}, },
"@rollup/plugin-node-resolve": { "@rollup/plugin-node-resolve": {
@ -16258,9 +16258,9 @@
} }
}, },
"playwright-core": { "playwright-core": {
"version": "1.35.1", "version": "1.36.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.35.1.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.0.tgz",
"integrity": "sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==", "integrity": "sha512-7RTr8P6YJPAqB+8j5ATGHqD6LvLLM39sYVNsslh78g8QeLcBs5750c6+msjrHUwwGt+kEbczBj1XB22WMwn+WA==",
"dev": true "dev": true
}, },
"postcss": { "postcss": {

View File

@ -1,6 +1,6 @@
{ {
"name": "@ionic/core", "name": "@ionic/core",
"version": "7.0.14", "version": "7.1.3",
"description": "Base components for Ionic", "description": "Base components for Ionic",
"keywords": [ "keywords": [
"ionic", "ionic",
@ -32,7 +32,7 @@
], ],
"dependencies": { "dependencies": {
"@stencil/core": "^3.4.0", "@stencil/core": "^3.4.0",
"ionicons": "^7.1.0", "ionicons": "7.1.0",
"tslib": "^2.1.0" "tslib": "^2.1.0"
}, },
"devDependencies": { "devDependencies": {
@ -40,7 +40,7 @@
"@ionic/eslint-config": "^0.3.0", "@ionic/eslint-config": "^0.3.0",
"@ionic/prettier-config": "^2.0.0", "@ionic/prettier-config": "^2.0.0",
"@jest/core": "^27.5.1", "@jest/core": "^27.5.1",
"@playwright/test": "^1.35.1", "@playwright/test": "^1.36.0",
"@rollup/plugin-node-resolve": "^8.4.0", "@rollup/plugin-node-resolve": "^8.4.0",
"@rollup/plugin-virtual": "^2.0.3", "@rollup/plugin-virtual": "^2.0.3",
"@stencil/angular-output-target": "^0.7.1", "@stencil/angular-output-target": "^0.7.1",

View File

@ -33,7 +33,7 @@ import { RefresherEventDetail } from "./components/refresher/refresher-interface
import { ItemReorderEventDetail } from "./components/reorder-group/reorder-group-interface"; import { ItemReorderEventDetail } from "./components/reorder-group/reorder-group-interface";
import { NavigationHookCallback } from "./components/route/route-interface"; import { NavigationHookCallback } from "./components/route/route-interface";
import { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface"; import { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface";
import { SegmentChangeEventDetail } from "./components/segment/segment-interface"; import { SegmentChangeEventDetail, SegmentValue } from "./components/segment/segment-interface";
import { SegmentButtonLayout } from "./components/segment-button/segment-button-interface"; import { SegmentButtonLayout } from "./components/segment-button/segment-button-interface";
import { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface"; import { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface";
import { SelectPopoverOption } from "./components/select-popover/select-popover-interface"; import { SelectPopoverOption } from "./components/select-popover/select-popover-interface";
@ -69,7 +69,7 @@ export { RefresherEventDetail } from "./components/refresher/refresher-interface
export { ItemReorderEventDetail } from "./components/reorder-group/reorder-group-interface"; export { ItemReorderEventDetail } from "./components/reorder-group/reorder-group-interface";
export { NavigationHookCallback } from "./components/route/route-interface"; export { NavigationHookCallback } from "./components/route/route-interface";
export { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface"; export { SearchbarChangeEventDetail, SearchbarInputEventDetail } from "./components/searchbar/searchbar-interface";
export { SegmentChangeEventDetail } from "./components/segment/segment-interface"; export { SegmentChangeEventDetail, SegmentValue } from "./components/segment/segment-interface";
export { SegmentButtonLayout } from "./components/segment-button/segment-button-interface"; export { SegmentButtonLayout } from "./components/segment-button/segment-button-interface";
export { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface"; export { SelectChangeEventDetail, SelectCompareFn, SelectInterface } from "./components/select/select-interface";
export { SelectPopoverOption } from "./components/select-popover/select-popover-interface"; export { SelectPopoverOption } from "./components/select-popover/select-popover-interface";
@ -947,7 +947,7 @@ export namespace Components {
*/ */
"value"?: string | string[] | null; "value"?: string | string[] | null;
/** /**
* Values used to create the list of selectable years. By default the year values range between the `min` and `max` datetime inputs. However, to control exactly which years to display, the `yearValues` input can take a number, an array of numbers, or string of comma separated numbers. For example, to show upcoming and recent leap years, then this input's value would be `yearValues="2024,2020,2016,2012,2008"`. * Values used to create the list of selectable years. By default the year values range between the `min` and `max` datetime inputs. However, to control exactly which years to display, the `yearValues` input can take a number, an array of numbers, or string of comma separated numbers. For example, to show upcoming and recent leap years, then this input's value would be `yearValues="2008,2012,2016,2020,2024"`.
*/ */
"yearValues"?: number[] | number | string; "yearValues"?: number[] | number | string;
} }
@ -1214,7 +1214,7 @@ export namespace Components {
*/ */
"inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; "inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';
/** /**
* The visible label associated with the input. * The visible label associated with the input. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used.
*/ */
"label"?: string; "label"?: string;
/** /**
@ -2289,6 +2289,10 @@ export namespace Components {
* Show two knobs. * Show two knobs.
*/ */
"dualKnobs": boolean; "dualKnobs": boolean;
/**
* The text to display as the control's label. Use this over the `label` slot if you only need plain text. The `label` property will take priority over the `label` slot if both are used.
*/
"label"?: string;
/** /**
* Where to place the label relative to the range. `"start"`: The label will appear to the left of the range in LTR and to the right in RTL. `"end"`: The label will appear to the right of the range in LTR and to the left in RTL. `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("..."). * Where to place the label relative to the range. `"start"`: The label will appear to the left of the range in LTR and to the right in RTL. `"end"`: The label will appear to the right of the range in LTR and to the left in RTL. `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
*/ */
@ -2635,7 +2639,7 @@ export namespace Components {
/** /**
* the value of the segment. * the value of the segment.
*/ */
"value"?: string; "value"?: SegmentValue;
} }
interface IonSegmentButton { interface IonSegmentButton {
/** /**
@ -2658,7 +2662,7 @@ export namespace Components {
/** /**
* The value of the segment button. * The value of the segment button.
*/ */
"value": string; "value": SegmentValue;
} }
interface IonSelect { interface IonSelect {
/** /**
@ -2677,6 +2681,10 @@ export namespace Components {
* If `true`, the user cannot interact with the select. * If `true`, the user cannot interact with the select.
*/ */
"disabled": boolean; "disabled": boolean;
/**
* The toggle icon to show when the select is open. If defined, the icon rotation behavior in `md` mode will be disabled. If undefined, `toggleIcon` will be used for when the select is both open and closed.
*/
"expandedIcon"?: string;
/** /**
* The fill for the item. If `"solid"` the item will have a background. If `"outline"` the item will be transparent with a border. Only available in `md` mode. * The fill for the item. If `"solid"` the item will have a background. If `"outline"` the item will be transparent with a border. Only available in `md` mode.
*/ */
@ -2694,7 +2702,7 @@ export namespace Components {
*/ */
"justify": 'start' | 'end' | 'space-between'; "justify": 'start' | 'end' | 'space-between';
/** /**
* The visible label associated with the select. * The visible label associated with the select. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used.
*/ */
"label"?: string; "label"?: string;
/** /**
@ -2738,6 +2746,10 @@ export namespace Components {
* The shape of the select. If "round" it will have an increased border radius. * The shape of the select. If "round" it will have an increased border radius.
*/ */
"shape"?: 'round'; "shape"?: 'round';
/**
* The toggle icon to use. Defaults to `chevronExpand` for `ios` mode, or `caretDownSharp` for `md` mode.
*/
"toggleIcon"?: string;
/** /**
* The value of the select. * The value of the select.
*/ */
@ -2980,7 +2992,7 @@ export namespace Components {
*/ */
"inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; "inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';
/** /**
* The visible label associated with the textarea. * The visible label associated with the textarea. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used.
*/ */
"label"?: string; "label"?: string;
/** /**
@ -4969,7 +4981,7 @@ declare namespace LocalJSX {
*/ */
"value"?: string | string[] | null; "value"?: string | string[] | null;
/** /**
* Values used to create the list of selectable years. By default the year values range between the `min` and `max` datetime inputs. However, to control exactly which years to display, the `yearValues` input can take a number, an array of numbers, or string of comma separated numbers. For example, to show upcoming and recent leap years, then this input's value would be `yearValues="2024,2020,2016,2012,2008"`. * Values used to create the list of selectable years. By default the year values range between the `min` and `max` datetime inputs. However, to control exactly which years to display, the `yearValues` input can take a number, an array of numbers, or string of comma separated numbers. For example, to show upcoming and recent leap years, then this input's value would be `yearValues="2008,2012,2016,2020,2024"`.
*/ */
"yearValues"?: number[] | number | string; "yearValues"?: number[] | number | string;
} }
@ -5244,7 +5256,7 @@ declare namespace LocalJSX {
*/ */
"inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; "inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';
/** /**
* The visible label associated with the input. * The visible label associated with the input. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used.
*/ */
"label"?: string; "label"?: string;
/** /**
@ -5288,7 +5300,7 @@ declare namespace LocalJSX {
*/ */
"onIonBlur"?: (event: IonInputCustomEvent<FocusEvent>) => void; "onIonBlur"?: (event: IonInputCustomEvent<FocusEvent>) => void;
/** /**
* The `ionChange` event is fired for `<ion-input>` elements when the user modifies the element's value. Unlike the `ionInput` event, the `ionChange` event is not necessarily fired for each alteration to an element's value. Depending on the way the users interacts with the element, the `ionChange` event fires at a different moment: - When the user commits the change explicitly (e.g. by selecting a date from a date picker for `<ion-input type="date">`, pressing the "Enter" key, etc.). - When the element loses focus after its value has changed: for elements where the user's interaction is typing. * The `ionChange` event is fired when the user modifies the input's value. Unlike the `ionInput` event, the `ionChange` event is only fired when changes are committed, not as the user types. Depending on the way the users interacts with the element, the `ionChange` event fires at a different moment: - When the user commits the change explicitly (e.g. by selecting a date from a date picker for `<ion-input type="date">`, pressing the "Enter" key, etc.). - When the element loses focus after its value has changed: for elements where the user's interaction is typing.
*/ */
"onIonChange"?: (event: IonInputCustomEvent<InputChangeEventDetail>) => void; "onIonChange"?: (event: IonInputCustomEvent<InputChangeEventDetail>) => void;
/** /**
@ -5296,7 +5308,7 @@ declare namespace LocalJSX {
*/ */
"onIonFocus"?: (event: IonInputCustomEvent<FocusEvent>) => void; "onIonFocus"?: (event: IonInputCustomEvent<FocusEvent>) => void;
/** /**
* The `ionInput` event fires when the `value` of an `<ion-input>` element has been changed. For elements that accept text input (`type=text`, `type=tel`, etc.), the interface is [`InputEvent`](https://developer.mozilla.org/en-US/docs/Web/API/InputEvent); for others, the interface is [`Event`](https://developer.mozilla.org/en-US/docs/Web/API/Event). If the input is cleared on edit, the type is `null`. * The `ionInput` event is fired each time the user modifies the input's value. Unlike the `ionChange` event, the `ionInput` event is fired for each alteration to the input's value. This typically happens for each keystroke as the user types. For elements that accept text input (`type=text`, `type=tel`, etc.), the interface is [`InputEvent`](https://developer.mozilla.org/en-US/docs/Web/API/InputEvent); for others, the interface is [`Event`](https://developer.mozilla.org/en-US/docs/Web/API/Event). If the input is cleared on edit, the type is `null`.
*/ */
"onIonInput"?: (event: IonInputCustomEvent<InputInputEventDetail>) => void; "onIonInput"?: (event: IonInputCustomEvent<InputInputEventDetail>) => void;
/** /**
@ -6304,6 +6316,10 @@ declare namespace LocalJSX {
* Show two knobs. * Show two knobs.
*/ */
"dualKnobs"?: boolean; "dualKnobs"?: boolean;
/**
* The text to display as the control's label. Use this over the `label` slot if you only need plain text. The `label` property will take priority over the `label` slot if both are used.
*/
"label"?: string;
/** /**
* Where to place the label relative to the range. `"start"`: The label will appear to the left of the range in LTR and to the right in RTL. `"end"`: The label will appear to the right of the range in LTR and to the left in RTL. `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("..."). * Where to place the label relative to the range. `"start"`: The label will appear to the left of the range in LTR and to the right in RTL. `"end"`: The label will appear to the right of the range in LTR and to the left in RTL. `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
*/ */
@ -6706,7 +6722,7 @@ declare namespace LocalJSX {
/** /**
* the value of the segment. * the value of the segment.
*/ */
"value"?: string; "value"?: SegmentValue;
} }
interface IonSegmentButton { interface IonSegmentButton {
/** /**
@ -6728,7 +6744,7 @@ declare namespace LocalJSX {
/** /**
* The value of the segment button. * The value of the segment button.
*/ */
"value"?: string; "value"?: SegmentValue;
} }
interface IonSelect { interface IonSelect {
/** /**
@ -6747,6 +6763,10 @@ declare namespace LocalJSX {
* If `true`, the user cannot interact with the select. * If `true`, the user cannot interact with the select.
*/ */
"disabled"?: boolean; "disabled"?: boolean;
/**
* The toggle icon to show when the select is open. If defined, the icon rotation behavior in `md` mode will be disabled. If undefined, `toggleIcon` will be used for when the select is both open and closed.
*/
"expandedIcon"?: string;
/** /**
* The fill for the item. If `"solid"` the item will have a background. If `"outline"` the item will be transparent with a border. Only available in `md` mode. * The fill for the item. If `"solid"` the item will have a background. If `"outline"` the item will be transparent with a border. Only available in `md` mode.
*/ */
@ -6764,7 +6784,7 @@ declare namespace LocalJSX {
*/ */
"justify"?: 'start' | 'end' | 'space-between'; "justify"?: 'start' | 'end' | 'space-between';
/** /**
* The visible label associated with the select. * The visible label associated with the select. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used.
*/ */
"label"?: string; "label"?: string;
/** /**
@ -6827,6 +6847,10 @@ declare namespace LocalJSX {
* The shape of the select. If "round" it will have an increased border radius. * The shape of the select. If "round" it will have an increased border radius.
*/ */
"shape"?: 'round'; "shape"?: 'round';
/**
* The toggle icon to use. Defaults to `chevronExpand` for `ios` mode, or `caretDownSharp` for `md` mode.
*/
"toggleIcon"?: string;
/** /**
* The value of the select. * The value of the select.
*/ */
@ -7066,7 +7090,7 @@ declare namespace LocalJSX {
*/ */
"inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'; "inputmode"?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';
/** /**
* The visible label associated with the textarea. * The visible label associated with the textarea. Use this if you need to render a plaintext label. The `label` property will take priority over the `label` slot if both are used.
*/ */
"label"?: string; "label"?: string;
/** /**
@ -7098,7 +7122,7 @@ declare namespace LocalJSX {
*/ */
"onIonBlur"?: (event: IonTextareaCustomEvent<FocusEvent>) => void; "onIonBlur"?: (event: IonTextareaCustomEvent<FocusEvent>) => void;
/** /**
* The `ionChange` event is fired for `<ion-textarea>` elements when the user modifies the element's value. Unlike the `ionInput` event, the `ionChange` event is not necessarily fired for each alteration to an element's value. The `ionChange` event is fired when the element loses focus after its value has been modified. * The `ionChange` event is fired when the user modifies the textarea's value. Unlike the `ionInput` event, the `ionChange` event is fired when the element loses focus after its value has been modified.
*/ */
"onIonChange"?: (event: IonTextareaCustomEvent<TextareaChangeEventDetail>) => void; "onIonChange"?: (event: IonTextareaCustomEvent<TextareaChangeEventDetail>) => void;
/** /**
@ -7106,7 +7130,7 @@ declare namespace LocalJSX {
*/ */
"onIonFocus"?: (event: IonTextareaCustomEvent<FocusEvent>) => void; "onIonFocus"?: (event: IonTextareaCustomEvent<FocusEvent>) => void;
/** /**
* The `ionInput` event fires when the `value` of an `<ion-textarea>` element has been changed. When `clearOnEdit` is enabled, the `ionInput` event will be fired when the user clears the textarea by performing a keydown event. * The `ionInput` event is fired each time the user modifies the textarea's value. Unlike the `ionChange` event, the `ionInput` event is fired for each alteration to the textarea's value. This typically happens for each keystroke as the user types. When `clearOnEdit` is enabled, the `ionInput` event will be fired when the user clears the textarea by performing a keydown event.
*/ */
"onIonInput"?: (event: IonTextareaCustomEvent<TextareaInputEventDetail>) => void; "onIonInput"?: (event: IonTextareaCustomEvent<TextareaInputEventDetail>) => void;
/** /**

View File

@ -1,8 +1,8 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Listen, Method, Prop, Watch, h } from '@stencil/core'; import { Component, Element, Event, Host, Listen, Method, Prop, Watch, h } from '@stencil/core';
import { printIonWarning } from '@utils/logging';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import { printIonWarning } from '../../utils/logging';
import type { AccordionGroupChangeEventDetail } from './accordion-group-interface'; import type { AccordionGroupChangeEventDetail } from './accordion-group-interface';

View File

@ -1,10 +1,10 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Element, Host, Prop, State, Watch, h } from '@stencil/core'; import { Component, Element, Host, Prop, State, Watch, h } from '@stencil/core';
import { addEventListener, getElementRoot, raf, removeEventListener, transitionEndAsync } from '@utils/helpers';
import { chevronDown } from 'ionicons/icons'; import { chevronDown } from 'ionicons/icons';
import { config } from '../../global/config'; import { config } from '../../global/config';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import { addEventListener, getElementRoot, raf, removeEventListener, transitionEndAsync } from '../../utils/helpers';
const enum AccordionState { const enum AccordionState {
Collapsed = 1 << 0, Collapsed = 1 << 0,

View File

@ -1,10 +1,7 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Watch, Component, Element, Event, Host, Method, Prop, h, readTask } from '@stencil/core'; import { Watch, Component, Element, Event, Host, Method, Prop, h, readTask } from '@stencil/core';
import type { Gesture } from '@utils/gesture';
import { getIonMode } from '../../global/ionic-global'; import { createButtonActiveGesture } from '@utils/gesture/button-active';
import type { AnimationBuilder, CssClassMap, FrameworkDelegate, OverlayInterface } from '../../interface';
import type { Gesture } from '../../utils/gesture';
import { createButtonActiveGesture } from '../../utils/gesture/button-active';
import { import {
BACKDROP, BACKDROP,
createDelegateController, createDelegateController,
@ -16,9 +13,12 @@ import {
present, present,
safeCall, safeCall,
setOverlayId, setOverlayId,
} from '../../utils/overlays'; } from '@utils/overlays';
import { getClassMap } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global';
import type { AnimationBuilder, CssClassMap, FrameworkDelegate, OverlayInterface } from '../../interface';
import type { OverlayEventDetail } from '../../utils/overlays-interface'; import type { OverlayEventDetail } from '../../utils/overlays-interface';
import { getClassMap } from '../../utils/theme';
import type { ActionSheetButton } from './action-sheet-interface'; import type { ActionSheetButton } from './action-sheet-interface';
import { iosEnterAnimation } from './animations/ios.enter'; import { iosEnterAnimation } from './animations/ios.enter';

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* iOS Action Sheet Enter Animation * iOS Action Sheet Enter Animation

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* iOS Action Sheet Leave Animation * iOS Action Sheet Leave Animation

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* MD Action Sheet Enter Animation * MD Action Sheet Enter Animation

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* MD Action Sheet Leave Animation * MD Action Sheet Leave Animation

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -1,12 +1,8 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Listen, Method, Prop, Watch, forceUpdate, h } from '@stencil/core'; import { Component, Element, Event, Host, Listen, Method, Prop, Watch, forceUpdate, h } from '@stencil/core';
import { ENABLE_HTML_CONTENT_DEFAULT } from '@utils/config';
import { config } from '../../global/config'; import type { Gesture } from '@utils/gesture';
import { getIonMode } from '../../global/ionic-global'; import { createButtonActiveGesture } from '@utils/gesture/button-active';
import type { AnimationBuilder, CssClassMap, OverlayInterface, FrameworkDelegate } from '../../interface';
import { ENABLE_HTML_CONTENT_DEFAULT } from '../../utils/config';
import type { Gesture } from '../../utils/gesture';
import { createButtonActiveGesture } from '../../utils/gesture/button-active';
import { import {
createDelegateController, createDelegateController,
createTriggerController, createTriggerController,
@ -18,11 +14,15 @@ import {
present, present,
safeCall, safeCall,
setOverlayId, setOverlayId,
} from '../../utils/overlays'; } from '@utils/overlays';
import { sanitizeDOMString } from '@utils/sanitization';
import { getClassMap } from '@utils/theme';
import { config } from '../../global/config';
import { getIonMode } from '../../global/ionic-global';
import type { AnimationBuilder, CssClassMap, OverlayInterface, FrameworkDelegate } from '../../interface';
import type { OverlayEventDetail } from '../../utils/overlays-interface'; import type { OverlayEventDetail } from '../../utils/overlays-interface';
import type { IonicSafeString } from '../../utils/sanitization'; import type { IonicSafeString } from '../../utils/sanitization';
import { sanitizeDOMString } from '../../utils/sanitization';
import { getClassMap } from '../../utils/theme';
import type { AlertButton, AlertInput } from './alert-interface'; import type { AlertButton, AlertInput } from './alert-interface';
import { iosEnterAnimation } from './animations/ios.enter'; import { iosEnterAnimation } from './animations/ios.enter';

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* iOS Alert Enter Animation * iOS Alert Enter Animation

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* iOS Alert Leave Animation * iOS Alert Leave Animation

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* Md Alert Enter Animation * Md Alert Enter Animation

View File

@ -1,5 +1,6 @@
import { createAnimation } from '@utils/animation/animation';
import type { Animation } from '../../../interface'; import type { Animation } from '../../../interface';
import { createAnimation } from '../../../utils/animation/animation';
/** /**
* Md Alert Leave Animation * Md Alert Leave Animation

View File

@ -1,9 +1,9 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Build, Component, Element, Host, Method, h } from '@stencil/core'; import { Build, Component, Element, Host, Method, h } from '@stencil/core';
import { isPlatform } from '@utils/platform';
import { config } from '../../global/config'; import { config } from '../../global/config';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import { isPlatform } from '../../utils/platform';
@Component({ @Component({
tag: 'ion-app', tag: 'ion-app',

View File

@ -38,11 +38,3 @@
opacity: .6; opacity: .6;
} }
} }
// Back Button Color: Focused
// --------------------------------------------------
:host(.ion-color.ion-focused) .button-native::after {
background: #{current-color(base)};
}

View File

@ -1,14 +1,14 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Element, Host, Prop, h } from '@stencil/core'; import { Component, Element, Host, Prop, h } from '@stencil/core';
import type { ButtonInterface } from '@utils/element-interface';
import type { Attributes } from '@utils/helpers';
import { inheritAriaAttributes } from '@utils/helpers';
import { createColorClasses, hostContext, openURL } from '@utils/theme';
import { arrowBackSharp, chevronBack } from 'ionicons/icons'; import { arrowBackSharp, chevronBack } from 'ionicons/icons';
import { config } from '../../global/config'; import { config } from '../../global/config';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { AnimationBuilder, Color } from '../../interface'; import type { AnimationBuilder, Color } from '../../interface';
import type { ButtonInterface } from '../../utils/element-interface';
import type { Attributes } from '../../utils/helpers';
import { inheritAriaAttributes } from '../../utils/helpers';
import { createColorClasses, hostContext, openURL } from '../../utils/theme';
/** /**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.

View File

@ -1,8 +1,8 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Event, Host, Listen, Prop, h } from '@stencil/core'; import { Component, Event, Host, Listen, Prop, h } from '@stencil/core';
import { GESTURE_CONTROLLER } from '@utils/gesture';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import { GESTURE_CONTROLLER } from '../../utils/gesture';
@Component({ @Component({
tag: 'ion-backdrop', tag: 'ion-backdrop',

View File

@ -1,9 +1,9 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Host, Prop, h } from '@stencil/core'; import { Component, Host, Prop, h } from '@stencil/core';
import { createColorClasses } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { createColorClasses } from '../../utils/theme';
/** /**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.

View File

@ -1,12 +1,12 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Prop, h } from '@stencil/core'; import { Component, Element, Event, Host, Prop, h } from '@stencil/core';
import type { Attributes } from '@utils/helpers';
import { inheritAriaAttributes } from '@utils/helpers';
import { createColorClasses, hostContext, openURL } from '@utils/theme';
import { chevronForwardOutline, ellipsisHorizontal } from 'ionicons/icons'; import { chevronForwardOutline, ellipsisHorizontal } from 'ionicons/icons';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { AnimationBuilder, Color } from '../../interface'; import type { AnimationBuilder, Color } from '../../interface';
import type { Attributes } from '../../utils/helpers';
import { inheritAriaAttributes } from '../../utils/helpers';
import { createColorClasses, hostContext, openURL } from '../../utils/theme';
import type { RouterDirection } from '../router/utils/interface'; import type { RouterDirection } from '../router/utils/interface';
import type { BreadcrumbCollapsedClickEventDetail } from './breadcrumb-interface'; import type { BreadcrumbCollapsedClickEventDetail } from './breadcrumb-interface';

View File

@ -1,9 +1,9 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Listen, Prop, State, Watch, h } from '@stencil/core'; import { Component, Element, Event, Host, Listen, Prop, State, Watch, h } from '@stencil/core';
import { createColorClasses, hostContext } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { createColorClasses, hostContext } from '../../utils/theme';
import type { BreadcrumbCollapsedClickEventDetail } from '../breadcrumb/breadcrumb-interface'; import type { BreadcrumbCollapsedClickEventDetail } from '../breadcrumb/breadcrumb-interface';
/** /**

View File

@ -1,13 +1,13 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Prop, h } from '@stencil/core'; import { Component, Element, Event, Host, Prop, h } from '@stencil/core';
import type { AnchorInterface, ButtonInterface } from '@utils/element-interface';
import type { Attributes } from '@utils/helpers';
import { inheritAriaAttributes, hasShadowDom } from '@utils/helpers';
import { printIonWarning } from '@utils/logging';
import { createColorClasses, hostContext, openURL } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { AnimationBuilder, Color } from '../../interface'; import type { AnimationBuilder, Color } from '../../interface';
import type { AnchorInterface, ButtonInterface } from '../../utils/element-interface';
import type { Attributes } from '../../utils/helpers';
import { inheritAriaAttributes, hasShadowDom } from '../../utils/helpers';
import { printIonWarning } from '../../utils/logging';
import { createColorClasses, hostContext, openURL } from '../../utils/theme';
import type { RouterDirection } from '../router/utils/interface'; import type { RouterDirection } from '../router/utils/interface';
/** /**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -1,9 +1,9 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Host, Prop, h } from '@stencil/core'; import { Component, Host, Prop, h } from '@stencil/core';
import { createColorClasses } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { createColorClasses } from '../../utils/theme';
/** /**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.

View File

@ -1,9 +1,9 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Host, Prop, h } from '@stencil/core'; import { Component, Host, Prop, h } from '@stencil/core';
import { createColorClasses } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { createColorClasses } from '../../utils/theme';
/** /**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.

View File

@ -1,9 +1,9 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Host, Prop, h } from '@stencil/core'; import { Component, Host, Prop, h } from '@stencil/core';
import { createColorClasses } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { createColorClasses } from '../../utils/theme';
/** /**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.

View File

@ -1,12 +1,12 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Element, Component, Host, Prop, h } from '@stencil/core'; import { Element, Component, Host, Prop, h } from '@stencil/core';
import type { AnchorInterface, ButtonInterface } from '@utils/element-interface';
import type { Attributes } from '@utils/helpers';
import { inheritAttributes } from '@utils/helpers';
import { createColorClasses, openURL } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { AnimationBuilder, Color, Mode } from '../../interface'; import type { AnimationBuilder, Color, Mode } from '../../interface';
import type { AnchorInterface, ButtonInterface } from '../../utils/element-interface';
import type { Attributes } from '../../utils/helpers';
import { inheritAttributes } from '../../utils/helpers';
import { createColorClasses, openURL } from '../../utils/theme';
import type { RouterDirection } from '../router/utils/interface'; import type { RouterDirection } from '../router/utils/interface';
/** /**

View File

@ -1,4 +1,5 @@
@import "../../themes/ionic.globals"; @import "../../themes/ionic.globals";
@import "./checkbox.vars.scss";
// Checkbox // Checkbox
// -------------------------------------------------- // --------------------------------------------------
@ -103,6 +104,10 @@
overflow: hidden; overflow: hidden;
} }
:host(.in-item:not(.legacy-checkbox)) .label-text-wrapper {
@include margin($checkbox-item-label-margin-top, null, $checkbox-item-label-margin-bottom, null);
}
/** /**
* If no label text is placed into the slot * If no label text is placed into the slot
* then the element should be hidden otherwise * then the element should be hidden otherwise
@ -194,7 +199,7 @@ input {
* the checkbox should be on the end * the checkbox should be on the end
* when the label sits at the start. * when the label sits at the start.
*/ */
@include margin(0, $form-control-label-margin, 0, 0); @include margin(null, $form-control-label-margin, null, 0);
} }
@ -215,7 +220,7 @@ input {
* when the label sits at the end. * when the label sits at the end.
*/ */
:host(.checkbox-label-placement-end) .label-text-wrapper { :host(.checkbox-label-placement-end) .label-text-wrapper {
@include margin(0, 0, 0, $form-control-label-margin); @include margin(null, 0, null, $form-control-label-margin);
} }
@ -228,7 +233,7 @@ input {
* the checkbox should be on the end * the checkbox should be on the end
* when the label sits at the start. * when the label sits at the start.
*/ */
@include margin(0, $form-control-label-margin, 0, 0); @include margin(null, $form-control-label-margin, null, 0);
} }
/** /**

View File

@ -1,15 +1,14 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Prop, Watch, h } from '@stencil/core'; import { Component, Element, Event, Host, Prop, Watch, h } from '@stencil/core';
import type { LegacyFormController } from '@utils/forms';
import { createLegacyFormController } from '@utils/forms';
import type { Attributes } from '@utils/helpers';
import { getAriaLabel, inheritAriaAttributes, renderHiddenInput } from '@utils/helpers';
import { printIonWarning } from '@utils/logging';
import { createColorClasses, hostContext } from '@utils/theme';
// TODO(FW-2845) - Use @utils/forms and @utils/logging when https://github.com/ionic-team/stencil/issues/3826 is resolved
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color, Mode, StyleEventDetail } from '../../interface'; import type { Color, Mode, StyleEventDetail } from '../../interface';
import type { LegacyFormController } from '../../utils/forms';
import { createLegacyFormController } from '../../utils/forms';
import type { Attributes } from '../../utils/helpers';
import { getAriaLabel, inheritAriaAttributes, renderHiddenInput } from '../../utils/helpers';
import { printIonWarning } from '../../utils/logging';
import { createColorClasses, hostContext } from '../../utils/theme';
import type { CheckboxChangeEventDetail } from './checkbox-interface'; import type { CheckboxChangeEventDetail } from './checkbox-interface';

View File

@ -0,0 +1,5 @@
/// @prop - Top margin of checkbox's label when in an item
$checkbox-item-label-margin-top: 10px !default;
/// @prop - Bottom margin of checkbox's label when in an item
$checkbox-item-label-margin-bottom: 10px !default;

View File

@ -50,3 +50,24 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
}); });
}); });
}); });
configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('checkbox: long label in item'), () => {
test('should render margins correctly when using long label in item', async ({ page }) => {
await page.setContent(
`
<ion-list>
<ion-item>
<ion-checkbox justify="start">
<ion-label class="ion-text-wrap">Enable Notifications Enable Notifications Enable Notifications</ion-label>
</ion-checkbox>
</ion-item>
</ion-list>
`,
config
);
const list = page.locator('ion-list');
expect(await list.screenshot()).toMatchSnapshot(screenshot(`checkbox-long-label-in-item`));
});
});
});

View File

@ -148,6 +148,19 @@
</ion-list> </ion-list>
</div> </div>
</div> </div>
<h1>Multiline Label</h1>
<div class="grid">
<div class="grid-item">
<ion-item>
<ion-checkbox justify="start">
<ion-label class="ion-text-wrap">
Enable Notifications Enable Notifications Enable Notifications
</ion-label>
</ion-checkbox>
</ion-item>
</div>
</div>
</ion-content> </ion-content>
</ion-app> </ion-app>
</body> </body>

View File

@ -1,9 +1,9 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Host, Prop, h } from '@stencil/core'; import { Component, Host, Prop, h } from '@stencil/core';
import { createColorClasses } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { createColorClasses } from '../../utils/theme';
/** /**
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use. * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.

View File

@ -1,8 +1,8 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Host, Listen, Prop, forceUpdate, h } from '@stencil/core'; import { Component, Host, Listen, Prop, forceUpdate, h } from '@stencil/core';
import { matchBreakpoint } from '@utils/media';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import { matchBreakpoint } from '../../utils/media';
const win = typeof (window as any) !== 'undefined' ? (window as any) : undefined; const win = typeof (window as any) !== 'undefined' ? (window as any) : undefined;
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain // eslint-disable-next-line @typescript-eslint/prefer-optional-chain

View File

@ -1,12 +1,12 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Build, Component, Element, Event, Host, Listen, Method, Prop, forceUpdate, h, readTask } from '@stencil/core'; import { Build, Component, Element, Event, Host, Listen, Method, Prop, forceUpdate, h, readTask } from '@stencil/core';
import { componentOnReady } from '@utils/helpers';
import { isPlatform } from '@utils/platform';
import { isRTL } from '@utils/rtl';
import { createColorClasses, hostContext } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { componentOnReady } from '../../utils/helpers';
import { isPlatform } from '../../utils/platform';
import { isRTL } from '../../utils/rtl';
import { createColorClasses, hostContext } from '../../utils/theme';
import type { ScrollBaseDetail, ScrollDetail } from './content-interface'; import type { ScrollBaseDetail, ScrollDetail } from './content-interface';

View File

@ -1,11 +1,11 @@
import type { ComponentInterface } from '@stencil/core'; import type { ComponentInterface } from '@stencil/core';
import { Component, Element, Host, Prop, State, h } from '@stencil/core'; import { Component, Element, Host, Prop, State, h } from '@stencil/core';
import { componentOnReady, addEventListener } from '@utils/helpers';
import { printIonError } from '@utils/logging';
import { createColorClasses } from '@utils/theme';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color } from '../../interface'; import type { Color } from '../../interface';
import { componentOnReady, addEventListener } from '../../utils/helpers';
import { printIonError } from '../../utils/logging';
import { createColorClasses } from '../../utils/theme';
import type { DatetimePresentation } from '../datetime/datetime-interface'; import type { DatetimePresentation } from '../datetime/datetime-interface';
import { getToday } from '../datetime/utils/data'; import { getToday } from '../datetime/utils/data';
import { getMonthAndYear, getMonthDayAndYear, getLocalizedDateTime, getLocalizedTime } from '../datetime/utils/format'; import { getMonthAndYear, getMonthDayAndYear, getLocalizedDateTime, getLocalizedTime } from '../datetime/utils/format';

View File

@ -36,7 +36,7 @@
:host .calendar-action-buttons ion-item, :host .calendar-action-buttons ion-item,
:host .calendar-action-buttons ion-button { :host .calendar-action-buttons ion-button {
color: #{$text-color-step-350}; --color: #{$text-color-step-350};
} }
// Calendar / Header / Days of Week // Calendar / Header / Days of Week

View File

@ -8,6 +8,12 @@
* @prop --background: The primary background of the datetime component. * @prop --background: The primary background of the datetime component.
* @prop --background-rgb: The primary background of the datetime component in RGB format. * @prop --background-rgb: The primary background of the datetime component in RGB format.
* @prop --title-color: The text color of the title. * @prop --title-color: The text color of the title.
*
* @prop --wheel-highlight-background: The background of the highlight under the selected
* item when using a wheel style layout, or in the month/year picker for grid style layouts.
* @prop --wheel-fade-background-rgb: The color of the gradient covering non-selected items
* when using a wheel style layout, or in the month/year picker for grid style layouts. Must
* be in RGB format, e.g. `255, 255, 255`.
*/ */
display: flex; display: flex;

View File

@ -1,14 +1,14 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core'; import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Method, Prop, State, Watch, h, writeTask } from '@stencil/core'; import { Component, Element, Event, Host, Method, Prop, State, Watch, h, writeTask } from '@stencil/core';
import { startFocusVisible } from '@utils/focus-visible';
import { getElementRoot, raf, renderHiddenInput } from '@utils/helpers';
import { printIonError, printIonWarning } from '@utils/logging';
import { isRTL } from '@utils/rtl';
import { createColorClasses } from '@utils/theme';
import { caretDownSharp, caretUpSharp, chevronBack, chevronDown, chevronForward } from 'ionicons/icons'; import { caretDownSharp, caretUpSharp, chevronBack, chevronDown, chevronForward } from 'ionicons/icons';
import { getIonMode } from '../../global/ionic-global'; import { getIonMode } from '../../global/ionic-global';
import type { Color, Mode, StyleEventDetail } from '../../interface'; import type { Color, Mode, StyleEventDetail } from '../../interface';
import { startFocusVisible } from '../../utils/focus-visible';
import { getElementRoot, raf, renderHiddenInput } from '../../utils/helpers';
import { printIonError, printIonWarning } from '../../utils/logging';
import { isRTL } from '../../utils/rtl';
import { createColorClasses } from '../../utils/theme';
import type { PickerColumnItem } from '../picker-column-internal/picker-column-internal-interfaces'; import type { PickerColumnItem } from '../picker-column-internal/picker-column-internal-interfaces';
import type { import type {
@ -74,6 +74,17 @@ import {
* @slot title - The title of the datetime. * @slot title - The title of the datetime.
* @slot buttons - The buttons in the datetime. * @slot buttons - The buttons in the datetime.
* @slot time-label - The label for the time selector in the datetime. * @slot time-label - The label for the time selector in the datetime.
*
* @part wheel-item - The individual items when using a wheel style layout, or in the
* month/year picker when using a grid style layout.
* @part wheel-item active - The currently selected wheel-item.
*
* @part time-button - The button that opens the time picker when using a grid style
* layout with `presentation="date-time"` or `"time-date"`.
* @part time-button active - The time picker button when the picker is open.
*
* @part month-year-button - The button that opens the month/year picker when
* using a grid style layout.
*/ */
@Component({ @Component({
tag: 'ion-datetime', tag: 'ion-datetime',
@ -231,7 +242,7 @@ export class Datetime implements ComponentInterface {
* the year values range between the `min` and `max` datetime inputs. However, to * the year values range between the `min` and `max` datetime inputs. However, to
* control exactly which years to display, the `yearValues` input can take a number, an array * control exactly which years to display, the `yearValues` input can take a number, an array
* of numbers, or string of comma separated numbers. For example, to show upcoming and * of numbers, or string of comma separated numbers. For example, to show upcoming and
* recent leap years, then this input's value would be `yearValues="2024,2020,2016,2012,2008"`. * recent leap years, then this input's value would be `yearValues="2008,2012,2016,2020,2024"`.
*/ */
@Prop() yearValues?: number[] | number | string; @Prop() yearValues?: number[] | number | string;
@Watch('yearValues') @Watch('yearValues')
@ -1920,6 +1931,7 @@ export class Datetime implements ComponentInterface {
<div class="calendar-action-buttons"> <div class="calendar-action-buttons">
<div class="calendar-month-year"> <div class="calendar-month-year">
<ion-item <ion-item
part="month-year-button"
ref={(el) => (this.monthYearToggleItemRef = el)} ref={(el) => (this.monthYearToggleItemRef = el)}
button button
aria-label="Show year picker" aria-label="Show year picker"
@ -2167,7 +2179,8 @@ export class Datetime implements ComponentInterface {
} }
private renderTimeOverlay() { private renderTimeOverlay() {
const use24Hour = is24Hour(this.locale, this.hourCycle); const { hourCycle, isTimePopoverOpen, locale } = this;
const use24Hour = is24Hour(locale, hourCycle);
const activePart = this.getActivePartsWithFallback(); const activePart = this.getActivePartsWithFallback();
return [ return [
@ -2175,8 +2188,9 @@ export class Datetime implements ComponentInterface {
<button <button
class={{ class={{
'time-body': true, 'time-body': true,
'time-body-active': this.isTimePopoverOpen, 'time-body-active': isTimePopoverOpen,
}} }}
part={`time-button${isTimePopoverOpen ? ' active' : ''}`}
aria-expanded="false" aria-expanded="false"
aria-haspopup="true" aria-haspopup="true"
onClick={async (ev) => { onClick={async (ev) => {
@ -2199,7 +2213,7 @@ export class Datetime implements ComponentInterface {
} }
}} }}
> >
{getLocalizedTime(this.locale, activePart, use24Hour)} {getLocalizedTime(locale, activePart, use24Hour)}
</button>, </button>,
<ion-popover <ion-popover
alignment="center" alignment="center"

View File

@ -0,0 +1,40 @@
import { expect } from '@playwright/test';
import { configs, test } from '@utils/test/playwright';
configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('datetime: custom'), () => {
test.beforeEach(async ({ page }) => {
await page.goto(`/src/components/datetime/test/custom`, config);
});
test('should allow styling wheel style datetimes', async ({ page }) => {
const datetime = page.locator('#custom-wheel');
await expect(datetime).toHaveScreenshot(screenshot(`datetime-custom-wheel`));
});
test('should allow styling month/year picker in grid style datetimes', async ({ page }) => {
const datetime = page.locator('#custom-grid');
const monthYearToggle = datetime.locator('.calendar-month-year');
await monthYearToggle.click();
await page.waitForChanges();
await expect(datetime).toHaveScreenshot(screenshot(`datetime-custom-month-year`));
});
test('should allow styling time picker in grid style datetimes', async ({ page }) => {
const timeButton = page.locator('ion-datetime .time-body');
const popover = page.locator('.popover-viewport');
const ionPopoverDidPresent = await page.spyOnEvent('ionPopoverDidPresent');
await expect(timeButton).toHaveScreenshot(screenshot(`datetime-custom-time-button`));
await timeButton.click();
await ionPopoverDidPresent.next();
await expect(popover).toHaveScreenshot(screenshot(`datetime-custom-time-picker`));
await expect(timeButton).toHaveScreenshot(screenshot(`datetime-custom-time-button-active`));
});
});
});

View File

@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<title>Datetime - Custom</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0" />
<link href="../../../../../css/ionic.bundle.css" rel="stylesheet" />
<link href="../../../../../scripts/testing/styles.css" rel="stylesheet" />
<script src="../../../../../scripts/testing/scripts.js"></script>
<script type="module" src="../../../../../dist/ionic/ionic.esm.js"></script>
<style>
.grid {
display: grid;
grid-template-columns: repeat(3, minmax(250px, 1fr));
grid-row-gap: 20px;
grid-column-gap: 20px;
}
h2 {
font-size: 12px;
font-weight: normal;
color: #6f7378;
margin-top: 10px;
margin-left: 5px;
}
@media screen and (max-width: 800px) {
.grid {
grid-template-columns: 1fr;
padding: 0;
}
}
/*
The second selectors that target ion-picker(-column)-internal
directly are for styling the time picker. This is currently
undocumented usage.
*/
ion-datetime,
ion-picker-internal {
--wheel-highlight-background: rgb(218, 216, 255);
--wheel-fade-background-rgb: 245, 235, 247;
}
ion-datetime {
--background: rgb(245, 235, 247);
--background-rgb: 245, 235, 247;
}
ion-picker-internal {
background-color: rgb(245, 235, 247);
}
ion-datetime::part(wheel-item),
ion-picker-column-internal::part(wheel-item) {
color: rgb(255, 134, 154);
}
ion-datetime::part(wheel-item active),
ion-picker-column-internal::part(wheel-item active) {
color: rgb(128, 30, 171);
}
ion-datetime::part(time-button) {
color: rgb(128, 30, 171);
}
ion-datetime::part(time-button active) {
background-color: rgb(248, 215, 255);
}
</style>
</head>
<body>
<ion-app>
<ion-header translucent="true">
<ion-toolbar>
<ion-title>Datetime - Custom</ion-title>
</ion-toolbar>
</ion-header>
<ion-content class="ion-padding">
<div class="grid">
<div class="grid-item">
<h2>Grid Style</h2>
<ion-datetime id="custom-grid" value="2020-03-14T14:23:00.000Z"></ion-datetime>
</div>
<div class="grid-item">
<h2>Wheel Style</h2>
<ion-datetime id="custom-wheel" prefer-wheel="true" value="2020-03-14T14:23:00.000Z"></ion-datetime>
</div>
</div>
</ion-content>
</ion-app>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

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