diff --git a/BREAKING.md b/BREAKING.md
index fc500f64888..e48fe76f98d 100644
--- a/BREAKING.md
+++ b/BREAKING.md
@@ -19,6 +19,7 @@ This is a comprehensive list of the breaking changes introduced in the major ver
- [Button](#version-9x-button)
- [Card](#version-9x-card)
- [Chip](#version-9x-chip)
+ - [Col](#version-9x-col)
- [Content](#version-9x-content)
- [Datetime](#version-9x-datetime)
- [Grid](#version-9x-grid)
@@ -27,6 +28,7 @@ This is a comprehensive list of the breaking changes introduced in the major ver
- [Item Divider](#version-9x-item-divider)
- [Menu Toggle](#version-9x-menu-toggle)
- [Radio Group](#version-9x-radio-group)
+ - [Row](#version-9x-row)
- [Spinner](#version-9x-spinner)
- [Text](#version-9x-text)
- [Textarea](#version-9x-textarea)
@@ -87,6 +89,25 @@ This is a comprehensive list of the breaking changes introduced in the major ver
- Specific theme classes (e.g., `ion-chip.md`) are no longer supported. Style modifications based on the active theme must be implemented using theme tokens rather than direct class targeting.
- The `border-radius` of the `ios` and `md` chip now defaults to `10px` and `8px`, respectively, instead of `16px` in accordance with the iOS and Material Design 3 guidelines. To revert to the previous appearance, set the `shape` to `"round"`, or override the `IonChip.shape.round.border.radius` to specify a different value for global styles and `--ion-chip-shape-round-border-radius` for component-specific styles.
+
Col
+
+The following breaking changes apply to `ion-col`:
+
+1. `--ion-grid-column-padding-*` CSS variables have been replaced with per-side, per-breakpoint tokens in the `col` namespace. [1](#version-9x-col-padding-variables)
+2. Theme classes (`ion-col.md`, `ion-col.ios`) are no longer supported. [2](#version-9x-col-theme-classes)
+
+Padding variables
+
+Column padding was a single value per breakpoint and is now set per-side, and the variables have moved from the `grid` namespace to the `col` namespace. Use the new token structure for global styles, or the corresponding CSS variable for component-specific overrides:
+
+| Old (8.x) | New token (global) | New CSS variable (component-specific) |
+|---|---|---|
+| `--ion-grid-column-padding-{bp}` | `IonCol.breakpoint.{bp}.padding.{top\|end\|bottom\|start}` | `--ion-col-breakpoint-{bp}-padding-{top\|end\|bottom\|start}` |
+
+Theme classes
+
+Remove any instances that target the theme classes: `ion-col.md`, `ion-col.ios`.
+
Content
The following breaking changes apply to `ion-content`:
@@ -141,9 +162,32 @@ Remove any instances that target the theme classes: `ion-content.md`, `ion-conte
Grid
-- The properties `pull` and `push` have been deprecated and no longer work. A similar look can be achieved with the newly added property `order`.
+The following breaking changes apply to `ion-grid`:
+
+1. `--ion-grid-padding-*` CSS variables have been replaced with per-side, per-breakpoint tokens. [1](#version-9x-grid-padding-variables)
+2. `--ion-grid-width-*` CSS variables for the fixed grid have been replaced with per-breakpoint tokens. [2](#version-9x-grid-fixed-width-variables)
+3. The `push` and `pull` properties have been deprecated. [3](#version-9x-grid-deprecated-push-and-pull-properties)
+4. Theme classes (`ion-grid.md`, `ion-grid.ios`) are no longer supported. [4](#version-9x-grid-theme-classes)
+
+Padding variables
-Example 1: Swap two columns
+Grid padding was a single value per breakpoint and is now set per-side. Use the new token structure for global styles, or the corresponding CSS variable for component-specific overrides:
+
+| Old (8.x) | New token (global) | New CSS variable (component-specific) |
+|---|---|---|
+| `--ion-grid-padding-{bp}` | `IonGrid.breakpoint.{bp}.padding.{top\|end\|bottom\|start}` | `--ion-grid-breakpoint-{bp}-padding-{top\|end\|bottom\|start}` |
+
+Fixed width variables
+
+| Old (8.x) | New token (global) | New CSS variable (component-specific) |
+|---|---|---|
+| `--ion-grid-width-{bp}` | `IonGrid.breakpoint.{bp}.width` | `--ion-grid-breakpoint-{bp}-width` |
+
+Deprecated push and pull properties
+
+The `push` and `pull` properties have been disabled. They now log a deprecation warning and no longer affect layout. Use the `order` property to achieve a similar result.
+
+**Example 1: Swap two columns**
**Version up to 8.x**
@@ -169,7 +213,7 @@ Remove any instances that target the theme classes: `ion-content.md`, `ion-conte
```
-Example 2: Reorder columns with specific sizes
+**Example 2: Reorder columns with specific sizes**
To reorder two columns where column 1 has `size="9" push="3"` and column 2 has `size="3" pull="9"`:
@@ -195,7 +239,7 @@ To reorder two columns where column 1 has `size="9" push="3"` and column 2 has `
```
-Example 3: Push
+**Example 3: Push**
```html
@@ -225,7 +269,7 @@ To reorder two columns where column 1 has `size="9" push="3"` and column 2 has `
```
-Example 4: Push and Pull
+**Example 4: Push and Pull**
```html
@@ -255,6 +299,10 @@ To reorder two columns where column 1 has `size="9" push="3"` and column 2 has `
```
+Theme classes
+
+Remove any instances that target the theme classes: `ion-grid.md`, `ion-grid.ios`.
+
Image
The following breaking changes apply to `ion-img`:
@@ -304,6 +352,16 @@ If you were targeting the internals of `ion-radio-group` in your CSS, you will n
Additionally, the `radio-group-wrapper` div element has been removed, causing slotted elements to be direct children of the `ion-radio-group`.
+Row
+
+The following breaking changes apply to `ion-row`:
+
+1. Theme classes (`ion-row.md`, `ion-row.ios`) are no longer supported. [1](#version-9x-row-theme-classes)
+
+Theme classes
+
+Remove any instances that target the theme classes: `ion-row.md`, `ion-row.ios`.
+
Spinner
- Component CSS variables have been removed. The component now utilizes the centralized Ionic Theming system. Global updates should be managed via the theme tokens file, while component-specific overrides are handled through localized CSS variables.
diff --git a/core/api.txt b/core/api.txt
index 56e39615965..36040cb0c13 100644
--- a/core/api.txt
+++ b/core/api.txt
@@ -781,15 +781,26 @@ ion-col,prop,sizeMd,string | undefined,undefined,false,false
ion-col,prop,sizeSm,string | undefined,undefined,false,false
ion-col,prop,sizeXl,string | undefined,undefined,false,false
ion-col,prop,sizeXs,string | undefined,undefined,false,false
-ion-col,prop,theme,"ios" | "md" | "ionic",undefined,false,false
-ion-col,css-prop,--col-unit-size
-ion-col,css-prop,--ion-grid-column-padding
-ion-col,css-prop,--ion-grid-column-padding-lg
-ion-col,css-prop,--ion-grid-column-padding-md
-ion-col,css-prop,--ion-grid-column-padding-sm
-ion-col,css-prop,--ion-grid-column-padding-xl
-ion-col,css-prop,--ion-grid-column-padding-xs
-ion-col,css-prop,--ion-grid-columns
+ion-col,css-prop,--ion-col-breakpoint-lg-padding-bottom
+ion-col,css-prop,--ion-col-breakpoint-lg-padding-end
+ion-col,css-prop,--ion-col-breakpoint-lg-padding-start
+ion-col,css-prop,--ion-col-breakpoint-lg-padding-top
+ion-col,css-prop,--ion-col-breakpoint-md-padding-bottom
+ion-col,css-prop,--ion-col-breakpoint-md-padding-end
+ion-col,css-prop,--ion-col-breakpoint-md-padding-start
+ion-col,css-prop,--ion-col-breakpoint-md-padding-top
+ion-col,css-prop,--ion-col-breakpoint-sm-padding-bottom
+ion-col,css-prop,--ion-col-breakpoint-sm-padding-end
+ion-col,css-prop,--ion-col-breakpoint-sm-padding-start
+ion-col,css-prop,--ion-col-breakpoint-sm-padding-top
+ion-col,css-prop,--ion-col-breakpoint-xl-padding-bottom
+ion-col,css-prop,--ion-col-breakpoint-xl-padding-end
+ion-col,css-prop,--ion-col-breakpoint-xl-padding-start
+ion-col,css-prop,--ion-col-breakpoint-xl-padding-top
+ion-col,css-prop,--ion-col-breakpoint-xs-padding-bottom
+ion-col,css-prop,--ion-col-breakpoint-xs-padding-end
+ion-col,css-prop,--ion-col-breakpoint-xs-padding-start
+ion-col,css-prop,--ion-col-breakpoint-xs-padding-top
ion-content,shadow
ion-content,prop,color,"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string & Record | undefined,undefined,false,true
@@ -1043,19 +1054,32 @@ ion-gallery,prop,theme,"ios" | "md" | "ionic",undefined,false,false
ion-grid,shadow
ion-grid,prop,fixed,boolean,false,false,false
ion-grid,prop,mode,"ios" | "md",undefined,false,false
-ion-grid,prop,theme,"ios" | "md" | "ionic",undefined,false,false
-ion-grid,css-prop,--ion-grid-padding
-ion-grid,css-prop,--ion-grid-padding-lg
-ion-grid,css-prop,--ion-grid-padding-md
-ion-grid,css-prop,--ion-grid-padding-sm
-ion-grid,css-prop,--ion-grid-padding-xl
-ion-grid,css-prop,--ion-grid-padding-xs
-ion-grid,css-prop,--ion-grid-width
-ion-grid,css-prop,--ion-grid-width-lg
-ion-grid,css-prop,--ion-grid-width-md
-ion-grid,css-prop,--ion-grid-width-sm
-ion-grid,css-prop,--ion-grid-width-xl
-ion-grid,css-prop,--ion-grid-width-xs
+ion-grid,css-prop,--ion-grid-breakpoint-lg-padding-bottom
+ion-grid,css-prop,--ion-grid-breakpoint-lg-padding-end
+ion-grid,css-prop,--ion-grid-breakpoint-lg-padding-start
+ion-grid,css-prop,--ion-grid-breakpoint-lg-padding-top
+ion-grid,css-prop,--ion-grid-breakpoint-lg-width
+ion-grid,css-prop,--ion-grid-breakpoint-md-padding-bottom
+ion-grid,css-prop,--ion-grid-breakpoint-md-padding-end
+ion-grid,css-prop,--ion-grid-breakpoint-md-padding-start
+ion-grid,css-prop,--ion-grid-breakpoint-md-padding-top
+ion-grid,css-prop,--ion-grid-breakpoint-md-width
+ion-grid,css-prop,--ion-grid-breakpoint-sm-padding-bottom
+ion-grid,css-prop,--ion-grid-breakpoint-sm-padding-end
+ion-grid,css-prop,--ion-grid-breakpoint-sm-padding-start
+ion-grid,css-prop,--ion-grid-breakpoint-sm-padding-top
+ion-grid,css-prop,--ion-grid-breakpoint-sm-width
+ion-grid,css-prop,--ion-grid-breakpoint-xl-padding-bottom
+ion-grid,css-prop,--ion-grid-breakpoint-xl-padding-end
+ion-grid,css-prop,--ion-grid-breakpoint-xl-padding-start
+ion-grid,css-prop,--ion-grid-breakpoint-xl-padding-top
+ion-grid,css-prop,--ion-grid-breakpoint-xl-width
+ion-grid,css-prop,--ion-grid-breakpoint-xs-padding-bottom
+ion-grid,css-prop,--ion-grid-breakpoint-xs-padding-end
+ion-grid,css-prop,--ion-grid-breakpoint-xs-padding-start
+ion-grid,css-prop,--ion-grid-breakpoint-xs-padding-top
+ion-grid,css-prop,--ion-grid-breakpoint-xs-width
+ion-grid,css-prop,--ion-grid-columns
ion-header,none
ion-header,prop,collapse,"condense" | "fade" | undefined,undefined,false,false
@@ -2255,8 +2279,7 @@ ion-router-outlet,prop,theme,"ios" | "md" | "ionic",undefined,false,false
ion-row,shadow
ion-row,prop,mode,"ios" | "md",undefined,false,false
-ion-row,prop,theme,"ios" | "md" | "ionic",undefined,false,false
-ion-row,css-prop,--ion-grid-gap
+ion-row,css-prop,--ion-row-gap
ion-searchbar,scoped
ion-searchbar,prop,animated,boolean,false,false,false
diff --git a/core/src/components.d.ts b/core/src/components.d.ts
index 23b33be9ec3..0e1bafc4319 100644
--- a/core/src/components.d.ts
+++ b/core/src/components.d.ts
@@ -1043,10 +1043,6 @@ export namespace Components {
* The size of the column for xs screens, in terms of how many columns it should take up out of the total available. If `"auto"` is passed, the column will be the size of its content.
*/
"sizeXs"?: string;
- /**
- * The theme determines the visual appearance of the component.
- */
- "theme"?: "ios" | "md" | "ionic";
}
interface IonContent {
/**
@@ -1512,10 +1508,6 @@ export namespace Components {
* The mode determines the platform behaviors of the component.
*/
"mode"?: "ios" | "md";
- /**
- * The theme determines the visual appearance of the component.
- */
- "theme"?: "ios" | "md" | "ionic";
}
interface IonHeader {
/**
@@ -3463,7 +3455,7 @@ export namespace Components {
* The mode determines the platform behaviors of the component.
* @default getIonMode(this)
*/
- "mode": "ios" | "md";
+ "mode": "md" | "ios";
"setRouteId": (id: string, params: ComponentProps | undefined, direction: RouterDirection, animation?: AnimationBuilder) => Promise;
"swipeHandler"?: SwipeGestureHandler;
/**
@@ -3476,10 +3468,6 @@ export namespace Components {
* The mode determines the platform behaviors of the component.
*/
"mode"?: "ios" | "md";
- /**
- * The theme determines the visual appearance of the component.
- */
- "theme"?: "ios" | "md" | "ionic";
}
interface IonSearchbar {
/**
@@ -7062,10 +7050,6 @@ declare namespace LocalJSX {
* The size of the column for xs screens, in terms of how many columns it should take up out of the total available. If `"auto"` is passed, the column will be the size of its content.
*/
"sizeXs"?: string;
- /**
- * The theme determines the visual appearance of the component.
- */
- "theme"?: "ios" | "md" | "ionic";
}
interface IonContent {
/**
@@ -7520,10 +7504,6 @@ declare namespace LocalJSX {
* The mode determines the platform behaviors of the component.
*/
"mode"?: "ios" | "md";
- /**
- * The theme determines the visual appearance of the component.
- */
- "theme"?: "ios" | "md" | "ionic";
}
interface IonHeader {
/**
@@ -9511,7 +9491,7 @@ declare namespace LocalJSX {
* The mode determines the platform behaviors of the component.
* @default getIonMode(this)
*/
- "mode"?: "ios" | "md";
+ "mode"?: "md" | "ios";
"onIonNavDidChange"?: (event: IonRouterOutletCustomEvent) => void;
"onIonNavWillChange"?: (event: IonRouterOutletCustomEvent) => void;
"onIonNavWillLoad"?: (event: IonRouterOutletCustomEvent) => void;
@@ -9526,10 +9506,6 @@ declare namespace LocalJSX {
* The mode determines the platform behaviors of the component.
*/
"mode"?: "ios" | "md";
- /**
- * The theme determines the visual appearance of the component.
- */
- "theme"?: "ios" | "md" | "ionic";
}
interface IonSearchbar {
/**
@@ -11229,7 +11205,7 @@ declare namespace LocalJSX {
"target": string | undefined;
}
interface IonRouterOutletAttributes {
- "mode": "ios" | "md";
+ "mode": "md" | "ios";
"animated": boolean;
}
interface IonSearchbarAttributes {
diff --git a/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Chrome-linux.png
index 28138808c3a..56e9941cb1e 100644
Binary files a/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Chrome-linux.png and b/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Firefox-linux.png
index f7a56d923a7..626dba67148 100644
Binary files a/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Firefox-linux.png and b/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Safari-linux.png b/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Safari-linux.png
index c5a575bfc19..69d462f2039 100644
Binary files a/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Safari-linux.png and b/core/src/components/action-sheet/test/translucent/action-sheet.e2e.ts-snapshots/action-sheet-translucent-ios-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/action-sheet/test/translucent/index.html b/core/src/components/action-sheet/test/translucent/index.html
index cfae303e7e6..1eef4d3849a 100644
--- a/core/src/components/action-sheet/test/translucent/index.html
+++ b/core/src/components/action-sheet/test/translucent/index.html
@@ -14,10 +14,16 @@
+
+
+
+ ion-col
+ ion-col
+ ion-col
+ ion-col
+ ion-col[width-50]
+ ion-col
+ ion-col
+
+
+
+ ion-col[width-25]
+ ion-col
+ ion-col[width-25]
+
+
+
+ ion-col[width-25]
+ ion-col[width-25][offset-25]
+
+
+
+ ion-col
+ ion-col
#
+ ion-col
#
#
+ ion-col
#
#
#
+
+
+
+ ion-col[top]
+ ion-col[center]
+ ion-col[bottom]
+ ion-col
#
#
+
+
+
+ [top] ion-col
+ [top] ion-col
+ [top] ion-col[bottom]
+ ion-col
#
#
+
+
+
+ [center] ion-col
+ [center] ion-col
+ [center] ion-col
+ ion-col
#
#
+
+
+
+ [bottom] ion-col
+ [bottom] ion-col[top]
+ [bottom] ion-col
+ ion-col
#
#
+
+
+
+ [responsive-sm] ion-col
+ [responsive-sm] ion-col
+ [responsive-sm] ion-col
+ [responsive-sm] ion-col
+
+
+
+ [responsive-md] ion-col
+ [responsive-md] ion-col
+ [responsive-md] ion-col
+ [responsive-md] ion-col
+
+
+
+ [responsive-lg] ion-col[width-50][offset-25]
+ [responsive-lg] ion-col[width-25]
+
+
+ `,
+ config
+ );
+
+ const grid = page.locator('ion-grid');
+
+ /**
+ * Grid overflows the default viewport, causing
+ * unrendered areas to appear black in the screenshot.
+ * Resizing to fit content.
+ */
+ const box = await grid.boundingBox();
+ await page.setViewportSize({ width: Math.ceil(box!.width), height: Math.ceil(box!.height) });
+
+ await expect(grid).toHaveScreenshot(screenshot('grid-basic'));
+ });
+
+ test('should not have visual regressions for custom columns', async ({ page }) => {
+ await page.setContent(
+ `
+
+
+
+
+ 16
+
+
+ 8
+ 8
+
+
+ 13
+ 3
+
+
+ size 10, offset 6
+
+
+ `,
+ config
+ );
await page.setIonViewport();
- await expect(page).toHaveScreenshot(screenshot(`grid-basic`));
+ const grid = page.locator('ion-grid');
+
+ await expect(grid).toHaveScreenshot(screenshot('grid-custom-columns'));
});
});
});
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Chrome-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Chrome-linux.png
index 707caaecc13..66bbd9ed32b 100644
Binary files a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Chrome-linux.png and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Firefox-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Firefox-linux.png
index 8c1b5d84f49..23d1b31a72c 100644
Binary files a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Firefox-linux.png and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Safari-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Safari-linux.png
index e020cae2f68..a4b61ab6fb5 100644
Binary files a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Safari-linux.png and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Chrome-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Chrome-linux.png
index 762d30ab638..bb5b50218a7 100644
Binary files a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Chrome-linux.png and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Firefox-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Firefox-linux.png
index 673cf5e73da..817413227da 100644
Binary files a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Firefox-linux.png and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Safari-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Safari-linux.png
index b7ffb15e9eb..456341d34eb 100644
Binary files a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Safari-linux.png and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-basic-md-rtl-Mobile-Safari-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Chrome-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Chrome-linux.png
new file mode 100644
index 00000000000..58da0f16b63
Binary files /dev/null and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Firefox-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Firefox-linux.png
new file mode 100644
index 00000000000..7fe743605df
Binary files /dev/null and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Safari-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Safari-linux.png
new file mode 100644
index 00000000000..28a9979669f
Binary files /dev/null and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Chrome-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Chrome-linux.png
new file mode 100644
index 00000000000..75d9fb08861
Binary files /dev/null and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Firefox-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Firefox-linux.png
new file mode 100644
index 00000000000..ebff9076e0e
Binary files /dev/null and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Safari-linux.png b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Safari-linux.png
new file mode 100644
index 00000000000..447779de36a
Binary files /dev/null and b/core/src/components/grid/test/basic/grid.e2e.ts-snapshots/grid-custom-columns-md-rtl-Mobile-Safari-linux.png differ
diff --git a/core/src/components/grid/test/basic/index.html b/core/src/components/grid/test/basic/index.html
index c351e8840d7..2a8ee1ae3a3 100644
--- a/core/src/components/grid/test/basic/index.html
+++ b/core/src/components/grid/test/basic/index.html
@@ -12,6 +12,24 @@
+
@@ -23,7 +41,8 @@
-
+ Default Columns
+
ion-col
@@ -205,16 +224,55 @@
-
-
+ Custom Column Count
+
+
+
+ ion-col[size-16] full width
+
+
+
+
+
+ ion-col[size-8] half
+
+
+ ion-col[size-8] half
+
+
+
+
+
+ ion-col[size-4]
+
+
+ ion-col[size-4]
+
+
+ ion-col[size-4]
+
+
+ ion-col[size-4]
+
+
+
+
+
+ ion-col[size-13]
+
+
+ ion-col[size-3]
+
+
+
+
+
+ ion-col[size-10][offset-6]
+
+
+
+