feat(input): add styles for round shape to ionic theme (#29329)

Issue number: Internal

---------

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

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

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

Added styles for `shape="round"`, including:
- Increased border radius
- Increased padding when additionally using outline fill and large size
- Horizontal padding also applied to label when using outline fill

I also changed the `$ionic-border-radius-rounded-full` design token from
100% to 999px. `border-radius: 100%` is pretty obviously incorrect for
most browsers (screenshot taken in Chrome):

![image](https://github.com/ionic-team/ionic-framework/assets/90629384/5dc47a65-0446-4e39-9ce3-1c749b6329e7)

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

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


## Other information

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

---------

Co-authored-by: ionitron <hi@ionicframework.com>
This commit is contained in:
Amanda Johnston
2024-04-16 09:52:27 -05:00
committed by GitHub
parent 3b0f3af897
commit cb71258474
22 changed files with 69 additions and 8 deletions

View File

@ -12,6 +12,11 @@
--placeholder-opacity: 1; --placeholder-opacity: 1;
} }
:host(.input-fill-outline.input-size-large.input-shape-round) {
--padding-start: 16px;
--padding-end: 16px;
}
/** /**
* The bottom content should never have * The bottom content should never have
* a border with the outline style. * a border with the outline style.
@ -34,10 +39,8 @@
/** /**
* For the ionic theme, the padding needs to sit on the * For the ionic theme, the padding needs to sit on the
* native wrapper instead, so that it sits within the * native wrapper instead, so that it sits within the
* outline container but does not affect the label text. * outline container but does not always affect the
* label text.
* For the ionic theme, the horizontal padding needs to
* sit on the native wrapper instead, so that
*/ */
@include padding(0); @include padding(0);
@ -49,6 +52,10 @@
border-bottom: none; border-bottom: none;
} }
:host(.input-fill-outline.input-shape-round) .label-text-wrapper {
@include padding(null, var(--padding-end), null, var(--padding-start));
}
:host(.input-fill-outline.input-label-placement-stacked) .label-text-wrapper { :host(.input-fill-outline.input-label-placement-stacked) .label-text-wrapper {
@include transform-origin(start, top); @include transform-origin(start, top);
@ -98,7 +105,7 @@
// ---------------------------------------------------------------- // ----------------------------------------------------------------
// This makes the label sit above the input. // This makes the label sit above the input.
:host(.label-floating.input-fill-outline.input-label-placement-stacked:not(.input-shape-round)) .label-text-wrapper { :host(.label-floating.input-fill-outline.input-label-placement-stacked) .label-text-wrapper {
@include transform(translateY(0), scale(#{$form-control-label-stacked-scale})); @include transform(translateY(0), scale(#{$form-control-label-stacked-scale}));
@include margin(0); @include margin(0);

View File

@ -21,6 +21,13 @@
min-height: 48px; min-height: 48px;
} }
// Ionic Input Shapes
// --------------------------------------------------
:host(.input-shape-round) {
--border-radius: #{$ionic-border-radius-rounded-full};
}
// Input Bottom Content // Input Bottom Content
// ---------------------------------------------------------------- // ----------------------------------------------------------------

View File

@ -267,5 +267,42 @@ configs({ modes: ['ionic-md'] }).forEach(({ title, screenshot, config }) => {
const input = page.locator('ion-input'); const input = page.locator('ion-input');
await expect(input).toHaveScreenshot(screenshot(`input-fill-outline-label-stacked`)); await expect(input).toHaveScreenshot(screenshot(`input-fill-outline-label-stacked`));
}); });
test('should not have visual regressions with outline fill and round shape', async ({ page }) => {
await page.setContent(
`
<ion-input
fill="outline"
label="Email"
label-placement="stacked"
placeholder="example@ionic.io"
shape="round"
></ion-input>
`,
config
);
const input = page.locator('ion-input');
await expect(input).toHaveScreenshot(screenshot(`input-fill-outline-label-stacked-shape-round`));
});
test('should not have visual regressions with outline fill, round shape, and large size', async ({ page }) => {
await page.setContent(
`
<ion-input
fill="outline"
label="Email"
label-placement="stacked"
placeholder="example@ionic.io"
shape="round"
size="large"
></ion-input>
`,
config
);
const input = page.locator('ion-input');
await expect(input).toHaveScreenshot(screenshot(`input-fill-outline-label-stacked-shape-round-size-large`));
});
}); });
}); });

View File

@ -67,6 +67,16 @@
<h2>Outline: Large Size</h2> <h2>Outline: Large Size</h2>
<ion-input size="large" fill="outline" label="Email"></ion-input> <ion-input size="large" fill="outline" label="Email"></ion-input>
</div> </div>
<div class="grid-item">
<h2>No Fill: Large Size, Round Shape</h2>
<ion-input size="large" shape="round" label="Email"></ion-input>
</div>
<div class="grid-item">
<h2>Outline: Large Size, Round Shape</h2>
<ion-input size="large" fill="outline" shape="round" label="Email"></ion-input>
</div>
</div> </div>
</ion-content> </ion-content>
</ion-app> </ion-app>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -388,7 +388,7 @@
"$value": "32px" "$value": "32px"
}, },
"full": { "full": {
"$value": "100%" "$value": "999px"
} }
} }
}, },

View File

@ -122,7 +122,7 @@
--ionic-border-radius-rounded-medium: 8px; --ionic-border-radius-rounded-medium: 8px;
--ionic-border-radius-rounded-large: 16px; --ionic-border-radius-rounded-large: 16px;
--ionic-border-radius-rounded-x-large: 32px; --ionic-border-radius-rounded-x-large: 32px;
--ionic-border-radius-rounded-full: 100%; --ionic-border-radius-rounded-full: 999px;
--ionic-border-size-small: 1px; --ionic-border-size-small: 1px;
--ionic-border-size-medium: 2px; --ionic-border-size-medium: 2px;
--ionic-border-size-large: 3px; --ionic-border-size-large: 3px;

View File

@ -121,7 +121,7 @@ $ionic-border-radius-rounded-small: var(--ionic-border-radius-rounded-small, 4px
$ionic-border-radius-rounded-medium: var(--ionic-border-radius-rounded-medium, 8px); $ionic-border-radius-rounded-medium: var(--ionic-border-radius-rounded-medium, 8px);
$ionic-border-radius-rounded-large: var(--ionic-border-radius-rounded-large, 16px); $ionic-border-radius-rounded-large: var(--ionic-border-radius-rounded-large, 16px);
$ionic-border-radius-rounded-x-large: var(--ionic-border-radius-rounded-x-large, 32px); $ionic-border-radius-rounded-x-large: var(--ionic-border-radius-rounded-x-large, 32px);
$ionic-border-radius-rounded-full: var(--ionic-border-radius-rounded-full, 100%); $ionic-border-radius-rounded-full: var(--ionic-border-radius-rounded-full, 999px);
$ionic-border-size-small: var(--ionic-border-size-small, 1px); $ionic-border-size-small: var(--ionic-border-size-small, 1px);
$ionic-border-size-medium: var(--ionic-border-size-medium, 2px); $ionic-border-size-medium: var(--ionic-border-size-medium, 2px);
$ionic-border-size-large: var(--ionic-border-size-large, 3px); $ionic-border-size-large: var(--ionic-border-size-large, 3px);