diff --git a/docs/api/picker-legacy.md b/docs/api/picker-legacy.md
deleted file mode 100644
index 19813672ab7..00000000000
--- a/docs/api/picker-legacy.md
+++ /dev/null
@@ -1,151 +0,0 @@
----
-title: "ion-picker-legacy"
----
-import Props from '@ionic-internal/component-api/v9/picker-legacy/props.md';
-import Events from '@ionic-internal/component-api/v9/picker-legacy/events.md';
-import Methods from '@ionic-internal/component-api/v9/picker-legacy/methods.md';
-import Parts from '@ionic-internal/component-api/v9/picker-legacy/parts.md';
-import CustomProps from '@ionic-internal/component-api/v9/picker-legacy/custom-props.mdx';
-import Slots from '@ionic-internal/component-api/v9/picker-legacy/slots.md';
-
-
- ion-picker-legacy: A Dialog That Displays Buttons and Columns
-
-
-
-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.
-
-:::
-
-A Picker is a dialog that displays a row of buttons and columns underneath. It appears on top of the app's content, and at the bottom of the viewport.
-
-## Inline Pickers (Recommended)
-
-`ion-picker-legacy` 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 Picker.
-
-import Trigger from '@site/static/usage/v9/picker-legacy/inline/trigger/index.md';
-
-
-
-### Using `isOpen`
-
-The `isOpen` property on `ion-picker-legacy` allows developers to control the presentation state of the Picker from their application state. This means when `isOpen` is set to `true` the Picker will be presented, and when `isOpen` is set to `false` the Picker will be dismissed.
-
-`isOpen` uses a one-way data binding, meaning it will not automatically be set to `false` when the Picker is dismissed. Developers should listen for the `ionPickerDidDismiss` or `didDismiss` event and set `isOpen` to `false`. The reason for this is it prevents the internals of `ion-picker` from being tightly coupled with the state of the application. With a one way data binding, the Picker only needs to concern itself with the boolean value that the reactive variable provides. With a two way data binding, the Picker 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/v9/picker-legacy/inline/isOpen/index.md';
-
-
-
-## Controller Pickers
-
-The `pickerController` can be used in situations where more control is needed over when the Picker is presented and dismissed.
-
-import Controller from '@site/static/usage/v9/picker-legacy/controller/index.md';
-
-
-
-## Multiple Columns
-
-The `columns` property can be used to display a Picker with multiple columns of different options.
-
-import MultipleColumn from '@site/static/usage/v9/picker-legacy/multiple-column/index.md';
-
-
-
-## Interfaces
-
-### PickerButton
-
-```typescript
-interface PickerButton {
- text?: string;
- role?: string;
- cssClass?: string | string[];
- handler?: (value: any) => boolean | void;
-}
-```
-
-### PickerColumn
-
-```typescript
-interface PickerColumn {
- name: string;
- align?: string;
- /**
- * Changing this value allows the initial value of a picker column to be set.
- */
- selectedIndex?: number;
- prevSelected?: number;
- prefix?: string;
- suffix?: string;
- options: PickerColumnOption[];
- cssClass?: string | string[];
- columnWidth?: string;
- prefixWidth?: string;
- suffixWidth?: string;
- optionsWidth?: string;
-}
-```
-
-### PickerColumnOption
-
-```typescript
-interface PickerColumnOption {
- text?: string;
- value?: any;
- disabled?: boolean;
- duration?: number;
- transform?: string;
- selected?: boolean;
- /**
- * The optional text to assign as the aria-label on the picker column option.
- */
- ariaLabel?: string;
-}
-```
-
-### PickerOptions
-
-```typescript
-interface PickerOptions {
- columns: PickerColumn[];
- buttons?: PickerButton[];
- cssClass?: string | string[];
- showBackdrop?: boolean;
- backdropDismiss?: 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/developing/config.md b/docs/developing/config.md
index 5204feb4f89..2fdef3f0e48 100644
--- a/docs/developing/config.md
+++ b/docs/developing/config.md
@@ -193,8 +193,6 @@ Below are the config options that Ionic uses.
| `modalLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-modal`, overriding the default "animation". |
| `mode` | `Mode` | The mode determines which platform styles to use for the whole application. |
| `navAnimation` | `AnimationBuilder` | Overrides the default "animation" of all `ion-nav` and `ion-router-outlet` across the whole application. |
-| `pickerEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-picker`, overriding the default "animation". |
-| `pickerLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-picker`, overriding the default "animation". |
| `platform` | [`PlatformConfig`](/docs/angular/platform#customizing-platform-detection-methods) | Overrides the default platform detection methods. |
| `popoverEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-popover`, overriding the default "animation". |
| `popoverLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-popover`, overriding the default "animation". |
diff --git a/docs/updating/9-0.md b/docs/updating/9-0.md
index 64beb278479..f0df6db52d2 100644
--- a/docs/updating/9-0.md
+++ b/docs/updating/9-0.md
@@ -258,6 +258,10 @@ npm install @ionic/vue@latest @ionic/vue-router@latest
npm install @ionic/core@latest
```
+### Legacy Picker
+
+1. Remove any usages of the `ion-picker-legacy` and `ion-picker-column-legacy` components. These components have been removed in Ionic 9. Use the [Picker](../api/picker.md#picker-in-modal) component instead.
+
## Need Help Upgrading?
Be sure to look at the [Ionic 9 Breaking Changes Guide](https://github.com/ionic-team/ionic-framework/blob/main/BREAKING.md#version-9x) for the complete list of breaking changes. This upgrade guide only covers changes that require action from developers.
diff --git a/sidebars.js b/sidebars.js
index aafb6c47ff3..661395b2463 100644
--- a/sidebars.js
+++ b/sidebars.js
@@ -326,14 +326,7 @@ module.exports = {
type: 'category',
label: 'Date & Time Pickers',
collapsed: false,
- items: [
- 'api/datetime',
- 'api/datetime-button',
- 'api/picker',
- 'api/picker-column',
- 'api/picker-column-option',
- 'api/picker-legacy',
- ],
+ items: ['api/datetime', 'api/datetime-button', 'api/picker', 'api/picker-column', 'api/picker-column-option'],
},
{
type: 'category',
diff --git a/static/usage/v9/picker-legacy/controller/angular/example_component_html.md b/static/usage/v9/picker-legacy/controller/angular/example_component_html.md
deleted file mode 100644
index 1e25fa99c40..00000000000
--- a/static/usage/v9/picker-legacy/controller/angular/example_component_html.md
+++ /dev/null
@@ -1,3 +0,0 @@
-```html
-Open
-```
diff --git a/static/usage/v9/picker-legacy/controller/angular/example_component_ts.md b/static/usage/v9/picker-legacy/controller/angular/example_component_ts.md
deleted file mode 100644
index 35edd60c597..00000000000
--- a/static/usage/v9/picker-legacy/controller/angular/example_component_ts.md
+++ /dev/null
@@ -1,56 +0,0 @@
-```ts
-import { Component } from '@angular/core';
-import { IonButton, PickerController } from '@ionic/angular/standalone';
-
-@Component({
- selector: 'app-example',
- templateUrl: 'example.component.html',
- styleUrls: ['example.component.css'],
- imports: [IonButton],
-})
-export class ExampleComponent {
- constructor(private pickerCtrl: PickerController) {}
-
- async openPicker() {
- const picker = await this.pickerCtrl.create({
- columns: [
- {
- name: 'languages',
- options: [
- {
- text: 'JavaScript',
- value: 'javascript',
- },
- {
- text: 'TypeScript',
- value: 'typescript',
- },
- {
- text: 'Rust',
- value: 'rust',
- },
- {
- text: 'C#',
- value: 'c#',
- },
- ],
- },
- ],
- buttons: [
- {
- text: 'Cancel',
- role: 'cancel',
- },
- {
- text: 'Confirm',
- handler: (value) => {
- console.log(`You selected: ${value.languages.value}`);
- },
- },
- ],
- });
-
- await picker.present();
- }
-}
-```
diff --git a/static/usage/v9/picker-legacy/controller/demo.html b/static/usage/v9/picker-legacy/controller/demo.html
deleted file mode 100644
index 2c584d6bec0..00000000000
--- a/static/usage/v9/picker-legacy/controller/demo.html
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
- Picker Legacy | Controller
-
-
-
-
-
-
-
-
-
-
-