Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
df394f2
fix(select-option): add rich content styles
thetaPC May 12, 2026
ce322f5
fix(action-sheet): add ionic theme
thetaPC May 12, 2026
db262b5
fix(action-sheet): add ionic theme
thetaPC May 13, 2026
c4aff48
test(action-sheet): add states page
thetaPC May 13, 2026
01cbf63
test(action-sheet): update states page
thetaPC May 13, 2026
d4680c5
fix(alert): add ionic theme
thetaPC May 13, 2026
bf4bc97
fix(action-sheet): split imports
thetaPC May 13, 2026
b3bd9ec
fix(alert): strip out imports
thetaPC May 14, 2026
2d7c760
fix(select-modal): update ionic theme
thetaPC May 14, 2026
03eb8d2
fix(action-sheet, alert): update ionic theme
thetaPC May 14, 2026
efc38be
fix(select-modal): update ionic theme
thetaPC May 14, 2026
6d01165
fix(action-sheet, alert, item): update ionic theme
thetaPC May 14, 2026
2305fc4
fix(alert): update ionic theme
thetaPC May 14, 2026
dce202e
test(action-sheet): update snapshots
thetaPC May 14, 2026
865d9af
fix(select-modal): update ionic theme
thetaPC May 14, 2026
5fa29e5
fix(select-popover): update ionic theme
thetaPC May 14, 2026
73f270d
fix(select-modal): update styles
thetaPC May 14, 2026
c7e177d
test(select): update order
thetaPC May 14, 2026
360a911
test(app): update snapshots
thetaPC May 14, 2026
5fda2dd
fix(many): improving cloning and add slot styles
thetaPC May 16, 2026
634408c
feat(alert): use ion-radio and ion-checkbox
thetaPC May 19, 2026
e26824c
Revert "feat(alert): use ion-radio and ion-checkbox"
thetaPC May 20, 2026
9c534e6
feat(select-option): add labelPlacement and justify props
thetaPC May 21, 2026
9b0e9f0
fix(alert): correct spot for radio
thetaPC May 21, 2026
b93a4cc
test(select-modal): update snapshots
thetaPC May 21, 2026
c9e6444
test(select-popover): update snapshots
thetaPC May 21, 2026
f968c7b
test(select): update snapshots
thetaPC May 21, 2026
7a4b385
test(alert): add label placement tests
thetaPC May 21, 2026
666a9a4
test(select-option): add label placement and justify tests
thetaPC May 21, 2026
cfc9b48
Merge branch 'next' of github.com:ionic-team/ionic-framework into FW-…
thetaPC May 21, 2026
c1c46cb
test(select): update snapshots
thetaPC May 21, 2026
3ea2a08
test(many): update snapshots
thetaPC May 21, 2026
a483e09
fix(select): preserve ion-icon props when slotted from frameworks
thetaPC May 22, 2026
8bcf91b
fix(many): update tokens and snapshots
thetaPC May 22, 2026
286ab81
fix(select-modal): remove focus styles
thetaPC May 26, 2026
e897877
test(select): update snapshots
thetaPC May 26, 2026
ccdd136
fix(action-sheet): update icon size
thetaPC May 29, 2026
d475f86
test(select): update snapshots
thetaPC May 29, 2026
3c32066
feat(select-option): align items center
thetaPC May 30, 2026
fdf9226
feat(select-option): add gap
thetaPC May 30, 2026
e669e54
feat(select-option): add checkbox flex
thetaPC May 30, 2026
863ca6c
fix(alert): remove uppercase for buttons on ionic
thetaPC May 30, 2026
8914cc3
feat(many): update styles
thetaPC Jun 1, 2026
54d2c0c
feat(many): update spacing
thetaPC Jun 2, 2026
6a5517d
test(select-option): use loop and const
thetaPC Jun 2, 2026
c6d6b5e
test(select-option): update snapshots
thetaPC Jun 2, 2026
645214a
test(select-option-render): add spec tests
thetaPC Jun 2, 2026
b89f9ac
docs(overlay-control-label): add todo
thetaPC Jun 2, 2026
ae8d923
test(sanitization): add more specs
thetaPC Jun 2, 2026
bfaf49e
test(select): add more spec
thetaPC Jun 2, 2026
26c24ea
fix(many): remove disabled check from close overlay
thetaPC Jun 2, 2026
138ddec
fix(select): add disabled to action sheet
thetaPC Jun 2, 2026
e2d8d15
test(select): cleanup
thetaPC Jun 2, 2026
bcbf6e1
test(select): update snapshots
thetaPC Jun 2, 2026
3db9b9a
test(select): update snapshots
thetaPC Jun 2, 2026
8cfef6b
refactor(select): correct grouping
thetaPC Jun 3, 2026
ea99611
test(select): move mouse
thetaPC Jun 3, 2026
2635dc7
test(select): update snapshots
thetaPC Jun 3, 2026
38dd874
refactor(many): rename file
thetaPC Jun 3, 2026
bd39bda
refactor(select-option): proper grouping
thetaPC Jun 3, 2026
43817c0
feat(alert): update padding
thetaPC Jun 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions core/api.txt
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be a feat since it adds new properties to the api?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we update the title to mention support for the new properties too?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does it sound now?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be better to target select:

