diff --git a/.editorconfig b/.editorconfig
index 82da0b16e75..0981b55d9ad 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -10,6 +10,6 @@ end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
-[*.md]
+[{*.md,*.mdx}]
insert_final_newline = false
trim_trailing_whitespace = false
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index cf3eb243153..ed18ea9546d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -118,10 +118,10 @@ Ionic's documentation is built using [Docusaurus](https://docusaurus.io/). The c
The content of the Ionic docs is written as [Markdown](https://commonmark.org/) in `docs/`. Each Markdown file corresponds to a route unless explicitly changed in the frontmatter.
```
-/docs/ => src/pages/index.md
-/docs/intro/cli => src/pages/intro/cli.md
-/docs/theming/advanced => src/pages/theming/advanced.md
-/docs/theming => src/pages/theming.md
+/docs/ => src/pages/index.mdx
+/docs/intro/cli => src/pages/intro/cli.mdx
+/docs/theming/advanced => src/pages/theming/advanced.mdx
+/docs/theming => src/pages/theming.mdx
```
You can make copy edits to the site by [editing the Markdown files directly on GitHub](https://help.github.com/articles/editing-files-in-another-user-s-repository/). In your pull request, please explain what was missing from or inaccurate about the content.
diff --git a/_templates/README.md b/_templates/README.md
index 60a3ebef83d..77790a47b4d 100644
--- a/_templates/README.md
+++ b/_templates/README.md
@@ -21,12 +21,12 @@ If you need a component for multiple versions of Ionic Framework, you (currently
## Usage
-Once you've generated your playground, you need to add it to the main markdown file in the docs (e.g. [docs/api/button.md](../docs/api/button.md)) by doing something similar to the following example:
+Once you've generated your playground, you need to add it to the main markdown file in the docs (e.g. [docs/api/button.mdx](../docs/api/button.mdx)) by doing something similar to the following example:
```
## Feature
-import Feature from '@site/static/usage/v8/button/feature/index.md';
+import Feature from '@site/static/usage/v8/button/feature/index.mdx';
```
diff --git a/docs/angular/build-options.md b/docs/angular/build-options.mdx
similarity index 100%
rename from docs/angular/build-options.md
rename to docs/angular/build-options.mdx
diff --git a/docs/angular/lifecycle.md b/docs/angular/lifecycle.mdx
similarity index 100%
rename from docs/angular/lifecycle.md
rename to docs/angular/lifecycle.mdx
diff --git a/docs/angular/navigation.md b/docs/angular/navigation.mdx
similarity index 100%
rename from docs/angular/navigation.md
rename to docs/angular/navigation.mdx
diff --git a/docs/angular/overview.md b/docs/angular/overview.mdx
similarity index 100%
rename from docs/angular/overview.md
rename to docs/angular/overview.mdx
diff --git a/docs/angular/performance.md b/docs/angular/performance.md
deleted file mode 100644
index 62877e6e4dd..00000000000
--- a/docs/angular/performance.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-title: Angular Performance
-sidebar_label: Performance
----
-
-
- Angular Performance: Manage App Component Change with ngFor
-
-
-
-## \*ngFor with Ionic Components
-
-When using `*ngFor` with Ionic components, we recommend using Angular's `trackBy` option. This allows Angular to manage change propagation in a much more efficient way and only update the content inside of the component rather than re-create the component altogether.
-
-By using `trackBy` you can provide a stable identity for each loop element so Angular can track insertions and deletions within the iterator. Below is an example of how to use `trackBy`:
-
-**home.page.html**
-
-```html
-
- {{ item.value }}
-
-```
-
-**home.component.ts**
-
-```tsx
-
-items = [
- { id: 0, value: 'Item 0' },
- { id: 1, value: 'Item 1' },
- ...
-]
-
-trackItems(index: number, itemObject: any) {
- return itemObject.id;
-}
-```
-
-In this example, we have an array of objects called `items`. Each object contains a `value` and an `id`. Using `trackBy`, we pass a `trackItems` function which returns the `id` of each object. This `id` is used to provide a stable identity for each loop element.
-
-For more information on how Angular manages change propagation with `ngFor` see https://angular.io/api/common/NgForOf#change-propagation.
-
-## From the Ionic Team
-
-[How to Lazy Load in Ionic Angular](https://ionicframework.com/blog/how-to-lazy-load-in-ionic-angular/)
-
-[Improved Perceived Performance with Skeleton Screens](https://ionicframework.com/blog/improved-perceived-performance-with-skeleton-screens/)
-
-## From the Angular Team
-
-[Build performant and progressive Angular apps](https://web.dev/angular) - web.dev
-
-## From the Community
-
-
-
-[High Performance Animations in Ionic](https://www.joshmorony.com/high-performance-animations-in-ionic/) - Josh Morony
-
-[High Performance List Filtering in Ionic](https://www.joshmorony.com/high-performance-list-filtering-in-ionic-2/) - Josh Morony
-
-[Increasing Performance with Efficient DOM Writes in Ionic](https://www.joshmorony.com/increasing-performance-with-efficient-dom-writes-in-ionic-2/) - Josh Morony
-
-[Ionic Framework is Fast (But Your Code Might Not Be)](https://www.joshmorony.com/ionic-framework-is-fast-but-your-code-might-not-be/) - Josh Morony
-
-
-
-:::note
-Do you have a guide you'd like to share? Click the _Edit this page_ button below.
-:::
diff --git a/docs/angular/performance.mdx b/docs/angular/performance.mdx
new file mode 100644
index 00000000000..c4f7760e318
--- /dev/null
+++ b/docs/angular/performance.mdx
@@ -0,0 +1,73 @@
+---
+title: Angular Performance
+sidebar_label: Performance
+---
+
+
+ Angular Performance: Manage App Component Change with ngFor
+
+
+
+## \*ngFor with Ionic Components
+
+When using `*ngFor` with Ionic components, we recommend using Angular's `trackBy` option. This allows Angular to manage change propagation in a much more efficient way and only update the content inside of the component rather than re-create the component altogether.
+
+By using `trackBy` you can provide a stable identity for each loop element so Angular can track insertions and deletions within the iterator. Below is an example of how to use `trackBy`:
+
+**home.page.html**
+
+```html
+
+ {{ item.value }}
+
+```
+
+**home.component.ts**
+
+```tsx
+
+items = [
+ { id: 0, value: 'Item 0' },
+ { id: 1, value: 'Item 1' },
+ ...
+]
+
+trackItems(index: number, itemObject: any) {
+ return itemObject.id;
+}
+```
+
+In this example, we have an array of objects called `items`. Each object contains a `value` and an `id`. Using `trackBy`, we pass a `trackItems` function which returns the `id` of each object. This `id` is used to provide a stable identity for each loop element.
+
+For more information on how Angular manages change propagation with `ngFor` see https://angular.io/api/common/NgForOf#change-propagation.
+
+## From the Ionic Team
+
+[How to Lazy Load in Ionic Angular](https://ionicframework.com/blog/how-to-lazy-load-in-ionic-angular/)
+
+[Improved Perceived Performance with Skeleton Screens](https://ionicframework.com/blog/improved-perceived-performance-with-skeleton-screens/)
+
+## From the Angular Team
+
+[Build performant and progressive Angular apps](https://web.dev/angular) - web.dev
+
+## From the Community
+
+{/* cspell:disable */}
+
+[High Performance Animations in Ionic](https://www.joshmorony.com/high-performance-animations-in-ionic/) - Josh Morony
+
+[High Performance List Filtering in Ionic](https://www.joshmorony.com/high-performance-list-filtering-in-ionic-2/) - Josh Morony
+
+[Increasing Performance with Efficient DOM Writes in Ionic](https://www.joshmorony.com/increasing-performance-with-efficient-dom-writes-in-ionic-2/) - Josh Morony
+
+[Ionic Framework is Fast (But Your Code Might Not Be)](https://www.joshmorony.com/ionic-framework-is-fast-but-your-code-might-not-be/) - Josh Morony
+
+{/* cspell:enable */}
+
+:::note
+Do you have a guide you'd like to share? Click the _Edit this page_ button below.
+:::
diff --git a/docs/angular/platform.md b/docs/angular/platform.mdx
similarity index 100%
rename from docs/angular/platform.md
rename to docs/angular/platform.mdx
diff --git a/docs/angular/pwa.md b/docs/angular/pwa.mdx
similarity index 100%
rename from docs/angular/pwa.md
rename to docs/angular/pwa.mdx
diff --git a/docs/angular/slides.md b/docs/angular/slides.mdx
similarity index 100%
rename from docs/angular/slides.md
rename to docs/angular/slides.mdx
diff --git a/docs/angular/storage.md b/docs/angular/storage.mdx
similarity index 100%
rename from docs/angular/storage.md
rename to docs/angular/storage.mdx
diff --git a/docs/angular/testing.md b/docs/angular/testing.mdx
similarity index 100%
rename from docs/angular/testing.md
rename to docs/angular/testing.mdx
diff --git a/docs/angular/virtual-scroll.md b/docs/angular/virtual-scroll.mdx
similarity index 100%
rename from docs/angular/virtual-scroll.md
rename to docs/angular/virtual-scroll.mdx
diff --git a/docs/angular/your-first-app.md b/docs/angular/your-first-app.md
deleted file mode 100644
index b876e2f66c4..00000000000
--- a/docs/angular/your-first-app.md
+++ /dev/null
@@ -1,182 +0,0 @@
----
-title: 'Your First Ionic App: Angular'
-sidebar_label: Build Your First App
----
-
-
- Build Your First Ionic Mobile App: Angular Development Tutorial
-
-
-
-The great thing about Ionic is that with one codebase, you can build for any platform using just HTML, CSS, and JavaScript. Follow along as we learn the fundamentals of Ionic app development by creating a realistic app step by step.
-
-Here’s the finished app running on all 3 platforms:
-
-
-
-:::note
-Looking for the previous version of this guide that covered Ionic 4 and Cordova? [See here.](../developer-resources/guides/first-app-v4/intro.md)
-:::
-
-## What We'll Build
-
-We'll create a Photo Gallery app that offers the ability to take photos with your device's camera, display them in a grid, and store them permanently on the device.
-
-Highlights include:
-
-- One Angular-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components).
-- Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitorjs.com), Ionic's official native app runtime.
-- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitorjs.com/docs/apis/camera), [Filesystem](https://capacitorjs.com/docs/apis/filesystem), and [Preferences](https://capacitorjs.com/docs/apis/preferences) APIs.
-
-Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-ng).
-
-## Download Required Tools
-
-Download and install these right away to ensure an optimal Ionic development experience:
-
-- **Node.js** for interacting with the Ionic ecosystem. [Download the LTS version here](https://nodejs.org/en/).
-- **A code editor** for... writing code! We are fans of [Visual Studio Code](https://code.visualstudio.com/).
-- **Command-line interface/terminal (CLI)**:
- - **Windows** users: for the best Ionic experience, we recommend the built-in command line (cmd) or the Powershell
- CLI, running in Administrator mode.
- - **Mac/Linux** users, virtually any terminal will work.
-
-## Install Ionic Tooling
-
-Run the following in the command line terminal to install the Ionic CLI (`ionic`), `native-run`, used to run native binaries on devices and simulators/emulators, and `cordova-res`, used to generate native app icons and splash screens:
-
-:::note
-To open a terminal in Visual Studio Code, go to Terminal -> New Terminal.
-:::
-
-```shell
-npm install -g @ionic/cli native-run cordova-res
-```
-
-:::note
-The `-g` option means _install globally_. When packages are installed globally, `EACCES` permission errors can occur.
-
-Consider setting up npm to operate globally without elevated permissions. See [Resolving Permission Errors](../developing/tips.md#resolving-permission-errors) for more information.
-:::
-
-## Create an App
-
-Next, create an Ionic Angular app that uses the “Tabs” starter template and adds Capacitor for native functionality:
-
-```shell
-ionic start photo-gallery tabs --type=angular --capacitor
-```
-
-:::note
-
-When prompted to choose between `NgModules` and `Standalone`, opt for `NgModules` as this tutorial follows the `NgModules` approach.
-
-:::
-
-This starter project comes complete with three pre-built pages and best practices for Ionic development. With common building blocks already in place, we can add more features easily!
-
-Next, change into the app folder:
-
-```shell
-cd photo-gallery
-```
-
-Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work:
-
-```shell
-npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem
-```
-
-### PWA Elements
-
-Some Capacitor plugins, including the Camera API, provide the web-based functionality and UI via the Ionic [PWA Elements library](https://github.com/ionic-team/ionic-pwa-elements).
-
-It's a separate dependency, so install it next:
-
-```shell
-npm install @ionic/pwa-elements
-```
-
-Next, import `@ionic/pwa-elements` by editing `src/main.ts`.
-
-```tsx
-import { defineCustomElements } from '@ionic/pwa-elements/loader';
-
-// Call the element loader before the bootstrapModule/bootstrapApplication call
-defineCustomElements(window);
-```
-
-That’s it! Now for the fun part - let’s see the app in action.
-
-## Run the App
-
-Run this command next:
-
-```shell
-ionic serve
-```
-
-And voilà! Your Ionic app is now running in a web browser. Most of your app can be built and tested right in the browser, greatly increasing development and testing speed.
-
-## Photo Gallery!!!
-
-There are three tabs. Click on the Tab2 tab. It’s a blank canvas, aka the perfect spot to transform into a Photo Gallery. The Ionic CLI features Live Reload, so when you make changes and save them, the app is updated immediately!
-
-
-
-Open the photo-gallery app folder in your code editor of choice, then navigate to `/src/app/tab2/tab2.page.html`. We see:
-
-```html
-
-
- Tab 2
-
-
-
-
-
-
- Tab 2
-
-
-
-```
-
-`ion-header` represents the top navigation and toolbar, with "Tab 2" as the title (there are two of them due to iOS [Collapsible Large Title](https://ionicframework.com/docs/api/title#collapsible-large-titles) support). Rename both `ion-title` elements to:
-
-```html
-Photo Gallery
-```
-
-We put the visual aspects of our app into ``. In this case, it’s where we’ll add a button that opens the device’s camera as well as displays the image captured by the camera. Start by adding a [floating action button](https://ionicframework.com/docs/api/fab) (FAB) to the bottom of the page and set the camera image as the icon.
-
-```html
-
-
-
-
-
-
-
-```
-
-Next, open `src/app/tabs/tabs.page.html`. Change the label to “Photos” and the icon name to “images”:
-
-```html
-
-
- Photos
-
-```
-
-Save all changes to see them automatically applied in the browser. That’s just the start of all the cool things we can do with Ionic. Up next, implement camera taking functionality on the web, then build it for iOS and Android.
diff --git a/docs/angular/your-first-app.mdx b/docs/angular/your-first-app.mdx
new file mode 100644
index 00000000000..915976f4c48
--- /dev/null
+++ b/docs/angular/your-first-app.mdx
@@ -0,0 +1,182 @@
+---
+title: 'Your First Ionic App: Angular'
+sidebar_label: Build Your First App
+---
+
+
+ Build Your First Ionic Mobile App: Angular Development Tutorial
+
+
+
+The great thing about Ionic is that with one codebase, you can build for any platform using just HTML, CSS, and JavaScript. Follow along as we learn the fundamentals of Ionic app development by creating a realistic app step by step.
+
+Here’s the finished app running on all 3 platforms:
+
+
+
+:::note
+Looking for the previous version of this guide that covered Ionic 4 and Cordova? [See here.](../developer-resources/guides/first-app-v4/intro.mdx)
+:::
+
+## What We'll Build
+
+We'll create a Photo Gallery app that offers the ability to take photos with your device's camera, display them in a grid, and store them permanently on the device.
+
+Highlights include:
+
+- One Angular-based codebase that runs on the web, iOS, and Android using Ionic Framework [UI components](https://ionicframework.com/docs/components).
+- Deployed as a native iOS and Android mobile app using [Capacitor](https://capacitorjs.com), Ionic's official native app runtime.
+- Photo Gallery functionality powered by the Capacitor [Camera](https://capacitorjs.com/docs/apis/camera), [Filesystem](https://capacitorjs.com/docs/apis/filesystem), and [Preferences](https://capacitorjs.com/docs/apis/preferences) APIs.
+
+Find the complete app code referenced in this guide [on GitHub](https://github.com/ionic-team/photo-gallery-capacitor-ng).
+
+## Download Required Tools
+
+Download and install these right away to ensure an optimal Ionic development experience:
+
+- **Node.js** for interacting with the Ionic ecosystem. [Download the LTS version here](https://nodejs.org/en/).
+- **A code editor** for... writing code! We are fans of [Visual Studio Code](https://code.visualstudio.com/).
+- **Command-line interface/terminal (CLI)**:
+ - **Windows** users: for the best Ionic experience, we recommend the built-in command line (cmd) or the Powershell
+ CLI, running in Administrator mode.
+ - **Mac/Linux** users, virtually any terminal will work.
+
+## Install Ionic Tooling
+
+Run the following in the command line terminal to install the Ionic CLI (`ionic`), `native-run`, used to run native binaries on devices and simulators/emulators, and `cordova-res`, used to generate native app icons and splash screens:
+
+:::note
+To open a terminal in Visual Studio Code, go to Terminal -> New Terminal.
+:::
+
+```shell
+npm install -g @ionic/cli native-run cordova-res
+```
+
+:::note
+The `-g` option means _install globally_. When packages are installed globally, `EACCES` permission errors can occur.
+
+Consider setting up npm to operate globally without elevated permissions. See [Resolving Permission Errors](../developing/tips.mdx#resolving-permission-errors) for more information.
+:::
+
+## Create an App
+
+Next, create an Ionic Angular app that uses the “Tabs” starter template and adds Capacitor for native functionality:
+
+```shell
+ionic start photo-gallery tabs --type=angular --capacitor
+```
+
+:::note
+
+When prompted to choose between `NgModules` and `Standalone`, opt for `NgModules` as this tutorial follows the `NgModules` approach.
+
+:::
+
+This starter project comes complete with three pre-built pages and best practices for Ionic development. With common building blocks already in place, we can add more features easily!
+
+Next, change into the app folder:
+
+```shell
+cd photo-gallery
+```
+
+Next we'll need to install the necessary Capacitor plugins to make the app's native functionality work:
+
+```shell
+npm install @capacitor/camera @capacitor/preferences @capacitor/filesystem
+```
+
+### PWA Elements
+
+Some Capacitor plugins, including the Camera API, provide the web-based functionality and UI via the Ionic [PWA Elements library](https://github.com/ionic-team/ionic-pwa-elements).
+
+It's a separate dependency, so install it next:
+
+```shell
+npm install @ionic/pwa-elements
+```
+
+Next, import `@ionic/pwa-elements` by editing `src/main.ts`.
+
+```tsx
+import { defineCustomElements } from '@ionic/pwa-elements/loader';
+
+// Call the element loader before the bootstrapModule/bootstrapApplication call
+defineCustomElements(window);
+```
+
+That’s it! Now for the fun part - let’s see the app in action.
+
+## Run the App
+
+Run this command next:
+
+```shell
+ionic serve
+```
+
+And voilà! Your Ionic app is now running in a web browser. Most of your app can be built and tested right in the browser, greatly increasing development and testing speed.
+
+## Photo Gallery!!!
+
+There are three tabs. Click on the Tab2 tab. It’s a blank canvas, aka the perfect spot to transform into a Photo Gallery. The Ionic CLI features Live Reload, so when you make changes and save them, the app is updated immediately!
+
+
+
+Open the photo-gallery app folder in your code editor of choice, then navigate to `/src/app/tab2/tab2.page.html`. We see:
+
+```html
+
+
+ Tab 2
+
+
+
+
+
+
+ Tab 2
+
+
+
+```
+
+`ion-header` represents the top navigation and toolbar, with "Tab 2" as the title (there are two of them due to iOS [Collapsible Large Title](https://ionicframework.com/docs/api/title#collapsible-large-titles) support). Rename both `ion-title` elements to:
+
+```html
+Photo Gallery
+```
+
+We put the visual aspects of our app into ``. In this case, it’s where we’ll add a button that opens the device’s camera as well as displays the image captured by the camera. Start by adding a [floating action button](https://ionicframework.com/docs/api/fab) (FAB) to the bottom of the page and set the camera image as the icon.
+
+```html
+
+
+
+
+
+
+
+```
+
+Next, open `src/app/tabs/tabs.page.html`. Change the label to “Photos” and the icon name to “images”:
+
+```html
+
+
+ Photos
+
+```
+
+Save all changes to see them automatically applied in the browser. That’s just the start of all the cool things we can do with Ionic. Up next, implement camera taking functionality on the web, then build it for iOS and Android.
diff --git a/docs/angular/your-first-app/2-taking-photos.md b/docs/angular/your-first-app/2-taking-photos.mdx
similarity index 100%
rename from docs/angular/your-first-app/2-taking-photos.md
rename to docs/angular/your-first-app/2-taking-photos.mdx
diff --git a/docs/angular/your-first-app/3-saving-photos.md b/docs/angular/your-first-app/3-saving-photos.mdx
similarity index 100%
rename from docs/angular/your-first-app/3-saving-photos.md
rename to docs/angular/your-first-app/3-saving-photos.mdx
diff --git a/docs/angular/your-first-app/4-loading-photos.md b/docs/angular/your-first-app/4-loading-photos.mdx
similarity index 100%
rename from docs/angular/your-first-app/4-loading-photos.md
rename to docs/angular/your-first-app/4-loading-photos.mdx
diff --git a/docs/angular/your-first-app/5-adding-mobile.md b/docs/angular/your-first-app/5-adding-mobile.mdx
similarity index 100%
rename from docs/angular/your-first-app/5-adding-mobile.md
rename to docs/angular/your-first-app/5-adding-mobile.mdx
diff --git a/docs/angular/your-first-app/6-deploying-mobile.md b/docs/angular/your-first-app/6-deploying-mobile.mdx
similarity index 100%
rename from docs/angular/your-first-app/6-deploying-mobile.md
rename to docs/angular/your-first-app/6-deploying-mobile.mdx
diff --git a/docs/angular/your-first-app/7-live-reload.md b/docs/angular/your-first-app/7-live-reload.mdx
similarity index 100%
rename from docs/angular/your-first-app/7-live-reload.md
rename to docs/angular/your-first-app/7-live-reload.mdx
diff --git a/docs/angular/your-first-app/8-distribute.md b/docs/angular/your-first-app/8-distribute.mdx
similarity index 100%
rename from docs/angular/your-first-app/8-distribute.md
rename to docs/angular/your-first-app/8-distribute.mdx
diff --git a/docs/api.mdx b/docs/api.mdx
new file mode 100644
index 00000000000..79303157760
--- /dev/null
+++ b/docs/api.mdx
@@ -0,0 +1,17 @@
+---
+title: API Index
+---
+
+import APIList from '@components/page/api/APIList';
+
+
+ API Index | Ionic Docs API Index for all API Custom Elements
+
+
+
+Each Ionic [component](components.mdx) consists of one or more [custom elements](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements). Each custom element, in turn, may expose properties, methods, events, and CSS custom properties.
+
+
diff --git a/docs/api/accordion-group.md b/docs/api/accordion-group.mdx
similarity index 100%
rename from docs/api/accordion-group.md
rename to docs/api/accordion-group.mdx
diff --git a/docs/api/accordion.md b/docs/api/accordion.mdx
similarity index 100%
rename from docs/api/accordion.md
rename to docs/api/accordion.mdx
diff --git a/docs/api/action-sheet.md b/docs/api/action-sheet.md
deleted file mode 100644
index afbec37e566..00000000000
--- a/docs/api/action-sheet.md
+++ /dev/null
@@ -1,298 +0,0 @@
----
-title: "ion-action-sheet"
----
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-import Props from '@ionic-internal/component-api/v8/action-sheet/props.md';
-import Events from '@ionic-internal/component-api/v8/action-sheet/events.md';
-import Methods from '@ionic-internal/component-api/v8/action-sheet/methods.md';
-import Parts from '@ionic-internal/component-api/v8/action-sheet/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/action-sheet/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/action-sheet/slots.md';
-
-
- ion-action-sheet: Action Sheet Dialog for iOS and Android
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-An Action Sheet is a dialog that displays a set of options. It appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. Destructive options are made obvious in `ios` mode. There are multiple ways to dismiss the action sheet, including tapping the backdrop or hitting the escape key on desktop.
-
-## Inline Action Sheets (Recommended)
-
-`ion-action-sheet` can be used by writing the component directly in your template. This reduces the number of handlers you need to wire up in order to present the Action Sheet.
-
-import Trigger from '@site/static/usage/v8/action-sheet/inline/trigger/index.md';
-
-
-
-### Using `isOpen`
-
-The `isOpen` property on `ion-action-sheet` allows developers to control the presentation state of the Action Sheet from their application state. This means when `isOpen` is set to `true` the Action Sheet will be presented, and when `isOpen` is set to `false` the Action Sheet will be dismissed.
-
-`isOpen` uses a one-way data binding, meaning it will not automatically be set to `false` when the Action Sheet is dismissed. Developers should listen for the `ionActionSheetDidDismiss` or `didDismiss` event and set `isOpen` to `false`. The reason for this is it prevents the internals of `ion-action-sheet` from being tightly coupled with the state of the application. With a one way data binding, the Action Sheet only needs to concern itself with the boolean value that the reactive variable provides. With a two way data binding, the Action Sheet needs to concern itself with both the boolean value as well as the existence of the reactive variable itself. This can lead to non-deterministic behaviors and make applications harder to debug.
-
-import IsOpen from '@site/static/usage/v8/action-sheet/inline/isOpen/index.md';
-
-
-
-## Controller Action Sheets
-
-The `actionSheetController` can be used in situations where more control is needed over when the Action Sheet is presented and dismissed.
-
-import Controller from '@site/static/usage/v8/action-sheet/controller/index.md';
-
-
-
-## Buttons
-
-A button's `role` property can either be `destructive` or `cancel`. Buttons without a role property will have the default look for the platform. Buttons with the `cancel` role will always load as the bottom button, no matter where they are in the array. All other buttons will be displayed in the order they have been added to the `buttons` array. Note: We recommend that `destructive` buttons are always the first button in the array, making them the top button. Additionally, if the action sheet is dismissed by tapping the backdrop, then it will fire the handler from the button with the cancel role.
-
-A button can also be passed data via the `data` property on `ActionSheetButton`. This will populate the `data` field in the return value of the `onDidDismiss` method.
-
-## Collecting Role Information on Dismiss
-
-When the `didDismiss` event is fired, the `data` and `role` fields of the event detail can be used to gather information about how the Action Sheet was dismissed.
-
-import RoleInfo from '@site/static/usage/v8/action-sheet/role-info-on-dismiss/index.md';
-
-
-
-## Theming
-
-Action Sheet uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector.
-
-### Styling
-
-We recommend passing a custom class to `cssClass` in the `create` method and using that to add custom styles to the host and inner elements. This property can also accept multiple classes separated by spaces.
-
-```css
-/* DOES NOT WORK - not specific enough */
-.action-sheet-group {
- background: #e5e5e5;
-}
-
-/* Works - pass "my-custom-class" in cssClass to increase specificity */
-.my-custom-class .action-sheet-group {
- background: #e5e5e5;
-}
-```
-
-import Styling from '@site/static/usage/v8/action-sheet/theming/styling/index.md';
-
-
-
-### CSS Custom Properties
-
-Any of the defined [CSS Custom Properties](#css-custom-properties-1) can be used to style the Action Sheet without needing to target individual elements.
-
-import CssCustomProperties from '@site/static/usage/v8/action-sheet/theming/css-properties/index.md';
-
-
-
-## Accessibility
-
-### Screen Readers
-
-Action Sheets set aria properties in order to be [accessible](../reference/glossary#a11y) to screen readers, but these properties can be overridden if they aren't descriptive enough or don't align with how the action sheet is being used in an app.
-
-#### Role
-
-Action Sheets are given a `role` of [`dialog`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/dialog_role). In order to align with the ARIA spec, either the `aria-label` or `aria-labelledby` attribute must be set.
-
-#### Action Sheet Description
-
-It is strongly recommended that every Action Sheet have the `header` property defined, as Ionic will automatically set `aria-labelledby` to point to the header element. However, if you choose not to include a `header`, an alternative is to use the `htmlAttributes` property to provide a descriptive `aria-label` or set a custom `aria-labelledby` value.
-
-
-
-
-
-```javascript
-const actionSheet = await this.actionSheetController.create({
- htmlAttributes: {
- 'aria-label': 'action sheet dialog',
- },
-});
-```
-
-
-
-
-
-```javascript
-const actionSheet = await this.actionSheetController.create({
- htmlAttributes: {
- 'aria-label': 'action sheet dialog',
- },
-});
-```
-
-
-
-
-
-```javascript
-useIonActionSheet({
- htmlAttributes: {
- 'aria-label': 'action sheet dialog',
- },
-});
-```
-
-
-
-
-
-```javascript
-const actionSheet = await actionSheetController.create({
- htmlAttributes: {
- 'aria-label': 'action sheet dialog',
- },
-});
-```
-
-
-
-
-
-#### Action Sheet Buttons Description
-
-Buttons containing text will be read by a screen reader. If a button contains only an icon, or a description other than the existing text is desired, a label should be assigned to the button by passing `aria-label` to the `htmlAttributes` property on the button.
-
-
-
-
-
-```javascript
-const actionSheet = await this.actionSheetController.create({
- header: 'Header',
- buttons: [
- {
- icon: 'close',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-```javascript
-const actionSheet = await this.actionSheetController.create({
- header: 'Header',
- buttons: [
- {
- icon: 'close',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-```javascript
-useIonActionSheet({
- header: 'Header',
- buttons: [
- {
- icon: 'close',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-```javascript
-const actionSheet = await actionSheetController.create({
- header: 'Header',
- buttons: [
- {
- icon: 'close',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-## Interfaces
-
-### ActionSheetButton
-
-```typescript
-interface ActionSheetButton {
- text?: string;
- role?: 'cancel' | 'destructive' | 'selected' | string;
- icon?: string;
- cssClass?: string | string[];
- id?: string;
- htmlAttributes?: { [key: string]: any };
- handler?: () => boolean | void | Promise;
- data?: T;
-}
-```
-
-### ActionSheetOptions
-
-```typescript
-interface ActionSheetOptions {
- header?: string;
- subHeader?: string;
- cssClass?: string | string[];
- buttons: (ActionSheetButton | string)[];
- backdropDismiss?: boolean;
- translucent?: boolean;
- animated?: boolean;
- mode?: Mode;
- keyboardClose?: boolean;
- id?: string;
- htmlAttributes?: { [key: string]: any };
-
- enterAnimation?: AnimationBuilder;
- leaveAnimation?: AnimationBuilder;
-}
-```
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/action-sheet.mdx b/docs/api/action-sheet.mdx
new file mode 100644
index 00000000000..767667ceae8
--- /dev/null
+++ b/docs/api/action-sheet.mdx
@@ -0,0 +1,298 @@
+---
+title: "ion-action-sheet"
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+import Props from '@ionic-internal/component-api/v8/action-sheet/props.md';
+import Events from '@ionic-internal/component-api/v8/action-sheet/events.md';
+import Methods from '@ionic-internal/component-api/v8/action-sheet/methods.md';
+import Parts from '@ionic-internal/component-api/v8/action-sheet/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/action-sheet/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/action-sheet/slots.md';
+
+
+ ion-action-sheet: Action Sheet Dialog for iOS and Android
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+An Action Sheet is a dialog that displays a set of options. It appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. Destructive options are made obvious in `ios` mode. There are multiple ways to dismiss the action sheet, including tapping the backdrop or hitting the escape key on desktop.
+
+## Inline Action Sheets (Recommended)
+
+`ion-action-sheet` can be used by writing the component directly in your template. This reduces the number of handlers you need to wire up in order to present the Action Sheet.
+
+import Trigger from '@site/static/usage/v8/action-sheet/inline/trigger/index.md';
+
+
+
+### Using `isOpen`
+
+The `isOpen` property on `ion-action-sheet` allows developers to control the presentation state of the Action Sheet from their application state. This means when `isOpen` is set to `true` the Action Sheet will be presented, and when `isOpen` is set to `false` the Action Sheet will be dismissed.
+
+`isOpen` uses a one-way data binding, meaning it will not automatically be set to `false` when the Action Sheet is dismissed. Developers should listen for the `ionActionSheetDidDismiss` or `didDismiss` event and set `isOpen` to `false`. The reason for this is it prevents the internals of `ion-action-sheet` from being tightly coupled with the state of the application. With a one way data binding, the Action Sheet only needs to concern itself with the boolean value that the reactive variable provides. With a two way data binding, the Action Sheet needs to concern itself with both the boolean value as well as the existence of the reactive variable itself. This can lead to non-deterministic behaviors and make applications harder to debug.
+
+import IsOpen from '@site/static/usage/v8/action-sheet/inline/isOpen/index.md';
+
+
+
+## Controller Action Sheets
+
+The `actionSheetController` can be used in situations where more control is needed over when the Action Sheet is presented and dismissed.
+
+import Controller from '@site/static/usage/v8/action-sheet/controller/index.md';
+
+
+
+## Buttons
+
+A button's `role` property can either be `destructive` or `cancel`. Buttons without a role property will have the default look for the platform. Buttons with the `cancel` role will always load as the bottom button, no matter where they are in the array. All other buttons will be displayed in the order they have been added to the `buttons` array. Note: We recommend that `destructive` buttons are always the first button in the array, making them the top button. Additionally, if the action sheet is dismissed by tapping the backdrop, then it will fire the handler from the button with the cancel role.
+
+A button can also be passed data via the `data` property on `ActionSheetButton`. This will populate the `data` field in the return value of the `onDidDismiss` method.
+
+## Collecting Role Information on Dismiss
+
+When the `didDismiss` event is fired, the `data` and `role` fields of the event detail can be used to gather information about how the Action Sheet was dismissed.
+
+import RoleInfo from '@site/static/usage/v8/action-sheet/role-info-on-dismiss/index.md';
+
+
+
+## Theming
+
+Action Sheet uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector.
+
+### Styling
+
+We recommend passing a custom class to `cssClass` in the `create` method and using that to add custom styles to the host and inner elements. This property can also accept multiple classes separated by spaces.
+
+```css
+/* DOES NOT WORK - not specific enough */
+.action-sheet-group {
+ background: #e5e5e5;
+}
+
+/* Works - pass "my-custom-class" in cssClass to increase specificity */
+.my-custom-class .action-sheet-group {
+ background: #e5e5e5;
+}
+```
+
+import Styling from '@site/static/usage/v8/action-sheet/theming/styling/index.md';
+
+
+
+### CSS Custom Properties
+
+Any of the defined [CSS Custom Properties](#css-custom-properties-1) can be used to style the Action Sheet without needing to target individual elements.
+
+import CssCustomProperties from '@site/static/usage/v8/action-sheet/theming/css-properties/index.md';
+
+
+
+## Accessibility
+
+### Screen Readers
+
+Action Sheets set aria properties in order to be [accessible](../reference/glossary.mdx#a11y) to screen readers, but these properties can be overridden if they aren't descriptive enough or don't align with how the action sheet is being used in an app.
+
+#### Role
+
+Action Sheets are given a `role` of [`dialog`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/dialog_role). In order to align with the ARIA spec, either the `aria-label` or `aria-labelledby` attribute must be set.
+
+#### Action Sheet Description
+
+It is strongly recommended that every Action Sheet have the `header` property defined, as Ionic will automatically set `aria-labelledby` to point to the header element. However, if you choose not to include a `header`, an alternative is to use the `htmlAttributes` property to provide a descriptive `aria-label` or set a custom `aria-labelledby` value.
+
+
+
+
+
+```javascript
+const actionSheet = await this.actionSheetController.create({
+ htmlAttributes: {
+ 'aria-label': 'action sheet dialog',
+ },
+});
+```
+
+
+
+
+
+```javascript
+const actionSheet = await this.actionSheetController.create({
+ htmlAttributes: {
+ 'aria-label': 'action sheet dialog',
+ },
+});
+```
+
+
+
+
+
+```javascript
+useIonActionSheet({
+ htmlAttributes: {
+ 'aria-label': 'action sheet dialog',
+ },
+});
+```
+
+
+
+
+
+```javascript
+const actionSheet = await actionSheetController.create({
+ htmlAttributes: {
+ 'aria-label': 'action sheet dialog',
+ },
+});
+```
+
+
+
+
+
+#### Action Sheet Buttons Description
+
+Buttons containing text will be read by a screen reader. If a button contains only an icon, or a description other than the existing text is desired, a label should be assigned to the button by passing `aria-label` to the `htmlAttributes` property on the button.
+
+
+
+
+
+```javascript
+const actionSheet = await this.actionSheetController.create({
+ header: 'Header',
+ buttons: [
+ {
+ icon: 'close',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+```javascript
+const actionSheet = await this.actionSheetController.create({
+ header: 'Header',
+ buttons: [
+ {
+ icon: 'close',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+```javascript
+useIonActionSheet({
+ header: 'Header',
+ buttons: [
+ {
+ icon: 'close',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+```javascript
+const actionSheet = await actionSheetController.create({
+ header: 'Header',
+ buttons: [
+ {
+ icon: 'close',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+## Interfaces
+
+### ActionSheetButton
+
+```typescript
+interface ActionSheetButton {
+ text?: string;
+ role?: 'cancel' | 'destructive' | 'selected' | string;
+ icon?: string;
+ cssClass?: string | string[];
+ id?: string;
+ htmlAttributes?: { [key: string]: any };
+ handler?: () => boolean | void | Promise;
+ data?: T;
+}
+```
+
+### ActionSheetOptions
+
+```typescript
+interface ActionSheetOptions {
+ header?: string;
+ subHeader?: string;
+ cssClass?: string | string[];
+ buttons: (ActionSheetButton | string)[];
+ backdropDismiss?: boolean;
+ translucent?: boolean;
+ animated?: boolean;
+ mode?: Mode;
+ keyboardClose?: boolean;
+ id?: string;
+ htmlAttributes?: { [key: string]: any };
+
+ enterAnimation?: AnimationBuilder;
+ leaveAnimation?: AnimationBuilder;
+}
+```
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/alert.md b/docs/api/alert.md
deleted file mode 100644
index b35622c1faf..00000000000
--- a/docs/api/alert.md
+++ /dev/null
@@ -1,350 +0,0 @@
----
-title: "ion-alert"
----
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-import Props from '@ionic-internal/component-api/v8/alert/props.md';
-import Events from '@ionic-internal/component-api/v8/alert/events.md';
-import Methods from '@ionic-internal/component-api/v8/alert/methods.md';
-import Parts from '@ionic-internal/component-api/v8/alert/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/alert/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/alert/slots.md';
-
-
- ion-alert: Ionic Alert Buttons with Custom Message Prompts
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-An Alert is a dialog that presents users with information or collects information from the user using inputs. An alert appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. It can also optionally have a `header`, `subHeader` and `message`.
-
-## Inline Alerts (Recommended)
-
-`ion-alert` can be used by writing the component directly in your template. This reduces the number of handlers you need to wire up in order to present the Alert.
-
-import Trigger from '@site/static/usage/v8/alert/presenting/trigger/index.md';
-
-
-
-### Using `isOpen`
-
-The `isOpen` property on `ion-alert` allows developers to control the presentation state of the Alert from their application state. This means when `isOpen` is set to `true` the Alert will be presented, and when `isOpen` is set to `false` the Alert will be dismissed.
-
-`isOpen` uses a one-way data binding, meaning it will not automatically be set to `false` when the Alert is dismissed. Developers should listen for the `ionAlertDidDismiss` or `didDismiss` event and set `isOpen` to `false`. The reason for this is it prevents the internals of `ion-alert` from being tightly coupled with the state of the application. With a one way data binding, the Alert only needs to concern itself with the boolean value that the reactive variable provides. With a two way data binding, the Alert needs to concern itself with both the boolean value as well as the existence of the reactive variable itself. This can lead to non-deterministic behaviors and make applications harder to debug.
-
-import IsOpen from '@site/static/usage/v8/alert/presenting/isOpen/index.md';
-
-
-
-## Controller Alerts
-
-The `alertController` can be used in situations where more control is needed over when the Alert is presented and dismissed.
-
-import Controller from '@site/static/usage/v8/alert/presenting/controller/index.md';
-
-
-
-## Buttons
-
-In the array of `buttons`, each button includes properties for its `text`, and optionally a `handler`. If a handler returns `false` then the alert will not automatically be dismissed when the button is clicked. All buttons will show up in the order they have been added to the `buttons` array from left to right. Note: The right most button (the last one in the array) is the main button.
-
-Optionally, a `role` property can be added to a button, such as `cancel`. If a `cancel` role is on one of the buttons, then if the alert is dismissed by tapping the backdrop, then it will fire the handler from the button with a cancel role.
-
-import Buttons from '@site/static/usage/v8/alert/buttons/index.md';
-
-
-
-
-## Inputs
-
-Alerts can also include several different inputs whose data can be passed back to the app. Inputs can be used as a simple way to prompt users for information. Radios, checkboxes and text inputs are all accepted, but they cannot be mixed. For example, an alert could have all radio button inputs, or all checkbox inputs, but the same alert cannot mix radio and checkbox inputs. Do note however, different types of "text" inputs can be mixed, such as `url`, `email`, `text`, `textarea` etc. If you require a complex form UI which doesn't fit within the guidelines of an alert then we recommend building the form within a modal instead.
-
-### Text Inputs Example
-
-import TextInputs from '@site/static/usage/v8/alert/inputs/text-inputs/index.md';
-
-
-
-### Radio Example
-
-import Radios from '@site/static/usage/v8/alert/inputs/radios/index.md';
-
-
-
-## Customization
-
-Alert uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector.
-
-We recommend passing a custom class to `cssClass` in the `create` method and using that to add custom styles to the host and inner elements. This property can also accept multiple classes separated by spaces.
-
-```css
-/* DOES NOT WORK - not specific enough */
-.alert-wrapper {
- background: #e5e5e5;
-}
-
-/* Works - pass "my-custom-class" in cssClass to increase specificity */
-.my-custom-class .alert-wrapper {
- background: #e5e5e5;
-}
-```
-
-Any of the defined [CSS Custom Properties](#css-custom-properties) can be used to style the Alert without needing to target individual elements:
-
-```css
-.my-custom-class {
- --background: #e5e5e5;
-}
-```
-
-import Customization from '@site/static/usage/v8/alert/customization/index.md';
-
-
-
-:::note
- If you are building an Ionic Angular app, the styles need to be added to a global stylesheet file.
-:::
-
-## Accessibility
-
-### Screen Readers
-
-Alerts set aria properties in order to be [accessible](../reference/glossary#a11y) to screen readers, but these properties can be overridden if they aren't descriptive enough or don't align with how the alert is being used in an app.
-
-#### Role
-
-Ionic automatically sets the Alert's `role` to either [`alertdialog`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/alertdialog_role) if there are any inputs or buttons included, or [`alert`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/alert_role) if there are none.
-
-#### Alert Description
-
-If the `header` property is defined for the Alert, the `aria-labelledby` attribute will be automatically set to the header's ID. The `subHeader` element will be used as a fallback if `header` is not defined. Similarly, the `aria-describedby` attribute will be automatically set to the ID of the `message` element if that property is defined.
-
-It is strongly recommended that your Alert have a `message`, as well as either a `header` or `subHeader`, in order to align with the ARIA spec. If you choose not to include a `header` or `subHeader`, an alternative is to provide a descriptive `aria-label` using the `htmlAttributes` property.
-
-
-
-
-
-```javascript
-const alert = await this.alertController.create({
- message: 'This is an alert with custom aria attributes.',
- htmlAttributes: {
- 'aria-label': 'alert dialog',
- },
-});
-```
-
-
-
-
-
-```javascript
-const alert = await this.alertController.create({
- message: 'This is an alert with custom aria attributes.',
- htmlAttributes: {
- 'aria-label': 'alert dialog',
- },
-});
-```
-
-
-
-
-
-```javascript
-useIonAlert({
- message: 'This is an alert with custom aria attributes.',
- htmlAttributes: {
- 'aria-label': 'alert dialog',
- },
-});
-```
-
-
-
-
-
-```javascript
-const alert = await alertController.create({
- message: 'This is an alert with custom aria attributes.',
- htmlAttributes: {
- 'aria-label': 'alert dialog',
- },
-});
-```
-
-
-
-
-
-
-All ARIA attributes can be manually overwritten by defining custom values in the `htmlAttributes` property of the Alert.
-
-#### Alert Buttons Description
-
-Buttons containing text will be read by a screen reader. If a description other than the existing text is desired, a label can be set on the button by passing `aria-label` to the `htmlAttributes` property on the button.
-
-
-
-
-
-```javascript
-const alert = await this.alertController.create({
- header: 'Header',
- buttons: [
- {
- text: 'Exit',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-```javascript
-const alert = await this.alertController.create({
- header: 'Header',
- buttons: [
- {
- text: 'Exit',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-```javascript
-useIonAlert({
- header: 'Header',
- buttons: [
- {
- text: 'Exit',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-```javascript
-const alert = await alertController.create({
- header: 'Header',
- buttons: [
- {
- text: 'Exit',
- htmlAttributes: {
- 'aria-label': 'close',
- },
- },
- ],
-});
-```
-
-
-
-
-
-## Interfaces
-
-### AlertButton
-
-```typescript
-type AlertButtonOverlayHandler = boolean | void | { [key: string]: any };
-
-interface AlertButton {
- text: string;
- role?: 'cancel' | 'destructive' | string;
- cssClass?: string | string[];
- id?: string;
- htmlAttributes?: { [key: string]: any };
- handler?: (value: any) => AlertButtonOverlayHandler | Promise;
-}
-```
-
-
-### AlertInput
-
-```typescript
-interface AlertInput {
- type?: TextFieldTypes | 'checkbox' | 'radio' | 'textarea';
- name?: string;
- placeholder?: string;
- value?: any;
- /**
- * The label text to display next to the input, if the input type is `radio` or `checkbox`.
- */
- label?: string;
- checked?: boolean;
- disabled?: boolean;
- id?: string;
- handler?: (input: AlertInput) => void;
- min?: string | number;
- max?: string | number;
- cssClass?: string | string[];
- attributes?: { [key: string]: any };
- tabindex?: number;
-}
-```
-
-
-### AlertOptions
-
-```typescript
-interface AlertOptions {
- header?: string;
- subHeader?: string;
- message?: string | IonicSafeString;
- cssClass?: string | string[];
- inputs?: AlertInput[];
- buttons?: (AlertButton | string)[];
- backdropDismiss?: boolean;
- translucent?: boolean;
- animated?: boolean;
- htmlAttributes?: { [key: string]: any };
-
- mode?: Mode;
- keyboardClose?: boolean;
- id?: string;
-
- enterAnimation?: AnimationBuilder;
- leaveAnimation?: AnimationBuilder;
-}
-```
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/alert.mdx b/docs/api/alert.mdx
new file mode 100644
index 00000000000..6a9d79dcc14
--- /dev/null
+++ b/docs/api/alert.mdx
@@ -0,0 +1,350 @@
+---
+title: "ion-alert"
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+import Props from '@ionic-internal/component-api/v8/alert/props.md';
+import Events from '@ionic-internal/component-api/v8/alert/events.md';
+import Methods from '@ionic-internal/component-api/v8/alert/methods.md';
+import Parts from '@ionic-internal/component-api/v8/alert/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/alert/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/alert/slots.md';
+
+
+ ion-alert: Ionic Alert Buttons with Custom Message Prompts
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+An Alert is a dialog that presents users with information or collects information from the user using inputs. An alert appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. It can also optionally have a `header`, `subHeader` and `message`.
+
+## Inline Alerts (Recommended)
+
+`ion-alert` can be used by writing the component directly in your template. This reduces the number of handlers you need to wire up in order to present the Alert.
+
+import Trigger from '@site/static/usage/v8/alert/presenting/trigger/index.md';
+
+
+
+### Using `isOpen`
+
+The `isOpen` property on `ion-alert` allows developers to control the presentation state of the Alert from their application state. This means when `isOpen` is set to `true` the Alert will be presented, and when `isOpen` is set to `false` the Alert will be dismissed.
+
+`isOpen` uses a one-way data binding, meaning it will not automatically be set to `false` when the Alert is dismissed. Developers should listen for the `ionAlertDidDismiss` or `didDismiss` event and set `isOpen` to `false`. The reason for this is it prevents the internals of `ion-alert` from being tightly coupled with the state of the application. With a one way data binding, the Alert only needs to concern itself with the boolean value that the reactive variable provides. With a two way data binding, the Alert needs to concern itself with both the boolean value as well as the existence of the reactive variable itself. This can lead to non-deterministic behaviors and make applications harder to debug.
+
+import IsOpen from '@site/static/usage/v8/alert/presenting/isOpen/index.md';
+
+
+
+## Controller Alerts
+
+The `alertController` can be used in situations where more control is needed over when the Alert is presented and dismissed.
+
+import Controller from '@site/static/usage/v8/alert/presenting/controller/index.md';
+
+
+
+## Buttons
+
+In the array of `buttons`, each button includes properties for its `text`, and optionally a `handler`. If a handler returns `false` then the alert will not automatically be dismissed when the button is clicked. All buttons will show up in the order they have been added to the `buttons` array from left to right. Note: The right most button (the last one in the array) is the main button.
+
+Optionally, a `role` property can be added to a button, such as `cancel`. If a `cancel` role is on one of the buttons, then if the alert is dismissed by tapping the backdrop, then it will fire the handler from the button with a cancel role.
+
+import Buttons from '@site/static/usage/v8/alert/buttons/index.md';
+
+
+
+
+## Inputs
+
+Alerts can also include several different inputs whose data can be passed back to the app. Inputs can be used as a simple way to prompt users for information. Radios, checkboxes and text inputs are all accepted, but they cannot be mixed. For example, an alert could have all radio button inputs, or all checkbox inputs, but the same alert cannot mix radio and checkbox inputs. Do note however, different types of "text" inputs can be mixed, such as `url`, `email`, `text`, `textarea` etc. If you require a complex form UI which doesn't fit within the guidelines of an alert then we recommend building the form within a modal instead.
+
+### Text Inputs Example
+
+import TextInputs from '@site/static/usage/v8/alert/inputs/text-inputs/index.md';
+
+
+
+### Radio Example
+
+import Radios from '@site/static/usage/v8/alert/inputs/radios/index.md';
+
+
+
+## Customization
+
+Alert uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector.
+
+We recommend passing a custom class to `cssClass` in the `create` method and using that to add custom styles to the host and inner elements. This property can also accept multiple classes separated by spaces.
+
+```css
+/* DOES NOT WORK - not specific enough */
+.alert-wrapper {
+ background: #e5e5e5;
+}
+
+/* Works - pass "my-custom-class" in cssClass to increase specificity */
+.my-custom-class .alert-wrapper {
+ background: #e5e5e5;
+}
+```
+
+Any of the defined [CSS Custom Properties](#css-custom-properties) can be used to style the Alert without needing to target individual elements:
+
+```css
+.my-custom-class {
+ --background: #e5e5e5;
+}
+```
+
+import Customization from '@site/static/usage/v8/alert/customization/index.md';
+
+
+
+:::note
+ If you are building an Ionic Angular app, the styles need to be added to a global stylesheet file.
+:::
+
+## Accessibility
+
+### Screen Readers
+
+Alerts set aria properties in order to be [accessible](../reference/glossary.mdx#a11y) to screen readers, but these properties can be overridden if they aren't descriptive enough or don't align with how the alert is being used in an app.
+
+#### Role
+
+Ionic automatically sets the Alert's `role` to either [`alertdialog`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/alertdialog_role) if there are any inputs or buttons included, or [`alert`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/alert_role) if there are none.
+
+#### Alert Description
+
+If the `header` property is defined for the Alert, the `aria-labelledby` attribute will be automatically set to the header's ID. The `subHeader` element will be used as a fallback if `header` is not defined. Similarly, the `aria-describedby` attribute will be automatically set to the ID of the `message` element if that property is defined.
+
+It is strongly recommended that your Alert have a `message`, as well as either a `header` or `subHeader`, in order to align with the ARIA spec. If you choose not to include a `header` or `subHeader`, an alternative is to provide a descriptive `aria-label` using the `htmlAttributes` property.
+
+
+
+
+
+```javascript
+const alert = await this.alertController.create({
+ message: 'This is an alert with custom aria attributes.',
+ htmlAttributes: {
+ 'aria-label': 'alert dialog',
+ },
+});
+```
+
+
+
+
+
+```javascript
+const alert = await this.alertController.create({
+ message: 'This is an alert with custom aria attributes.',
+ htmlAttributes: {
+ 'aria-label': 'alert dialog',
+ },
+});
+```
+
+
+
+
+
+```javascript
+useIonAlert({
+ message: 'This is an alert with custom aria attributes.',
+ htmlAttributes: {
+ 'aria-label': 'alert dialog',
+ },
+});
+```
+
+
+
+
+
+```javascript
+const alert = await alertController.create({
+ message: 'This is an alert with custom aria attributes.',
+ htmlAttributes: {
+ 'aria-label': 'alert dialog',
+ },
+});
+```
+
+
+
+
+
+
+All ARIA attributes can be manually overwritten by defining custom values in the `htmlAttributes` property of the Alert.
+
+#### Alert Buttons Description
+
+Buttons containing text will be read by a screen reader. If a description other than the existing text is desired, a label can be set on the button by passing `aria-label` to the `htmlAttributes` property on the button.
+
+
+
+
+
+```javascript
+const alert = await this.alertController.create({
+ header: 'Header',
+ buttons: [
+ {
+ text: 'Exit',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+```javascript
+const alert = await this.alertController.create({
+ header: 'Header',
+ buttons: [
+ {
+ text: 'Exit',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+```javascript
+useIonAlert({
+ header: 'Header',
+ buttons: [
+ {
+ text: 'Exit',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+```javascript
+const alert = await alertController.create({
+ header: 'Header',
+ buttons: [
+ {
+ text: 'Exit',
+ htmlAttributes: {
+ 'aria-label': 'close',
+ },
+ },
+ ],
+});
+```
+
+
+
+
+
+## Interfaces
+
+### AlertButton
+
+```typescript
+type AlertButtonOverlayHandler = boolean | void | { [key: string]: any };
+
+interface AlertButton {
+ text: string;
+ role?: 'cancel' | 'destructive' | string;
+ cssClass?: string | string[];
+ id?: string;
+ htmlAttributes?: { [key: string]: any };
+ handler?: (value: any) => AlertButtonOverlayHandler | Promise;
+}
+```
+
+
+### AlertInput
+
+```typescript
+interface AlertInput {
+ type?: TextFieldTypes | 'checkbox' | 'radio' | 'textarea';
+ name?: string;
+ placeholder?: string;
+ value?: any;
+ /**
+ * The label text to display next to the input, if the input type is `radio` or `checkbox`.
+ */
+ label?: string;
+ checked?: boolean;
+ disabled?: boolean;
+ id?: string;
+ handler?: (input: AlertInput) => void;
+ min?: string | number;
+ max?: string | number;
+ cssClass?: string | string[];
+ attributes?: { [key: string]: any };
+ tabindex?: number;
+}
+```
+
+
+### AlertOptions
+
+```typescript
+interface AlertOptions {
+ header?: string;
+ subHeader?: string;
+ message?: string | IonicSafeString;
+ cssClass?: string | string[];
+ inputs?: AlertInput[];
+ buttons?: (AlertButton | string)[];
+ backdropDismiss?: boolean;
+ translucent?: boolean;
+ animated?: boolean;
+ htmlAttributes?: { [key: string]: any };
+
+ mode?: Mode;
+ keyboardClose?: boolean;
+ id?: string;
+
+ enterAnimation?: AnimationBuilder;
+ leaveAnimation?: AnimationBuilder;
+}
+```
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/app.md b/docs/api/app.mdx
similarity index 100%
rename from docs/api/app.md
rename to docs/api/app.mdx
diff --git a/docs/api/avatar.md b/docs/api/avatar.mdx
similarity index 100%
rename from docs/api/avatar.md
rename to docs/api/avatar.mdx
diff --git a/docs/api/back-button.md b/docs/api/back-button.mdx
similarity index 100%
rename from docs/api/back-button.md
rename to docs/api/back-button.mdx
diff --git a/docs/api/backdrop.md b/docs/api/backdrop.mdx
similarity index 100%
rename from docs/api/backdrop.md
rename to docs/api/backdrop.mdx
diff --git a/docs/api/badge.md b/docs/api/badge.mdx
similarity index 100%
rename from docs/api/badge.md
rename to docs/api/badge.mdx
diff --git a/docs/api/breadcrumb.md b/docs/api/breadcrumb.mdx
similarity index 100%
rename from docs/api/breadcrumb.md
rename to docs/api/breadcrumb.mdx
diff --git a/docs/api/breadcrumbs.md b/docs/api/breadcrumbs.mdx
similarity index 100%
rename from docs/api/breadcrumbs.md
rename to docs/api/breadcrumbs.mdx
diff --git a/docs/api/button.md b/docs/api/button.mdx
similarity index 100%
rename from docs/api/button.md
rename to docs/api/button.mdx
diff --git a/docs/api/buttons.md b/docs/api/buttons.md
deleted file mode 100644
index 642354eefc8..00000000000
--- a/docs/api/buttons.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: "ion-buttons"
----
-import Props from '@ionic-internal/component-api/v8/buttons/props.md';
-import Events from '@ionic-internal/component-api/v8/buttons/events.md';
-import Methods from '@ionic-internal/component-api/v8/buttons/methods.md';
-import Parts from '@ionic-internal/component-api/v8/buttons/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/buttons/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/buttons/slots.md';
-
-
- ion-buttons: Toolbar Element with Named Slots for Buttons
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-The Buttons component is a container element. It should be used inside of a [toolbar](./toolbar) and can contain several types of buttons, including standard [buttons](./button), [menu buttons](./menu-button), and [back buttons](./back-button).
-
-## Basic Usage
-
-import Basic from '@site/static/usage/v8/buttons/basic/index.md';
-
-
-
-
-## Buttons Placement
-
-Buttons can be positioned inside of the toolbar using a named slot. The below chart has a description of each slot.
-
-| Slot | Description |
-|--------------|----------------------------------------------------------------------------------------------------------|
-| `start` | Positions to the `left` of the content in LTR, and to the `right` in RTL. |
-| `end` | Positions to the `right` of the content in LTR, and to the `left` in RTL. |
-| `secondary` | Positions element to the `left` of the content in `ios` mode, and directly to the `right` in `md` mode. |
-| `primary` | Positions element to the `right` of the content in `ios` mode, and to the far `right` in `md` mode. |
-
-import Placement from '@site/static/usage/v8/buttons/placement/index.md';
-
-
-
-
-## Types of Buttons
-
-A button in a toolbar is styled to be clear by default, but this can be changed using the [`fill`](./button#fill) property on the button. The properties included on [back button](./back-button) and [menu button](./menu-button) in this example are for display purposes; see their respective documentation for proper usage.
-
-import Types from '@site/static/usage/v8/buttons/types/index.md';
-
-
-
-
-## Collapsible Buttons
-
-The `collapse` property can be set on the buttons to collapse them when the header collapses. This is typically used with [collapsible large titles](./title#collapsible-large-titles).
-
-:::info
-
-This feature is only available for iOS.
-
-:::
-
-
-import CollapsibleLargeTitleButtons from '@site/static/usage/v8/title/collapsible-large-title/buttons/index.md';
-
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/buttons.mdx b/docs/api/buttons.mdx
new file mode 100644
index 00000000000..2c35af96efb
--- /dev/null
+++ b/docs/api/buttons.mdx
@@ -0,0 +1,87 @@
+---
+title: "ion-buttons"
+---
+import Props from '@ionic-internal/component-api/v8/buttons/props.md';
+import Events from '@ionic-internal/component-api/v8/buttons/events.md';
+import Methods from '@ionic-internal/component-api/v8/buttons/methods.md';
+import Parts from '@ionic-internal/component-api/v8/buttons/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/buttons/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/buttons/slots.md';
+
+
+ ion-buttons: Toolbar Element with Named Slots for Buttons
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+The Buttons component is a container element. It should be used inside of a [toolbar](./toolbar) and can contain several types of buttons, including standard [buttons](./button), [menu buttons](./menu-button), and [back buttons](./back-button).
+
+## Basic Usage
+
+import Basic from '@site/static/usage/v8/buttons/basic/index.md';
+
+
+
+
+## Buttons Placement
+
+Buttons can be positioned inside of the toolbar using a named slot. The below chart has a description of each slot.
+
+| Slot | Description |
+|--------------|----------------------------------------------------------------------------------------------------------|
+| `start` | Positions to the `left` of the content in LTR, and to the `right` in RTL. |
+| `end` | Positions to the `right` of the content in LTR, and to the `left` in RTL. |
+| `secondary` | Positions element to the `left` of the content in `ios` mode, and directly to the `right` in `md` mode. |
+| `primary` | Positions element to the `right` of the content in `ios` mode, and to the far `right` in `md` mode. |
+
+import Placement from '@site/static/usage/v8/buttons/placement/index.md';
+
+
+
+
+## Types of Buttons
+
+A button in a toolbar is styled to be clear by default, but this can be changed using the [`fill`](./button#fill) property on the button. The properties included on [back button](./back-button) and [menu button](./menu-button) in this example are for display purposes; see their respective documentation for proper usage.
+
+import Types from '@site/static/usage/v8/buttons/types/index.md';
+
+
+
+
+## Collapsible Buttons
+
+The `collapse` property can be set on the buttons to collapse them when the header collapses. This is typically used with [collapsible large titles](./title#collapsible-large-titles).
+
+:::info
+
+This feature is only available for iOS.
+
+:::
+
+{/* Reuse the playground from the Title directory */}
+import CollapsibleLargeTitleButtons from '@site/static/usage/v8/title/collapsible-large-title/buttons/index.md';
+
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/card-content.md b/docs/api/card-content.mdx
similarity index 100%
rename from docs/api/card-content.md
rename to docs/api/card-content.mdx
diff --git a/docs/api/card-header.md b/docs/api/card-header.mdx
similarity index 100%
rename from docs/api/card-header.md
rename to docs/api/card-header.mdx
diff --git a/docs/api/card-subtitle.md b/docs/api/card-subtitle.mdx
similarity index 100%
rename from docs/api/card-subtitle.md
rename to docs/api/card-subtitle.mdx
diff --git a/docs/api/card-title.md b/docs/api/card-title.mdx
similarity index 100%
rename from docs/api/card-title.md
rename to docs/api/card-title.mdx
diff --git a/docs/api/card.md b/docs/api/card.mdx
similarity index 100%
rename from docs/api/card.md
rename to docs/api/card.mdx
diff --git a/docs/api/checkbox.md b/docs/api/checkbox.mdx
similarity index 100%
rename from docs/api/checkbox.md
rename to docs/api/checkbox.mdx
diff --git a/docs/api/chip.md b/docs/api/chip.mdx
similarity index 100%
rename from docs/api/chip.md
rename to docs/api/chip.mdx
diff --git a/docs/api/col.md b/docs/api/col.md
deleted file mode 100644
index ebc54b7f02f..00000000000
--- a/docs/api/col.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: "ion-col"
----
-import Props from '@ionic-internal/component-api/v8/col/props.md';
-import Events from '@ionic-internal/component-api/v8/col/events.md';
-import Methods from '@ionic-internal/component-api/v8/col/methods.md';
-import Parts from '@ionic-internal/component-api/v8/col/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/col/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/col/slots.md';
-
-
- ion-col: Column Component Padding and Other Properties
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-Columns are cellular components of the [grid](./grid) system and go inside of a [row](./row). They will expand to fill the row. All content within a grid should go inside of a column.
-
-See the [grid](./grid) documentation for more information.
-
-
-## Column Alignment
-
-By default, columns will stretch to fill the entire height of the row. Columns are [flex items](https://developer.mozilla.org/en-US/docs/Glossary/Flex_Item), so there are several [CSS classes](/docs/layout/css-utilities#flex-item-properties) that can be applied to a column to customize this behavior.
-
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/col.mdx b/docs/api/col.mdx
new file mode 100644
index 00000000000..0a201dfa091
--- /dev/null
+++ b/docs/api/col.mdx
@@ -0,0 +1,49 @@
+---
+title: "ion-col"
+---
+import Props from '@ionic-internal/component-api/v8/col/props.md';
+import Events from '@ionic-internal/component-api/v8/col/events.md';
+import Methods from '@ionic-internal/component-api/v8/col/methods.md';
+import Parts from '@ionic-internal/component-api/v8/col/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/col/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/col/slots.md';
+
+
+ ion-col: Column Component Padding and Other Properties
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+Columns are cellular components of the [grid](./grid) system and go inside of a [row](./row). They will expand to fill the row. All content within a grid should go inside of a column.
+
+See the [grid](./grid) documentation for more information.
+
+
+## Column Alignment
+
+By default, columns will stretch to fill the entire height of the row. Columns are [flex items](https://developer.mozilla.org/en-US/docs/Glossary/Flex_Item), so there are several [CSS classes](/docs/layout/css-utilities.mdx#flex-item-properties) that can be applied to a column to customize this behavior.
+
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/content.md b/docs/api/content.md
deleted file mode 100644
index 832e22cd9d1..00000000000
--- a/docs/api/content.md
+++ /dev/null
@@ -1,179 +0,0 @@
----
-title: "ion-content"
----
-import Props from '@ionic-internal/component-api/v8/content/props.md';
-import Events from '@ionic-internal/component-api/v8/content/events.md';
-import Methods from '@ionic-internal/component-api/v8/content/methods.md';
-import Parts from '@ionic-internal/component-api/v8/content/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/content/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/content/slots.md';
-
-
- ion-content: Scrollable Component for Ionic App Content
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-The content component provides an easy to use content area with some useful methods
-to control the scrollable area. There should only be one content in a single
-view.
-
-Content, along with many other Ionic components, can be customized to modify its padding, margin, and more using the global styles provided in the [CSS Utilities](/docs/layout/css-utilities) or by individually styling it using CSS and the available [CSS Custom Properties](#css-custom-properties).
-
-
-## Basic Usage
-
-import Basic from '@site/static/usage/v8/content/basic/index.md';
-
-
-
-
-## Header & Footer
-
-Content can be the only top-level component in a page, or it can be used alongside a [header](./header), [footer](./footer), or both. When used with a header or footer, it will adjust its size to fill the remaining height.
-
-import HeaderFooter from '@site/static/usage/v8/content/header-footer/index.md';
-
-
-
-
-## Fullscreen Content
-
-By default, content fills the space between a [header](./header) and [footer](./footer) but does not go behind them. In certain cases, it may be desired to have the content scroll behind the header and footer, such as when the `translucent` property is set on either of them, or `opacity` is set on the toolbar. This can be achieved by setting the `fullscreen` property on the content to `true`.
-
-import Fullscreen from '@site/static/usage/v8/content/fullscreen/index.md';
-
-
-
-
-## Fixed Content
-
-To place elements outside of the scrollable area, assign them to the `fixed` slot. Doing so will [absolutely position](https://developer.mozilla.org/en-US/docs/Web/CSS/position#absolute_positioning) the element to the top left of the content. In order to change the position of the element, it can be styled using the [top, right, bottom, and left](https://developer.mozilla.org/en-US/docs/Web/CSS/position) CSS properties.
-
-import Fixed from '@site/static/usage/v8/content/fixed/index.md';
-
-
-
-## Scroll Methods
-
-Content provides [methods](#methods) that can be called to scroll the content to the bottom, top, or to a specific point. They can be passed a `duration` in order to smoothly transition instead of instantly changing the position.
-
-import ScrollMethods from '@site/static/usage/v8/content/scroll-methods/index.md';
-
-
-
-## Scroll Events
-
-Scroll events are disabled by default for content due to performance. However, they can be enabled by setting `scrollEvents` to `true`. This is necessary before listening to any of the scroll [events](#events).
-
-import ScrollEvents from '@site/static/usage/v8/content/scroll-events/index.md';
-
-
-
-
-## Theming
-
-### Colors
-
-import Colors from '@site/static/usage/v8/content/theming/colors/index.md';
-
-
-
-### CSS Shadow Parts
-
-import CSSParts from '@site/static/usage/v8/content/theming/css-shadow-parts/index.md';
-
-
-
-### CSS Custom Properties
-
-import CSSProps from '@site/static/usage/v8/content/theming/css-properties/index.md';
-
-
-
-### Safe Area Padding
-
-The content component will not automatically apply padding to any of its sides to account for the [safe area](/docs/theming/advanced#safe-area-padding). This is because the content component is often used in conjunction with other components that apply their own padding, such as [headers](./header) and [footers](./footer). However, if the content component is being used on its own, it may be desired to apply padding to the safe area. This can be done through CSS by using the `--ion-safe-area-(dir)` variables described in [Application Variables](../theming/advanced.md#application-variables).
-
-The most common use case for this is to apply padding to the top of the content to account for the status bar. This can be done by setting the `padding-top` property to the value of the `--ion-safe-area-top` variable.
-
-```css
-ion-content::part(scroll) {
- padding-top: var(--ion-safe-area-top, 0);
-}
-```
-
-Another common use case is to apply padding to the left side of the content to account for the notch when the device is in landscape mode and the notch is on the left side. This can be done by setting the `padding-left` property to the value of the `--ion-safe-area-left` variable.
-
-```css
-ion-content::part(scroll) {
- padding-left: var(--ion-safe-area-left, 0);
-}
-```
-
-import SafeArea from '@site/static/usage/v8/content/theming/safe-area/index.md';
-
-
-
-## Interfaces
-
-### ScrollBaseDetail
-
-```typescript
-interface ScrollBaseDetail {
- isScrolling: boolean;
-}
-```
-
-### ScrollDetail
-
-```typescript
-interface ScrollDetail extends GestureDetail, ScrollBaseDetail {
- scrollTop: number;
- scrollLeft: number;
-}
-```
-
-### ScrollBaseCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing on the `ionScrollStart` and `ionScrollEnd` events.
-
-```typescript
-interface ScrollBaseCustomEvent extends CustomEvent {
- detail: ScrollBaseDetail;
- target: HTMLIonContentElement;
-}
-```
-
-### ScrollCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing on the `ionScroll` event.
-
-```typescript
-interface ScrollCustomEvent extends ScrollBaseCustomEvent {
- detail: ScrollDetail;
-}
-```
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/content.mdx b/docs/api/content.mdx
new file mode 100644
index 00000000000..10219dec0dd
--- /dev/null
+++ b/docs/api/content.mdx
@@ -0,0 +1,179 @@
+---
+title: "ion-content"
+---
+import Props from '@ionic-internal/component-api/v8/content/props.md';
+import Events from '@ionic-internal/component-api/v8/content/events.md';
+import Methods from '@ionic-internal/component-api/v8/content/methods.md';
+import Parts from '@ionic-internal/component-api/v8/content/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/content/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/content/slots.md';
+
+
+ ion-content: Scrollable Component for Ionic App Content
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+The content component provides an easy to use content area with some useful methods
+to control the scrollable area. There should only be one content in a single
+view.
+
+Content, along with many other Ionic components, can be customized to modify its padding, margin, and more using the global styles provided in the [CSS Utilities](/docs/layout/css-utilities.mdx) or by individually styling it using CSS and the available [CSS Custom Properties](#css-custom-properties).
+
+
+## Basic Usage
+
+import Basic from '@site/static/usage/v8/content/basic/index.md';
+
+
+
+
+## Header & Footer
+
+Content can be the only top-level component in a page, or it can be used alongside a [header](./header), [footer](./footer), or both. When used with a header or footer, it will adjust its size to fill the remaining height.
+
+import HeaderFooter from '@site/static/usage/v8/content/header-footer/index.md';
+
+
+
+
+## Fullscreen Content
+
+By default, content fills the space between a [header](./header) and [footer](./footer) but does not go behind them. In certain cases, it may be desired to have the content scroll behind the header and footer, such as when the `translucent` property is set on either of them, or `opacity` is set on the toolbar. This can be achieved by setting the `fullscreen` property on the content to `true`.
+
+import Fullscreen from '@site/static/usage/v8/content/fullscreen/index.md';
+
+
+
+
+## Fixed Content
+
+To place elements outside of the scrollable area, assign them to the `fixed` slot. Doing so will [absolutely position](https://developer.mozilla.org/en-US/docs/Web/CSS/position#absolute_positioning) the element to the top left of the content. In order to change the position of the element, it can be styled using the [top, right, bottom, and left](https://developer.mozilla.org/en-US/docs/Web/CSS/position) CSS properties.
+
+import Fixed from '@site/static/usage/v8/content/fixed/index.md';
+
+
+
+## Scroll Methods
+
+Content provides [methods](#methods) that can be called to scroll the content to the bottom, top, or to a specific point. They can be passed a `duration` in order to smoothly transition instead of instantly changing the position.
+
+import ScrollMethods from '@site/static/usage/v8/content/scroll-methods/index.md';
+
+
+
+## Scroll Events
+
+Scroll events are disabled by default for content due to performance. However, they can be enabled by setting `scrollEvents` to `true`. This is necessary before listening to any of the scroll [events](#events).
+
+import ScrollEvents from '@site/static/usage/v8/content/scroll-events/index.md';
+
+
+
+
+## Theming
+
+### Colors
+
+import Colors from '@site/static/usage/v8/content/theming/colors/index.md';
+
+
+
+### CSS Shadow Parts
+
+import CSSParts from '@site/static/usage/v8/content/theming/css-shadow-parts/index.md';
+
+
+
+### CSS Custom Properties
+
+import CSSProps from '@site/static/usage/v8/content/theming/css-properties/index.md';
+
+
+
+### Safe Area Padding
+
+The content component will not automatically apply padding to any of its sides to account for the [safe area](/docs/theming/advanced.mdx#safe-area-padding). This is because the content component is often used in conjunction with other components that apply their own padding, such as [headers](./header) and [footers](./footer). However, if the content component is being used on its own, it may be desired to apply padding to the safe area. This can be done through CSS by using the `--ion-safe-area-(dir)` variables described in [Application Variables](../theming/advanced.mdx#application-variables).
+
+The most common use case for this is to apply padding to the top of the content to account for the status bar. This can be done by setting the `padding-top` property to the value of the `--ion-safe-area-top` variable.
+
+```css
+ion-content::part(scroll) {
+ padding-top: var(--ion-safe-area-top, 0);
+}
+```
+
+Another common use case is to apply padding to the left side of the content to account for the notch when the device is in landscape mode and the notch is on the left side. This can be done by setting the `padding-left` property to the value of the `--ion-safe-area-left` variable.
+
+```css
+ion-content::part(scroll) {
+ padding-left: var(--ion-safe-area-left, 0);
+}
+```
+
+import SafeArea from '@site/static/usage/v8/content/theming/safe-area/index.md';
+
+
+
+## Interfaces
+
+### ScrollBaseDetail
+
+```typescript
+interface ScrollBaseDetail {
+ isScrolling: boolean;
+}
+```
+
+### ScrollDetail
+
+```typescript
+interface ScrollDetail extends GestureDetail, ScrollBaseDetail {
+ scrollTop: number;
+ scrollLeft: number;
+}
+```
+
+### ScrollBaseCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing on the `ionScrollStart` and `ionScrollEnd` events.
+
+```typescript
+interface ScrollBaseCustomEvent extends CustomEvent {
+ detail: ScrollBaseDetail;
+ target: HTMLIonContentElement;
+}
+```
+
+### ScrollCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing on the `ionScroll` event.
+
+```typescript
+interface ScrollCustomEvent extends ScrollBaseCustomEvent {
+ detail: ScrollDetail;
+}
+```
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/datetime-button.md b/docs/api/datetime-button.md
deleted file mode 100644
index 361a1c9c8f1..00000000000
--- a/docs/api/datetime-button.md
+++ /dev/null
@@ -1,80 +0,0 @@
----
-title: "ion-datetime-button"
----
-import Props from '@ionic-internal/component-api/v8/datetime-button/props.md';
-import Events from '@ionic-internal/component-api/v8/datetime-button/events.md';
-import Methods from '@ionic-internal/component-api/v8/datetime-button/methods.md';
-import Parts from '@ionic-internal/component-api/v8/datetime-button/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/datetime-button/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/datetime-button/slots.md';
-
-
- ion-datetime-button: Ionic Input for Datetime Picker
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Datetime Button links with a [Datetime](./datetime) component to display the formatted date and time. It also provides buttons to present the datetime in a modal, popover, and more.
-
-## Overview
-
-Datetime Button should be used when space is constrained. This component displays buttons which show the current date and time values. When the buttons are tapped, the date or time pickers open in the overlay.
-
-When using Datetime Button with a JavaScript framework such as Angular, React, or Vue be sure to use the [keepContentsMounted property on ion-modal](./modal#keepcontentsmounted) or the [keepContentsMounted property on ion-popover](./popover#keepcontentsmounted). This allows the linked datetime instance to be mounted even if the overlay has not been presented yet.
-
-## Basic Usage
-
-import Basic from '@site/static/usage/v8/datetime-button/basic/index.md';
-
-
-
-## Localization
-
-The localized text on `ion-datetime-button` is determined by the `locale` property on the associated `ion-datetime` instance. See [Datetime Localization](./datetime#localization) for more details.
-
-## Format Options
-
-You can customize the format of the date and time in a Datetime Button by providing `formatOptions` on the associated Datetime instance. See [Datetime Format Options](./datetime#format-options) for more details.
-
-import FormatOptions from '@site/static/usage/v8/datetime-button/format-options/index.md';
-
-
-
-## Usage with Modals and Popovers
-
-`ion-datetime-button` must be associated with a mounted `ion-datetime` instance. As a result, [Inline Modals](./modal#inline-modals-recommended) and [Inline Popovers](./popover#inline-popovers) with the `keepContentsMounted` property set to `true` must be used.
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/datetime-button.mdx b/docs/api/datetime-button.mdx
new file mode 100644
index 00000000000..cdb7aadc02c
--- /dev/null
+++ b/docs/api/datetime-button.mdx
@@ -0,0 +1,78 @@
+---
+title: "ion-datetime-button"
+---
+import Props from '@ionic-internal/component-api/v8/datetime-button/props.md';
+import Events from '@ionic-internal/component-api/v8/datetime-button/events.md';
+import Methods from '@ionic-internal/component-api/v8/datetime-button/methods.md';
+import Parts from '@ionic-internal/component-api/v8/datetime-button/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/datetime-button/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/datetime-button/slots.md';
+
+
+ ion-datetime-button: Ionic Input for Datetime Picker
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Datetime Button links with a [Datetime](./datetime) component to display the formatted date and time. It also provides buttons to present the datetime in a modal, popover, and more.
+
+## Overview
+
+Datetime Button should be used when space is constrained. This component displays buttons which show the current date and time values. When the buttons are tapped, the date or time pickers open in the overlay.
+
+When using Datetime Button with a JavaScript framework such as Angular, React, or Vue be sure to use the [keepContentsMounted property on ion-modal](./modal#keepcontentsmounted) or the [keepContentsMounted property on ion-popover](./popover#keepcontentsmounted). This allows the linked datetime instance to be mounted even if the overlay has not been presented yet.
+
+## Basic Usage
+
+import Basic from '@site/static/usage/v8/datetime-button/basic/index.md';
+
+
+
+## Localization
+
+The localized text on `ion-datetime-button` is determined by the `locale` property on the associated `ion-datetime` instance. See [Datetime Localization](./datetime#localization) for more details.
+
+## Format Options
+
+You can customize the format of the date and time in a Datetime Button by providing `formatOptions` on the associated Datetime instance. See [Datetime Format Options](./datetime#format-options) for more details.
+
+import FormatOptions from '@site/static/usage/v8/datetime-button/format-options/index.md';
+
+
+
+## Usage with Modals and Popovers
+
+`ion-datetime-button` must be associated with a mounted `ion-datetime` instance. As a result, [Inline Modals](./modal#inline-modals-recommended) and [Inline Popovers](./popover#inline-popovers) with the `keepContentsMounted` property set to `true` must be used.
+
+{/* ## Customization
+
+TODO
+
+### Buttons
+
+TODO
+
+### Theming
+
+TODO */}
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/datetime.md b/docs/api/datetime.md
deleted file mode 100644
index a820311f1b3..00000000000
--- a/docs/api/datetime.md
+++ /dev/null
@@ -1,492 +0,0 @@
----
-title: "ion-datetime"
----
-import Props from '@ionic-internal/component-api/v8/datetime/props.md';
-import Events from '@ionic-internal/component-api/v8/datetime/events.md';
-import Methods from '@ionic-internal/component-api/v8/datetime/methods.md';
-import Parts from '@ionic-internal/component-api/v8/datetime/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/datetime/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/datetime/slots.md';
-
-import Basic from '@site/static/usage/v8/datetime/basic/index.md';
-
-import MaxMin from '@site/static/usage/v8/datetime/date-constraints/max-min/index.md';
-import Values from '@site/static/usage/v8/datetime/date-constraints/values/index.md';
-import Advanced from '@site/static/usage/v8/datetime/date-constraints/advanced/index.md';
-
-import FormatOptions from '@site/static/usage/v8/datetime/format-options/index.md';
-
-import CustomLocale from '@site/static/usage/v8/datetime/localization/custom-locale/index.md';
-import HourCycle from '@site/static/usage/v8/datetime/localization/hour-cycle/index.md';
-import FirstDayOfWeek from '@site/static/usage/v8/datetime/localization/first-day-of-week/index.md';
-import LocaleExtensionTags from '@site/static/usage/v8/datetime/localization/locale-extension-tags/index.md';
-import TimeLabel from '@site/static/usage/v8/datetime/localization/time-label/index.md';
-
-import MonthAndYear from '@site/static/usage/v8/datetime/presentation/month-and-year/index.md';
-import Time from '@site/static/usage/v8/datetime/presentation/time/index.md';
-import Date from '@site/static/usage/v8/datetime/presentation/date/index.md';
-
-import ShowingDefaultTitle from '@site/static/usage/v8/datetime/title/showing-default-title/index.md';
-import CustomizingTitle from '@site/static/usage/v8/datetime/title/customizing-title/index.md';
-
-import ShowingConfirmationButtons from '@site/static/usage/v8/datetime/buttons/showing-confirmation-buttons/index.md';
-import CustomizingButtons from '@site/static/usage/v8/datetime/buttons/customizing-buttons/index.md';
-import CustomizingButtonTexts from '@site/static/usage/v8/datetime/buttons/customizing-button-texts/index.md';
-
-import HighlightedDatesArray from '@site/static/usage/v8/datetime/highlightedDates/array/index.md';
-import HighlightedDatesCallback from '@site/static/usage/v8/datetime/highlightedDates/callback/index.md';
-
-import MultipleDateSelection from '@site/static/usage/v8/datetime/multiple/index.md';
-
-import GlobalTheming from '@site/static/usage/v8/datetime/styling/global-theming/index.md';
-import CalendarDaysStyling from '@site/static/usage/v8/datetime/styling/calendar-days/index.md';
-import WheelStyling from '@site/static/usage/v8/datetime/styling/wheel-styling/index.md';
-
-
- ion-datetime: Ionic API Input for Datetime Format Picker
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Datetimes present a calendar interface and time wheel, making it easy for users to select dates and times. Datetimes are similar to the native `input` elements of `datetime-local`, however, Ionic Framework's Datetime component makes it easy to display the date and time in the preferred format, and manage the datetime values.
-
-## Overview
-
-Historically, handling datetime values within JavaScript, or even within HTML
-inputs, has always been a challenge. Specifically, JavaScript's `Date` object is
-notoriously difficult to correctly parse apart datetime strings or to format
-datetime values. Even worse is how different browsers and JavaScript versions
-parse various datetime strings differently, especially per locale.
-
-Fortunately, Ionic Framework's datetime input has been designed so developers can avoid
-the common pitfalls, allowing developers to easily manipulate datetime values and give the user a simple datetime picker for a great user experience.
-
-### ISO 8601 Datetime Format: `YYYY-MM-DDTHH:mmZ`
-
-Ionic Framework uses the [ISO 8601 datetime format](https://www.w3.org/TR/NOTE-datetime)
-for its value. The value is simply a string, rather than using JavaScript's
-`Date` object. Using the ISO datetime format makes it easy to serialize
-and parse within JSON objects and databases.
-
-Below are some examples of ISO 8601 formats that can be used with `ion-datetime`:
-
-| Description | Format | Datetime Value Example |
-| -------------------- | ------------------------ | ------------------------------ |
-| Year | `YYYY` | `1994` |
-| Year and Month | `YYYY-MM` | `1994-12` |
-| Complete Date | `YYYY-MM-DD` | `1994-12-15` |
-| Date and Time | `YYYY-MM-DDTHH:mm` | `1994-12-15T13:47` |
-| UTC Timezone | `YYYY-MM-DDTHH:mm:ssZ` | `1994-12-15T13:47:20Z` |
-| Timezone Offset | `YYYY-MM-DDTHH:mm:ssTZD` | `1994-12-15T13:47:20+05:00` |
-| Hour and Minute | `HH:mm` | `13:47` |
-
-Note that the year is always four-digits, milliseconds (if it's added) is always
-three-digits, and all others are always two-digits. So the number representing
-January always has a leading zero, such as `01`. Additionally, the hour is
-always in the 24-hour format, so `00` is `12am` on a 12-hour clock, `13` means
-`1pm`, and `23` means `11pm`.
-
-:::note
-While seconds, milliseconds, and time zone can be specified using the ISO 8601 datetime format, `ion-datetime` does not provide an interface for second, millisecond, and time zone selection. Any second, millisecond, or time zone values provided will be ignored.
-:::
-
-## Basic Usage
-
-
-
-## Usage with Datetime Button
-
-If you need to present a datetime in an overlay such as a modal or a popover, we recommend using [ion-datetime-button](./datetime-button). `ion-datetime-button` should be used when space is constrained. This component displays buttons which show the current date and time values. When the buttons are tapped, the date or time pickers open in the overlay.
-
-## Setting Values Asynchronously
-
-If its `value` is updated programmatically after a datetime has already been created, the datetime will automatically jump to the new date. However, it is recommended to avoid updating the `value` in this way when users are able to interact with the datetime, as this could be disorienting for those currently trying to select a date. For example, if a datetime's `value` is loaded by an asynchronous process, it is recommended to hide the datetime with CSS until the value has finished updating.
-
-## Date Constraints
-
-### Max and Min Dates
-
-To customize the minimum and maximum datetime values, the `min` and `max` component properties can be provided which may make more sense for the app's use-case. Following the same IS0 8601 format listed in the table above, each component can restrict which dates can be selected by the user.
-
-The following example restricts date selection to March 2022 through May 2022 only.
-
-
-
-### Selecting Specific Values
-
-While the `min` and `max` properties allow you to restrict date selection to a certain range, the `monthValues`, `dayValues`, `yearValues`, `hourValues`, and `minuteValues` properties allow you choose specific days and times that users can select.
-
-The following example allows minutes to be selected in increments of 15. It also allows for days to be selected in increments of 5.
-
-
-
-### Advanced Date Constraints
-
-With the `isDateEnabled` property, developers can customize the `ion-datetime` to disable a specific day, range of dates, weekends or any custom rule using an ISO 8601 date string.
-The `isDateEnabled` property accepts a function returning a boolean, indicating if a date is enabled. The function is called for each rendered calendar day, for the previous, current and next month. Custom implementations should be optimized for performance to avoid jank.
-
-The following example shows how to disable all weekend dates. For more advanced date manipulation, we recommend using a date utility such as `date-fns`.
-
-
-
-## Localization
-
-Ionic Framework makes use of the [Intl.DatetimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DatetimeFormat) Web API which allows us to automatically localize the month and day names according to the language and region set on the user's device.
-
-### Custom Locale
-
-For instances where you need a specific locale, you can use the `locale` property to set it. The locale controls both the language and the date and time formats that are displayed.
-
-The following example shows how to set the locale to Spanish (Spain).
-
-
-
-:::note
-The time label is not automatically localized. See [Time Label](#time-label) for more information.
-:::
-
-### Hour Cycle
-
-`ion-datetime` will use the hour cycle that is specified by the `locale` property by default. For example, if `locale` is set to `en-US`, then `ion-datetime` will use a 12 hour cycle.
-
-There are 4 primary hour cycle types:
-
-| Hour cycle type | Description |
-| --------------- | ------------------------------------------------------------ |
-| `'h12'` | Hour system using 1–12; corresponds to 'h' in patterns. The 12 hour clock, with midnight starting at 12:00 am. |
-| `'h23'` | Hour system using 0–23; corresponds to 'H' in patterns. The 24 hour clock, with midnight starting at 0:00. |
-| `'h11'` | Hour system using 0–11; corresponds to 'K' in patterns. The 12 hour clock, with midnight starting at 0:00 am. |
-| `'h24'` | Hour system using 1–24; corresponds to 'k' in pattern. The 24 hour clock, with midnight starting at 24:00. |
-
-:::note
- Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle
-:::
-
-
-There may be scenarios where you need to have more control over which hour cycle is used. This is where the `hourCycle` property can help.
-
-In the following example, we can use the `hourCycle` property to force `ion-datetime` to use the 12 hour cycle even though the locale is `en-GB`, which uses a 24 hour cycle by default:
-
-
-
-### First Day of the Week
-
-For `ion-datetime`, the default first day of the week is Sunday. As of 2022, there is no browser API that lets Ionic automatically determine the first day of the week based on a device's locale, though there is on-going work regarding this (see: [TC39 GitHub](https://github.com/tc39/ecma402/issues/6)).
-
-
-
-### Time Label
-
-The time label is not automatically localized. Fortunately, Ionic makes it easy to provide custom localizations with the `time-label` slot.
-
-
-
-### Locale Extension Tags
-
-`ion-datetime` also supports [locale extension tags](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) as part of the `Intl.Locale` API. These tags let you encode information about the locale in the locale string itself. Developers may prefer to use the extension tag approach if they are using the [Intl.Locale API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) in their apps.
-
-For example, if you wanted to use a 12 hour cycle with the `en-GB` locale, you could provide extension tags instead of using both the `locale` and `hourCycle` properties:
-
-
-
-:::note
-Be sure to check the [Browser Compatibility Chart](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale#browser_compatibility) for `Intl.Locale` before using it in your app.
-:::
-
-## Presentation
-
-By default, `ion-datetime` allows users to select both date and time. In addition, users have access to selecting the specific month, year, hour, and minute.
-
-Some use cases may call for only date selection or only time selection. The `presentation` property allows you to specify which pickers to show and the order to show them in. For example, setting `date-time` will have the calendar picker appear before the time picker. Setting `time-date` will have the calendar picker appear after the time picker.
-
-### Month and Year Selection
-
-Month and year selection is available by passing `month-year`, `year-month`, `month`, or `year` to the `presentation` property.
-
-This example shows a datetime with the `month-year` configuration.
-
-
-
-### Time Selection
-
-Time selection is available by passing `date-time`, `time-date`, or `time` to the `presentation` property.
-
-This example shows a datetime with the `time` configuration.
-
-
-
-### Date Selection
-
-Date selection is available by passing `date-time`, `time-date`, or `date` to the `presentation` property.
-
-This example shows a datetime with the `date` configuration.
-
-
-
-### Wheel Style Pickers
-
-By default, Ionic will prefer to show a grid style layout when using `presentation`. However, it is possible to show a wheel style using the `preferWheel` property. When `preferWheel` is `true`, Ionic will prefer to show the wheel style layout when possible.
-
-Certain `presentation` options have both grid and wheel styles that developers can choose from with the `preferWheel` property. Other `presentation` values only have a wheel style and will never show a grid style. The table below shows which `presentation` values have grid or wheel styles.
-
-| `presentation` | Has Grid Style? | Has Wheel Style? |
-| -------------- | --------------- | ---------------- |
-| `date` | Yes | Yes |
-| `date-time` | Yes | Yes |
-| `month` | No | Yes |
-| `month-year` | No | Yes |
-| `time` | No | Yes |
-| `time-date` | Yes | Yes |
-| `year` | No | Yes |
-
-The example below shows the wheel picker with `presentation="date-time"`.
-
-import Wheel from '@site/static/usage/v8/datetime/presentation/wheel/index.md';
-
-
-
-## Multiple Date Selection
-
-If the `multiple` property is set to `true`, multiple dates can be selected from the calendar picker. Clicking a selected date will deselect it.
-
-:::note
-This property is only supported when using `presentation="date"` and `preferWheel="false"`.
-:::
-
-
-
-## Titles
-
-By default, `ion-datetime` does not show any header or title associated with the component. Developers can use the `showDefaultTitle` property to show the default title/header configuration. They can also use the `title` slot to customize what is rendered in the header.
-
-### Showing the Default Title
-
-
-
-### Customizing the Title
-
-
-
-## Format Options
-
-You can customize the format of the date in the header text and the time in the time button of a Datetime component by providing `formatOptions`. The `date` and `time` in the `formatOptions` property should each be an [`Intl.DateTimeFormatOptions`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#options) object. If `formatOptions` is not provided, default formats will be used for dates and times.
-
-Datetime [does not manipulate or set](#time-zones) the time zone. If `timeZone` or `timeZoneName` are provided, they will be ignored, and the time zone will be set to UTC. This ensures that the displayed value matches the selected value, rather than being converted to the user's current time zone.
-
-Be careful with the options you provide, as they may not match the selected presentation. For example, providing `minute: 'numeric'` for a presentation of `month` may lead to unexpected behavior, displaying a month where only a time might be expected.
-
-
-
-## Buttons
-
-By default, `ionChange` is emitted with the new datetime value whenever a new date is selected. To require user confirmation before emitting `ionChange`, you can either set the `showDefaultButtons` property to `true` or use the `buttons` slot to pass in a custom confirmation button. When passing in custom buttons, the confirm button must call the `confirm` method on `ion-datetime` for `ionChange` to be emitted.
-
-### Showing Confirmation Buttons
-
-The default Done and Cancel buttons are already preconfigured to call the [`confirm`](#confirm) and [`cancel`](#cancel) methods, respectively.
-
-
-
-### Customizing Button Texts
-
-For simple use cases, developers can provide custom button text to the confirmation and cancel values through the `doneText` and `cancelText` properties. We recommend doing this when you only need to change the button text and do not need any custom behavior.
-
-
-
-### Customizing Button Elements
-
-Developers can provide their own buttons for advanced custom behavior.
-
-`ion-datetime` has `confirm`, `cancel`, and `reset` methods that developers can call when clicking on custom buttons. The `reset` method also allows developers to provide a date to reset the datetime to.
-
-
-
-## Highlighting Specific Dates
-
-Using the `highlightedDates` property, developers can style particular dates with custom text or background colors. This property can be defined as either an array of dates and their colors, or a callback that receives an ISO string and returns the colors to use.
-
-When specifying colors, any valid CSS color format can be used. This includes hex codes, `rgba`, [color variables](../theming/colors), etc.
-
-To maintain a consistent user experience, the style of selected date(s) will always override custom highlights.
-
-:::note
-This property is only supported when `preferWheel="false"`, and using a `presentation` of either `"date"`, `"date-time"`, or `"time-date"`.
-:::
-
-### Using Array
-
-An array is better when the highlights apply to fixed dates, such as due dates.
-
-
-
-### Using Callback
-
-A callback is better when the highlighted dates are recurring, such as birthdays or recurring meetings.
-
-
-
-## Styling
-
-### Global Theming
-
-Ionic's powerful theming system can be used to easily change your entire app to match a certain theme. In this example, we used the [Color Creator](../theming/colors#new-color-creator) and the [Stepped Color Generator](../theming/themes#stepped-color-generator) to create a rose color palette that we can use for `ion-datetime`.
-
-The benefit of this approach is that every component, not just `ion-datetime`, can automatically take advantage of this theme.
-
-
-
-### Calendar Days
-
-The calendar days in a grid-style `ion-datetime` can be styled using CSS shadow parts.
-
-:::note
-The example below selects the day 2 days ago, unless that day is in the previous month, then it selects a day 2 days in the future. This is done for demo purposes in order to show how to apply custom styling to all days, the current day, and the selected day.
-:::
-
-
-
-### Wheel Pickers
-
-The wheels used in `ion-datetime` can be styled through a combination of shadow parts and CSS variables. This applies to both the columns in wheel-style datetimes, and the month/year picker in grid-style datetimes.
-
-
-
-## Time Zones
-
-Ionic's `ion-datetime` follows the [datetime-local](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local) behavior of not manipulating or setting the time zone inside of a datetime control. In other words, a time value of "07:00" will not be adjusted according to different time zones.
-
-We recommend using a library such as [date-fns-tz](https://github.com/marnusw/date-fns-tz) to convert a datetime value to the desired time zone.
-
-Below is an example of formatting an ISO-8601 string to display in the time zone set on a user's device:
-
-```typescript
-import { format, utcToZonedTime } from 'date-fns-tz';
-
-// Get the time zone set on the user's device
-const userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
-
-// Create a date object from a UTC date string
-const date = new Date('2014-10-25T10:46:20Z');
-
-// Use date-fns-tz to convert from UTC to a zoned time
-const zonedTime = utcToZonedTime(date, userTimeZone);
-
-// Create a formatted string from the zoned time
-format(zonedTime, 'yyyy-MM-dd HH:mm:ssXXX', { timeZone: userTimeZone });
-```
-
-### Parsing Date Values
-
-The `ionChange` event will emit the date value as an ISO-8601 string in the event payload. It is the developer's responsibility to format it based on their application needs. We recommend using [date-fns](https://date-fns.org) to format the date value.
-
-Below is an example of formatting an ISO-8601 string to display the month, date and year:
-
-```typescript
-import { format, parseISO } from 'date-fns';
-
-/**
- * This is provided in the event
- * payload from the `ionChange` event.
- *
- * The value is an ISO-8601 date string.
- */
-const dateFromIonDatetime = '2021-06-04T14:23:00-04:00';
-const formattedString = format(parseISO(dateFromIonDatetime), 'MMM d, yyyy');
-
-console.log(formattedString); // Jun 4, 2021
-```
-
-See https://date-fns.org/docs/format for a list of all the valid format tokens.
-
-
-## Advanced Datetime Validation and Manipulation
-
-The datetime picker provides the simplicity of selecting an exact format, and
-persists the datetime values as a string using the standardized [ISO 8601
-datetime format](https://www.w3.org/TR/NOTE-datetime). However, it's important
-to note that `ion-datetime` does not attempt to solve all situations when
-validating and manipulating datetime values. If datetime values need to be
-parsed from a certain format, or manipulated (such as adding 5 days to a date,
-subtracting 30 minutes, etc.), or even formatting data to a specific locale,
-then we highly recommend using [date-fns](https://date-fns.org) to work with
-dates in JavaScript.
-
-## Accessibility
-
-### Keyboard Navigation
-
-`ion-datetime` has full keyboard support for navigating between focusable elements inside of the component. The following table details what each key does:
-
-| Key | Function |
-| ------------------ | ------------------------------------------------------------ |
-| `Tab` | Moves focus to the next focusable element. |
-| `Shift` + `Tab` | Moves focus to the previous focusable element. |
-| `Space` or `Enter` | Clicks the focusable element. |
-
-#### Date Grid
-
-| Key | Function |
-| ------------------ | ------------------------------------------------------------ |
-| `ArrowUp` | Moves focus to the same day of the previous week. |
-| `ArrowDown` | Moves focus to the same day of the next week. |
-| `ArrowRight` | Moves focus to the next day. |
-| `ArrowLeft` | Moves focus to the previous day. |
-| `Home` | Moves focus to the first day of the current week. |
-| `End` | Moves focus to the last day of the current week. |
-| `PageUp` | Changes the grid of dates to the previous month. |
-| `PageDown` | Changes the grid of dates to the next month. |
-| `Shift` + `PageUp` | Changes the grid of dates to the previous year. |
-| `Shift` + `PageDown` | Changes the grid of dates to the next year. |
-
-#### Time, Month, and Year Wheels
-
-When using the time wheel picker, you can use the number keys to select hour and minute values when the columns are focused.
-
-| Key | Function |
-| ------------------ | ------------------------------------------------------------ |
-| `ArrowUp` | Scroll to the previous item. |
-| `ArrowDown` | Scroll to the next item. |
-| `Home` | Scroll to the first item. |
-| `End` | Scroll to the last item. |
-
-## Interfaces
-
-### DatetimeChangeEventDetail
-
-```typescript
-interface DatetimeChangeEventDetail {
- value?: string | null;
-}
-```
-
-### DatetimeCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
-
-```typescript
-interface DatetimeCustomEvent extends CustomEvent {
- detail: DatetimeChangeEventDetail;
- target: HTMLIonDatetimeElement;
-}
-```
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/datetime.mdx b/docs/api/datetime.mdx
new file mode 100644
index 00000000000..bb5f3546a5d
--- /dev/null
+++ b/docs/api/datetime.mdx
@@ -0,0 +1,492 @@
+---
+title: "ion-datetime"
+---
+import Props from '@ionic-internal/component-api/v8/datetime/props.md';
+import Events from '@ionic-internal/component-api/v8/datetime/events.md';
+import Methods from '@ionic-internal/component-api/v8/datetime/methods.md';
+import Parts from '@ionic-internal/component-api/v8/datetime/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/datetime/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/datetime/slots.md';
+
+import Basic from '@site/static/usage/v8/datetime/basic/index.md';
+
+import MaxMin from '@site/static/usage/v8/datetime/date-constraints/max-min/index.md';
+import Values from '@site/static/usage/v8/datetime/date-constraints/values/index.md';
+import Advanced from '@site/static/usage/v8/datetime/date-constraints/advanced/index.md';
+
+import FormatOptions from '@site/static/usage/v8/datetime/format-options/index.md';
+
+import CustomLocale from '@site/static/usage/v8/datetime/localization/custom-locale/index.md';
+import HourCycle from '@site/static/usage/v8/datetime/localization/hour-cycle/index.md';
+import FirstDayOfWeek from '@site/static/usage/v8/datetime/localization/first-day-of-week/index.md';
+import LocaleExtensionTags from '@site/static/usage/v8/datetime/localization/locale-extension-tags/index.md';
+import TimeLabel from '@site/static/usage/v8/datetime/localization/time-label/index.md';
+
+import MonthAndYear from '@site/static/usage/v8/datetime/presentation/month-and-year/index.md';
+import Time from '@site/static/usage/v8/datetime/presentation/time/index.md';
+import Date from '@site/static/usage/v8/datetime/presentation/date/index.md';
+
+import ShowingDefaultTitle from '@site/static/usage/v8/datetime/title/showing-default-title/index.md';
+import CustomizingTitle from '@site/static/usage/v8/datetime/title/customizing-title/index.md';
+
+import ShowingConfirmationButtons from '@site/static/usage/v8/datetime/buttons/showing-confirmation-buttons/index.md';
+import CustomizingButtons from '@site/static/usage/v8/datetime/buttons/customizing-buttons/index.md';
+import CustomizingButtonTexts from '@site/static/usage/v8/datetime/buttons/customizing-button-texts/index.md';
+
+import HighlightedDatesArray from '@site/static/usage/v8/datetime/highlightedDates/array/index.md';
+import HighlightedDatesCallback from '@site/static/usage/v8/datetime/highlightedDates/callback/index.md';
+
+import MultipleDateSelection from '@site/static/usage/v8/datetime/multiple/index.md';
+
+import GlobalTheming from '@site/static/usage/v8/datetime/styling/global-theming/index.md';
+import CalendarDaysStyling from '@site/static/usage/v8/datetime/styling/calendar-days/index.md';
+import WheelStyling from '@site/static/usage/v8/datetime/styling/wheel-styling/index.md';
+
+
+ ion-datetime: Ionic API Input for Datetime Format Picker
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Datetimes present a calendar interface and time wheel, making it easy for users to select dates and times. Datetimes are similar to the native `input` elements of `datetime-local`, however, Ionic Framework's Datetime component makes it easy to display the date and time in the preferred format, and manage the datetime values.
+
+## Overview
+
+Historically, handling datetime values within JavaScript, or even within HTML
+inputs, has always been a challenge. Specifically, JavaScript's `Date` object is
+notoriously difficult to correctly parse apart datetime strings or to format
+datetime values. Even worse is how different browsers and JavaScript versions
+parse various datetime strings differently, especially per locale.
+
+Fortunately, Ionic Framework's datetime input has been designed so developers can avoid
+the common pitfalls, allowing developers to easily manipulate datetime values and give the user a simple datetime picker for a great user experience.
+
+### ISO 8601 Datetime Format: `YYYY-MM-DDTHH:mmZ`
+
+Ionic Framework uses the [ISO 8601 datetime format](https://www.w3.org/TR/NOTE-datetime)
+for its value. The value is simply a string, rather than using JavaScript's
+`Date` object. Using the ISO datetime format makes it easy to serialize
+and parse within JSON objects and databases.
+
+Below are some examples of ISO 8601 formats that can be used with `ion-datetime`:
+
+| Description | Format | Datetime Value Example |
+| -------------------- | ------------------------ | ------------------------------ |
+| Year | `YYYY` | `1994` |
+| Year and Month | `YYYY-MM` | `1994-12` |
+| Complete Date | `YYYY-MM-DD` | `1994-12-15` |
+| Date and Time | `YYYY-MM-DDTHH:mm` | `1994-12-15T13:47` |
+| UTC Timezone | `YYYY-MM-DDTHH:mm:ssZ` | `1994-12-15T13:47:20Z` |
+| Timezone Offset | `YYYY-MM-DDTHH:mm:ssTZD` | `1994-12-15T13:47:20+05:00` |
+| Hour and Minute | `HH:mm` | `13:47` |
+
+Note that the year is always four-digits, milliseconds (if it's added) is always
+three-digits, and all others are always two-digits. So the number representing
+January always has a leading zero, such as `01`. Additionally, the hour is
+always in the 24-hour format, so `00` is `12am` on a 12-hour clock, `13` means
+`1pm`, and `23` means `11pm`.
+
+:::note
+While seconds, milliseconds, and time zone can be specified using the ISO 8601 datetime format, `ion-datetime` does not provide an interface for second, millisecond, and time zone selection. Any second, millisecond, or time zone values provided will be ignored.
+:::
+
+## Basic Usage
+
+
+
+## Usage with Datetime Button
+
+If you need to present a datetime in an overlay such as a modal or a popover, we recommend using [ion-datetime-button](./datetime-button). `ion-datetime-button` should be used when space is constrained. This component displays buttons which show the current date and time values. When the buttons are tapped, the date or time pickers open in the overlay.
+
+## Setting Values Asynchronously
+
+If its `value` is updated programmatically after a datetime has already been created, the datetime will automatically jump to the new date. However, it is recommended to avoid updating the `value` in this way when users are able to interact with the datetime, as this could be disorienting for those currently trying to select a date. For example, if a datetime's `value` is loaded by an asynchronous process, it is recommended to hide the datetime with CSS until the value has finished updating.
+
+## Date Constraints
+
+### Max and Min Dates
+
+To customize the minimum and maximum datetime values, the `min` and `max` component properties can be provided which may make more sense for the app's use-case. Following the same IS0 8601 format listed in the table above, each component can restrict which dates can be selected by the user.
+
+The following example restricts date selection to March 2022 through May 2022 only.
+
+
+
+### Selecting Specific Values
+
+While the `min` and `max` properties allow you to restrict date selection to a certain range, the `monthValues`, `dayValues`, `yearValues`, `hourValues`, and `minuteValues` properties allow you choose specific days and times that users can select.
+
+The following example allows minutes to be selected in increments of 15. It also allows for days to be selected in increments of 5.
+
+
+
+### Advanced Date Constraints
+
+With the `isDateEnabled` property, developers can customize the `ion-datetime` to disable a specific day, range of dates, weekends or any custom rule using an ISO 8601 date string.
+The `isDateEnabled` property accepts a function returning a boolean, indicating if a date is enabled. The function is called for each rendered calendar day, for the previous, current and next month. Custom implementations should be optimized for performance to avoid jank.
+
+The following example shows how to disable all weekend dates. For more advanced date manipulation, we recommend using a date utility such as `date-fns`.
+
+
+
+## Localization
+
+Ionic Framework makes use of the [Intl.DatetimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DatetimeFormat) Web API which allows us to automatically localize the month and day names according to the language and region set on the user's device.
+
+### Custom Locale
+
+For instances where you need a specific locale, you can use the `locale` property to set it. The locale controls both the language and the date and time formats that are displayed.
+
+The following example shows how to set the locale to Spanish (Spain).
+
+
+
+:::note
+The time label is not automatically localized. See [Time Label](#time-label) for more information.
+:::
+
+### Hour Cycle
+
+`ion-datetime` will use the hour cycle that is specified by the `locale` property by default. For example, if `locale` is set to `en-US`, then `ion-datetime` will use a 12 hour cycle.
+
+There are 4 primary hour cycle types:
+
+| Hour cycle type | Description |
+| --------------- | ------------------------------------------------------------ |
+| `'h12'` | Hour system using 1–12; corresponds to 'h' in patterns. The 12 hour clock, with midnight starting at 12:00 am. |
+| `'h23'` | Hour system using 0–23; corresponds to 'H' in patterns. The 24 hour clock, with midnight starting at 0:00. |
+| `'h11'` | Hour system using 0–11; corresponds to 'K' in patterns. The 12 hour clock, with midnight starting at 0:00 am. |
+| `'h24'` | Hour system using 1–24; corresponds to 'k' in pattern. The 24 hour clock, with midnight starting at 24:00. |
+
+:::note
+ Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle
+:::
+
+
+There may be scenarios where you need to have more control over which hour cycle is used. This is where the `hourCycle` property can help.
+
+In the following example, we can use the `hourCycle` property to force `ion-datetime` to use the 12 hour cycle even though the locale is `en-GB`, which uses a 24 hour cycle by default:
+
+
+
+### First Day of the Week
+
+For `ion-datetime`, the default first day of the week is Sunday. As of 2022, there is no browser API that lets Ionic automatically determine the first day of the week based on a device's locale, though there is on-going work regarding this (see: [TC39 GitHub](https://github.com/tc39/ecma402/issues/6)).
+
+
+
+### Time Label
+
+The time label is not automatically localized. Fortunately, Ionic makes it easy to provide custom localizations with the `time-label` slot.
+
+
+
+### Locale Extension Tags
+
+`ion-datetime` also supports [locale extension tags](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) as part of the `Intl.Locale` API. These tags let you encode information about the locale in the locale string itself. Developers may prefer to use the extension tag approach if they are using the [Intl.Locale API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) in their apps.
+
+For example, if you wanted to use a 12 hour cycle with the `en-GB` locale, you could provide extension tags instead of using both the `locale` and `hourCycle` properties:
+
+
+
+:::note
+Be sure to check the [Browser Compatibility Chart](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale#browser_compatibility) for `Intl.Locale` before using it in your app.
+:::
+
+## Presentation
+
+By default, `ion-datetime` allows users to select both date and time. In addition, users have access to selecting the specific month, year, hour, and minute.
+
+Some use cases may call for only date selection or only time selection. The `presentation` property allows you to specify which pickers to show and the order to show them in. For example, setting `date-time` will have the calendar picker appear before the time picker. Setting `time-date` will have the calendar picker appear after the time picker.
+
+### Month and Year Selection
+
+Month and year selection is available by passing `month-year`, `year-month`, `month`, or `year` to the `presentation` property.
+
+This example shows a datetime with the `month-year` configuration.
+
+
+
+### Time Selection
+
+Time selection is available by passing `date-time`, `time-date`, or `time` to the `presentation` property.
+
+This example shows a datetime with the `time` configuration.
+
+
+
+### Date Selection
+
+Date selection is available by passing `date-time`, `time-date`, or `date` to the `presentation` property.
+
+This example shows a datetime with the `date` configuration.
+
+
+
+### Wheel Style Pickers
+
+By default, Ionic will prefer to show a grid style layout when using `presentation`. However, it is possible to show a wheel style using the `preferWheel` property. When `preferWheel` is `true`, Ionic will prefer to show the wheel style layout when possible.
+
+Certain `presentation` options have both grid and wheel styles that developers can choose from with the `preferWheel` property. Other `presentation` values only have a wheel style and will never show a grid style. The table below shows which `presentation` values have grid or wheel styles.
+
+| `presentation` | Has Grid Style? | Has Wheel Style? |
+| -------------- | --------------- | ---------------- |
+| `date` | Yes | Yes |
+| `date-time` | Yes | Yes |
+| `month` | No | Yes |
+| `month-year` | No | Yes |
+| `time` | No | Yes |
+| `time-date` | Yes | Yes |
+| `year` | No | Yes |
+
+The example below shows the wheel picker with `presentation="date-time"`.
+
+import Wheel from '@site/static/usage/v8/datetime/presentation/wheel/index.md';
+
+
+
+## Multiple Date Selection
+
+If the `multiple` property is set to `true`, multiple dates can be selected from the calendar picker. Clicking a selected date will deselect it.
+
+:::note
+This property is only supported when using `presentation="date"` and `preferWheel="false"`.
+:::
+
+
+
+## Titles
+
+By default, `ion-datetime` does not show any header or title associated with the component. Developers can use the `showDefaultTitle` property to show the default title/header configuration. They can also use the `title` slot to customize what is rendered in the header.
+
+### Showing the Default Title
+
+
+
+### Customizing the Title
+
+
+
+## Format Options
+
+You can customize the format of the date in the header text and the time in the time button of a Datetime component by providing `formatOptions`. The `date` and `time` in the `formatOptions` property should each be an [`Intl.DateTimeFormatOptions`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#options) object. If `formatOptions` is not provided, default formats will be used for dates and times.
+
+Datetime [does not manipulate or set](#time-zones) the time zone. If `timeZone` or `timeZoneName` are provided, they will be ignored, and the time zone will be set to UTC. This ensures that the displayed value matches the selected value, rather than being converted to the user's current time zone.
+
+Be careful with the options you provide, as they may not match the selected presentation. For example, providing `minute: 'numeric'` for a presentation of `month` may lead to unexpected behavior, displaying a month where only a time might be expected.
+
+
+
+## Buttons
+
+By default, `ionChange` is emitted with the new datetime value whenever a new date is selected. To require user confirmation before emitting `ionChange`, you can either set the `showDefaultButtons` property to `true` or use the `buttons` slot to pass in a custom confirmation button. When passing in custom buttons, the confirm button must call the `confirm` method on `ion-datetime` for `ionChange` to be emitted.
+
+### Showing Confirmation Buttons
+
+The default Done and Cancel buttons are already preconfigured to call the [`confirm`](#confirm) and [`cancel`](#cancel) methods, respectively.
+
+
+
+### Customizing Button Texts
+
+For simple use cases, developers can provide custom button text to the confirmation and cancel values through the `doneText` and `cancelText` properties. We recommend doing this when you only need to change the button text and do not need any custom behavior.
+
+
+
+### Customizing Button Elements
+
+Developers can provide their own buttons for advanced custom behavior.
+
+`ion-datetime` has `confirm`, `cancel`, and `reset` methods that developers can call when clicking on custom buttons. The `reset` method also allows developers to provide a date to reset the datetime to.
+
+
+
+## Highlighting Specific Dates
+
+Using the `highlightedDates` property, developers can style particular dates with custom text or background colors. This property can be defined as either an array of dates and their colors, or a callback that receives an ISO string and returns the colors to use.
+
+When specifying colors, any valid CSS color format can be used. This includes hex codes, `rgba`, [color variables](../theming/colors.mdx), etc.
+
+To maintain a consistent user experience, the style of selected date(s) will always override custom highlights.
+
+:::note
+This property is only supported when `preferWheel="false"`, and using a `presentation` of either `"date"`, `"date-time"`, or `"time-date"`.
+:::
+
+### Using Array
+
+An array is better when the highlights apply to fixed dates, such as due dates.
+
+
+
+### Using Callback
+
+A callback is better when the highlighted dates are recurring, such as birthdays or recurring meetings.
+
+
+
+## Styling
+
+### Global Theming
+
+Ionic's powerful theming system can be used to easily change your entire app to match a certain theme. In this example, we used the [Color Creator](../theming/colors#new-color-creator) and the [Stepped Color Generator](../theming/themes.mdx#stepped-color-generator) to create a rose color palette that we can use for `ion-datetime`.
+
+The benefit of this approach is that every component, not just `ion-datetime`, can automatically take advantage of this theme.
+
+
+
+### Calendar Days
+
+The calendar days in a grid-style `ion-datetime` can be styled using CSS shadow parts.
+
+:::note
+The example below selects the day 2 days ago, unless that day is in the previous month, then it selects a day 2 days in the future. This is done for demo purposes in order to show how to apply custom styling to all days, the current day, and the selected day.
+:::
+
+
+
+### Wheel Pickers
+
+The wheels used in `ion-datetime` can be styled through a combination of shadow parts and CSS variables. This applies to both the columns in wheel-style datetimes, and the month/year picker in grid-style datetimes.
+
+
+
+## Time Zones
+
+Ionic's `ion-datetime` follows the [datetime-local](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local) behavior of not manipulating or setting the time zone inside of a datetime control. In other words, a time value of "07:00" will not be adjusted according to different time zones.
+
+We recommend using a library such as [date-fns-tz](https://github.com/marnusw/date-fns-tz) to convert a datetime value to the desired time zone.
+
+Below is an example of formatting an ISO-8601 string to display in the time zone set on a user's device:
+
+```typescript
+import { format, utcToZonedTime } from 'date-fns-tz';
+
+// Get the time zone set on the user's device
+const userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
+
+// Create a date object from a UTC date string
+const date = new Date('2014-10-25T10:46:20Z');
+
+// Use date-fns-tz to convert from UTC to a zoned time
+const zonedTime = utcToZonedTime(date, userTimeZone);
+
+// Create a formatted string from the zoned time
+format(zonedTime, 'yyyy-MM-dd HH:mm:ssXXX', { timeZone: userTimeZone });
+```
+
+### Parsing Date Values
+
+The `ionChange` event will emit the date value as an ISO-8601 string in the event payload. It is the developer's responsibility to format it based on their application needs. We recommend using [date-fns](https://date-fns.org) to format the date value.
+
+Below is an example of formatting an ISO-8601 string to display the month, date and year:
+
+```typescript
+import { format, parseISO } from 'date-fns';
+
+/**
+ * This is provided in the event
+ * payload from the `ionChange` event.
+ *
+ * The value is an ISO-8601 date string.
+ */
+const dateFromIonDatetime = '2021-06-04T14:23:00-04:00';
+const formattedString = format(parseISO(dateFromIonDatetime), 'MMM d, yyyy');
+
+console.log(formattedString); // Jun 4, 2021
+```
+
+See https://date-fns.org/docs/format for a list of all the valid format tokens.
+
+
+## Advanced Datetime Validation and Manipulation
+
+The datetime picker provides the simplicity of selecting an exact format, and
+persists the datetime values as a string using the standardized [ISO 8601
+datetime format](https://www.w3.org/TR/NOTE-datetime). However, it's important
+to note that `ion-datetime` does not attempt to solve all situations when
+validating and manipulating datetime values. If datetime values need to be
+parsed from a certain format, or manipulated (such as adding 5 days to a date,
+subtracting 30 minutes, etc.), or even formatting data to a specific locale,
+then we highly recommend using [date-fns](https://date-fns.org) to work with
+dates in JavaScript.
+
+## Accessibility
+
+### Keyboard Navigation
+
+`ion-datetime` has full keyboard support for navigating between focusable elements inside of the component. The following table details what each key does:
+
+| Key | Function |
+| ------------------ | ------------------------------------------------------------ |
+| `Tab` | Moves focus to the next focusable element. |
+| `Shift` + `Tab` | Moves focus to the previous focusable element. |
+| `Space` or `Enter` | Clicks the focusable element. |
+
+#### Date Grid
+
+| Key | Function |
+| ------------------ | ------------------------------------------------------------ |
+| `ArrowUp` | Moves focus to the same day of the previous week. |
+| `ArrowDown` | Moves focus to the same day of the next week. |
+| `ArrowRight` | Moves focus to the next day. |
+| `ArrowLeft` | Moves focus to the previous day. |
+| `Home` | Moves focus to the first day of the current week. |
+| `End` | Moves focus to the last day of the current week. |
+| `PageUp` | Changes the grid of dates to the previous month. |
+| `PageDown` | Changes the grid of dates to the next month. |
+| `Shift` + `PageUp` | Changes the grid of dates to the previous year. |
+| `Shift` + `PageDown` | Changes the grid of dates to the next year. |
+
+#### Time, Month, and Year Wheels
+
+When using the time wheel picker, you can use the number keys to select hour and minute values when the columns are focused.
+
+| Key | Function |
+| ------------------ | ------------------------------------------------------------ |
+| `ArrowUp` | Scroll to the previous item. |
+| `ArrowDown` | Scroll to the next item. |
+| `Home` | Scroll to the first item. |
+| `End` | Scroll to the last item. |
+
+## Interfaces
+
+### DatetimeChangeEventDetail
+
+```typescript
+interface DatetimeChangeEventDetail {
+ value?: string | null;
+}
+```
+
+### DatetimeCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
+
+```typescript
+interface DatetimeCustomEvent extends CustomEvent {
+ detail: DatetimeChangeEventDetail;
+ target: HTMLIonDatetimeElement;
+}
+```
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/fab-button.md b/docs/api/fab-button.mdx
similarity index 100%
rename from docs/api/fab-button.md
rename to docs/api/fab-button.mdx
diff --git a/docs/api/fab-list.md b/docs/api/fab-list.mdx
similarity index 100%
rename from docs/api/fab-list.md
rename to docs/api/fab-list.mdx
diff --git a/docs/api/fab.md b/docs/api/fab.md
deleted file mode 100644
index 3e665ad8159..00000000000
--- a/docs/api/fab.md
+++ /dev/null
@@ -1,120 +0,0 @@
----
-title: "ion-fab"
----
-import Props from '@ionic-internal/component-api/v8/fab/props.md';
-import Events from '@ionic-internal/component-api/v8/fab/events.md';
-import Methods from '@ionic-internal/component-api/v8/fab/methods.md';
-import Parts from '@ionic-internal/component-api/v8/fab/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/fab/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/fab/slots.md';
-
-
- ion-fab: Ionic Floating Action Button for Android and iOS
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Fabs are container elements that contain one or more [fab buttons](./fab-button). They should be placed in a fixed position that does not scroll with the content. Fabs should have one main fab button. Fabs can also contain one or more [fab lists](./fab-list) which contain related buttons that show when the main fab button is clicked.
-
-## Basic Usage
-
-import BasicUsage from '@site/static/usage/v8/fab/basic/index.md';
-
-
-
-## List Side
-
-The `side` property of the [fab list](./fab-list) component controls where it appears relative to the main fab button. A single fab can have multiple fab lists as long as they all have different values for `side`.
-
-import ListSide from '@site/static/usage/v8/fab/list-side/index.md';
-
-
-
-## Positioning
-
-In order to place the fab in a fixed position, it should be assigned to the `fixed` slot of the outer [content](./content) component. Use the `vertical` and `horizontal` props to control the alignment of the fab in the viewport. The `edge` prop will cause the fab button to overlap with the app's header or footer.
-
-import Positioning from '@site/static/usage/v8/fab/positioning/index.md';
-
-
-
-### Safe Area
-
-If there is no `ion-header` or `ion-footer` component, the fab may be covered by a device's notch, status bar, or other device UI. In these cases, the [safe area](/docs/theming/advanced#safe-area-padding) on the top and bottom is not taken into account. This can be adjusted by using the [`--ion-safe-area-(dir)` variables](/docs/theming/advanced#application-variables).
-
-When using a fab with `vertical` set to `"top"` without an `ion-header`, the top margin needs to be set:
-
-```css
-ion-fab {
- margin-top: var(--ion-safe-area-top, 0);
-}
-```
-
-And when using a fab with `vertical` set to `"bottom"` without an `ion-footer`, the bottom margin needs to be set:
-
-```css
-ion-fab {
- margin-bottom: var(--ion-safe-area-bottom, 0);
-}
-```
-
-If there is an `ion-header` (for a fab with `vertical` set to `"top"`) or `ion-footer` (for a fab with `vertical` set to `"bottom"`), no CSS adjustment is needed because the fab gets positioned relative to the header or footer.
-
-import SafeArea from '@site/static/usage/v8/fab/safe-area/index.md';
-
-
-
-## Button Sizing
-
-Setting the `size` property of the main fab button to `"small"` will render it at a mini size. Note that this property will not have an effect when used with the inner fab buttons.
-
-import ButtonSizing from '@site/static/usage/v8/fab/button-sizing/index.md';
-
-
-
-## Theming
-
-### Colors
-
-import Colors from '@site/static/usage/v8/fab/theming/colors/index.md';
-
-
-
-### CSS Custom Properties
-
-import CSSCustomProperties from '@site/static/usage/v8/fab/theming/css-custom-properties/index.md';
-
-
-
-### CSS Shadow Parts
-
-import CSSShadowParts from '@site/static/usage/v8/fab/theming/css-shadow-parts/index.md';
-
-
-
-## Accessibility
-
-### Labels
-
-Since FABs are allowed to contain only icons, developers must provide an `aria-label` on each `ion-fab-button` instance. Without this label, assistive technologies will not be able to announce the purpose of each button.
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/fab.mdx b/docs/api/fab.mdx
new file mode 100644
index 00000000000..37ea87bbf90
--- /dev/null
+++ b/docs/api/fab.mdx
@@ -0,0 +1,120 @@
+---
+title: "ion-fab"
+---
+import Props from '@ionic-internal/component-api/v8/fab/props.md';
+import Events from '@ionic-internal/component-api/v8/fab/events.md';
+import Methods from '@ionic-internal/component-api/v8/fab/methods.md';
+import Parts from '@ionic-internal/component-api/v8/fab/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/fab/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/fab/slots.md';
+
+
+ ion-fab: Ionic Floating Action Button for Android and iOS
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Fabs are container elements that contain one or more [fab buttons](./fab-button). They should be placed in a fixed position that does not scroll with the content. Fabs should have one main fab button. Fabs can also contain one or more [fab lists](./fab-list) which contain related buttons that show when the main fab button is clicked.
+
+## Basic Usage
+
+import BasicUsage from '@site/static/usage/v8/fab/basic/index.md';
+
+
+
+## List Side
+
+The `side` property of the [fab list](./fab-list) component controls where it appears relative to the main fab button. A single fab can have multiple fab lists as long as they all have different values for `side`.
+
+import ListSide from '@site/static/usage/v8/fab/list-side/index.md';
+
+
+
+## Positioning
+
+In order to place the fab in a fixed position, it should be assigned to the `fixed` slot of the outer [content](./content) component. Use the `vertical` and `horizontal` props to control the alignment of the fab in the viewport. The `edge` prop will cause the fab button to overlap with the app's header or footer.
+
+import Positioning from '@site/static/usage/v8/fab/positioning/index.md';
+
+
+
+### Safe Area
+
+If there is no `ion-header` or `ion-footer` component, the fab may be covered by a device's notch, status bar, or other device UI. In these cases, the [safe area](/docs/theming/advanced.mdx#safe-area-padding) on the top and bottom is not taken into account. This can be adjusted by using the [`--ion-safe-area-(dir)` variables](/docs/theming/advanced.mdx#application-variables).
+
+When using a fab with `vertical` set to `"top"` without an `ion-header`, the top margin needs to be set:
+
+```css
+ion-fab {
+ margin-top: var(--ion-safe-area-top, 0);
+}
+```
+
+And when using a fab with `vertical` set to `"bottom"` without an `ion-footer`, the bottom margin needs to be set:
+
+```css
+ion-fab {
+ margin-bottom: var(--ion-safe-area-bottom, 0);
+}
+```
+
+If there is an `ion-header` (for a fab with `vertical` set to `"top"`) or `ion-footer` (for a fab with `vertical` set to `"bottom"`), no CSS adjustment is needed because the fab gets positioned relative to the header or footer.
+
+import SafeArea from '@site/static/usage/v8/fab/safe-area/index.md';
+
+
+
+## Button Sizing
+
+Setting the `size` property of the main fab button to `"small"` will render it at a mini size. Note that this property will not have an effect when used with the inner fab buttons.
+
+import ButtonSizing from '@site/static/usage/v8/fab/button-sizing/index.md';
+
+
+
+## Theming
+
+### Colors
+
+import Colors from '@site/static/usage/v8/fab/theming/colors/index.md';
+
+
+
+### CSS Custom Properties
+
+import CSSCustomProperties from '@site/static/usage/v8/fab/theming/css-custom-properties/index.md';
+
+
+
+### CSS Shadow Parts
+
+import CSSShadowParts from '@site/static/usage/v8/fab/theming/css-shadow-parts/index.md';
+
+
+
+## Accessibility
+
+### Labels
+
+Since FABs are allowed to contain only icons, developers must provide an `aria-label` on each `ion-fab-button` instance. Without this label, assistive technologies will not be able to announce the purpose of each button.
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/footer.md b/docs/api/footer.mdx
similarity index 100%
rename from docs/api/footer.md
rename to docs/api/footer.mdx
diff --git a/docs/api/grid.md b/docs/api/grid.md
deleted file mode 100644
index abe0b2950a1..00000000000
--- a/docs/api/grid.md
+++ /dev/null
@@ -1,215 +0,0 @@
----
-title: "ion-grid"
----
-import Props from '@ionic-internal/component-api/v8/grid/props.md';
-import Events from '@ionic-internal/component-api/v8/grid/events.md';
-import Methods from '@ionic-internal/component-api/v8/grid/methods.md';
-import Parts from '@ionic-internal/component-api/v8/grid/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/grid/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/grid/slots.md';
-
-
- ion-grid: Display Grids for Mobile-First Custom App Layout
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-The grid is a powerful mobile-first flexbox system for building custom layouts. It is composed of three units — a grid, [row(s)](row.md) and [column(s)](col.md). Columns will expand to fill the row, and will resize to fit additional columns. It is based on a 12 column layout with different breakpoints based on the screen size. The number of columns can be customized using CSS.
-
-## Overview
-
-- Grids act as a container for all rows and columns. Grids take up the full width of their container,
- but adding the `fixed` property will set the width based on the screen size, see [Fixed Grid](#fixed-grid) below.
-- Rows are horizontal groups of columns that line the columns up properly.
-- Content should be placed within columns, and only columns may be immediate children of rows.
-- The `size` property indicates the number of columns to use out of the default 12 per row.
- So, `size="4"` can be added to a column in order to take up 1/3 of the grid, or 4 of the 12 columns.
-- Columns without a value for size will automatically have equal widths. For example, four columns will each automatically be 25% wide.
-- Column widths are set as a percentage, so they’re always fluid and sized relative to their parent element.
-- There is padding between individual columns. However, the padding can be removed from the grid and
- columns by adding the `ion-no-padding` class to the grid. See the [CSS Utilities](../layout/css-utilities) for more styles that can be applied to the grid.
-- There are five grid tiers, one for each responsive breakpoint: all breakpoints (extra small), small, medium, large, and extra large.
-- Grid tiers are based on minimum widths, meaning they apply to their tier and all those larger than them
- (e.g., `size-sm="4"` applies to small, medium, large, and extra large devices).
-- Grids can be customized via CSS variables. See [Customizing the Grid](#customizing-the-grid).
-
-## Default Breakpoints
-
-The default breakpoints for the grid and the corresponding properties are defined in the table below. Breakpoint values can not be customized at this time. For more information on why they can't be customized, see [Variables in Media Queries](../theming/advanced#variables-in-media-queries).
-
-| Name | Value | Width Property | Offset Property | Push Property | Pull Property | Description |
-| ---- | ------ | -------------- | --------------- | ------------- | ------------- | ------------------------------------ |
-| xs | 0 | `size` | `offset` | `push` | `pull` | Set columns when (min-width: 0) |
-| sm | 576px | `sizeSm` | `offsetSm` | `pushSm` | `pullSm` | Set columns when (min-width: 576px) |
-| md | 768px | `sizeMd` | `offsetMd` | `pushMd` | `pullMd` | Set columns when (min-width: 768px) |
-| lg | 992px | `sizeLg` | `offsetLg` | `pushLg` | `pullLg` | Set columns when (min-width: 992px) |
-| xl | 1200px | `sizeXl` | `offsetXl` | `pushXl` | `pullXl` | Set columns when (min-width: 1200px) |
-
-
-## Basic Usage
-
-By default, columns will take up equal width inside of a row for all devices and screen sizes.
-
-import Basic from '@site/static/usage/v8/grid/basic/index.md';
-
-
-
-
-## Fixed Grid
-
-Grids take up 100% width of their container. By adding the `fixed` property to the grid, the width will be set based on the screen size. The width of the grid for each breakpoint is listed in the table below, but it can be customized. For more information, see [Customizing the Grid](#customizing-the-grid). Open the below example in StackBlitz and resize the screen to see the grid width change.
-
-| Name | Value | Description |
-| ---- | ------ | ------------------------------------------------- |
-| xs | 100% | Width is 100% for xs screens |
-| sm | 540px | Set grid width to 540px when (min-width: 576px) |
-| md | 720px | Set grid width to 720px when (min-width: 768px) |
-| lg | 960px | Set grid width to 960px when (min-width: 992px) |
-| xl | 1140px | Set grid width to 1140px when (min-width: 1200px) |
-
-import Fixed from '@site/static/usage/v8/grid/fixed/index.md';
-
-
-
-
-## Column Size
-
-Columns can be set to specific sizes to take up a certain number out of the total number of columns, or resize their width based on the content. The default number of columns is 12, but this can be customized. See the [Number of Columns](#number-of-columns) section below for more information.
-
-### Content-based size
-
-By setting the `size` to `"auto"` the column can size itself based on the natural width of its content. This is necessary when setting a column to an absolute width, such as a specific number of pixels. The columns next to the auto-width column will resize to fill the row.
-
-import SizeAuto from '@site/static/usage/v8/grid/size-auto/index.md';
-
-
-
-
-### Specified size
-
-Set the `size` of a column and the others will automatically resize around it. If a size is specified on all of the columns and it doesn't add up to the total number of columns, there will be empty space after the columns.
-
-import Size from '@site/static/usage/v8/grid/size/index.md';
-
-
-
-### Responsive size
-
-The `size` property will change the column width for all [breakpoints](#default-breakpoints). Column also provides several size properties with the breakpoint name appended to the end of "size". These properties can be used to change the width of the column based on the screen size. Open the below example in StackBlitz and resize the screen to see the column widths change.
-
-import SizeResponsive from '@site/static/usage/v8/grid/size-responsive/index.md';
-
-
-
-
-## Column Offset
-
-Columns can be offset to shift to the right by a certain number of columns out of the total number of columns.
-
-### Specified offset
-
-Columns can be moved to the right by using the `offset` property. This property increases the left margin of the column by the number of specified columns. It also shifts the columns to the right of it, if any exist.
-
-import Offset from '@site/static/usage/v8/grid/offset/index.md';
-
-
-
-### Responsive offset
-
-The `offset` property will change the column's left margin for all [breakpoints](#default-breakpoints). Column also provides several offset properties with the breakpoint name appended to the end of "offset". These properties can be used to change the offset of the column based on the screen size. Open the below example in StackBlitz and resize the screen to see the column offsets change.
-
-import OffsetResponsive from '@site/static/usage/v8/grid/offset-responsive/index.md';
-
-
-
-
-## Column Push & Pull
-
-Columns can be pushed to to the right or pulled to the left by a certain number of columns out of the total number of columns.
-
-### Specified push & pull
-
-Reorder the columns by adding the `push` and `pull` properties. These properties adjust the `left` and `right` of the columns by the specified number of columns making it easy to reorder columns. This will cause columns to overlap if they are shifted to where another column is positioned.
-
-import PushPull from '@site/static/usage/v8/grid/push-pull/index.md';
-
-
-
-### Responsive push & pull
-
-The `push` and `pull` properties will change the column's position for all [breakpoints](#default-breakpoints). Column also provides several `push` and `pull` properties with the breakpoint name appended to the end of "push" / "pull". These properties can be used to change the position of the column based on the screen size. Open the below example in StackBlitz and resize the screen to see the column positions change.
-
-import PushPullResponsive from '@site/static/usage/v8/grid/push-pull-responsive/index.md';
-
-
-
-## Alignment
-
-### Vertical Alignment
-
-All columns can be vertically aligned inside of a row by adding different classes to the row. For a list of available classes, see [css utilities](/layout/css-utilities#flex-container-properties).
-
-import VerticalAlignment from '@site/static/usage/v8/grid/vertical-alignment/index.md';
-
-
-
-
-### Horizontal Alignment
-
-All columns can be horizontally aligned inside of a row by adding different classes to the row. For a list of available classes, see [css utilities](/layout/css-utilities.md#flex-container-properties).
-
-import HorizontalAlignment from '@site/static/usage/v8/grid/horizontal-alignment/index.md';
-
-
-
-## Customizing the Grid
-
-Using our built-in CSS variables, it’s possible to customize the predefined grid attributes. Change the values of the padding, the number of columns, and more.
-
-### Fixed Width
-
-The width of a fixed grid can be set for all breakpoints with the `--ion-grid-width` CSS variable. To override individual breakpoints, use the `--ion-grid-width-{breakpoint}` CSS variables. The default value for each of the breakpoints can be found in the [Fixed Grid](#fixed-grid) section. Open the below example in StackBlitz and resize the screen to see the grid width change.
-
-import Width from '@site/static/usage/v8/grid/customizing/width/index.md';
-
-
-
-### Number of Columns
-
-The number of grid columns can be modified with the `--ion-grid-columns` CSS variable. By default there are 12 grid columns, but this can be changed to any positive integer and be used to calculate the width of each individual column.
-
-import ColumnNumber from '@site/static/usage/v8/grid/customizing/column-number/index.md';
-
-
-
-### Padding
-
-The padding on the grid container can be set for all breakpoints with the `--ion-grid-padding` CSS variable. To override individual breakpoints, use the `--ion-grid-padding-{breakpoint}` CSS variables.
-
-The padding on the columns can be set for all breakpoints with the `--ion-grid-column-padding` CSS variable. To override individual breakpoints, use the `--ion-grid-column-padding-{breakpoint}` CSS variables.
-
-import Padding from '@site/static/usage/v8/grid/customizing/padding/index.md';
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/grid.mdx b/docs/api/grid.mdx
new file mode 100644
index 00000000000..b113efc5916
--- /dev/null
+++ b/docs/api/grid.mdx
@@ -0,0 +1,215 @@
+---
+title: "ion-grid"
+---
+import Props from '@ionic-internal/component-api/v8/grid/props.md';
+import Events from '@ionic-internal/component-api/v8/grid/events.md';
+import Methods from '@ionic-internal/component-api/v8/grid/methods.md';
+import Parts from '@ionic-internal/component-api/v8/grid/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/grid/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/grid/slots.md';
+
+
+ ion-grid: Display Grids for Mobile-First Custom App Layout
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+The grid is a powerful mobile-first flexbox system for building custom layouts. It is composed of three units — a grid, [row(s)](row.mdx) and [column(s)](col.mdx). Columns will expand to fill the row, and will resize to fit additional columns. It is based on a 12 column layout with different breakpoints based on the screen size. The number of columns can be customized using CSS.
+
+## Overview
+
+- Grids act as a container for all rows and columns. Grids take up the full width of their container,
+ but adding the `fixed` property will set the width based on the screen size, see [Fixed Grid](#fixed-grid) below.
+- Rows are horizontal groups of columns that line the columns up properly.
+- Content should be placed within columns, and only columns may be immediate children of rows.
+- The `size` property indicates the number of columns to use out of the default 12 per row.
+ So, `size="4"` can be added to a column in order to take up 1/3 of the grid, or 4 of the 12 columns.
+- Columns without a value for size will automatically have equal widths. For example, four columns will each automatically be 25% wide.
+- Column widths are set as a percentage, so they’re always fluid and sized relative to their parent element.
+- There is padding between individual columns. However, the padding can be removed from the grid and
+ columns by adding the `ion-no-padding` class to the grid. See the [CSS Utilities](../layout/css-utilities.mdx) for more styles that can be applied to the grid.
+- There are five grid tiers, one for each responsive breakpoint: all breakpoints (extra small), small, medium, large, and extra large.
+- Grid tiers are based on minimum widths, meaning they apply to their tier and all those larger than them
+ (e.g., `size-sm="4"` applies to small, medium, large, and extra large devices).
+- Grids can be customized via CSS variables. See [Customizing the Grid](#customizing-the-grid).
+
+## Default Breakpoints
+
+The default breakpoints for the grid and the corresponding properties are defined in the table below. Breakpoint values can not be customized at this time. For more information on why they can't be customized, see [Variables in Media Queries](../theming/advanced.mdx#variables-in-media-queries).
+
+| Name | Value | Width Property | Offset Property | Push Property | Pull Property | Description |
+| ---- | ------ | -------------- | --------------- | ------------- | ------------- | ------------------------------------ |
+| xs | 0 | `size` | `offset` | `push` | `pull` | Set columns when (min-width: 0) |
+| sm | 576px | `sizeSm` | `offsetSm` | `pushSm` | `pullSm` | Set columns when (min-width: 576px) |
+| md | 768px | `sizeMd` | `offsetMd` | `pushMd` | `pullMd` | Set columns when (min-width: 768px) |
+| lg | 992px | `sizeLg` | `offsetLg` | `pushLg` | `pullLg` | Set columns when (min-width: 992px) |
+| xl | 1200px | `sizeXl` | `offsetXl` | `pushXl` | `pullXl` | Set columns when (min-width: 1200px) |
+
+
+## Basic Usage
+
+By default, columns will take up equal width inside of a row for all devices and screen sizes.
+
+import Basic from '@site/static/usage/v8/grid/basic/index.md';
+
+
+
+
+## Fixed Grid
+
+Grids take up 100% width of their container. By adding the `fixed` property to the grid, the width will be set based on the screen size. The width of the grid for each breakpoint is listed in the table below, but it can be customized. For more information, see [Customizing the Grid](#customizing-the-grid). Open the below example in StackBlitz and resize the screen to see the grid width change.
+
+| Name | Value | Description |
+| ---- | ------ | ------------------------------------------------- |
+| xs | 100% | Width is 100% for xs screens |
+| sm | 540px | Set grid width to 540px when (min-width: 576px) |
+| md | 720px | Set grid width to 720px when (min-width: 768px) |
+| lg | 960px | Set grid width to 960px when (min-width: 992px) |
+| xl | 1140px | Set grid width to 1140px when (min-width: 1200px) |
+
+import Fixed from '@site/static/usage/v8/grid/fixed/index.md';
+
+
+
+
+## Column Size
+
+Columns can be set to specific sizes to take up a certain number out of the total number of columns, or resize their width based on the content. The default number of columns is 12, but this can be customized. See the [Number of Columns](#number-of-columns) section below for more information.
+
+### Content-based size
+
+By setting the `size` to `"auto"` the column can size itself based on the natural width of its content. This is necessary when setting a column to an absolute width, such as a specific number of pixels. The columns next to the auto-width column will resize to fill the row.
+
+import SizeAuto from '@site/static/usage/v8/grid/size-auto/index.md';
+
+
+
+
+### Specified size
+
+Set the `size` of a column and the others will automatically resize around it. If a size is specified on all of the columns and it doesn't add up to the total number of columns, there will be empty space after the columns.
+
+import Size from '@site/static/usage/v8/grid/size/index.md';
+
+
+
+### Responsive size
+
+The `size` property will change the column width for all [breakpoints](#default-breakpoints). Column also provides several size properties with the breakpoint name appended to the end of "size". These properties can be used to change the width of the column based on the screen size. Open the below example in StackBlitz and resize the screen to see the column widths change.
+
+import SizeResponsive from '@site/static/usage/v8/grid/size-responsive/index.md';
+
+
+
+
+## Column Offset
+
+Columns can be offset to shift to the right by a certain number of columns out of the total number of columns.
+
+### Specified offset
+
+Columns can be moved to the right by using the `offset` property. This property increases the left margin of the column by the number of specified columns. It also shifts the columns to the right of it, if any exist.
+
+import Offset from '@site/static/usage/v8/grid/offset/index.md';
+
+
+
+### Responsive offset
+
+The `offset` property will change the column's left margin for all [breakpoints](#default-breakpoints). Column also provides several offset properties with the breakpoint name appended to the end of "offset". These properties can be used to change the offset of the column based on the screen size. Open the below example in StackBlitz and resize the screen to see the column offsets change.
+
+import OffsetResponsive from '@site/static/usage/v8/grid/offset-responsive/index.md';
+
+
+
+
+## Column Push & Pull
+
+Columns can be pushed to to the right or pulled to the left by a certain number of columns out of the total number of columns.
+
+### Specified push & pull
+
+Reorder the columns by adding the `push` and `pull` properties. These properties adjust the `left` and `right` of the columns by the specified number of columns making it easy to reorder columns. This will cause columns to overlap if they are shifted to where another column is positioned.
+
+import PushPull from '@site/static/usage/v8/grid/push-pull/index.md';
+
+
+
+### Responsive push & pull
+
+The `push` and `pull` properties will change the column's position for all [breakpoints](#default-breakpoints). Column also provides several `push` and `pull` properties with the breakpoint name appended to the end of "push" / "pull". These properties can be used to change the position of the column based on the screen size. Open the below example in StackBlitz and resize the screen to see the column positions change.
+
+import PushPullResponsive from '@site/static/usage/v8/grid/push-pull-responsive/index.md';
+
+
+
+## Alignment
+
+### Vertical Alignment
+
+All columns can be vertically aligned inside of a row by adding different classes to the row. For a list of available classes, see [css utilities](/layout/css-utilities.mdx#flex-container-properties).
+
+import VerticalAlignment from '@site/static/usage/v8/grid/vertical-alignment/index.md';
+
+
+
+
+### Horizontal Alignment
+
+All columns can be horizontally aligned inside of a row by adding different classes to the row. For a list of available classes, see [css utilities](/layout/css-utilities.mdx#flex-container-properties).
+
+import HorizontalAlignment from '@site/static/usage/v8/grid/horizontal-alignment/index.md';
+
+
+
+## Customizing the Grid
+
+Using our built-in CSS variables, it’s possible to customize the predefined grid attributes. Change the values of the padding, the number of columns, and more.
+
+### Fixed Width
+
+The width of a fixed grid can be set for all breakpoints with the `--ion-grid-width` CSS variable. To override individual breakpoints, use the `--ion-grid-width-{breakpoint}` CSS variables. The default value for each of the breakpoints can be found in the [Fixed Grid](#fixed-grid) section. Open the below example in StackBlitz and resize the screen to see the grid width change.
+
+import Width from '@site/static/usage/v8/grid/customizing/width/index.md';
+
+
+
+### Number of Columns
+
+The number of grid columns can be modified with the `--ion-grid-columns` CSS variable. By default there are 12 grid columns, but this can be changed to any positive integer and be used to calculate the width of each individual column.
+
+import ColumnNumber from '@site/static/usage/v8/grid/customizing/column-number/index.md';
+
+
+
+### Padding
+
+The padding on the grid container can be set for all breakpoints with the `--ion-grid-padding` CSS variable. To override individual breakpoints, use the `--ion-grid-padding-{breakpoint}` CSS variables.
+
+The padding on the columns can be set for all breakpoints with the `--ion-grid-column-padding` CSS variable. To override individual breakpoints, use the `--ion-grid-column-padding-{breakpoint}` CSS variables.
+
+import Padding from '@site/static/usage/v8/grid/customizing/padding/index.md';
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/header.md b/docs/api/header.mdx
similarity index 100%
rename from docs/api/header.md
rename to docs/api/header.mdx
diff --git a/docs/api/icon.md b/docs/api/icon.mdx
similarity index 100%
rename from docs/api/icon.md
rename to docs/api/icon.mdx
diff --git a/docs/api/img.md b/docs/api/img.mdx
similarity index 100%
rename from docs/api/img.md
rename to docs/api/img.mdx
diff --git a/docs/api/infinite-scroll-content.md b/docs/api/infinite-scroll-content.md
deleted file mode 100644
index 84fc4a93993..00000000000
--- a/docs/api/infinite-scroll-content.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: "ion-infinite-scroll-content"
----
-
-import Props from '@ionic-internal/component-api/v8/infinite-scroll-content/props.md';
-import Events from '@ionic-internal/component-api/v8/infinite-scroll-content/events.md';
-import Methods from '@ionic-internal/component-api/v8/infinite-scroll-content/methods.md';
-import Parts from '@ionic-internal/component-api/v8/infinite-scroll-content/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/infinite-scroll-content/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/infinite-scroll-content/slots.md';
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-The `ion-infinite-scroll-content` component is the default child used by the `ion-infinite-scroll`. It displays an infinite scroll spinner that looks best based on the platform and changes the look depending on the infinite scroll's state. The default spinner can be changed and text can be added by setting the `loadingSpinner` and `loadingText` properties.
-
-For more information as well as usage, see the [Infinite Scroll Documentation](./infinite-scroll.md#infinite-scroll-content).
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
\ No newline at end of file
diff --git a/docs/api/infinite-scroll-content.mdx b/docs/api/infinite-scroll-content.mdx
new file mode 100644
index 00000000000..ad5edef2474
--- /dev/null
+++ b/docs/api/infinite-scroll-content.mdx
@@ -0,0 +1,34 @@
+---
+title: "ion-infinite-scroll-content"
+---
+
+import Props from '@ionic-internal/component-api/v8/infinite-scroll-content/props.md';
+import Events from '@ionic-internal/component-api/v8/infinite-scroll-content/events.md';
+import Methods from '@ionic-internal/component-api/v8/infinite-scroll-content/methods.md';
+import Parts from '@ionic-internal/component-api/v8/infinite-scroll-content/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/infinite-scroll-content/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/infinite-scroll-content/slots.md';
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+The `ion-infinite-scroll-content` component is the default child used by the `ion-infinite-scroll`. It displays an infinite scroll spinner that looks best based on the platform and changes the look depending on the infinite scroll's state. The default spinner can be changed and text can be added by setting the `loadingSpinner` and `loadingText` properties.
+
+For more information as well as usage, see the [Infinite Scroll Documentation](./infinite-scroll.mdx#infinite-scroll-content).
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
\ No newline at end of file
diff --git a/docs/api/infinite-scroll.md b/docs/api/infinite-scroll.mdx
similarity index 100%
rename from docs/api/infinite-scroll.md
rename to docs/api/infinite-scroll.mdx
diff --git a/docs/api/input.md b/docs/api/input.md
deleted file mode 100644
index cab651f57bd..00000000000
--- a/docs/api/input.md
+++ /dev/null
@@ -1,249 +0,0 @@
----
-title: "ion-input"
----
-import Props from '@ionic-internal/component-api/v8/input/props.md';
-import Events from '@ionic-internal/component-api/v8/input/events.md';
-import Methods from '@ionic-internal/component-api/v8/input/methods.md';
-import Parts from '@ionic-internal/component-api/v8/input/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/input/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/input/slots.md';
-
-
- ion-input: Custom Input With Styling and CSS Properties
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-The input component is a wrapper to the HTML input element with custom styling and additional functionality. It accepts most of the same properties as the HTML input and integrates with the keyboard on mobile devices.
-
-
-## Basic Usage
-
-import Basic from '@site/static/usage/v8/input/basic/index.md';
-
-
-
-
-## Types
-
-The input component is meant for text type inputs only, such as `"text"`, `"password"`, `"email"`, `"number"`, `"search"`, `"tel"`, and `"url"`. It supports all standard text input events including `keyup`, `keydown`, `keypress`, and more. The default `type` is `"text"`.
-
-import Types from '@site/static/usage/v8/input/types/index.md';
-
-
-
-## Labels
-
-Labels should be used to describe the input. They can be used visually, and they will also be read out by screen readers when the user is focused on the input. This makes it easy for the user to understand the intent of the input. Input has several ways to assign a label:
-
-- `label` property: used for plaintext labels
-- `label` slot: used for custom HTML labels (experimental)
-- `aria-label`: used to provide a label for screen readers but adds no visible label
-
-### Label Placement
-
-Labels will take up the width of their content by default. Developers can use the `labelPlacement` property to control how the label is placed relative to the control.
-
-import LabelPlacement from '@site/static/usage/v8/input/label-placement/index.md';
-
-
-
-### Label Slot (experimental)
-
-While plaintext labels should be passed in via the `label` property, if custom HTML is needed, it can be passed through the `label` slot instead.
-
-Note that this feature is considered experimental because it relies on a simulated version of [Web Component slots](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots). As a result, the simulated behavior may not exactly match the native slot behavior.
-
-import LabelSlot from '@site/static/usage/v8/input/label-slot/index.md';
-
-
-
-### No Visible Label
-
-If no visible label is needed, developers should still supply an `aria-label` so the input is accessible to screen readers.
-
-import NoVisibleLabel from '@site/static/usage/v8/input/no-visible-label/index.md';
-
-
-
-## Clear Options
-
-Inputs offer two options for clearing the input based on how you interact with it. The first way is by adding the `clearInput` property which will show a clear button when the input has a `value`. The second way is the `clearOnEdit` property which will clear the input after it has been blurred and then typed in again. Inputs with a `type` set to `"password"` will have `clearOnEdit` enabled by default.
-
-import Clear from '@site/static/usage/v8/input/clear/index.md';
-
-
-
-
-## Filled Inputs
-
-Material Design offers filled styles for an input. The `fill` property on the input can be set to either `"solid"` or `"outline"`.
-
-Since the `fill` styles visually defines the input container, inputs that use `fill` should not be used in `ion-item`.
-
-Filled inputs can be used on iOS by setting Input's `mode` to `md`.
-
-import Fill from '@site/static/usage/v8/input/fill/index.md';
-
-
-
-
-## Helper & Error Text
-
-Helper and error text can be used inside of an input with the `helperText` and `errorText` property. The error text will not be displayed unless the `ion-invalid` and `ion-touched` classes are added to the `ion-input`. This ensures errors are not shown before the user has a chance to enter data.
-
-In Angular, this is done automatically through form validation. In JavaScript, React and Vue, the class needs to be manually added based on your own validation.
-
-import HelperError from '@site/static/usage/v8/input/helper-error/index.md';
-
-
-
-## Input Counter
-
-The input counter is text that displays under an input to notify the user of how many characters have been entered out of the total that the input will accept. When adding counter, the default behavior is to format the value that gets displayed as `inputLength` / `maxLength`. This behavior can be customized by passing in a formatter function to the `counterFormatter` property.
-
-The `counter` and `counterFormatter` properties on `ion-item` were [deprecated in Ionic 7](/docs/api/input#using-the-modern-syntax) and should be used directly on `ion-input` instead.
-
-import Counter from '@site/static/usage/v8/input/counter/index.md';
-
-
-
-Inputs with a counter add a border between the input and the counter, therefore they should not be placed inside of an `ion-item` which adds an additional border under the item. The `ion-padding-start` class can be added to align the counter inputs with inputs inside of items.
-
-import CounterAlignment from '@site/static/usage/v8/input/counter-alignment/index.md';
-
-
-
-## Filtering User Input
-
-Developers can use the `ionInput` event to update the input value in response to user input such as a `keypress`. This is useful for filtering out invalid or unwanted characters.
-
-When storing the value in a state variable, we recommend updating both the state variable and the `ion-input` component value. This ensures that the state variable and the `ion-input` component value remain in sync.
-
-import FilteringData from '@site/static/usage/v8/input/filtering/index.md';
-
-
-
-## Input Masking
-
-Input masks are expressions that constrain input to support valid input values. Ionic recommends using [Maskito](https://maskito.dev) for input masking. Maskito is a lightweight, dependency-free library for masking input fields. It supports a wide range of masks, including phone numbers, credit cards, dates, and more.
-
-To get started with Maskito, install the library:
-
-```bash
-npm install @maskito/core @maskito/{angular,react,vue}
-```
-
-import Masking from '@site/static/usage/v8/input/mask/index.md';
-
-
-
-:::note
-
-Please submit bug reports with Maskito to the [Maskito Github repository](https://github.com/taiga-family/maskito/issues). For technical support, please use the [Ionic Forum](https://forum.ionicframework.com/) or [Ionic Discord](http://chat.ionicframework.com/).
-
-:::
-
-## Start and End Slots (experimental)
-
-The `start` and `end` slots can be used to place icons, buttons, or prefix/suffix text on either side of the input.
-
-Note that this feature is considered experimental because it relies on a simulated version of [Web Component slots](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots). As a result, the simulated behavior may not exactly match the native slot behavior.
-
-:::note
-In most cases, [Icon](./icon.md) components placed in these slots should have `aria-hidden="true"`. See the [Icon accessibility docs](https://ionicframework.com/docs/api/icon#accessibility) for more information.
-
-If slot content is meant to be interacted with, it should be wrapped in an interactive element such as a [Button](./button.md). This ensures that the content can be tabbed to.
-:::
-
-import StartEndSlots from '@site/static/usage/v7/input/start-end-slots/index.md';
-
-
-
-## Theming
-
-### Colors
-
-Setting the `color` property changes the color palette for each input. On `ios` mode, this property changes the caret color. On `md` mode, this property changes the caret color and the highlight/underline color.
-
-:::note
-The `color` property does *not* change the text color of the input. For that, use the [`--color` CSS property](#css-custom-properties-1).
-:::
-
-import Colors from '@site/static/usage/v8/input/theming/colors/index.md';
-
-
-
-### CSS Custom Properties
-
-Input uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector. Targeting the `ion-input` for customization will not work; therefore we recommend adding a class and customizing it that way.
-
-import CSSProps from '@site/static/usage/v8/input/theming/css-properties/index.md';
-
-
-
-## Migrating from Legacy Input Syntax
-
-A simpler input syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an input, resolves accessibility issues, and improves the developer experience.
-
-Developers can perform this migration one input at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible.
-
-### Using the Modern Syntax
-
-Using the modern syntax involves three steps:
-
-1. Remove `ion-label` and use the `label` property on `ion-input` instead. The placement of the label can be configured using the `labelPlacement` property on `ion-input`.
-2. Move input-specific properties from `ion-item` on to `ion-input`. This includes the `counter`, `counterFormatter`, `fill`, and `shape` properties.
-3. Remove usages of the `helper` and `error` slots on `ion-item` and use the `helperText` and `errorText` properties on `ion-input` instead.
-
-import Migration from '@site/static/usage/v8/input/migration/index.md';
-
-
-
-### Using the Legacy Syntax
-
-Ionic uses heuristics to detect if an app is using the modern input syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-input` to `true` to force that instance of the input to use the legacy syntax.
-
-## Interfaces
-
-### InputChangeEventDetail
-
-```typescript
-interface InputChangeEventDetail {
- value: string | undefined | null;
-}
-```
-
-### InputCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
-
-```typescript
-interface InputCustomEvent extends CustomEvent {
- detail: InputChangeEventDetail;
- target: HTMLIonInputElement;
-}
-```
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/input.mdx b/docs/api/input.mdx
new file mode 100644
index 00000000000..08370664512
--- /dev/null
+++ b/docs/api/input.mdx
@@ -0,0 +1,249 @@
+---
+title: "ion-input"
+---
+import Props from '@ionic-internal/component-api/v8/input/props.md';
+import Events from '@ionic-internal/component-api/v8/input/events.md';
+import Methods from '@ionic-internal/component-api/v8/input/methods.md';
+import Parts from '@ionic-internal/component-api/v8/input/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/input/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/input/slots.md';
+
+
+ ion-input: Custom Input With Styling and CSS Properties
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+The input component is a wrapper to the HTML input element with custom styling and additional functionality. It accepts most of the same properties as the HTML input and integrates with the keyboard on mobile devices.
+
+
+## Basic Usage
+
+import Basic from '@site/static/usage/v8/input/basic/index.md';
+
+
+
+
+## Types
+
+The input component is meant for text type inputs only, such as `"text"`, `"password"`, `"email"`, `"number"`, `"search"`, `"tel"`, and `"url"`. It supports all standard text input events including `keyup`, `keydown`, `keypress`, and more. The default `type` is `"text"`.
+
+import Types from '@site/static/usage/v8/input/types/index.md';
+
+
+
+## Labels
+
+Labels should be used to describe the input. They can be used visually, and they will also be read out by screen readers when the user is focused on the input. This makes it easy for the user to understand the intent of the input. Input has several ways to assign a label:
+
+- `label` property: used for plaintext labels
+- `label` slot: used for custom HTML labels (experimental)
+- `aria-label`: used to provide a label for screen readers but adds no visible label
+
+### Label Placement
+
+Labels will take up the width of their content by default. Developers can use the `labelPlacement` property to control how the label is placed relative to the control.
+
+import LabelPlacement from '@site/static/usage/v8/input/label-placement/index.md';
+
+
+
+### Label Slot (experimental)
+
+While plaintext labels should be passed in via the `label` property, if custom HTML is needed, it can be passed through the `label` slot instead.
+
+Note that this feature is considered experimental because it relies on a simulated version of [Web Component slots](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots). As a result, the simulated behavior may not exactly match the native slot behavior.
+
+import LabelSlot from '@site/static/usage/v8/input/label-slot/index.md';
+
+
+
+### No Visible Label
+
+If no visible label is needed, developers should still supply an `aria-label` so the input is accessible to screen readers.
+
+import NoVisibleLabel from '@site/static/usage/v8/input/no-visible-label/index.md';
+
+
+
+## Clear Options
+
+Inputs offer two options for clearing the input based on how you interact with it. The first way is by adding the `clearInput` property which will show a clear button when the input has a `value`. The second way is the `clearOnEdit` property which will clear the input after it has been blurred and then typed in again. Inputs with a `type` set to `"password"` will have `clearOnEdit` enabled by default.
+
+import Clear from '@site/static/usage/v8/input/clear/index.md';
+
+
+
+
+## Filled Inputs
+
+Material Design offers filled styles for an input. The `fill` property on the input can be set to either `"solid"` or `"outline"`.
+
+Since the `fill` styles visually defines the input container, inputs that use `fill` should not be used in `ion-item`.
+
+Filled inputs can be used on iOS by setting Input's `mode` to `md`.
+
+import Fill from '@site/static/usage/v8/input/fill/index.md';
+
+
+
+
+## Helper & Error Text
+
+Helper and error text can be used inside of an input with the `helperText` and `errorText` property. The error text will not be displayed unless the `ion-invalid` and `ion-touched` classes are added to the `ion-input`. This ensures errors are not shown before the user has a chance to enter data.
+
+In Angular, this is done automatically through form validation. In JavaScript, React and Vue, the class needs to be manually added based on your own validation.
+
+import HelperError from '@site/static/usage/v8/input/helper-error/index.md';
+
+
+
+## Input Counter
+
+The input counter is text that displays under an input to notify the user of how many characters have been entered out of the total that the input will accept. When adding counter, the default behavior is to format the value that gets displayed as `inputLength` / `maxLength`. This behavior can be customized by passing in a formatter function to the `counterFormatter` property.
+
+The `counter` and `counterFormatter` properties on `ion-item` were [deprecated in Ionic 7](/docs/api/input#using-the-modern-syntax) and should be used directly on `ion-input` instead.
+
+import Counter from '@site/static/usage/v8/input/counter/index.md';
+
+
+
+Inputs with a counter add a border between the input and the counter, therefore they should not be placed inside of an `ion-item` which adds an additional border under the item. The `ion-padding-start` class can be added to align the counter inputs with inputs inside of items.
+
+import CounterAlignment from '@site/static/usage/v8/input/counter-alignment/index.md';
+
+
+
+## Filtering User Input
+
+Developers can use the `ionInput` event to update the input value in response to user input such as a `keypress`. This is useful for filtering out invalid or unwanted characters.
+
+When storing the value in a state variable, we recommend updating both the state variable and the `ion-input` component value. This ensures that the state variable and the `ion-input` component value remain in sync.
+
+import FilteringData from '@site/static/usage/v8/input/filtering/index.md';
+
+
+
+## Input Masking
+
+Input masks are expressions that constrain input to support valid input values. Ionic recommends using [Maskito](https://maskito.dev) for input masking. Maskito is a lightweight, dependency-free library for masking input fields. It supports a wide range of masks, including phone numbers, credit cards, dates, and more.
+
+To get started with Maskito, install the library:
+
+```bash
+npm install @maskito/core @maskito/{angular,react,vue}
+```
+
+import Masking from '@site/static/usage/v8/input/mask/index.md';
+
+
+
+:::note
+
+Please submit bug reports with Maskito to the [Maskito Github repository](https://github.com/taiga-family/maskito/issues). For technical support, please use the [Ionic Forum](https://forum.ionicframework.com/) or [Ionic Discord](http://chat.ionicframework.com/).
+
+:::
+
+## Start and End Slots (experimental)
+
+The `start` and `end` slots can be used to place icons, buttons, or prefix/suffix text on either side of the input.
+
+Note that this feature is considered experimental because it relies on a simulated version of [Web Component slots](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots). As a result, the simulated behavior may not exactly match the native slot behavior.
+
+:::note
+In most cases, [Icon](./icon.mdx) components placed in these slots should have `aria-hidden="true"`. See the [Icon accessibility docs](https://ionicframework.com/docs/api/icon#accessibility) for more information.
+
+If slot content is meant to be interacted with, it should be wrapped in an interactive element such as a [Button](./button.mdx). This ensures that the content can be tabbed to.
+:::
+
+import StartEndSlots from '@site/static/usage/v7/input/start-end-slots/index.md';
+
+
+
+## Theming
+
+### Colors
+
+Setting the `color` property changes the color palette for each input. On `ios` mode, this property changes the caret color. On `md` mode, this property changes the caret color and the highlight/underline color.
+
+:::note
+The `color` property does *not* change the text color of the input. For that, use the [`--color` CSS property](#css-custom-properties-1).
+:::
+
+import Colors from '@site/static/usage/v8/input/theming/colors/index.md';
+
+
+
+### CSS Custom Properties
+
+Input uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector. Targeting the `ion-input` for customization will not work; therefore we recommend adding a class and customizing it that way.
+
+import CSSProps from '@site/static/usage/v8/input/theming/css-properties/index.md';
+
+
+
+## Migrating from Legacy Input Syntax
+
+A simpler input syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an input, resolves accessibility issues, and improves the developer experience.
+
+Developers can perform this migration one input at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible.
+
+### Using the Modern Syntax
+
+Using the modern syntax involves three steps:
+
+1. Remove `ion-label` and use the `label` property on `ion-input` instead. The placement of the label can be configured using the `labelPlacement` property on `ion-input`.
+2. Move input-specific properties from `ion-item` on to `ion-input`. This includes the `counter`, `counterFormatter`, `fill`, and `shape` properties.
+3. Remove usages of the `helper` and `error` slots on `ion-item` and use the `helperText` and `errorText` properties on `ion-input` instead.
+
+import Migration from '@site/static/usage/v8/input/migration/index.md';
+
+
+
+### Using the Legacy Syntax
+
+Ionic uses heuristics to detect if an app is using the modern input syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-input` to `true` to force that instance of the input to use the legacy syntax.
+
+## Interfaces
+
+### InputChangeEventDetail
+
+```typescript
+interface InputChangeEventDetail {
+ value: string | undefined | null;
+}
+```
+
+### InputCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
+
+```typescript
+interface InputCustomEvent extends CustomEvent {
+ detail: InputChangeEventDetail;
+ target: HTMLIonInputElement;
+}
+```
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/item-divider.md b/docs/api/item-divider.mdx
similarity index 100%
rename from docs/api/item-divider.md
rename to docs/api/item-divider.mdx
diff --git a/docs/api/item-group.md b/docs/api/item-group.mdx
similarity index 100%
rename from docs/api/item-group.md
rename to docs/api/item-group.mdx
diff --git a/docs/api/item-option.md b/docs/api/item-option.mdx
similarity index 100%
rename from docs/api/item-option.md
rename to docs/api/item-option.mdx
diff --git a/docs/api/item-options.md b/docs/api/item-options.mdx
similarity index 100%
rename from docs/api/item-options.md
rename to docs/api/item-options.mdx
diff --git a/docs/api/item-sliding.md b/docs/api/item-sliding.mdx
similarity index 100%
rename from docs/api/item-sliding.md
rename to docs/api/item-sliding.mdx
diff --git a/docs/api/item.md b/docs/api/item.md
deleted file mode 100644
index 5aaa4a16304..00000000000
--- a/docs/api/item.md
+++ /dev/null
@@ -1,264 +0,0 @@
----
-title: "ion-item"
----
-import Props from '@ionic-internal/component-api/v8/item/props.md';
-import Events from '@ionic-internal/component-api/v8/item/events.md';
-import Methods from '@ionic-internal/component-api/v8/item/methods.md';
-import Parts from '@ionic-internal/component-api/v8/item/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/item/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/item/slots.md';
-
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import BestPracticeFigure from '@components/global/BestPracticeFigure';
-
-
- ion-item: Input, Edit, or Delete iOS and Android Item Elements
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Items are elements that can contain text, icons, avatars, images, inputs, and any other native or custom elements. Items should only be used as rows in a [List](./list) with other items. Items can be swiped, deleted, reordered, edited, and more.
-
-
-## Basic Usage
-
-Items left align text and wrap when the text is wider than the item. We can modify this behavior using the CSS Utilities provided by Ionic Framework, such as using `.ion-text-nowrap` in the below example. See the [CSS Utilities Documentation](/docs/layout/css-utilities) for more classes that can be added to an item to transform the text.
-
-import Basic from '@site/static/usage/v8/item/basic/index.md';
-
-
-
-
-## Content Types
-
-While items in a list take many forms, they typically support 5 different content types: supporting visuals, text, metadata, actions, and controls. However, not all of these content types should be used together at the same time. The following guide shows the different content types as well as how to properly utilize them in an application.
-
-### Supporting Visuals
-
-Supporting visuals are decorative icons or other adornments for an item. Common examples of supporting visuals are [Avatars](./avatar), [Icons](./icon), and [Thumbnails](./thumbnail). Since this content is not required to understand the intent of the item, it is typically hidden from screen readers using `aria-hidden="true"`.
-
-If a visual is required to interact with the item, such as an icon button, then the visual is an [action](#actions) not a supporting visual.
-
-}
- doNotImage={}
-/>
-
-In the example below, we are creating two lists with supporting visuals. The first list uses icons, and the second list uses avatars. The visuals are decorative, so they all have `aria-hidden="true"`. Additionally, they are presented consistently in the `start` slot.
-
-import SupportingVisuals from '@site/static/usage/v8/item/content-types/supporting-visuals/index.md';
-
-
-
-### Text
-
-The text content type includes form control labels or other visible text. This text serves to indicate the intent of the item. Try to keep the text short and to the point.
-
-If you find that you need a few more sentences to clarify the item's purpose, consider moving the additional sentences to a Note at the bottom of the list. Adding the item to its own list makes it clear which item the text is associated with.>}
- doText="Move long text outside of the list"
- doNotText="Don't try to fit long text in an item"
- doImage={}
- doNotImage={}
-/>
-
-In the example below, we are creating a list with different types of text. The "First Name" and "Last Name" labels serve to indicate what to type into the text inputs.
-
-The "Allow Notifications" label on the toggle has additional text underneath it that notes users can disable notifications. Since this text is short, it is placed inside of the item.
-
-Below that list is another list containing a textarea with a [Note](./note) containing long text underneath. The textarea was placed in its own list to make it apparent that the long text is associated with the textarea and not any other fields.
-
-import Text from '@site/static/usage/v8/item/content-types/text/index.md';
-
-
-
-### Metadata
-
-Metadata provides additional context for an item such as status text or counts. Components like [Badge](./badge) or [Note](./note) are great ways of showing metadata.
-
-}
- doNotImage={}
-/>
-
-}
- cautionImage={}
-/>
-
-In the example below, we are creating two lists with different kinds of metadata. The first list uses [Note](./note) to show how many tasks are in each to-do list.
-
-The second list mimics the iOS Mail app to show an inbox. This list makes use of custom metadata including an "unread message" indicator in the "start" slot as well as a timestamp and custom detail icon in the "end" slot. The "unread message" indicator is highlighted in blue to draw the user's attention to the unread messages, while the timestamp is more subtle.
-
-import Metadata from '@site/static/usage/v8/item/content-types/metadata/index.md';
-
-
-
-### Actions
-
-Actions are interactive elements that do something when you activate them. An item can have multiple actions displayed on a line. However, developers should ensure that each action's tap target is large enough to be usable.
-
-Developers should avoid creating nested interactives which can break the user experience with screen readers. For example, developers should avoid adding a button inside the main content of the Item if the `button` property is set to `true`.
-
-Actions can be added by using the Item Sliding component. Actions can also be placed directly inside of the Item without the use of Item Sliding, but this should be limited to no more than 2 actions.>}
- doText={<>Use an Item Sliding to reveal multiple actions by swiping on the Item.>}
- doNotText="Don't put more than 2 actions within an Item."
- doImage={}
- doNotImage={}
-/>
-
-In the example below, we are creating a list of contacts. Each item is a stubbed button intended to bring you to the full contact page for that item. There are additional actions associated with each item that users can reveal by swiping on the item.
-
-import Actions from '@site/static/usage/v8/item/content-types/actions/index.md';
-
-
-
-### Controls
-
-Controls are form components such as checkboxes, inputs, radios, and more. Each item in a list should have at most two controls due to screen space constraints.
-
-Metadata such as helper text or character counts should not be used on form controls in list views. If such metadata is needed, the form control should be placed outside of a list. Filled Inputs are a great way of visually defining the input container outside of a list.>}
- doText="Place inputs with metadata outside of the list."
- doNotText="Don't put metadata for inputs in the list."
- doImage={}
- doNotImage={}
-/>
-
-Alternatively, the metadata can be placed in a Note at the bottom of the list.>}
- doText="Place metadata for inputs at the end of a list."
- doNotText="Don't put metadata for inputs in the list."
- doImage={}
- doNotImage={}
-/>
-
-Items should typically have no more than two controls. If you need more controls, consider adding the additional controls in a Modal that is accessible from the item.>}
- doText="Move additional controls to a submenu accessible from the item."
- doNotText="Don't use more than two controls within an item."
- doImage={}
- doNotImage={}
-/>
-
-In the example below, we are creating a list of to-do tasks. Each item has a checkbox and an input. The checkbox lets the user mark a task as complete, and the input lets the user change the name of the task.
-
-import Controls from '@site/static/usage/v8/item/content-types/controls/index.md';
-
-
-
-
-## Clickable Items
-
-An item is considered "clickable" if it has an `href` or `button` property set. Clickable items have a few visual differences that indicate they can be interacted with. For example, a clickable item receives the ripple effect upon activation in `md` mode, has a highlight when activated in `ios` mode, and has a [detail arrow](#detail-arrows) by default in `ios` mode.
-
-import Clickable from '@site/static/usage/v8/item/clickable/index.md';
-
-
-
-
-## Detail Arrows
-
-By default [clickable items](#clickable-items) will display a right arrow icon on `ios` mode. To hide the right arrow icon on clickable elements, set the `detail` property to `false`. To show the right arrow icon on an item that doesn't display it naturally, set the `detail` property to `true`.
-
-import DetailArrows from '@site/static/usage/v8/item/detail-arrows/index.md';
-
-
-
-
-
-
-
-## Item Lines
-
-Items show an inset bottom border by default. The border has padding on the left and does not appear under any content that is slotted in the `"start"` slot. The `lines` property can be modified to `"full"` or `"none"` which will show a full width border or no border, respectively.
-
-import Lines from '@site/static/usage/v8/item/lines/index.md';
-
-
-
-## Buttons in Items
-
-Buttons are styled smaller inside of items than when they are outside of them. To make the button size match buttons outside of an item, set the `size` attribute to `"default"`.
-
-import Buttons from '@site/static/usage/v8/item/buttons/index.md';
-
-
-
-## Item Inputs
-
-import Inputs from '@site/static/usage/v8/item/inputs/index.md';
-
-
-
-## Theming
-
-### Colors
-
-import Colors from '@site/static/usage/v8/item/theming/colors/index.md';
-
-
-
-### CSS Shadow Parts
-
-import CSSParts from '@site/static/usage/v8/item/theming/css-shadow-parts/index.md';
-
-
-
-### CSS Custom Properties
-
-import CSSProps from '@site/static/usage/v8/item/theming/css-properties/index.md';
-
-
-
-## Guidelines
-
-The following guidelines will help ensure your list items are easy to understand and use.
-
-1. Items should only be used inside of [Lists](./list).
-2. Items inside of a list should be presented in a consistent format. For example, if your items present decorative icons, the icons should be positioned in the same way between items.
-3. Items should never render [nested interactives](https://dequeuniversity.com/rules/axe/4.4/nested-interactive). Screen readers are unable to select the correct interactive element when nested interactives are used. For example, avoid placing a button inside of an `ion-item` that has `button="true"`.
-4. Use [content types](#content-types) correctly. The Item component is designed to be a row in a [List](./list) and should not be used as a general purpose container.
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/item.mdx b/docs/api/item.mdx
new file mode 100644
index 00000000000..a220e9c1168
--- /dev/null
+++ b/docs/api/item.mdx
@@ -0,0 +1,258 @@
+---
+title: "ion-item"
+---
+import Props from '@ionic-internal/component-api/v8/item/props.md';
+import Events from '@ionic-internal/component-api/v8/item/events.md';
+import Methods from '@ionic-internal/component-api/v8/item/methods.md';
+import Parts from '@ionic-internal/component-api/v8/item/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/item/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/item/slots.md';
+
+import useBaseUrl from '@docusaurus/useBaseUrl';
+import BestPracticeFigure from '@components/global/BestPracticeFigure';
+
+
+ ion-item: Input, Edit, or Delete iOS and Android Item Elements
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Items are elements that can contain text, icons, avatars, images, inputs, and any other native or custom elements. Items should only be used as rows in a [List](./list) with other items. Items can be swiped, deleted, reordered, edited, and more.
+
+
+## Basic Usage
+
+Items left align text and wrap when the text is wider than the item. We can modify this behavior using the CSS Utilities provided by Ionic Framework, such as using `.ion-text-nowrap` in the below example. See the [CSS Utilities Documentation](/docs/layout/css-utilities.mdx) for more classes that can be added to an item to transform the text.
+
+import Basic from '@site/static/usage/v8/item/basic/index.md';
+
+
+
+
+## Content Types
+
+While items in a list take many forms, they typically support 5 different content types: supporting visuals, text, metadata, actions, and controls. However, not all of these content types should be used together at the same time. The following guide shows the different content types as well as how to properly utilize them in an application.
+
+### Supporting Visuals
+
+Supporting visuals are decorative icons or other adornments for an item. Common examples of supporting visuals are [Avatars](./avatar), [Icons](./icon), and [Thumbnails](./thumbnail). Since this content is not required to understand the intent of the item, it is typically hidden from screen readers using `aria-hidden="true"`.
+
+If a visual is required to interact with the item, such as an icon button, then the visual is an [action](#actions) not a supporting visual.
+
+}
+ doNotImage={}
+/>
+
+In the example below, we are creating two lists with supporting visuals. The first list uses icons, and the second list uses avatars. The visuals are decorative, so they all have `aria-hidden="true"`. Additionally, they are presented consistently in the `start` slot.
+
+import SupportingVisuals from '@site/static/usage/v8/item/content-types/supporting-visuals/index.md';
+
+
+
+### Text
+
+The text content type includes form control labels or other visible text. This text serves to indicate the intent of the item. Try to keep the text short and to the point.
+
+If you find that you need a few more sentences to clarify the item's purpose, consider moving the additional sentences to a Note at the bottom of the list. Adding the item to its own list makes it clear which item the text is associated with.>}
+ doText="Move long text outside of the list"
+ doNotText="Don't try to fit long text in an item"
+ doImage={}
+ doNotImage={}
+/>
+
+In the example below, we are creating a list with different types of text. The "First Name" and "Last Name" labels serve to indicate what to type into the text inputs.
+
+The "Allow Notifications" label on the toggle has additional text underneath it that notes users can disable notifications. Since this text is short, it is placed inside of the item.
+
+Below that list is another list containing a textarea with a [Note](./note) containing long text underneath. The textarea was placed in its own list to make it apparent that the long text is associated with the textarea and not any other fields.
+
+import Text from '@site/static/usage/v8/item/content-types/text/index.md';
+
+
+
+### Metadata
+
+Metadata provides additional context for an item such as status text or counts. Components like [Badge](./badge) or [Note](./note) are great ways of showing metadata.
+
+}
+ doNotImage={}
+/>
+
+}
+ cautionImage={}
+/>
+
+In the example below, we are creating two lists with different kinds of metadata. The first list uses [Note](./note) to show how many tasks are in each to-do list.
+
+The second list mimics the iOS Mail app to show an inbox. This list makes use of custom metadata including an "unread message" indicator in the "start" slot as well as a timestamp and custom detail icon in the "end" slot. The "unread message" indicator is highlighted in blue to draw the user's attention to the unread messages, while the timestamp is more subtle.
+
+import Metadata from '@site/static/usage/v8/item/content-types/metadata/index.md';
+
+
+
+### Actions
+
+Actions are interactive elements that do something when you activate them. An item can have multiple actions displayed on a line. However, developers should ensure that each action's tap target is large enough to be usable.
+
+Developers should avoid creating nested interactives which can break the user experience with screen readers. For example, developers should avoid adding a button inside the main content of the Item if the `button` property is set to `true`.
+
+Actions can be added by using the Item Sliding component. Actions can also be placed directly inside of the Item without the use of Item Sliding, but this should be limited to no more than 2 actions.>}
+ doText={<>Use an Item Sliding to reveal multiple actions by swiping on the Item.>}
+ doNotText="Don't put more than 2 actions within an Item."
+ doImage={}
+ doNotImage={}
+/>
+
+In the example below, we are creating a list of contacts. Each item is a stubbed button intended to bring you to the full contact page for that item. There are additional actions associated with each item that users can reveal by swiping on the item.
+
+import Actions from '@site/static/usage/v8/item/content-types/actions/index.md';
+
+
+
+### Controls
+
+Controls are form components such as checkboxes, inputs, radios, and more. Each item in a list should have at most two controls due to screen space constraints.
+
+Metadata such as helper text or character counts should not be used on form controls in list views. If such metadata is needed, the form control should be placed outside of a list. Filled Inputs are a great way of visually defining the input container outside of a list.>}
+ doText="Place inputs with metadata outside of the list."
+ doNotText="Don't put metadata for inputs in the list."
+ doImage={}
+ doNotImage={}
+/>
+
+Alternatively, the metadata can be placed in a Note at the bottom of the list.>}
+ doText="Place metadata for inputs at the end of a list."
+ doNotText="Don't put metadata for inputs in the list."
+ doImage={}
+ doNotImage={}
+/>
+
+Items should typically have no more than two controls. If you need more controls, consider adding the additional controls in a Modal that is accessible from the item.>}
+ doText="Move additional controls to a submenu accessible from the item."
+ doNotText="Don't use more than two controls within an item."
+ doImage={}
+ doNotImage={}
+/>
+
+In the example below, we are creating a list of to-do tasks. Each item has a checkbox and an input. The checkbox lets the user mark a task as complete, and the input lets the user change the name of the task.
+
+import Controls from '@site/static/usage/v8/item/content-types/controls/index.md';
+
+
+
+
+## Clickable Items
+
+An item is considered "clickable" if it has an `href` or `button` property set. Clickable items have a few visual differences that indicate they can be interacted with. For example, a clickable item receives the ripple effect upon activation in `md` mode, has a highlight when activated in `ios` mode, and has a [detail arrow](#detail-arrows) by default in `ios` mode.
+
+import Clickable from '@site/static/usage/v8/item/clickable/index.md';
+
+
+
+
+## Detail Arrows
+
+By default [clickable items](#clickable-items) will display a right arrow icon on `ios` mode. To hide the right arrow icon on clickable elements, set the `detail` property to `false`. To show the right arrow icon on an item that doesn't display it naturally, set the `detail` property to `true`.
+
+import DetailArrows from '@site/static/usage/v8/item/detail-arrows/index.md';
+
+
+
+{/* TODO add this functionality back as a css variable
+
+This feature is not enabled by default on clickable items for the `md` mode, but it can be enabled by setting the following CSS variable:
+
+```css
+--item-detail-push-show: true;
+```
+
+See the [theming documentation](/docs/theming/css-variables.mdx) for more information. */}
+
+## Item Lines
+
+Items show an inset bottom border by default. The border has padding on the left and does not appear under any content that is slotted in the `"start"` slot. The `lines` property can be modified to `"full"` or `"none"` which will show a full width border or no border, respectively.
+
+import Lines from '@site/static/usage/v8/item/lines/index.md';
+
+
+
+## Buttons in Items
+
+Buttons are styled smaller inside of items than when they are outside of them. To make the button size match buttons outside of an item, set the `size` attribute to `"default"`.
+
+import Buttons from '@site/static/usage/v8/item/buttons/index.md';
+
+
+
+## Item Inputs
+
+import Inputs from '@site/static/usage/v8/item/inputs/index.md';
+
+
+
+## Theming
+
+### Colors
+
+import Colors from '@site/static/usage/v8/item/theming/colors/index.md';
+
+
+
+### CSS Shadow Parts
+
+import CSSParts from '@site/static/usage/v8/item/theming/css-shadow-parts/index.md';
+
+
+
+### CSS Custom Properties
+
+import CSSProps from '@site/static/usage/v8/item/theming/css-properties/index.md';
+
+
+
+## Guidelines
+
+The following guidelines will help ensure your list items are easy to understand and use.
+
+1. Items should only be used inside of [Lists](./list).
+2. Items inside of a list should be presented in a consistent format. For example, if your items present decorative icons, the icons should be positioned in the same way between items.
+3. Items should never render [nested interactives](https://dequeuniversity.com/rules/axe/4.4/nested-interactive). Screen readers are unable to select the correct interactive element when nested interactives are used. For example, avoid placing a button inside of an `ion-item` that has `button="true"`.
+4. Use [content types](#content-types) correctly. The Item component is designed to be a row in a [List](./list) and should not be used as a general purpose container.
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/label.md b/docs/api/label.md
deleted file mode 100644
index dcf24afbeaf..00000000000
--- a/docs/api/label.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-title: "ion-label"
----
-import Props from '@ionic-internal/component-api/v8/label/props.md';
-import Events from '@ionic-internal/component-api/v8/label/events.md';
-import Methods from '@ionic-internal/component-api/v8/label/methods.md';
-import Parts from '@ionic-internal/component-api/v8/label/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/label/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/label/slots.md';
-
-
- ion-label: Item Label Color and Properties for Applications
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Label is an element used primarily to add text content to [Item](./item.md) components. Label can also be used inside of form control components such as [Input](./input.md) or [Radio](./radio.md) when specifying the visible label, but it is not required.
-
-The position of the label inside of an item can be inline, fixed, stacked, or floating.
-
-## Basic Usage
-
-import Basic from '@site/static/usage/v8/label/basic/index.md';
-
-
-
-## Item Labels
-
-import Item from '@site/static/usage/v8/label/item/index.md';
-
-
-
-## Theming
-
-### Colors
-
-import Colors from '@site/static/usage/v8/label/theming/colors/index.md';
-
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/label.mdx b/docs/api/label.mdx
new file mode 100644
index 00000000000..c373a169f64
--- /dev/null
+++ b/docs/api/label.mdx
@@ -0,0 +1,61 @@
+---
+title: "ion-label"
+---
+import Props from '@ionic-internal/component-api/v8/label/props.md';
+import Events from '@ionic-internal/component-api/v8/label/events.md';
+import Methods from '@ionic-internal/component-api/v8/label/methods.md';
+import Parts from '@ionic-internal/component-api/v8/label/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/label/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/label/slots.md';
+
+
+ ion-label: Item Label Color and Properties for Applications
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Label is an element used primarily to add text content to [Item](./item.mdx) components. Label can also be used inside of form control components such as [Input](./input.mdx) or [Radio](./radio.mdx) when specifying the visible label, but it is not required.
+
+The position of the label inside of an item can be inline, fixed, stacked, or floating.
+
+## Basic Usage
+
+import Basic from '@site/static/usage/v8/label/basic/index.md';
+
+
+
+## Item Labels
+
+import Item from '@site/static/usage/v8/label/item/index.md';
+
+
+
+## Theming
+
+### Colors
+
+import Colors from '@site/static/usage/v8/label/theming/colors/index.md';
+
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/list-header.md b/docs/api/list-header.mdx
similarity index 100%
rename from docs/api/list-header.md
rename to docs/api/list-header.mdx
diff --git a/docs/api/list.md b/docs/api/list.mdx
similarity index 100%
rename from docs/api/list.md
rename to docs/api/list.mdx
diff --git a/docs/api/loading.md b/docs/api/loading.mdx
similarity index 100%
rename from docs/api/loading.md
rename to docs/api/loading.mdx
diff --git a/docs/api/menu-button.md b/docs/api/menu-button.mdx
similarity index 100%
rename from docs/api/menu-button.md
rename to docs/api/menu-button.mdx
diff --git a/docs/api/menu-toggle.md b/docs/api/menu-toggle.mdx
similarity index 100%
rename from docs/api/menu-toggle.md
rename to docs/api/menu-toggle.mdx
diff --git a/docs/api/menu.md b/docs/api/menu.mdx
similarity index 100%
rename from docs/api/menu.md
rename to docs/api/menu.mdx
diff --git a/docs/api/modal.md b/docs/api/modal.mdx
similarity index 100%
rename from docs/api/modal.md
rename to docs/api/modal.mdx
diff --git a/docs/api/nav-link.md b/docs/api/nav-link.mdx
similarity index 100%
rename from docs/api/nav-link.md
rename to docs/api/nav-link.mdx
diff --git a/docs/api/nav.md b/docs/api/nav.md
deleted file mode 100644
index 3cce798832c..00000000000
--- a/docs/api/nav.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-title: "ion-nav"
----
-import Props from '@ionic-internal/component-api/v8/nav/props.md';
-import Events from '@ionic-internal/component-api/v8/nav/events.md';
-import Methods from '@ionic-internal/component-api/v8/nav/methods.md';
-import Parts from '@ionic-internal/component-api/v8/nav/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/nav/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/nav/slots.md';
-
-
- ion-nav: Nav View Component for Ionic Framework Apps
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Nav is a standalone component for loading arbitrary components and pushing new components on to the stack.
-
-Unlike Router Outlet, Nav is not tied to a particular router. This means that if we load a Nav component, and push other components to the stack, they will not affect the app's overall router. For example, you should not push a new component to `ion-nav` and expect the URL to update. This fits use cases where you could have a modal, which needs its own sub-navigation, without making it tied to the apps URL.
-
-:::note
-`ion-nav` is not meant to be used for routing. Instead, see the routing guides for [Angular](../angular/navigation), [React](../react/navigation), and [Vue](../vue/navigation), or [`ion-router`](./router) for vanilla JavaScript projects.
-:::
-
-## Using NavLink
-
-NavLink is a simplified API when interacting with Nav. Developers can customize the component, pass along component properties, modify the direction of the route animation or define a custom animation when navigating.
-
-import NavLinkExample from '@site/static/usage/v8/nav/nav-link/index.md';
-
-
-
-## Interfaces
-
-### NavCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
-
-```typescript
-interface NavCustomEvent extends CustomEvent {
- target: HTMLIonNavElement;
-}
-```
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/nav.mdx b/docs/api/nav.mdx
new file mode 100644
index 00000000000..be3670fca90
--- /dev/null
+++ b/docs/api/nav.mdx
@@ -0,0 +1,66 @@
+---
+title: "ion-nav"
+---
+import Props from '@ionic-internal/component-api/v8/nav/props.md';
+import Events from '@ionic-internal/component-api/v8/nav/events.md';
+import Methods from '@ionic-internal/component-api/v8/nav/methods.md';
+import Parts from '@ionic-internal/component-api/v8/nav/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/nav/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/nav/slots.md';
+
+
+ ion-nav: Nav View Component for Ionic Framework Apps
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Nav is a standalone component for loading arbitrary components and pushing new components on to the stack.
+
+Unlike Router Outlet, Nav is not tied to a particular router. This means that if we load a Nav component, and push other components to the stack, they will not affect the app's overall router. For example, you should not push a new component to `ion-nav` and expect the URL to update. This fits use cases where you could have a modal, which needs its own sub-navigation, without making it tied to the apps URL.
+
+:::note
+`ion-nav` is not meant to be used for routing. Instead, see the routing guides for [Angular](../angular/navigation.mdx), [React](../react/navigation.mdx), and [Vue](../vue/navigation.mdx), or [`ion-router`](./router) for vanilla JavaScript projects.
+:::
+
+## Using NavLink
+
+NavLink is a simplified API when interacting with Nav. Developers can customize the component, pass along component properties, modify the direction of the route animation or define a custom animation when navigating.
+
+import NavLinkExample from '@site/static/usage/v8/nav/nav-link/index.md';
+
+
+
+## Interfaces
+
+### NavCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
+
+```typescript
+interface NavCustomEvent extends CustomEvent {
+ target: HTMLIonNavElement;
+}
+```
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/note.md b/docs/api/note.mdx
similarity index 100%
rename from docs/api/note.md
rename to docs/api/note.mdx
diff --git a/docs/api/picker-column-option.md b/docs/api/picker-column-option.md
index caf78e4f0c3..75941c04581 100644
--- a/docs/api/picker-column-option.md
+++ b/docs/api/picker-column-option.md
@@ -17,7 +17,7 @@ import EncapsulationPill from '@components/page/api/EncapsulationPill';
-An individual column option in a picker. Visit the [`ion-picker`](./picker.md) documentation for more details.
+An individual column option in a picker. Visit the [`ion-picker`](./picker.mdx) documentation for more details.
## Properties
diff --git a/docs/api/picker-column.md b/docs/api/picker-column.md
index 5872043e5e0..0ef5b991fd6 100644
--- a/docs/api/picker-column.md
+++ b/docs/api/picker-column.md
@@ -17,7 +17,7 @@ import EncapsulationPill from '@components/page/api/EncapsulationPill';
-An individual column within a picker. Visit the [`ion-picker`](./picker.md) documentation for more details.
+An individual column within a picker. Visit the [`ion-picker`](./picker.mdx) documentation for more details.
## Properties
diff --git a/docs/api/picker-legacy.md b/docs/api/picker-legacy.md
index 8d3e45c48c5..dfee19c249c 100644
--- a/docs/api/picker-legacy.md
+++ b/docs/api/picker-legacy.md
@@ -19,7 +19,7 @@ import EncapsulationPill from '@components/page/api/EncapsulationPill';
:::warning Deprecation Notice
-`ion-picker-legacy` is deprecated and will be removed in the next major release. Migrate to [`ion-picker`](./picker.md) as soon as possible.
+`ion-picker-legacy` is deprecated and will be removed in the next major release. Migrate to [`ion-picker`](./picker.mdx) as soon as possible.
:::
diff --git a/docs/api/picker.md b/docs/api/picker.mdx
similarity index 100%
rename from docs/api/picker.md
rename to docs/api/picker.mdx
diff --git a/docs/api/popover.md b/docs/api/popover.mdx
similarity index 100%
rename from docs/api/popover.md
rename to docs/api/popover.mdx
diff --git a/docs/api/progress-bar.md b/docs/api/progress-bar.md
deleted file mode 100644
index 1d775421031..00000000000
--- a/docs/api/progress-bar.md
+++ /dev/null
@@ -1,96 +0,0 @@
----
-title: "ion-progress-bar"
----
-import Props from '@ionic-internal/component-api/v8/progress-bar/props.md';
-import Events from '@ionic-internal/component-api/v8/progress-bar/events.md';
-import Methods from '@ionic-internal/component-api/v8/progress-bar/methods.md';
-import Parts from '@ionic-internal/component-api/v8/progress-bar/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/progress-bar/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/progress-bar/slots.md';
-
-
- ion-progress-bar: App Progress Bar for Loading Indicator
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-Progress bars inform users about the status of ongoing processes, such as loading an app, submitting a form, or saving updates. There are two types of progress bars: `determinate` and `indeterminate`.
-
-## Determinate
-
-Determinate is the default type. It should be used when the percentage of an operation is known. The progress is represented by setting the `value` property. This can be used to show the progress increasing from 0 to 100% of the track.
-
-import Determinate from '@site/static/usage/v8/progress-bar/determinate/index.md';
-
-
-
-### Buffer
-
-If the `buffer` property is set, a buffer stream will show with animated circles to indicate activity. The value of the `buffer` property will also be represented by how much visible track there is. If the value of `buffer` is less than the `value` property, there will be no visible track. If `buffer` is equal to `1` then the buffer stream will be hidden.
-
-import Buffer from '@site/static/usage/v8/progress-bar/buffer/index.md';
-
-
-
-
-## Indeterminate
-
-The indeterminate type should be used when it is unknown how long the process will take. The progress bar is not tied to the `value`, instead it continually slides along the track until the process is complete.
-
-import Indeterminate from '@site/static/usage/v8/progress-bar/indeterminate/index.md';
-
-
-
-
-## Progress Bars in Toolbars
-
-
-import Toolbar from '@site/static/usage/v8/toolbar/progress-bars/index.md';
-
-
-
-
-## Theming
-
-### Colors
-
-import Colors from '@site/static/usage/v8/progress-bar/theming/colors/index.md';
-
-
-
-
-### CSS Custom Properties
-
-import CSSProps from '@site/static/usage/v8/progress-bar/theming/css-properties/index.md';
-
-
-
-
-### CSS Shadow Parts
-
-import CSSParts from '@site/static/usage/v8/progress-bar/theming/css-shadow-parts/index.md';
-
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/progress-bar.mdx b/docs/api/progress-bar.mdx
new file mode 100644
index 00000000000..d909da715c5
--- /dev/null
+++ b/docs/api/progress-bar.mdx
@@ -0,0 +1,96 @@
+---
+title: "ion-progress-bar"
+---
+import Props from '@ionic-internal/component-api/v8/progress-bar/props.md';
+import Events from '@ionic-internal/component-api/v8/progress-bar/events.md';
+import Methods from '@ionic-internal/component-api/v8/progress-bar/methods.md';
+import Parts from '@ionic-internal/component-api/v8/progress-bar/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/progress-bar/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/progress-bar/slots.md';
+
+
+ ion-progress-bar: App Progress Bar for Loading Indicator
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+Progress bars inform users about the status of ongoing processes, such as loading an app, submitting a form, or saving updates. There are two types of progress bars: `determinate` and `indeterminate`.
+
+## Determinate
+
+Determinate is the default type. It should be used when the percentage of an operation is known. The progress is represented by setting the `value` property. This can be used to show the progress increasing from 0 to 100% of the track.
+
+import Determinate from '@site/static/usage/v8/progress-bar/determinate/index.md';
+
+
+
+### Buffer
+
+If the `buffer` property is set, a buffer stream will show with animated circles to indicate activity. The value of the `buffer` property will also be represented by how much visible track there is. If the value of `buffer` is less than the `value` property, there will be no visible track. If `buffer` is equal to `1` then the buffer stream will be hidden.
+
+import Buffer from '@site/static/usage/v8/progress-bar/buffer/index.md';
+
+
+
+
+## Indeterminate
+
+The indeterminate type should be used when it is unknown how long the process will take. The progress bar is not tied to the `value`, instead it continually slides along the track until the process is complete.
+
+import Indeterminate from '@site/static/usage/v8/progress-bar/indeterminate/index.md';
+
+
+
+
+## Progress Bars in Toolbars
+
+{/* Reuse the playground from the Toolbar directory */}
+import Toolbar from '@site/static/usage/v8/toolbar/progress-bars/index.md';
+
+
+
+
+## Theming
+
+### Colors
+
+import Colors from '@site/static/usage/v8/progress-bar/theming/colors/index.md';
+
+
+
+
+### CSS Custom Properties
+
+import CSSProps from '@site/static/usage/v8/progress-bar/theming/css-properties/index.md';
+
+
+
+
+### CSS Shadow Parts
+
+import CSSParts from '@site/static/usage/v8/progress-bar/theming/css-shadow-parts/index.md';
+
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/radio-group.md b/docs/api/radio-group.mdx
similarity index 100%
rename from docs/api/radio-group.md
rename to docs/api/radio-group.mdx
diff --git a/docs/api/radio.md b/docs/api/radio.mdx
similarity index 100%
rename from docs/api/radio.md
rename to docs/api/radio.mdx
diff --git a/docs/api/range.md b/docs/api/range.mdx
similarity index 100%
rename from docs/api/range.md
rename to docs/api/range.mdx
diff --git a/docs/api/refresher-content.md b/docs/api/refresher-content.mdx
similarity index 100%
rename from docs/api/refresher-content.md
rename to docs/api/refresher-content.mdx
diff --git a/docs/api/refresher.md b/docs/api/refresher.mdx
similarity index 100%
rename from docs/api/refresher.md
rename to docs/api/refresher.mdx
diff --git a/docs/api/reorder-group.md b/docs/api/reorder-group.mdx
similarity index 100%
rename from docs/api/reorder-group.md
rename to docs/api/reorder-group.mdx
diff --git a/docs/api/reorder.md b/docs/api/reorder.mdx
similarity index 100%
rename from docs/api/reorder.md
rename to docs/api/reorder.mdx
diff --git a/docs/api/ripple-effect.md b/docs/api/ripple-effect.mdx
similarity index 100%
rename from docs/api/ripple-effect.md
rename to docs/api/ripple-effect.mdx
diff --git a/docs/api/route-redirect.md b/docs/api/route-redirect.md
deleted file mode 100644
index 411ea7b518f..00000000000
--- a/docs/api/route-redirect.md
+++ /dev/null
@@ -1,114 +0,0 @@
----
-title: "ion-route-redirect"
----
-
-import Props from '@ionic-internal/component-api/v8/route-redirect/props.md';
-import Events from '@ionic-internal/component-api/v8/route-redirect/events.md';
-import Methods from '@ionic-internal/component-api/v8/route-redirect/methods.md';
-import Parts from '@ionic-internal/component-api/v8/route-redirect/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/route-redirect/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/route-redirect/slots.md';
-
-
- ion-route-redirect: Redirect 'from' a URL 'to' Another URL
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-A route redirect can only be used with an `ion-router` as a direct child of it.
-
-:::note
- Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](router-outlet.md) and the Angular router.
-:::
-
-
-The route redirect has two configurable properties:
- - `from`
- - `to`
-
-It redirects "from" a URL "to" another URL. When the defined `ion-route-redirect` rule matches, the router will redirect from the path specified in the `from` property to the path in the `to` property. In order for a redirect to occur the `from` path needs to be an exact match to the navigated URL.
-
-
-## Multiple Route Redirects
-
-An arbitrary number of redirect routes can be defined inside an `ion-router`, but only one can match.
-
-A route redirect will never call another redirect after its own redirect, since this could lead to infinite loops.
-
-Take the following two redirects:
-
-```html
-
-
-
-
-```
-
-If the user navigates to `/admin` the router will redirect to `/login` and stop there. It will never evaluate more than one redirect.
-
-
-
-
-## Usage
-
-```html
-
-
-
-
-
-```
-
-### Route Redirects as Guards
-
-Redirection routes can work as guards to prevent users from navigating to certain areas of an application based on a given condition, such as if the user is authenticated or not.
-
-A route redirect can be added and removed dynamically to redirect (or guard) some routes from being accessed. In the following example, all urls `*` will be redirected to the `/login` url if `isLoggedIn` is `false`.
-
-```tsx
-const isLoggedIn = false;
-
-const router = document.querySelector('ion-router');
-const routeRedirect = document.createElement('ion-route-redirect');
-routeRedirect.setAttribute('from', '*');
-routeRedirect.setAttribute('to', '/login');
-
-if (!isLoggedIn) {
- router.appendChild(routeRedirect);
-}
-```
-
-Alternatively, the value of `to` can be modified based on a condition. In the following example, the route redirect will check if the user is logged in and redirect to the `/login` url if not.
-
-```html
-
-```
-
-```javascript
-const isLoggedIn = false;
-const routeRedirect = document.querySelector('#tutorialRedirect');
-
-routeRedirect.setAttribute('to', isLoggedIn ? undefined : '/login');
-```
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
\ No newline at end of file
diff --git a/docs/api/route-redirect.mdx b/docs/api/route-redirect.mdx
new file mode 100644
index 00000000000..de1c5b52460
--- /dev/null
+++ b/docs/api/route-redirect.mdx
@@ -0,0 +1,114 @@
+---
+title: "ion-route-redirect"
+---
+
+import Props from '@ionic-internal/component-api/v8/route-redirect/props.md';
+import Events from '@ionic-internal/component-api/v8/route-redirect/events.md';
+import Methods from '@ionic-internal/component-api/v8/route-redirect/methods.md';
+import Parts from '@ionic-internal/component-api/v8/route-redirect/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/route-redirect/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/route-redirect/slots.md';
+
+
+ ion-route-redirect: Redirect 'from' a URL 'to' Another URL
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+A route redirect can only be used with an `ion-router` as a direct child of it.
+
+:::note
+ Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](router-outlet.mdx) and the Angular router.
+:::
+
+
+The route redirect has two configurable properties:
+ - `from`
+ - `to`
+
+It redirects "from" a URL "to" another URL. When the defined `ion-route-redirect` rule matches, the router will redirect from the path specified in the `from` property to the path in the `to` property. In order for a redirect to occur the `from` path needs to be an exact match to the navigated URL.
+
+
+## Multiple Route Redirects
+
+An arbitrary number of redirect routes can be defined inside an `ion-router`, but only one can match.
+
+A route redirect will never call another redirect after its own redirect, since this could lead to infinite loops.
+
+Take the following two redirects:
+
+```html
+
+
+
+
+```
+
+If the user navigates to `/admin` the router will redirect to `/login` and stop there. It will never evaluate more than one redirect.
+
+
+
+
+## Usage
+
+```html
+
+
+
+
+
+```
+
+### Route Redirects as Guards
+
+Redirection routes can work as guards to prevent users from navigating to certain areas of an application based on a given condition, such as if the user is authenticated or not.
+
+A route redirect can be added and removed dynamically to redirect (or guard) some routes from being accessed. In the following example, all urls `*` will be redirected to the `/login` url if `isLoggedIn` is `false`.
+
+```tsx
+const isLoggedIn = false;
+
+const router = document.querySelector('ion-router');
+const routeRedirect = document.createElement('ion-route-redirect');
+routeRedirect.setAttribute('from', '*');
+routeRedirect.setAttribute('to', '/login');
+
+if (!isLoggedIn) {
+ router.appendChild(routeRedirect);
+}
+```
+
+Alternatively, the value of `to` can be modified based on a condition. In the following example, the route redirect will check if the user is logged in and redirect to the `/login` url if not.
+
+```html
+
+```
+
+```javascript
+const isLoggedIn = false;
+const routeRedirect = document.querySelector('#tutorialRedirect');
+
+routeRedirect.setAttribute('to', isLoggedIn ? undefined : '/login');
+```
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
\ No newline at end of file
diff --git a/docs/api/route.md b/docs/api/route.md
deleted file mode 100644
index 8fc251b1907..00000000000
--- a/docs/api/route.md
+++ /dev/null
@@ -1,269 +0,0 @@
----
-title: "ion-route"
----
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-import Props from '@ionic-internal/component-api/v8/route/props.md';
-import Events from '@ionic-internal/component-api/v8/route/events.md';
-import Methods from '@ionic-internal/component-api/v8/route/methods.md';
-import Parts from '@ionic-internal/component-api/v8/route/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/route/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/route/slots.md';
-
-
- ion-route: API Route Component for Ionic Framework Apps
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-The route component takes a component and renders it when the Browser URL matches the url property.
-
-:::note
- Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](router-outlet.md) and the Angular router.
-:::
-
-
-## Navigation Hooks
-
-Navigation hooks can be used to perform tasks or act as navigation guards. Hooks are used by providing functions to the `beforeEnter` and `beforeLeave` properties on each `ion-route`. Returning `true` allows navigation to proceed, while returning `false` causes it to be cancelled. Returning an object of type `NavigationHookOptions` allows you to redirect navigation to another page.
-
-## Interfaces
-
-```typescript
-interface NavigationHookOptions {
- /**
- * A valid path to redirect navigation to.
- */
- redirect: string;
-}
-```
-
-
-
-
-## Usage
-
-
-
-
-
-```html
-
-
-
-
-
-
-```
-
-```javascript
-const dashboardPage = document.querySelector('ion-route[url="/dashboard"]');
-dashboardPage.beforeEnter = isLoggedInGuard;
-
-const newMessagePage = document.querySelector('ion-route[url="/dashboard"]');
-newMessagePage.beforeLeave = hasUnsavedDataGuard;
-
-const isLoggedInGuard = async () => {
- const isLoggedIn = await UserData.isLoggedIn(); // Replace this with actual login validation
-
- if (isLoggedIn) {
- return true;
- } else {
- return { redirect: '/login' }; // If a user is not logged in, they will be redirected to the /login page
- }
-}
-
-const hasUnsavedDataGuard = async () => {
- const hasUnsavedData = await checkData(); // Replace this with actual validation
-
- if (hasUnsavedData) {
- return await confirmDiscardChanges();
- } else {
- return true;
- }
-}
-
-const confirmDiscardChanges = async () => {
- const alert = document.createElement('ion-alert');
- alert.header = 'Discard Unsaved Changes?';
- alert.message = 'Are you sure you want to leave? Any unsaved changed will be lost.';
- alert.buttons = [
- {
- text: 'Cancel',
- role: 'Cancel',
- },
- {
- text: 'Discard',
- role: 'destructive',
- }
- ];
-
- document.body.appendChild(alert);
-
- await alert.present();
-
- const { role } = await alert.onDidDismiss();
-
- return (role === 'Cancel') ? false : true;
-}
-```
-
-
-
-
-
-
-
-```typescript
-import { Component, h } from '@stencil/core';
-import { alertController } from '@ionic/core';
-
-@Component({
- tag: 'router-example',
- styleUrl: 'router-example.css'
-})
-export class RouterExample {
- render() {
- return (
-
-
-
-
-
-
- )
- }
-}
-
-const isLoggedInGuard = async () => {
- const isLoggedIn = await UserData.isLoggedIn(); // Replace this with actual login validation
-
- if (isLoggedIn) {
- return true;
- } else {
- return { redirect: '/login' }; // If a user is not logged in, they will be redirected to the /login page
- }
-}
-
-const hasUnsavedDataGuard = async () => {
- const hasUnsavedData = await checkData(); // Replace this with actual validation
-
- if (hasUnsavedData) {
- return await confirmDiscardChanges();
- } else {
- return true;
- }
-}
-
-const confirmDiscardChanges = async () => {
- const alert = await alertController.create({
- header: 'Discard Unsaved Changes?',
- message: 'Are you sure you want to leave? Any unsaved changed will be lost.',
- buttons: [
- {
- text: 'Cancel',
- role: 'Cancel',
- },
- {
- text: 'Discard',
- role: 'destructive',
- }
- ]
- });
-
- await alert.present();
-
- const { role } = await alert.onDidDismiss();
-
- return (role === 'Cancel') ? false : true;
-}
-```
-
-
-
-
-
-
-
-```html
-
-
-
-
-
-
-
-
-
-
-```
-
-
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
\ No newline at end of file
diff --git a/docs/api/route.mdx b/docs/api/route.mdx
new file mode 100644
index 00000000000..cdd72f18ce6
--- /dev/null
+++ b/docs/api/route.mdx
@@ -0,0 +1,269 @@
+---
+title: "ion-route"
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+import Props from '@ionic-internal/component-api/v8/route/props.md';
+import Events from '@ionic-internal/component-api/v8/route/events.md';
+import Methods from '@ionic-internal/component-api/v8/route/methods.md';
+import Parts from '@ionic-internal/component-api/v8/route/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/route/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/route/slots.md';
+
+
+ ion-route: API Route Component for Ionic Framework Apps
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+The route component takes a component and renders it when the Browser URL matches the url property.
+
+:::note
+ Note: this component should only be used with vanilla and Stencil JavaScript projects. For Angular projects, use [`ion-router-outlet`](router-outlet.mdx) and the Angular router.
+:::
+
+
+## Navigation Hooks
+
+Navigation hooks can be used to perform tasks or act as navigation guards. Hooks are used by providing functions to the `beforeEnter` and `beforeLeave` properties on each `ion-route`. Returning `true` allows navigation to proceed, while returning `false` causes it to be cancelled. Returning an object of type `NavigationHookOptions` allows you to redirect navigation to another page.
+
+## Interfaces
+
+```typescript
+interface NavigationHookOptions {
+ /**
+ * A valid path to redirect navigation to.
+ */
+ redirect: string;
+}
+```
+
+
+
+
+## Usage
+
+
+
+
+
+```html
+
+
+
+
+
+
+```
+
+```javascript
+const dashboardPage = document.querySelector('ion-route[url="/dashboard"]');
+dashboardPage.beforeEnter = isLoggedInGuard;
+
+const newMessagePage = document.querySelector('ion-route[url="/dashboard"]');
+newMessagePage.beforeLeave = hasUnsavedDataGuard;
+
+const isLoggedInGuard = async () => {
+ const isLoggedIn = await UserData.isLoggedIn(); // Replace this with actual login validation
+
+ if (isLoggedIn) {
+ return true;
+ } else {
+ return { redirect: '/login' }; // If a user is not logged in, they will be redirected to the /login page
+ }
+}
+
+const hasUnsavedDataGuard = async () => {
+ const hasUnsavedData = await checkData(); // Replace this with actual validation
+
+ if (hasUnsavedData) {
+ return await confirmDiscardChanges();
+ } else {
+ return true;
+ }
+}
+
+const confirmDiscardChanges = async () => {
+ const alert = document.createElement('ion-alert');
+ alert.header = 'Discard Unsaved Changes?';
+ alert.message = 'Are you sure you want to leave? Any unsaved changed will be lost.';
+ alert.buttons = [
+ {
+ text: 'Cancel',
+ role: 'Cancel',
+ },
+ {
+ text: 'Discard',
+ role: 'destructive',
+ }
+ ];
+
+ document.body.appendChild(alert);
+
+ await alert.present();
+
+ const { role } = await alert.onDidDismiss();
+
+ return (role === 'Cancel') ? false : true;
+}
+```
+
+
+
+
+
+
+
+```typescript
+import { Component, h } from '@stencil/core';
+import { alertController } from '@ionic/core';
+
+@Component({
+ tag: 'router-example',
+ styleUrl: 'router-example.css'
+})
+export class RouterExample {
+ render() {
+ return (
+
+
+
+
+
+
+ )
+ }
+}
+
+const isLoggedInGuard = async () => {
+ const isLoggedIn = await UserData.isLoggedIn(); // Replace this with actual login validation
+
+ if (isLoggedIn) {
+ return true;
+ } else {
+ return { redirect: '/login' }; // If a user is not logged in, they will be redirected to the /login page
+ }
+}
+
+const hasUnsavedDataGuard = async () => {
+ const hasUnsavedData = await checkData(); // Replace this with actual validation
+
+ if (hasUnsavedData) {
+ return await confirmDiscardChanges();
+ } else {
+ return true;
+ }
+}
+
+const confirmDiscardChanges = async () => {
+ const alert = await alertController.create({
+ header: 'Discard Unsaved Changes?',
+ message: 'Are you sure you want to leave? Any unsaved changed will be lost.',
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'Cancel',
+ },
+ {
+ text: 'Discard',
+ role: 'destructive',
+ }
+ ]
+ });
+
+ await alert.present();
+
+ const { role } = await alert.onDidDismiss();
+
+ return (role === 'Cancel') ? false : true;
+}
+```
+
+
+
+
+
+
+
+```html
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
\ No newline at end of file
diff --git a/docs/api/router-link.md b/docs/api/router-link.mdx
similarity index 100%
rename from docs/api/router-link.md
rename to docs/api/router-link.mdx
diff --git a/docs/api/router-outlet.md b/docs/api/router-outlet.mdx
similarity index 100%
rename from docs/api/router-outlet.md
rename to docs/api/router-outlet.mdx
diff --git a/docs/api/router.md b/docs/api/router.md
deleted file mode 100644
index 2d061c0f7a4..00000000000
--- a/docs/api/router.md
+++ /dev/null
@@ -1,114 +0,0 @@
----
-title: "ion-router"
----
-
-import Props from '@ionic-internal/component-api/v8/router/props.md';
-import Events from '@ionic-internal/component-api/v8/router/events.md';
-import Methods from '@ionic-internal/component-api/v8/router/methods.md';
-import Parts from '@ionic-internal/component-api/v8/router/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/router/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/router/slots.md';
-
-
- ion-router: Router Component to Coordinate URL Navigation
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-The router is a component for handling routing inside vanilla and Stencil JavaScript projects.
-
-:::note
- Note: This component should only be used with vanilla and Stencil JavaScript projects. See the routing guides for [Angular](../angular/navigation), [React](../react/navigation), and [Vue](../vue/navigation) for framework-specific routing solutions.
-:::
-
-
-Apps should have a single `ion-router` component in the codebase.
-This component controls all interactions with the browser history and it aggregates updates through an event system.
-
-`ion-router` is just a URL coordinator for the navigation outlets of ionic: `ion-nav`, `ion-tabs`, and `ion-router-outlet`.
-
-That means the `ion-router` never touches the DOM, it does NOT show the components or emit any kind of lifecycle events, it just tells `ion-nav`, `ion-tabs`, and `ion-router-outlet` what and when to "show" based on the browser's URL.
-
-In order to configure this relationship between components (to load/select) and URLs, `ion-router` uses a declarative syntax using JSX/HTML to define a tree of routes.
-
-## Basic Usage
-
-import BasicExample from '@site/static/usage/v8/router/basic/index.md';
-
-
-
-## Interfaces
-
-### RouterEventDetail
-
-```typescript
-interface RouterEventDetail {
- from: string | null;
- redirectedFrom: string | null;
- to: string;
-}
-```
-
-### RouterCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
-
-```typescript
-interface RouterCustomEvent extends CustomEvent {
- detail: RouterEventDetail;
- target: HTMLIonRouterElement;
-}
-```
-
-
-
-## Usage
-
-```html
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
\ No newline at end of file
diff --git a/docs/api/router.mdx b/docs/api/router.mdx
new file mode 100644
index 00000000000..ca4ef164fcf
--- /dev/null
+++ b/docs/api/router.mdx
@@ -0,0 +1,114 @@
+---
+title: "ion-router"
+---
+
+import Props from '@ionic-internal/component-api/v8/router/props.md';
+import Events from '@ionic-internal/component-api/v8/router/events.md';
+import Methods from '@ionic-internal/component-api/v8/router/methods.md';
+import Parts from '@ionic-internal/component-api/v8/router/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/router/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/router/slots.md';
+
+
+ ion-router: Router Component to Coordinate URL Navigation
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+The router is a component for handling routing inside vanilla and Stencil JavaScript projects.
+
+:::note
+ Note: This component should only be used with vanilla and Stencil JavaScript projects. See the routing guides for [Angular](../angular/navigation.mdx), [React](../react/navigation.mdx), and [Vue](../vue/navigation.mdx) for framework-specific routing solutions.
+:::
+
+
+Apps should have a single `ion-router` component in the codebase.
+This component controls all interactions with the browser history and it aggregates updates through an event system.
+
+`ion-router` is just a URL coordinator for the navigation outlets of ionic: `ion-nav`, `ion-tabs`, and `ion-router-outlet`.
+
+That means the `ion-router` never touches the DOM, it does NOT show the components or emit any kind of lifecycle events, it just tells `ion-nav`, `ion-tabs`, and `ion-router-outlet` what and when to "show" based on the browser's URL.
+
+In order to configure this relationship between components (to load/select) and URLs, `ion-router` uses a declarative syntax using JSX/HTML to define a tree of routes.
+
+## Basic Usage
+
+import BasicExample from '@site/static/usage/v8/router/basic/index.md';
+
+
+
+## Interfaces
+
+### RouterEventDetail
+
+```typescript
+interface RouterEventDetail {
+ from: string | null;
+ redirectedFrom: string | null;
+ to: string;
+}
+```
+
+### RouterCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
+
+```typescript
+interface RouterCustomEvent extends CustomEvent {
+ detail: RouterEventDetail;
+ target: HTMLIonRouterElement;
+}
+```
+
+
+
+## Usage
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
\ No newline at end of file
diff --git a/docs/api/row.md b/docs/api/row.md
deleted file mode 100644
index 4172ef4a478..00000000000
--- a/docs/api/row.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: "ion-row"
----
-import Props from '@ionic-internal/component-api/v8/row/props.md';
-import Events from '@ionic-internal/component-api/v8/row/events.md';
-import Methods from '@ionic-internal/component-api/v8/row/methods.md';
-import Parts from '@ionic-internal/component-api/v8/row/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/row/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/row/slots.md';
-
-
- ion-row: Horizontal Row Components of the Grid System
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Rows are horizontal components of the [grid](./grid) system and contain varying numbers of
-[columns](./col). They ensure the columns are positioned properly.
-
-See the [grid](./grid) documentation for more information.
-
-
-## Row Alignment
-
-By default, columns will stretch to fill the entire height of the row and wrap when necessary. Rows are [flex containers](https://developer.mozilla.org/en-US/docs/Glossary/Flex_Container), so there are several [CSS classes](/docs/layout/css-utilities#flex-container-properties) that can be applied to a row to customize this behavior.
-
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/row.mdx b/docs/api/row.mdx
new file mode 100644
index 00000000000..65c43586c3a
--- /dev/null
+++ b/docs/api/row.mdx
@@ -0,0 +1,49 @@
+---
+title: "ion-row"
+---
+import Props from '@ionic-internal/component-api/v8/row/props.md';
+import Events from '@ionic-internal/component-api/v8/row/events.md';
+import Methods from '@ionic-internal/component-api/v8/row/methods.md';
+import Parts from '@ionic-internal/component-api/v8/row/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/row/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/row/slots.md';
+
+
+ ion-row: Horizontal Row Components of the Grid System
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Rows are horizontal components of the [grid](./grid) system and contain varying numbers of
+[columns](./col). They ensure the columns are positioned properly.
+
+See the [grid](./grid) documentation for more information.
+
+
+## Row Alignment
+
+By default, columns will stretch to fill the entire height of the row and wrap when necessary. Rows are [flex containers](https://developer.mozilla.org/en-US/docs/Glossary/Flex_Container), so there are several [CSS classes](/docs/layout/css-utilities.mdx#flex-container-properties) that can be applied to a row to customize this behavior.
+
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/searchbar.md b/docs/api/searchbar.md
deleted file mode 100644
index 529ac434a90..00000000000
--- a/docs/api/searchbar.md
+++ /dev/null
@@ -1,141 +0,0 @@
----
-title: "ion-searchbar"
----
-import Props from '@ionic-internal/component-api/v8/searchbar/props.md';
-import Events from '@ionic-internal/component-api/v8/searchbar/events.md';
-import Methods from '@ionic-internal/component-api/v8/searchbar/methods.md';
-import Parts from '@ionic-internal/component-api/v8/searchbar/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/searchbar/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/searchbar/slots.md';
-
-
- ion-searchbar: Search Bar for Searching a Collection
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-Searchbars represent a text field that can be used to search through a collection. They can be displayed inside of a toolbar or the main content. A searchbar should be used instead of an input to search lists.
-
-
-## Basic Usage
-
-import Basic from '@site/static/usage/v8/searchbar/basic/index.md';
-
-
-
-
-## Search Icon
-
-A search icon is displayed to the left of the input field in a searchbar. It can be customized to any [Ionicon](https://ionic.io/ionicons/).
-
-import SearchIcon from '@site/static/usage/v8/searchbar/search-icon/index.md';
-
-
-
-
-## Clear Button
-
-A clear button is displayed when a searchbar has a value or upon entering input in the searchbar's text field. Clicking on the clear button will erase the text field and the input will remain focused. By default, the clear button is set to show when focusing the searchbar, but it can be set to always show or never show. The icon inside of the clear button can also be customized to any [Ionicon](https://ionic.io/ionicons/).
-
-import ClearButton from '@site/static/usage/v8/searchbar/clear-button/index.md';
-
-
-
-
-## Cancel Button
-
-A cancel button can be enabled which will clear the input and lose the focus upon click. By default, cancel buttons are set to never show, but they can be set to always show or only show when focusing the searchbar. The cancel button is displayed as text in `ios` mode, and as an icon in `md` mode. Both the text and icon can be customized using different properties, with the icon accepting any [Ionicon](https://ionic.io/ionicons/).
-
-import CancelButton from '@site/static/usage/v8/searchbar/cancel-button/index.md';
-
-
-
-
-## Searchbars in Toolbars
-
-Searchbars are styled to look native when placed inside of a toolbar. In iOS, searchbars should be placed in their own toolbar, under a toolbar that contains the page title. In Material Design, searchbars are either persistently displayed in their own toolbar, or expand over a toolbar containing the page title.
-
-
-import Toolbar from '@site/static/usage/v8/toolbar/searchbars/index.md';
-
-
-
-
-## Debounce
-
-A debounce can be set on the searchbar in order to delay triggering the `ionInput` event. This is useful when querying data, as it can be used to wait to make a request instead of requesting the data each time a character is entered in the input.
-
-import Debounce from '@site/static/usage/v8/searchbar/debounce/index.md';
-
-
-
-
-## Theming
-
-### Colors
-
-import Colors from '@site/static/usage/v8/searchbar/theming/colors/index.md';
-
-
-
-### CSS Custom Properties
-
-Searchbar uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector. Targeting the `ion-searchbar` for customization will not work, therefore we recommend adding a class and customizing it that way.
-
-import CSSProps from '@site/static/usage/v8/searchbar/theming/css-properties/index.md';
-
-
-
-
-## Keyboard Display
-
-### Android
-
-By default, tapping the input will cause the keyboard to appear with a magnifying glass icon on the submit button. You can optionally set the `inputmode` property to `"search"`, which will change the icon from a magnifying glass to a carriage return.
-
-### iOS
-
-By default, tapping the input will cause the keyboard to appear with the text "return" on a gray submit button. You can optionally set the `inputmode` property to `"search"`, which will change the text from "return" to "go", and change the button color from gray to blue. Alternatively, you can wrap the `ion-searchbar` in a `form` element with an `action` property. This will cause the keyboard to appear with a blue submit button that says "search".
-
-## Interfaces
-
-### SearchbarChangeEventDetail
-
-```typescript
-interface SearchbarChangeEventDetail {
- value?: string;
-}
-```
-
-### SearchbarCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
-
-```typescript
-interface SearchbarCustomEvent extends CustomEvent {
- detail: SearchbarChangeEventDetail;
- target: HTMLIonSearchbarElement;
-}
-```
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/searchbar.mdx b/docs/api/searchbar.mdx
new file mode 100644
index 00000000000..34c96bf7ff3
--- /dev/null
+++ b/docs/api/searchbar.mdx
@@ -0,0 +1,141 @@
+---
+title: "ion-searchbar"
+---
+import Props from '@ionic-internal/component-api/v8/searchbar/props.md';
+import Events from '@ionic-internal/component-api/v8/searchbar/events.md';
+import Methods from '@ionic-internal/component-api/v8/searchbar/methods.md';
+import Parts from '@ionic-internal/component-api/v8/searchbar/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/searchbar/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/searchbar/slots.md';
+
+
+ ion-searchbar: Search Bar for Searching a Collection
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+Searchbars represent a text field that can be used to search through a collection. They can be displayed inside of a toolbar or the main content. A searchbar should be used instead of an input to search lists.
+
+
+## Basic Usage
+
+import Basic from '@site/static/usage/v8/searchbar/basic/index.md';
+
+
+
+
+## Search Icon
+
+A search icon is displayed to the left of the input field in a searchbar. It can be customized to any [Ionicon](https://ionic.io/ionicons/).
+
+import SearchIcon from '@site/static/usage/v8/searchbar/search-icon/index.md';
+
+
+
+
+## Clear Button
+
+A clear button is displayed when a searchbar has a value or upon entering input in the searchbar's text field. Clicking on the clear button will erase the text field and the input will remain focused. By default, the clear button is set to show when focusing the searchbar, but it can be set to always show or never show. The icon inside of the clear button can also be customized to any [Ionicon](https://ionic.io/ionicons/).
+
+import ClearButton from '@site/static/usage/v8/searchbar/clear-button/index.md';
+
+
+
+
+## Cancel Button
+
+A cancel button can be enabled which will clear the input and lose the focus upon click. By default, cancel buttons are set to never show, but they can be set to always show or only show when focusing the searchbar. The cancel button is displayed as text in `ios` mode, and as an icon in `md` mode. Both the text and icon can be customized using different properties, with the icon accepting any [Ionicon](https://ionic.io/ionicons/).
+
+import CancelButton from '@site/static/usage/v8/searchbar/cancel-button/index.md';
+
+
+
+
+## Searchbars in Toolbars
+
+Searchbars are styled to look native when placed inside of a toolbar. In iOS, searchbars should be placed in their own toolbar, under a toolbar that contains the page title. In Material Design, searchbars are either persistently displayed in their own toolbar, or expand over a toolbar containing the page title.
+
+{/* Reuse the playground from the Toolbar directory */}
+import Toolbar from '@site/static/usage/v8/toolbar/searchbars/index.md';
+
+
+
+
+## Debounce
+
+A debounce can be set on the searchbar in order to delay triggering the `ionInput` event. This is useful when querying data, as it can be used to wait to make a request instead of requesting the data each time a character is entered in the input.
+
+import Debounce from '@site/static/usage/v8/searchbar/debounce/index.md';
+
+
+
+
+## Theming
+
+### Colors
+
+import Colors from '@site/static/usage/v8/searchbar/theming/colors/index.md';
+
+
+
+### CSS Custom Properties
+
+Searchbar uses scoped encapsulation, which means it will automatically scope its CSS by appending each of the styles with an additional class at runtime. Overriding scoped selectors in CSS requires a [higher specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) selector. Targeting the `ion-searchbar` for customization will not work, therefore we recommend adding a class and customizing it that way.
+
+import CSSProps from '@site/static/usage/v8/searchbar/theming/css-properties/index.md';
+
+
+
+
+## Keyboard Display
+
+### Android
+
+By default, tapping the input will cause the keyboard to appear with a magnifying glass icon on the submit button. You can optionally set the `inputmode` property to `"search"`, which will change the icon from a magnifying glass to a carriage return.
+
+### iOS
+
+By default, tapping the input will cause the keyboard to appear with the text "return" on a gray submit button. You can optionally set the `inputmode` property to `"search"`, which will change the text from "return" to "go", and change the button color from gray to blue. Alternatively, you can wrap the `ion-searchbar` in a `form` element with an `action` property. This will cause the keyboard to appear with a blue submit button that says "search".
+
+## Interfaces
+
+### SearchbarChangeEventDetail
+
+```typescript
+interface SearchbarChangeEventDetail {
+ value?: string;
+}
+```
+
+### SearchbarCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
+
+```typescript
+interface SearchbarCustomEvent extends CustomEvent {
+ detail: SearchbarChangeEventDetail;
+ target: HTMLIonSearchbarElement;
+}
+```
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/segment-button.md b/docs/api/segment-button.md
deleted file mode 100644
index dc1c866b382..00000000000
--- a/docs/api/segment-button.md
+++ /dev/null
@@ -1,71 +0,0 @@
----
-title: "ion-segment-button"
----
-import Props from '@ionic-internal/component-api/v8/segment-button/props.md';
-import Events from '@ionic-internal/component-api/v8/segment-button/events.md';
-import Methods from '@ionic-internal/component-api/v8/segment-button/methods.md';
-import Parts from '@ionic-internal/component-api/v8/segment-button/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/segment-button/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/segment-button/slots.md';
-
-
- ion-segment-button | Segment Button Icon and Segment Value
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-Segment buttons are groups of related buttons inside of a [segment](segment.md). They are displayed in a horizontal row. A segment button can be selected by default by setting the `value` of the segment to the `value` of the segment button. Only one segment button can be selected at a time.
-
-
-## Basic Usage
-
-import Basic from '@site/static/usage/v8/segment-button/basic/index.md';
-
-
-
-
-## Layout
-
-The `layout` property is set to `"icon-top"` by default. When a segment button has both an icon and a label, it will display the icon on top of the label. This behavior can be changed by setting the `layout` property to `"icon-bottom"`, `"icon-start"`, or `"icon-end"` which will show the icon below the label, to the start of the label (left in LTR and right in RTL) or to the end of the label (right in LTR and left in RTL), respectively.
-
-import Layout from '@site/static/usage/v8/segment-button/layout/index.md';
-
-
-
-
-## Theming
-### CSS Shadow Parts
-
-import CSSParts from '@site/static/usage/v8/segment-button/theming/css-shadow-parts/index.md';
-
-
-
-
-### CSS Custom Properties
-
-import CSSProps from '@site/static/usage/v8/segment-button/theming/css-properties/index.md';
-
-
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/segment-button.mdx b/docs/api/segment-button.mdx
new file mode 100644
index 00000000000..a17696f6f2a
--- /dev/null
+++ b/docs/api/segment-button.mdx
@@ -0,0 +1,71 @@
+---
+title: "ion-segment-button"
+---
+import Props from '@ionic-internal/component-api/v8/segment-button/props.md';
+import Events from '@ionic-internal/component-api/v8/segment-button/events.md';
+import Methods from '@ionic-internal/component-api/v8/segment-button/methods.md';
+import Parts from '@ionic-internal/component-api/v8/segment-button/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/segment-button/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/segment-button/slots.md';
+
+
+ ion-segment-button | Segment Button Icon and Segment Value
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+Segment buttons are groups of related buttons inside of a [segment](segment.mdx). They are displayed in a horizontal row. A segment button can be selected by default by setting the `value` of the segment to the `value` of the segment button. Only one segment button can be selected at a time.
+
+
+## Basic Usage
+
+import Basic from '@site/static/usage/v8/segment-button/basic/index.md';
+
+
+
+
+## Layout
+
+The `layout` property is set to `"icon-top"` by default. When a segment button has both an icon and a label, it will display the icon on top of the label. This behavior can be changed by setting the `layout` property to `"icon-bottom"`, `"icon-start"`, or `"icon-end"` which will show the icon below the label, to the start of the label (left in LTR and right in RTL) or to the end of the label (right in LTR and left in RTL), respectively.
+
+import Layout from '@site/static/usage/v8/segment-button/layout/index.md';
+
+
+
+
+## Theming
+### CSS Shadow Parts
+
+import CSSParts from '@site/static/usage/v8/segment-button/theming/css-shadow-parts/index.md';
+
+
+
+
+### CSS Custom Properties
+
+import CSSProps from '@site/static/usage/v8/segment-button/theming/css-properties/index.md';
+
+
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/segment.md b/docs/api/segment.md
deleted file mode 100644
index 46eb28050bb..00000000000
--- a/docs/api/segment.md
+++ /dev/null
@@ -1,119 +0,0 @@
----
-title: "ion-segment"
----
-import Props from '@ionic-internal/component-api/v8/segment/props.md';
-import Events from '@ionic-internal/component-api/v8/segment/events.md';
-import Methods from '@ionic-internal/component-api/v8/segment/methods.md';
-import Parts from '@ionic-internal/component-api/v8/segment/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/segment/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/segment/slots.md';
-
-
- ion-segment: API Documentation for Segmented Controls
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-Segments display a group of related buttons, sometimes known as segmented controls, in a horizontal row. They can be displayed inside of a toolbar or the main content.
-
-Their functionality is similar to tabs, where selecting one will deselect all others. Segments are useful for toggling between different views inside of the content. Tabs should be used instead of a segment when clicking on a control should navigate between pages.
-
-
-## Basic Usage
-
-Segments consist of [segment buttons](./segment-button) with a `value` property on each button. Set the `value` property on the segment to match the value of a button to select that button. Segments can also be disabled to prevent users from interacting with them.
-
-import Basic from '@site/static/usage/v8/segment/basic/index.md';
-
-
-
-
-## Scrollable Segments
-
-Segments are not scrollable by default. Each segment button has a fixed width, and the width is determined by dividing the number of segment buttons by the screen width. This ensures that each segment button can be displayed on the screen without having to scroll. As a result, some segment buttons with longer labels may get cut off. To avoid this we recommend either using a shorter label or switching to a scrollable segment by setting the `scrollable` property to `true`. This will cause the segment to scroll horizontally, but will allow each segment button to have a variable width.
-
-import Scrollable from '@site/static/usage/v8/segment/scrollable/index.md';
-
-
-
-
-## Segments in Toolbars
-
-
-import Toolbar from '@site/static/usage/v8/toolbar/segments/index.md';
-
-
-
-
-## Theming
-
-### Colors
-
-import Colors from '@site/static/usage/v8/segment/theming/colors/index.md';
-
-
-
-### CSS Custom Properties
-
-import CSSProps from '@site/static/usage/v8/segment/theming/css-properties/index.md';
-
-
-
-
-## Accessibility
-
-### Keyboard Navigation
-
-The component has full keyboard support for navigating between and selecting `ion-segment-button` elements. By default, keyboard navigation will only focus `ion-segment-button` elements, but you can use the `selectOnFocus` property to ensure that they get selected on focus as well. The following table details what each key does:
-
-| Key | Function |
-| ------------------ | -------------------------------------------------------------- |
-| `ArrowRight` | Focuses the next focusable element. |
-| `ArrowLeft` | Focuses the previous focusable element. |
-| `Home` | Focuses the first focusable element. |
-| `End` | Focuses the last focusable element. |
-| `Space` or `Enter` | Selects the element that is currently focused. |
-
-## Interfaces
-
-### SegmentChangeEventDetail
-
-```typescript
-interface SegmentChangeEventDetail {
- value?: string;
-}
-```
-
-### SegmentCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
-
-```typescript
-interface SegmentCustomEvent extends CustomEvent {
- target: HTMLIonSegmentElement;
- detail: SegmentChangeEventDetail;
-}
-```
-
-
-## Properties
-
-
-## Events
-
-
-## Methods
-
-
-## CSS Shadow Parts
-
-
-## CSS Custom Properties
-
-
-## Slots
-
diff --git a/docs/api/segment.mdx b/docs/api/segment.mdx
new file mode 100644
index 00000000000..d2059aecd46
--- /dev/null
+++ b/docs/api/segment.mdx
@@ -0,0 +1,119 @@
+---
+title: "ion-segment"
+---
+import Props from '@ionic-internal/component-api/v8/segment/props.md';
+import Events from '@ionic-internal/component-api/v8/segment/events.md';
+import Methods from '@ionic-internal/component-api/v8/segment/methods.md';
+import Parts from '@ionic-internal/component-api/v8/segment/parts.md';
+import CustomProps from '@ionic-internal/component-api/v8/segment/custom-props.md';
+import Slots from '@ionic-internal/component-api/v8/segment/slots.md';
+
+
+ ion-segment: API Documentation for Segmented Controls
+
+
+
+import EncapsulationPill from '@components/page/api/EncapsulationPill';
+
+
+
+
+Segments display a group of related buttons, sometimes known as segmented controls, in a horizontal row. They can be displayed inside of a toolbar or the main content.
+
+Their functionality is similar to tabs, where selecting one will deselect all others. Segments are useful for toggling between different views inside of the content. Tabs should be used instead of a segment when clicking on a control should navigate between pages.
+
+
+## Basic Usage
+
+Segments consist of [segment buttons](./segment-button) with a `value` property on each button. Set the `value` property on the segment to match the value of a button to select that button. Segments can also be disabled to prevent users from interacting with them.
+
+import Basic from '@site/static/usage/v8/segment/basic/index.md';
+
+
+
+
+## Scrollable Segments
+
+Segments are not scrollable by default. Each segment button has a fixed width, and the width is determined by dividing the number of segment buttons by the screen width. This ensures that each segment button can be displayed on the screen without having to scroll. As a result, some segment buttons with longer labels may get cut off. To avoid this we recommend either using a shorter label or switching to a scrollable segment by setting the `scrollable` property to `true`. This will cause the segment to scroll horizontally, but will allow each segment button to have a variable width.
+
+import Scrollable from '@site/static/usage/v8/segment/scrollable/index.md';
+
+
+
+
+## Segments in Toolbars
+
+{/* Reuse the playground from the Toolbar directory */}
+import Toolbar from '@site/static/usage/v8/toolbar/segments/index.md';
+
+
+
+
+## Theming
+
+### Colors
+
+import Colors from '@site/static/usage/v8/segment/theming/colors/index.md';
+
+
+
+### CSS Custom Properties
+
+import CSSProps from '@site/static/usage/v8/segment/theming/css-properties/index.md';
+
+
+
+
+## Accessibility
+
+### Keyboard Navigation
+
+The component has full keyboard support for navigating between and selecting `ion-segment-button` elements. By default, keyboard navigation will only focus `ion-segment-button` elements, but you can use the `selectOnFocus` property to ensure that they get selected on focus as well. The following table details what each key does:
+
+| Key | Function |
+| ------------------ | -------------------------------------------------------------- |
+| `ArrowRight` | Focuses the next focusable element. |
+| `ArrowLeft` | Focuses the previous focusable element. |
+| `Home` | Focuses the first focusable element. |
+| `End` | Focuses the last focusable element. |
+| `Space` or `Enter` | Selects the element that is currently focused. |
+
+## Interfaces
+
+### SegmentChangeEventDetail
+
+```typescript
+interface SegmentChangeEventDetail {
+ value?: string;
+}
+```
+
+### SegmentCustomEvent
+
+While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
+
+```typescript
+interface SegmentCustomEvent extends CustomEvent {
+ target: HTMLIonSegmentElement;
+ detail: SegmentChangeEventDetail;
+}
+```
+
+
+## Properties
+
+
+## Events
+
+
+## Methods
+
+
+## CSS Shadow Parts
+
+
+## CSS Custom Properties
+
+
+## Slots
+
diff --git a/docs/api/select-option.md b/docs/api/select-option.mdx
similarity index 100%
rename from docs/api/select-option.md
rename to docs/api/select-option.mdx
diff --git a/docs/api/select.md b/docs/api/select.md
deleted file mode 100644
index 0beb1767edd..00000000000
--- a/docs/api/select.md
+++ /dev/null
@@ -1,349 +0,0 @@
----
-title: "ion-select"
----
-import Props from '@ionic-internal/component-api/v8/select/props.md';
-import Events from '@ionic-internal/component-api/v8/select/events.md';
-import Methods from '@ionic-internal/component-api/v8/select/methods.md';
-import Parts from '@ionic-internal/component-api/v8/select/parts.md';
-import CustomProps from '@ionic-internal/component-api/v8/select/custom-props.md';
-import Slots from '@ionic-internal/component-api/v8/select/slots.md';
-
-
- ion-select: Select One or Multiple Value Boxes or Placeholders
-
-
-
-import EncapsulationPill from '@components/page/api/EncapsulationPill';
-
-
-
-
-Selects are form controls to select an option, or options, from a set of options. When a user taps the select, a dialog appears with all of the options in a large, easy to select list.
-
-A select should be used with child `` elements. If the child option is not given a `value` attribute then its text will be used as the value.
-
-If `value` is set on the ``, the selected option will be chosen based on that value.
-
-## Labels
-
-Labels should be used to describe the select. They can be used visually, and they will also be read out by screen readers when the user is focused on the select. This makes it easy for the user to understand the intent of the select. Select has several ways to assign a label:
-
-Select has several options for supplying a label for the component:
-
-- `label` property: used for plaintext labels
-- `label` slot: used for custom HTML labels
-- `aria-label`: used to provide a label for screen readers but adds no visible label
-
-### Label Placement
-
-Labels will take up the width of their content by default. Developers can use the `labelPlacement` property to control how the label is placed relative to the control. While the `label` property is used here, `labelPlacement` can also be used with the `label` slot.
-
-import LabelPlacement from '@site/static/usage/v8/select/label-placement/index.md';
-
-
-
-### Label Slot
-
-While plaintext labels should be passed in via the `label` property, if custom HTML is needed, it can be passed through the `label` slot instead.
-
-import LabelSlot from '@site/static/usage/v8/select/label-slot/index.md';
-
-
-
-### No Visible Label
-
-If no visible label is needed, developers should still supply an `aria-label` so the select is accessible to screen readers.
-
-import NoVisibleLabel from '@site/static/usage/v8/select/no-visible-label/index.md';
-
-
-
-## Single Selection
-
-By default, the select allows the user to select only one option. The alert interface presents users with a radio button styled list of options. The select component's value receives the value of the selected option's value.
-
-Keyboard interactions for single selection are described in the [Keyboard Interactions](#single-selection-1) section below.
-
-import SingleSelectionExample from '@site/static/usage/v8/select/basic/single-selection/index.md';
-
-
-
-## Multiple Selection
-
-By adding the `multiple` attribute to select, users are able to select multiple options. When multiple options can be selected, the alert or popover overlay presents users with a checkbox styled list of options. The select component's value receives an array of all of the selected option values.
-
-:::note
-
-The `action-sheet` interface is not supported with multiple selection.
-
-:::
-
-Keyboard interactions for multiple selection are described in the [Keyboard Interactions](#multiple-selection-1) section below.
-
-import MultipleSelectionExample from '@site/static/usage/v8/select/basic/multiple-selection/index.md';
-
-
-
-## Interfaces
-
-By default, select uses [ion-alert](alert.md) to open up the overlay of options in an alert. The interface can be changed to use [ion-action-sheet](action-sheet.md) or [ion-popover](popover.md) by passing `action-sheet` or `popover`, respectively, to the `interface` property. Read on to the other sections for the limitations of the different interfaces.
-
-### Alert
-
-import AlertExample from '@site/static/usage/v8/select/basic/single-selection/index.md';
-
-
-
-
-### Action Sheet
-
-import ActionSheetExample from '@site/static/usage/v8/select/interfaces/action-sheet/index.md';
-
-
-
-### Popover
-
-import PopoverExample from '@site/static/usage/v8/select/interfaces/popover/index.md';
-
-
-
-## Responding to Interaction
-
-The main ways of handling user interaction with the select are the `ionChange`, `ionDismiss`, and `ionCancel` events. See [Events](#events) for more details on these and other events that select fires.
-
-import RespondingToInteractionExample from '@site/static/usage/v8/select/basic/responding-to-interaction/index.md';
-
-
-
-## Object Value References
-
-When using objects for select values, it is possible for the identities of these objects to change if they are coming from a server or database, while the selected value's identity remains the same. For example, this can occur when an existing record with the desired object value is loaded into the select, but the newly retrieved select options now have different identities. This will result in the select appearing to have no value at all, even though the original selection in still intact.
-
-By default, the select uses strict equality (`===`) to determine if an option is selected. This can be overridden by providing a property name or a function to the `compareWith` property.
-
-### Using compareWith
-
-import UsingCompareWithExample from '@site/static/usage/v8/select/objects-as-values/using-comparewith/index.md';
-
-
-
-### Object Values and Multiple Selection
-
-import ObjectValuesAndMultipleSelectionExample from '@site/static/usage/v8/select/objects-as-values/multiple-selection/index.md';
-
-
-
-## Justification
-
-Developers can use the `justify` property to control how the label and control are packed on a line.
-
-import JustifyExample from '@site/static/usage/v8/select/justify/index.md';
-
-
-
-## Filled Selects
-
-Material Design offers filled styles for a select. The `fill` property on the select can be set to either `"solid"` or `"outline"`.
-
-Since the `fill` styles visually defines the select container, selects that use `fill` should not be used in `ion-item`.
-
-import FillExample from '@site/static/usage/v8/select/fill/index.md';
-
-
-
-## Select Buttons
-
-The alert supports two buttons: `Cancel` and `OK`. Each button's text can be customized using the `cancelText` and `okText` properties.
-
-The `action-sheet` and `popover` interfaces do not have an `OK` button, clicking on any of the options will automatically close the overlay and select that value. The `popover` interface does not have a `Cancel` button, clicking on the backdrop will close the overlay.
-
-import ButtonTextExample from '@site/static/usage/v8/select/customization/button-text/index.md';
-
-
-
-## Interface Options
-
-Since select uses the alert, action sheet and popover interfaces, options can be passed to these components through the `interfaceOptions` property. This can be used to pass a custom header, subheader, css class, and more.
-
-See the [ion-alert docs](alert.md), [ion-action-sheet docs](action-sheet.md), and [ion-popover docs](popover.md) for the properties that each interface accepts.
-
-Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
-
-import InterfaceOptionsExample from '@site/static/usage/v8/select/customization/interface-options/index.md';
-
-
-
-## Start and End Slots
-
-The `start` and `end` slots can be used to place icons, buttons, or prefix/suffix text on either side of the select. If the slot content is clicked, the select will not open.
-
-:::note
-In most cases, [Icon](./icon.md) components placed in these slots should have `aria-hidden="true"`. See the [Icon accessibility docs](https://ionicframework.com/docs/api/icon#accessibility) for more information.
-
-If slot content is meant to be interacted with, it should be wrapped in an interactive element such as a [Button](./button.md). This ensures that the content can be tabbed to.
-:::
-
-import StartEndSlots from '@site/static/usage/v7/select/start-end-slots/index.md';
-
-
-
-## Customization
-
-There are two units that make up the Select component and each need to be styled separately. The `ion-select` element is represented on the view by the selected value(s), or placeholder if there is none, and dropdown icon. The interface, which is defined in the [Interfaces](#interfaces) section above, is the dialog that opens when clicking on the `ion-select`. The interface contains all of the options defined by adding `ion-select-option` elements. The following sections will go over the differences between styling these.
-
-### Styling Select Element
-
-As mentioned, the `ion-select` element consists only of the value(s), or placeholder, and icon that is displayed on the view. To customize this, style using a combination of CSS and any of the [CSS custom properties](#css-custom-properties).
-
-Alternatively, depending on the [browser support](https://caniuse.com/#feat=mdn-css_selectors_part) needed, CSS shadow parts can be used to style the select. Notice that by using `::part`, any CSS property on the element can be targeted.
-
-import StylingSelectExample from '@site/static/usage/v8/select/customization/styling-select/index.md';
-
-
-
-### Styling Select Interface
-
-Customizing the interface dialog should be done by following the Customization section in that interface's documentation:
-
-- [Alert Customization](alert.md#customization)
-- [Action Sheet Customization](action-sheet.md#customization)
-- [Popover Customization](popover.md#customization)
-
-However, the Select Option does set a class for easier styling and allows for the ability to pass a class to the overlay option, see the [Select Options documentation](select-option.md) for usage examples of customizing options.
-
-### Custom Toggle Icons
-
-The icon that displays next to the select text can be set to any [Ionicon](https://ionic.io/ionicons) using the `toggleIcon` and/or `expandedIcon` properties.
-
-import CustomToggleIconsExample from '@site/static/usage/v8/select/customization/custom-toggle-icons/index.md';
-
-
-
-### Icon Flip Behavior
-
-By default, when the select is open, the toggle icon will automatically rotate on `md` mode and remain static on `ios` mode. This behavior can be customized using CSS.
-
-The below example also uses a [custom `toggleIcon`](#custom-toggle-icons) to better demonstrate the flip behavior on `ios`, since the default icon is vertically symmetrical.
-
-import IconFlipBehaviorExample from '@site/static/usage/v8/select/customization/icon-flip-behavior/index.md';
-
-
-
-## Typeahead Component
-
-Typeahead or autocomplete functionality can be built using existing Ionic components. We recommend using an `ion-modal` to make the best use of the available screen space.
-
-import TypeaheadExample from '@site/static/usage/v8/select/typeahead/index.md';
-
-
-
-## Interfaces
-
-### SelectChangeEventDetail
-
-```typescript
-interface SelectChangeEventDetail {
- value: T;
-}
-```
-
-### SelectCustomEvent
-
-While not required, this interface can be used in place of the `CustomEvent` interface for stronger typing with Ionic events emitted from this component.
-
-```typescript
-interface SelectCustomEvent extends CustomEvent {
- detail: SelectChangeEventDetail;
- target: HTMLIonSelectElement;
-}
-```
-
-## Migrating from Legacy Select Syntax
-
-A simpler select syntax was introduced in Ionic 7.0. This new syntax reduces the boilerplate required to setup an select, resolves accessibility issues, and improves the developer experience.
-
-Developers can perform this migration one select at a time. While developers can continue using the legacy syntax, we recommend migrating as soon as possible.
-
-
-### Using the Modern Syntax
-
-Using the modern syntax involves two steps:
-
-1. Remove `ion-label` and use the `label` property on `ion-select` instead. The placement of the label can be configured using the `labelPlacement` property on `ion-select`.
-2. Move any usage of `fill` and `shape` from `ion-item` on to `ion-select`.
-
-import Migration from '@site/static/usage/v8/select/migration/index.md';
-
-
-
-### Using the Legacy Syntax
-
-Ionic uses heuristics to detect if an app is using the modern select syntax. In some instances, it may be preferable to continue using the legacy syntax. Developers can set the `legacy` property on `ion-select` to `true` to force that instance of the input to use the legacy syntax.
-
-## Accessibility
-
-### Keyboard Interactions
-
-Ionic's keyboard interactions follow the implementation patterns of the web instead of the native iOS select for a consistent experience across all platforms.
-
-These keyboard interactions apply to all `ion-select` elements when the following conditions are met:
-- The select is closed.
-- The select is focused.
-- The select is not disabled.
-
-|Key|Description|
-|----|----|
-|Enter|Opens the overlay and focuses on the first selected option. If there is no selected option, then it focuses on the first option.|
-|Space|Opens the overlay and focuses on the first selected option. If there is no selected option, then it focuses on the first option.|
-
-
-#### Single Selection
-
-Single selection keyboard interaction follows the [ARIA implementation patterns of a radio](https://www.w3.org/WAI/ARIA/apg/patterns/radio/).
-
-
-These keyboard interactions apply to `ion-action-sheet`, `ion-alert`, and `ion-popover` elements when the overlay is presented and focused.
-
-|Key|Description|
-|----|----|
-|ArrowDown|Focuses and selects the next option in the list. If there is no next option, selection will cycle to the first option.|
-|ArrowLeft|Focuses and selects the previous option in the list. If there is no previous option, selection will cycle to the last option.|
-|ArrowRight|Focuses and selects the next option in the list. If there is no next option, selection will cycle to the first option.|
-|ArrowUp|Focuses and selects the previous option in the list. If there is no previous option, selection will cycle to the last option.|
-|Enter|If an option is focused, it will select the option. Overlays **without** an 'OK' button will commit the value immediately, dismiss the overlay and return focus to the `ion-select` element.