>;
+}
diff --git a/packages/angular/standalone/src/index.ts b/packages/angular/standalone/src/index.ts
index 15895b0fef..209fa25d77 100644
--- a/packages/angular/standalone/src/index.ts
+++ b/packages/angular/standalone/src/index.ts
@@ -24,7 +24,20 @@ export {
IonicRouteStrategy,
} from '@ionic/angular/common';
export { IonNav } from './navigation/nav';
-export { IonIcon } from './directives/icon';
+export {
+ IonCheckbox,
+ IonDatetime,
+ IonInput,
+ IonIcon,
+ IonRadioGroup,
+ IonRadio,
+ IonRange,
+ IonSearchbar,
+ IonSegment,
+ IonSelect,
+ IonTextarea,
+ IonToggle,
+} from './directives';
export * from './directives/proxies';
export {
diff --git a/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts b/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
new file mode 100644
index 0000000000..a8e1c36e90
--- /dev/null
+++ b/packages/angular/test/base/e2e/src/standalone/value-accessors.spec.ts
@@ -0,0 +1,132 @@
+
+describe('Value Accessors', () => {
+
+ describe('Checkbox', () => {
+ beforeEach(() => cy.visit('/standalone/value-accessors/checkbox'));
+
+ it('should update the form value', () => {
+ cy.get('#formValue').should('have.text', JSON.stringify({ checkbox: false }, null, 2));
+ cy.get('ion-checkbox').should('have.class', 'ion-pristine');
+
+ cy.get('ion-checkbox').click();
+
+ cy.get('#formValue').should('have.text', JSON.stringify({ checkbox: true }, null, 2));
+ cy.get('ion-checkbox').should('have.class', 'ion-dirty');
+ cy.get('ion-checkbox').should('have.class', 'ion-valid');
+ });
+ });
+
+ describe('Input', () => {
+ beforeEach(() => cy.visit('/standalone/value-accessors/input'));
+
+ it('should update the form value', () => {
+ cy.get('#formValue').should('have.text', JSON.stringify({
+ inputString: '',
+ inputNumber: ''
+ }, null, 2));
+ cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-pristine');
+ cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-pristine');
+
+ cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-invalid');
+ cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-invalid');
+
+ cy.get('ion-input[formControlName="inputString"] input').type('test');
+ cy.get('ion-input[formControlName="inputString"] input').blur();
+
+ cy.get('ion-input[formControlName="inputNumber"] input').type(1);
+ cy.get('ion-input[formControlName="inputNumber"] input').blur();
+
+ cy.get('#formValue').should('have.text', JSON.stringify({
+ inputString: 'test',
+ inputNumber: 1
+ }, null, 2));
+
+ cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-dirty');
+ cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-dirty');
+
+ cy.get('ion-input[formControlName="inputString"]').should('have.class', 'ion-valid');
+ cy.get('ion-input[formControlName="inputNumber"]').should('have.class', 'ion-valid');
+
+ });
+ });
+
+ describe('Radio Group', () => {
+ beforeEach(() => cy.visit('/standalone/value-accessors/radio-group'));
+
+ it('should update the form value', () => {
+ cy.get('#formValue').should('have.text', JSON.stringify({ radioGroup: '1' }, null, 2));
+ cy.get('ion-radio-group').should('have.class', 'ion-pristine');
+
+ cy.get('ion-radio').contains('Two').click();
+
+ cy.get('#formValue').should('have.text', JSON.stringify({ radioGroup: '2' }, null, 2));
+ cy.get('ion-radio-group').should('have.class', 'ion-dirty');
+ cy.get('ion-radio-group').should('have.class', 'ion-valid');
+ });
+ });
+
+ describe('Searchbar', () => {
+ beforeEach(() => cy.visit('/standalone/value-accessors/searchbar'));
+
+ it('should update the form value', () => {
+ cy.get('#formValue').should('have.text', JSON.stringify({ searchbar: '' }, null, 2));
+ cy.get('ion-searchbar').should('have.class', 'ion-pristine');
+ cy.get('ion-searchbar').should('have.class', 'ion-invalid');
+
+ cy.get('ion-searchbar').type('test');
+ cy.get('ion-searchbar input').blur();
+
+ cy.get('#formValue').should('have.text', JSON.stringify({ searchbar: 'test' }, null, 2));
+ cy.get('ion-searchbar').should('have.class', 'ion-dirty');
+ cy.get('ion-searchbar').should('have.class', 'ion-valid');
+ });
+ });
+
+ describe('Segment', () => {
+ beforeEach(() => cy.visit('/standalone/value-accessors/segment'));
+
+ it('should update the form value', () => {
+ cy.get('#formValue').should('have.text', JSON.stringify({ segment: 'Paid' }, null, 2));
+ cy.get('ion-segment').should('have.class', 'ion-pristine');
+
+ cy.get('ion-segment-button').eq(1).click();
+
+ cy.get('#formValue').should('have.text', JSON.stringify({ segment: 'Free' }, null, 2));
+ cy.get('ion-segment').should('have.class', 'ion-dirty');
+ cy.get('ion-segment').should('have.class', 'ion-valid');
+ });
+ });
+
+ describe('Textarea', () => {
+ beforeEach(() => cy.visit('/standalone/value-accessors/textarea'));
+
+ it('should update the form value', () => {
+ cy.get('#formValue').should('have.text', JSON.stringify({ textarea: '' }, null, 2));
+ cy.get('ion-textarea').should('have.class', 'ion-pristine');
+ cy.get('ion-textarea').should('have.class', 'ion-invalid');
+
+ cy.get('ion-textarea').click();
+ cy.get('ion-textarea').type('test');
+
+ cy.get('#formValue').should('have.text', JSON.stringify({ textarea: 'test' }, null, 2));
+ cy.get('ion-textarea').should('have.class', 'ion-dirty');
+ cy.get('ion-textarea').should('have.class', 'ion-valid');
+ });
+ });
+
+ describe('Toggle', () => {
+ beforeEach(() => cy.visit('/standalone/value-accessors/toggle'));
+
+ it('should update the form value', () => {
+ cy.get('#formValue').should('have.text', JSON.stringify({ toggle: false }, null, 2));
+ cy.get('ion-toggle').should('have.class', 'ion-pristine');
+
+ cy.get('ion-toggle').click();
+
+ cy.get('#formValue').should('have.text', JSON.stringify({ toggle: true }, null, 2));
+ cy.get('ion-toggle').should('have.class', 'ion-dirty');
+ cy.get('ion-toggle').should('have.class', 'ion-valid');
+ });
+ });
+
+});
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 d97d34c66b..93e869651a 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
@@ -26,6 +26,21 @@ export const routes: Routes = [
{ path: 'tab-three', loadComponent: () => import('../tabs/tab3.component').then(c => c.TabThreeComponent) }
]
},
+ {
+ path: 'value-accessors',
+ children: [
+ { path: 'checkbox', loadComponent: () => import('../value-accessors/checkbox/checkbox.component').then(c => c.CheckboxComponent) },
+ { path: 'datetime', loadComponent: () => import('../value-accessors/datetime/datetime.component').then(c => c.DatetimeComponent) },
+ { path: 'input', loadComponent: () => import('../value-accessors/input/input.component').then(c => c.InputComponent) },
+ { path: 'radio-group', loadComponent: () => import('../value-accessors/radio-group/radio-group.component').then(c => c.RadioGroupComponent) },
+ { path: 'range', loadComponent: () => import('../value-accessors/range/range.component').then(c => c.RangeComponent) },
+ { path: 'searchbar', loadComponent: () => import('../value-accessors/searchbar/searchbar.component').then(c => c.SearchbarComponent) },
+ { path: 'segment', loadComponent: () => import('../value-accessors/segment/segment.component').then(c => c.SegmentComponent) },
+ { path: 'textarea', loadComponent: () => import('../value-accessors/textarea/textarea.component').then(c => c.TextareaComponent) },
+ { path: 'toggle', loadComponent: () => import('../value-accessors/toggle/toggle.component').then(c => c.ToggleComponent) },
+ { path: '**', redirectTo: 'checkbox' }
+ ]
+ }
]
},
];
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html
new file mode 100644
index 0000000000..2921e06b91
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.html
@@ -0,0 +1,11 @@
+
+
IonCheckbox Value Accessors
+
+ This test checks the form integrations with ion-checkbox to make sure values are correctly assigned to the form
+ group.
+
+
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts
new file mode 100644
index 0000000000..d58672d954
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/checkbox/checkbox.component.ts
@@ -0,0 +1,25 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonCheckbox } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-checkbox',
+ templateUrl: 'checkbox.component.html',
+ standalone: true,
+ imports: [
+ IonCheckbox,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class CheckboxComponent {
+
+ form = this.fb.group({
+ checkbox: [false, Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/datetime/datetime.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/datetime/datetime.component.html
new file mode 100644
index 0000000000..22c3633971
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/datetime/datetime.component.html
@@ -0,0 +1,11 @@
+
+
IonDatetime Value Accessors
+
+ This test checks the form integrations with ion-datetime to make sure values are correctly assigned to the form
+ group.
+
+
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/datetime/datetime.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/datetime/datetime.component.ts
new file mode 100644
index 0000000000..7d647e7e03
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/datetime/datetime.component.ts
@@ -0,0 +1,25 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonDatetime } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-datetime',
+ templateUrl: 'datetime.component.html',
+ standalone: true,
+ imports: [
+ IonDatetime,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class DatetimeComponent {
+
+ form = this.fb.group({
+ datetime: ['2023-05-10T04:00:00', Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/input/input.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/input/input.component.html
new file mode 100644
index 0000000000..e63235cea5
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/input/input.component.html
@@ -0,0 +1,11 @@
+
+
IonInput Value Accessors
+
+ This test checks the form integrations with ion-input to make sure values are correctly assigned to the form group.
+
+
+
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/input/input.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/input/input.component.ts
new file mode 100644
index 0000000000..1afa4a3b01
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/input/input.component.ts
@@ -0,0 +1,26 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonInput } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-input',
+ templateUrl: 'input.component.html',
+ standalone: true,
+ imports: [
+ IonInput,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent,
+ ]
+})
+export class InputComponent {
+
+ form = this.fb.group({
+ inputString: ['', Validators.required],
+ inputNumber: ['', Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/radio-group/radio-group.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/radio-group/radio-group.component.html
new file mode 100644
index 0000000000..a511dbbbe5
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/radio-group/radio-group.component.html
@@ -0,0 +1,14 @@
+
+
IonRadioGroup Value Accessors
+
+ This test checks the form integrations with ion-radio-group to make sure values are correctly assigned to the form
+ group.
+
+
+
+
+ One
+ Two
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/radio-group/radio-group.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/radio-group/radio-group.component.ts
new file mode 100644
index 0000000000..b4890240c5
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/radio-group/radio-group.component.ts
@@ -0,0 +1,26 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonRadioGroup, IonRadio } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-radio-group',
+ templateUrl: 'radio-group.component.html',
+ standalone: true,
+ imports: [
+ IonRadioGroup,
+ IonRadio,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class RadioGroupComponent {
+
+ form = this.fb.group({
+ radioGroup: ['1', Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/range/range.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/range/range.component.html
new file mode 100644
index 0000000000..9a496fbcd3
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/range/range.component.html
@@ -0,0 +1,9 @@
+
+
IonRange Value Accessors
+
+ This test checks the form integrations with ion-range to make sure values are correctly assigned to the form group.
+
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/range/range.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/range/range.component.ts
new file mode 100644
index 0000000000..f303826524
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/range/range.component.ts
@@ -0,0 +1,25 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonRange } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-range',
+ templateUrl: 'range.component.html',
+ standalone: true,
+ imports: [
+ IonRange,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class RangeComponent {
+
+ form = this.fb.group({
+ range: [0, Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/searchbar/searchbar.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/searchbar/searchbar.component.html
new file mode 100644
index 0000000000..9a6137c65b
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/searchbar/searchbar.component.html
@@ -0,0 +1,10 @@
+
+
IonSearchbar Value Accessors
+
+ This test checks the form integrations with ion-searchbar to make sure values are correctly assigned to the form
+ group.
+
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/searchbar/searchbar.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/searchbar/searchbar.component.ts
new file mode 100644
index 0000000000..6113ed5ddc
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/searchbar/searchbar.component.ts
@@ -0,0 +1,25 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonSearchbar } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-searchbar',
+ templateUrl: 'searchbar.component.html',
+ standalone: true,
+ imports: [
+ IonSearchbar,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class SearchbarComponent {
+
+ form = this.fb.group({
+ searchbar: ['', Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/segment/segment.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/segment/segment.component.html
new file mode 100644
index 0000000000..98016fcde6
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/segment/segment.component.html
@@ -0,0 +1,18 @@
+
+
IonSegment Value Accessors
+
+ This test checks the form integrations with ion-segment to make sure values are correctly assigned to the form
+ group.
+
+
+
+
+
+ Paid
+
+
+ Free
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/segment/segment.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/segment/segment.component.ts
new file mode 100644
index 0000000000..d3de204881
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/segment/segment.component.ts
@@ -0,0 +1,27 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonSegment, IonSegmentButton, IonLabel } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-segment',
+ templateUrl: 'segment.component.html',
+ standalone: true,
+ imports: [
+ IonSegment,
+ IonSegmentButton,
+ IonLabel,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class SegmentComponent {
+
+ form = this.fb.group({
+ segment: ['Paid', Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/textarea/textarea.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/textarea/textarea.component.html
new file mode 100644
index 0000000000..678d42d391
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/textarea/textarea.component.html
@@ -0,0 +1,11 @@
+
+
IonTextarea Value Accessors
+
+ This test checks the form integrations with ion-textarea to make sure values are correctly assigned to the form
+ group.
+
+
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/textarea/textarea.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/textarea/textarea.component.ts
new file mode 100644
index 0000000000..9410c03dce
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/textarea/textarea.component.ts
@@ -0,0 +1,25 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonTextarea } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-textarea',
+ templateUrl: 'textarea.component.html',
+ standalone: true,
+ imports: [
+ IonTextarea,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class TextareaComponent {
+
+ form = this.fb.group({
+ textarea: ['', Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/toggle/toggle.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/toggle/toggle.component.html
new file mode 100644
index 0000000000..08888059f9
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/toggle/toggle.component.html
@@ -0,0 +1,10 @@
+
+
IonToggle Value Accessors
+
+ This test checks the form integrations with ion-toggle to make sure values are correctly assigned to the form group.
+
+
+
+
+
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/toggle/toggle.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/toggle/toggle.component.ts
new file mode 100644
index 0000000000..3b72b4c16d
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/toggle/toggle.component.ts
@@ -0,0 +1,25 @@
+import { Component } from "@angular/core";
+import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
+import { IonToggle } from "@ionic/angular/standalone";
+import { ValueAccessorTestComponent } from "../value-accessor-test/value-accessor-test.component";
+
+@Component({
+ selector: 'app-toggle',
+ templateUrl: 'toggle.component.html',
+ standalone: true,
+ imports: [
+ IonToggle,
+ ReactiveFormsModule,
+ FormsModule,
+ ValueAccessorTestComponent
+ ]
+})
+export class ToggleComponent {
+
+ form = this.fb.group({
+ toggle: [false, Validators.required],
+ });
+
+ constructor(private fb: FormBuilder) { }
+
+}
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/value-accessor-test/value-accessor-test.component.html b/packages/angular/test/base/src/app/standalone/value-accessors/value-accessor-test/value-accessor-test.component.html
new file mode 100644
index 0000000000..754b47c799
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/value-accessor-test/value-accessor-test.component.html
@@ -0,0 +1,16 @@
+
diff --git a/packages/angular/test/base/src/app/standalone/value-accessors/value-accessor-test/value-accessor-test.component.ts b/packages/angular/test/base/src/app/standalone/value-accessors/value-accessor-test/value-accessor-test.component.ts
new file mode 100644
index 0000000000..6796f64564
--- /dev/null
+++ b/packages/angular/test/base/src/app/standalone/value-accessors/value-accessor-test/value-accessor-test.component.ts
@@ -0,0 +1,27 @@
+import { CommonModule, JsonPipe, KeyValuePipe } from "@angular/common";
+import { Component, Input } from "@angular/core";
+import { FormGroup, FormsModule, ReactiveFormsModule } from "@angular/forms";
+
+@Component({
+ selector: 'app-value-accessor-test',
+ templateUrl: 'value-accessor-test.component.html',
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ FormsModule,
+ JsonPipe,
+ KeyValuePipe,
+ /**
+ * NgFor directive is not available until Angular 15.
+ * We import the CommonModule for now.
+ *
+ * TODO: FW-5197 Replace with NgFor when dropping Angular 14 support.
+ */
+ CommonModule
+ ]
+})
+export class ValueAccessorTestComponent {
+
+ @Input() formGroup!: FormGroup;
+
+}