feat(select): add labelPlacement prop, justify prop, and rich content styles for select options

Original file line number Diff line number Diff line change
Expand Up @@ -2378,6 +2378,8 @@ ion-select-modal,prop,options,SelectModalOption[],[],false,false
ion-select-option,shadow
ion-select-option,prop,description,string | undefined,undefined,false,false
ion-select-option,prop,disabled,boolean,false,false,false
ion-select-option,prop,justify,"end" | "space-between" | "start" | undefined,undefined,false,false
ion-select-option,prop,labelPlacement,"end" | "start" | undefined,undefined,false,false
ion-select-option,prop,mode,"ios" | "md",undefined,false,false
ion-select-option,prop,theme,"ios" | "md" | "ionic",undefined,false,false
ion-select-option,prop,value,any,undefined,false,false
Expand Down
18 changes: 18 additions & 0 deletions core/src/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3863,6 +3863,14 @@ export namespace Components {
* @default false
*/
"disabled": boolean;
/**
* How to pack the label and the option's selection control within a line. `"start"`: The label and radio will appear on the left in LTR and on the right in RTL. `"end"`: The label and radio will appear on the right in LTR and on the left in RTL. `"space-between"`: The label and radio will appear on opposite ends of the line with space between the two elements. Applies to the `alert`, `popover`, and `modal` interfaces, but has no visible effect on radio options in `popover` or `modal` on the `md` and `ionic` themes (the radio control is hidden there). When unset, the interface picks a default based on theme and control type.
*/
"justify"?: 'start' | 'end' | 'space-between';
/**
* Where the label is placed relative to the option's selection control (radio circle or checkbox box) when the option is rendered in an `alert`, `popover`, or `modal` interface. `"start"`: The label will appear to the left of the radio in LTR and to the right in RTL. `"end"`: The label will appear to the right of the radio in LTR and to the left in RTL. Applies to the `alert`, `popover`, and `modal` interfaces, but has no visible effect on radio options in `popover` or `modal` on the `md` and `ionic` themes (the radio control is hidden there). When unset, the interface picks a default based on theme and control type.
*/
"labelPlacement"?: 'start' | 'end';
/**
* The mode determines the platform behaviors of the component.
*/
Expand Down Expand Up @@ -10002,6 +10010,14 @@ declare namespace LocalJSX {
* @default false
*/
"disabled"?: boolean;
/**
* How to pack the label and the option's selection control within a line. `"start"`: The label and radio will appear on the left in LTR and on the right in RTL. `"end"`: The label and radio will appear on the right in LTR and on the left in RTL. `"space-between"`: The label and radio will appear on opposite ends of the line with space between the two elements. Applies to the `alert`, `popover`, and `modal` interfaces, but has no visible effect on radio options in `popover` or `modal` on the `md` and `ionic` themes (the radio control is hidden there). When unset, the interface picks a default based on theme and control type.
*/
"justify"?: 'start' | 'end' | 'space-between';
/**
* Where the label is placed relative to the option's selection control (radio circle or checkbox box) when the option is rendered in an `alert`, `popover`, or `modal` interface. `"start"`: The label will appear to the left of the radio in LTR and to the right in RTL. `"end"`: The label will appear to the right of the radio in LTR and to the left in RTL. Applies to the `alert`, `popover`, and `modal` interfaces, but has no visible effect on radio options in `popover` or `modal` on the `md` and `ionic` themes (the radio control is hidden there). When unset, the interface picks a default based on theme and control type.
*/
"labelPlacement"?: 'start' | 'end';
/**
* The mode determines the platform behaviors of the component.
*/
Expand Down Expand Up @@ -11382,6 +11398,8 @@ declare namespace LocalJSX {
"disabled": boolean;
"value": string;
"description": string;
"labelPlacement": 'start' | 'end';
"justify": 'start' | 'end' | 'space-between';
}
interface IonSelectPopoverAttributes {
"header": string;
Expand Down
50 changes: 20 additions & 30 deletions core/src/components/action-sheet/action-sheet.common.scss
Comment thread
brandyscarney marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@import "./action-sheet.vars";
@use "../../themes/mixins" as mixins;
@use "../select-option/select-option.common.overlay";

// Action Sheet
// --------------------------------------------------
Expand Down Expand Up @@ -41,34 +42,31 @@
--button-color-hover: var(--button-color);
--button-color-selected: var(--button-color);
--min-width: auto;
--width: #{$action-sheet-width};
--max-width: #{$action-sheet-max-width};
--width: 100%;
--max-width: 500px;
--min-height: auto;
--height: auto;
--max-height: calc(100% - (var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));

@include font-smoothing();
@include position(0, 0, 0, 0);
@include mixins.font-smoothing();
@include mixins.position(0, 0, 0, 0);

display: block;
position: fixed;

outline: none;

font-family: $font-family-base;

touch-action: none;
user-select: none;
z-index: $z-index-overlay;
}

:host(.overlay-hidden) {
display: none;
}

.action-sheet-wrapper {
@include position(null, 0, 0, 0);
@include transform(translate3d(0, 100%, 0));
@include mixins.position(null, 0, 0, 0);
@include mixins.transform(translate3d(0, 100%, 0));

display: block;
position: absolute;
Expand All @@ -81,7 +79,6 @@
min-height: var(--min-height);
max-height: var(--max-height);

z-index: $z-index-overlay-wrapper;
pointer-events: none;
}

Expand Down Expand Up @@ -109,6 +106,10 @@
opacity: 0.4;
}

.action-sheet-button:disabled ion-icon {
color: currentColor;
}

.action-sheet-button-inner {
display: flex;

Expand Down Expand Up @@ -177,7 +178,7 @@
// --------------------------------------------------

.action-sheet-button::after {
@include button-state();
@include mixins.button-state();
}

// Action Sheet: Selected
Expand Down Expand Up @@ -209,14 +210,20 @@
// Action Sheet: Focused
// --------------------------------------------------

.action-sheet-button.ion-focused {
.action-sheet-button.ion-focused:not(.ion-activated) {
color: var(--button-color-focused);

&::after {
background: var(--button-background-focused);

opacity: var(--button-background-focused-opacity);
}

&.action-sheet-selected::after {
background: var(--button-background-focused, var(--button-background-selected));

opacity: var(--button-background-focused-opacity, var(--button-background-selected-opacity));
}
Comment on lines +213 to +226
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By restructuring it this way, we are making sure that this style will be just a copy and paste for the Modular Ionic migration.

}

// Action Sheet: Hover
Expand All @@ -233,20 +240,3 @@
}
}
}

