fix(select): remove item focus style when there are no selected items only at ionic mode (#30750)

Issue number: resolves #

---------

This PR introduces improvements to the visual focus styling of Ionic
items when inside a select modal.

## What is the current behavior?
- The CSS variables `--background-focused` and
`--background-focused-opacity` were missing from `item.ionic.scss`,
which resulted in the native default outline focus style being applied
to focused items.
- When no item is selected, the focus style is currently applied to the
first list item by default, which we intend to change.

## What is the new behavior?
- Added missing focus css variables
- Hide the default focus style when there is no item selected

## NOTE
- This change will require an additional interaction to observe the
focus behavior when navigating through keyboard, since tap-based
navigation does not rely on focus styling.

## 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>
Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com>
This commit is contained in:
José Rio
2025-10-30 15:14:43 +00:00
committed by GitHub
parent 183a90ad84
commit 28caeff459
6 changed files with 17 additions and 1 deletions

View File

@ -71,7 +71,6 @@ slot[name="end"]::slotted(*) {
// Item: Focused // Item: Focused
// -------------------------------------------------- // --------------------------------------------------
:host(.ion-focused) .item-native::after { :host(.ion-focused) .item-native::after {
@include globals.border-radius(inherit); @include globals.border-radius(inherit);
@include globals.position(0, 0, 0, 0); @include globals.position(0, 0, 0, 0);
@ -112,3 +111,14 @@ slot[name="end"]::slotted(*) {
:host(.item-lines-none) { :host(.item-lines-none) {
--inner-border-width: #{globals.$ion-border-size-0}; --inner-border-width: #{globals.$ion-border-size-0};
} }
// Item in Select Modal
// --------------------------------------------------
:host(.in-select-modal) {
--background-focused: #{globals.$ion-bg-neutral-subtlest-press};
--background-focused-opacity: 0;
}
:host(.in-select-modal.ion-focused) .item-native {
--border-radius: #{globals.$ion-border-radius-400};
}

View File

@ -407,6 +407,7 @@ export class Item implements ComponentInterface, AnchorInterface, ButtonInterfac
'item-control-needs-pointer-cursor': firstInteractiveNeedsPointerCursor, 'item-control-needs-pointer-cursor': firstInteractiveNeedsPointerCursor,
'item-disabled': disabled, 'item-disabled': disabled,
'in-list': inList, 'in-list': inList,
'in-select-modal': hostContext('ion-select-modal', this.el),
'item-multiple-inputs': this.multipleInputs, 'item-multiple-inputs': this.multipleInputs,
'ion-activatable': canActivate, 'ion-activatable': canActivate,
'ion-focusable': this.focusable, 'ion-focusable': this.focusable,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -67,4 +67,9 @@ ion-content {
--padding-end: #{globals.$ion-space-400} !important; --padding-end: #{globals.$ion-space-400} !important;
/* stylelint-disable-next-line declaration-no-important */ /* stylelint-disable-next-line declaration-no-important */
--padding-bottom: #{globals.$ion-space-1200} !important; --padding-bottom: #{globals.$ion-space-1200} !important;
// Set the background to the focused element within a radio group only when there is a checked radio
&:has(.radio-checked) .ion-focused:not(.item-radio-checked) {
--background-focused-opacity: 1;
}
} }