diff --git a/packages/angular/common/src/index.ts b/packages/angular/common/src/index.ts
index 74bc82f3c80..7229a93a0d1 100644
--- a/packages/angular/common/src/index.ts
+++ b/packages/angular/common/src/index.ts
@@ -30,3 +30,5 @@ export {
} from './directives/navigation/router-link-delegate';
export { NavDelegate } from './directives/navigation/nav-delegate';
export { IonTabs } from './directives/navigation/tabs';
+
+export { ProxyCmp } from './utils/proxy';
diff --git a/packages/angular/standalone/src/index.ts b/packages/angular/standalone/src/index.ts
index a5a128b2514..f5fc4e8273d 100644
--- a/packages/angular/standalone/src/index.ts
+++ b/packages/angular/standalone/src/index.ts
@@ -1,3 +1 @@
-// This is required to get ng-packagr to build.
-// Remove this when you actually have something to export
-export const placeholder = true;
+export { IonRouterOutlet } from './navigation/router-outlet';
diff --git a/packages/angular/standalone/src/navigation/router-outlet.ts b/packages/angular/standalone/src/navigation/router-outlet.ts
new file mode 100644
index 00000000000..2b750736e06
--- /dev/null
+++ b/packages/angular/standalone/src/navigation/router-outlet.ts
@@ -0,0 +1,13 @@
+import { Directive } from '@angular/core';
+import { IonRouterOutlet as IonRouterOutletBase, ProxyCmp } from '@ionic/angular/common';
+import { defineCustomElement } from '@ionic/core/components/ion-router-outlet.js';
+
+@ProxyCmp({
+ defineCustomElementFn: defineCustomElement,
+})
+@Directive({
+ selector: 'ion-router-outlet',
+ standalone: true,
+})
+// eslint-disable-next-line @angular-eslint/directive-class-suffix
+export class IonRouterOutlet extends IonRouterOutletBase {}
diff --git a/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts b/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts
new file mode 100644
index 00000000000..37beac46fc8
--- /dev/null
+++ b/packages/angular/test/base/e2e/src/standalone/router-outlet.spec.ts
@@ -0,0 +1,9 @@
+describe('Router Outlet', () => {
+ beforeEach(() => {
+ cy.visit('/standalone/router-outlet');
+ })
+
+ it('should render a as a child page of the router outlet', () => {
+ cy.ionPageVisible('ion-router-outlet app-router-outlet');
+ });
+})
diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html
index 0680b43f9c6..15a92a22447 100644
--- a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html
+++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.html
@@ -1 +1 @@
-
+
diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts
index b8ba6d5caa7..280de0d8c76 100644
--- a/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts
+++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.component.ts
@@ -1,6 +1,6 @@
import { Component } from '@angular/core';
import { RouterModule } from '@angular/router';
-
+import { IonRouterOutlet } from '@ionic/angular/standalone';
/**
* This temporary code initialized Ionic and ensures components are visible.
* TODO FW-4766 Can be removed when ticket is implemented
@@ -15,7 +15,7 @@ document.querySelector('html')!.classList.add('ion-ce')
selector: 'app-root-standalone',
templateUrl: './app.component.html',
standalone: true,
- imports: [RouterModule]
+ imports: [RouterModule, IonRouterOutlet]
})
export class AppComponent {
}
diff --git a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts
index 3182d3167a2..a453e1e46e3 100644
--- a/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts
+++ b/packages/angular/test/base/src/app/standalone/app-standalone/app.routes.ts
@@ -7,6 +7,7 @@ export const routes: Routes = [
component: AppComponent,
children: [
{ path: 'test', loadComponent: () => import('../test/test.component').then(m => m.TestComponent) },
+ { path: 'router-outlet', loadComponent: () => import('../router-outlet/router-outlet.component').then(m => m.RouterOutletComponent) },
]
},
];
diff --git a/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.html b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.html
new file mode 100644
index 00000000000..83a1ae37758
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.html
@@ -0,0 +1 @@
+This should be visible and rendered inside of an ion-router-outlet.
diff --git a/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.ts b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.ts
new file mode 100644
index 00000000000..c28ea0e309d
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/router-outlet/router-outlet.component.ts
@@ -0,0 +1,8 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-router-outlet',
+ templateUrl: './router-outlet.component.html',
+ standalone: true
+})
+export class RouterOutletComponent {}