// Action Sheet: Select Option
// --------------------------------------------------

.action-sheet-button-label {
display: flex;

align-items: center;
}

.select-option-content {
flex: 1;
}

.select-option-description {
display: block;
}
106 changes: 97 additions & 9 deletions core/src/components/action-sheet/action-sheet.ionic.scss
Original file line number Diff line number Diff line change
@@ -1,22 +1,110 @@
@use "../../themes/ionic/ionic.globals.scss" as globals;
@use "../../themes/mixins" as mixins;
@use "../select-option/select-option.ionic.interface";
@use "./action-sheet.common";
@use "./action-sheet.md" as action-sheet-md;

// Ionic Action Sheet
// --------------------------------------------------

// Action Sheet: Select Option
// --------------------------------------------------
:host {
--background: #{globals.$ion-bg-surface-default};
--backdrop-opacity: 0.7;
--button-background: transparent;
--button-background-selected: #{globals.$ion-bg-primary-subtle-default};
--button-background-selected-opacity: 1;
--button-background-activated: #{globals.$ion-bg-neutral-subtlest-press};
--button-background-activated-opacity: 1;
--button-background-hover: #{globals.$ion-bg-neutral-subtlest-press};
--button-background-hover-opacity: 1;
--button-color: #{globals.$ion-text-default};
--button-color-disabled: #{globals.$ion-text-disabled};
--color: #{globals.$ion-text-default};

z-index: 1001;
}

.action-sheet-wrapper {
z-index: 10;
}

.action-sheet-button.ion-focused::after {
@include globals.focused-state(
globals.$ion-border-size-050,
globals.$ion-border-style-solid,
globals.$ion-border-focus-default
);

outline-offset: calc(globals.$ion-border-size-050 * -1);
}

// Action Sheet Wrapper
// -----------------------------------------

