fix(input): add focused state for ionic theme (#29342)
Co-authored-by: Amanda Johnston <90629384+amandaejohnston@users.noreply.github.com>
@ -8,8 +8,6 @@
|
|||||||
--border-radius: #{$ionic-border-radius-rounded-small};
|
--border-radius: #{$ionic-border-radius-rounded-small};
|
||||||
--padding-start: 12px;
|
--padding-start: 12px;
|
||||||
--padding-end: 12px;
|
--padding-end: 12px;
|
||||||
--placeholder-color: #{$ionic-color-neutral-600};
|
|
||||||
--placeholder-opacity: 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
:host(.input-fill-outline.input-size-large.input-shape-round) {
|
:host(.input-fill-outline.input-size-large.input-shape-round) {
|
||||||
|
|||||||
@ -11,6 +11,8 @@
|
|||||||
--border-color: #{$ionic-color-neutral-300};
|
--border-color: #{$ionic-color-neutral-300};
|
||||||
--highlight-color-valid: #{$ionic-color-success-400};
|
--highlight-color-valid: #{$ionic-color-success-400};
|
||||||
--highlight-color-invalid: #{$ionic-color-error-400};
|
--highlight-color-invalid: #{$ionic-color-error-400};
|
||||||
|
--placeholder-color: #{$ionic-color-neutral-500};
|
||||||
|
--placeholder-opacity: 1;
|
||||||
--text-color-invalid: #{$ionic-color-error-600};
|
--text-color-invalid: #{$ionic-color-error-600};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,6 +93,11 @@
|
|||||||
color: var(--text-color-invalid);
|
color: var(--text-color-invalid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:host(.has-focus.ion-valid),
|
||||||
|
:host(.ion-touched.ion-invalid) {
|
||||||
|
--border-width: #{tokens.$ionic-border-size-small};
|
||||||
|
}
|
||||||
|
|
||||||
// Input Hover
|
// Input Hover
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
|
|
||||||
@ -137,3 +144,11 @@
|
|||||||
:host(.input-disabled.ion-color) .helper-text {
|
:host(.input-disabled.ion-color) .helper-text {
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Input Focus
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
|
||||||
|
:host(.has-focus) {
|
||||||
|
--border-color: #{tokens.$ionic-color-primary};
|
||||||
|
--border-width: #{tokens.$ionic-border-size-medium};
|
||||||
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.7 KiB |
@ -19,7 +19,7 @@
|
|||||||
grid-row-gap: 20px;
|
grid-row-gap: 20px;
|
||||||
grid-column-gap: 20px;
|
grid-column-gap: 20px;
|
||||||
}
|
}
|
||||||
h3 {
|
h2 {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
|
|
||||||
@ -46,19 +46,18 @@
|
|||||||
|
|
||||||
<ion-content id="content" class="ion-padding">
|
<ion-content id="content" class="ion-padding">
|
||||||
<h1>Readonly</h1>
|
<h1>Readonly</h1>
|
||||||
<h2>No Fill</h2>
|
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Default</h3>
|
<h2>No Fill</h2>
|
||||||
|
|
||||||
<ion-input label="Email" value="hi@ionic.io" readonly="true"></ion-input>
|
<ion-input label="Email" value="hi@ionic.io" readonly="true"></ion-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h1>Disabled</h1>
|
<h1>Disabled</h1>
|
||||||
<h2>No Fill</h2>
|
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Default</h3>
|
<h2>No Fill</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
label="Email"
|
label="Email"
|
||||||
@ -71,7 +70,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Valid</h3>
|
<h2>No Fill, Valid</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
label="Email"
|
label="Email"
|
||||||
@ -85,7 +84,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Invalid</h3>
|
<h2>No Fill, Invalid</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
label="Email"
|
label="Email"
|
||||||
@ -99,7 +98,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Color (ionic theme only)</h3>
|
<h2>No Fill, Color (ionic theme only)</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
label="Email"
|
label="Email"
|
||||||
@ -113,10 +112,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Outline</h2>
|
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Default</h3>
|
<h2>Outline</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
fill="outline"
|
fill="outline"
|
||||||
@ -130,7 +128,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Valid</h3>
|
<h2>Outline, Valid</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
fill="outline"
|
fill="outline"
|
||||||
@ -145,7 +143,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Invalid</h3>
|
<h2>Outline, Invalid</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
fill="outline"
|
fill="outline"
|
||||||
@ -160,7 +158,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid-item">
|
<div class="grid-item">
|
||||||
<h3>Color (ionic theme only)</h3>
|
<h2>Outline, Color (ionic theme only)</h2>
|
||||||
|
|
||||||
<ion-input
|
<ion-input
|
||||||
fill="outline"
|
fill="outline"
|
||||||
@ -174,6 +172,21 @@
|
|||||||
></ion-input>
|
></ion-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h1>Focused</h1>
|
||||||
|
<div class="grid">
|
||||||
|
<div class="grid-item">
|
||||||
|
<h2>No Fill</h2>
|
||||||
|
|
||||||
|
<ion-input label="Email" value="hi@ionic.io" class="has-focus"></ion-input>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid-item">
|
||||||
|
<h2>Outline</h2>
|
||||||
|
|
||||||
|
<ion-input fill="outline" label="Email" value="hi@ionic.io" class="has-focus"></ion-input>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
</ion-app>
|
</ion-app>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -142,5 +142,38 @@ configs({ modes: ['ionic-md'], directions: ['ltr'] }).forEach(({ title, screensh
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test.describe(title('focused'), () => {
|
||||||
|
test('should render focused input correctly', async ({ page }) => {
|
||||||
|
await page.setContent(
|
||||||
|
`
|
||||||
|
<div class="container">
|
||||||
|
<ion-input
|
||||||
|
label="Email"
|
||||||
|
value="hi@ionic.io"
|
||||||
|
helper-text="Enter an email"
|
||||||
|
counter="true"
|
||||||
|
maxlength="20"
|
||||||
|
class="has-focus"
|
||||||
|
></ion-input>
|
||||||
|
|
||||||
|
<ion-input
|
||||||
|
fill="outline"
|
||||||
|
label="Email"
|
||||||
|
value="hi@ionic.io"
|
||||||
|
helper-text="Enter an email"
|
||||||
|
counter="true"
|
||||||
|
maxlength="20"
|
||||||
|
class="has-focus"
|
||||||
|
></ion-input>
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
config
|
||||||
|
);
|
||||||
|
|
||||||
|
const container = page.locator('.container');
|
||||||
|
await expect(container).toHaveScreenshot(screenshot(`input-focused`));
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 6.4 KiB |