.action-sheet-button-label {
gap: globals.$ion-space-300;
.action-sheet-wrapper {
@include mixins.margin(var(--ion-safe-area-top, 0), auto, 0, auto);
}

.select-option-description {
.action-sheet-title {
@include mixins.padding(globals.$ion-space-400);
@include globals.typography(globals.$ion-heading-h6-medium);

color: var(--color);

text-align: start;
}

.action-sheet-sub-title {
@include globals.typography(globals.$ion-body-md-regular);
@include globals.padding(0);

color: globals.$ion-text-subtle;
color: globals.$ion-text-subtlest;
}

// Action Sheet Group
// -----------------------------------------

.action-sheet-group:first-child {
@include mixins.padding(globals.$ion-space-400, null, null, null);
}

.action-sheet-group:last-child {
@include mixins.padding(null, null, globals.$ion-space-400, null);
}

// Action Sheet Buttons
// -----------------------------------------

.action-sheet-button {
@include mixins.padding(
globals.$ion-space-200,
globals.$ion-space-400,
globals.$ion-space-200,
globals.$ion-space-400
);
@include globals.typography(globals.$ion-body-md-regular);

position: relative;

min-height: 52px;

text-align: start;

contain: content;
overflow: hidden;
}

.action-sheet-icon {
Comment thread
brandyscarney marked this conversation as resolved.
@include mixins.margin(globals.$ion-space-0, globals.$ion-space-600, globals.$ion-space-0, globals.$ion-space-0);

width: globals.$ion-scale-600;
height: globals.$ion-scale-600;

color: var(--color, globals.$ion-text-default);
}

.action-sheet-button-inner {
justify-content: flex-start;
}

font-size: globals.$ion-font-size-350;
.action-sheet-selected {
font-weight: bold;
}
1 change: 1 addition & 0 deletions core/src/components/action-sheet/action-sheet.ios.scss
Comment thread
brandyscarney marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
@use "../select-option/select-option.ios.interface";
@import "./action-sheet.native";
@import "./action-sheet.ios.vars";

Expand Down
3 changes: 2 additions & 1 deletion core/src/components/action-sheet/action-sheet.md.scss
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
@use "../select-option/select-option.md.interface";
@import "./action-sheet.native";
@import "./action-sheet.md.vars";

// Material Design Action Sheet Title
// Material Design Action Sheet
// -----------------------------------------

:host {
Expand Down
18 changes: 7 additions & 11 deletions core/src/components/action-sheet/action-sheet.native.scss
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
@use "../../themes/native/native.theme.default" as native;
@use "../../themes/mixins" as mixins;
@use "../../themes/functions.font" as font;
@use "../../themes/native/native.globals" as native;
@use "./action-sheet.common";

// Action Sheet: Native
// --------------------------------------------------

.action-sheet-button-label {
gap: 12px;
}

.select-option-description {
@include mixins.padding(5px, 0, 0, 0);
:host {
font-family: native.$font-family-base;

color: native.$text-color-step-300;
z-index: native.$z-index-overlay;
}

font-size: font.dynamic-font(12px);
.action-sheet-wrapper {
z-index: native.$z-index-overlay-wrapper;
}
10 changes: 0 additions & 10 deletions core/src/components/action-sheet/action-sheet.vars.scss

This file was deleted.

2 changes: 2 additions & 0 deletions core/src/components/action-sheet/test/basic/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
.my-color-class {
--background: #292929;
--button-background-selected: #222222;
--button-background-activated: #393838;
--button-background-activated-opacity: 1;

--color: #dfdfdf;
--button-color: #dfdfdf;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { configs, test } from '@utils/test/playwright';

import { ActionSheetFixture } from '../basic/fixture';

/**
* This behavior does not vary across directions.
*/
configs({ directions: ['ltr'], modes: ['ios', 'md', 'ionic-md'] }).forEach(({ config, screenshot, title }) => {
test.describe(title('action sheet: states'), () => {
/**
* `(any-hover: hover)` evaluates to "none" in all three mobile-emulated
* projects, suppressing the hover rules:
*
* - Chromium and WebKit suppress it because of hasTouch and isMobile.
* - Headless Firefox doesn't detect input devices and reports no hover
* capability regardless of context options, so override it via
* launchOptions.firefoxUserPrefs. Bit values: 4 = FINE (mouse),
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overriding it would lead to a global change so I didn't want to attempt that in this PR.

* 8 = HOVER, 12 = FINE | HOVER.
*
* Viewport, userAgent, and scale factor remain mobile-sized.
*/
test.use({
hasTouch: false,
isMobile: false,
});

test('should render all button states', async ({ page }) => {
await page.goto(`/src/components/action-sheet/test/states`, config);

const actionSheetFixture = new ActionSheetFixture(page, screenshot);

await actionSheetFixture.open('#basic');

const defaultButton = page.locator('ion-action-sheet button.action-sheet-button').first();
await defaultButton.hover();

await actionSheetFixture.screenshot('states');
});
});
});
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hovered styles in Playwright Firefox do not display because we aren't truly mimicking a supported device.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading