diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 20ed118..f0a1eb0 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -14,6 +14,7 @@
"@angular/forms": "^20.3.0",
"@angular/platform-browser": "^20.3.0",
"@angular/router": "^20.3.0",
+ "@hugeicons/core-free-icons": "^2.0.0",
"@tailwindcss/postcss": "^4.1.17",
"postcss": "^8.5.6",
"rxjs": "~7.8.0",
@@ -1356,6 +1357,12 @@
"node": ">=18"
}
},
+ "node_modules/@hugeicons/core-free-icons": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@hugeicons/core-free-icons/-/core-free-icons-2.0.0.tgz",
+ "integrity": "sha512-OSfv5k0iB0yG61dcfK7jcf00AIK8EXyQOgtcNJzSBFvm88n9VOelkxihZHJnNwDUFpO/jZI3vZSVp6i1dmRvJQ==",
+ "license": "MIT"
+ },
"node_modules/@inquirer/ansi": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index e21c412..9949e50 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -28,6 +28,7 @@
"@angular/forms": "^20.3.0",
"@angular/platform-browser": "^20.3.0",
"@angular/router": "^20.3.0",
+ "@hugeicons/core-free-icons": "^2.0.0",
"@tailwindcss/postcss": "^4.1.17",
"postcss": "^8.5.6",
"rxjs": "~7.8.0",
diff --git a/frontend/src/app/app.html b/frontend/src/app/app.html
index c4b8b19..9ae70bb 100644
--- a/frontend/src/app/app.html
+++ b/frontend/src/app/app.html
@@ -66,37 +66,7 @@
-
-
- Most Popular
-
-
-
{{ plan.name }}
-
{{ plan.price }}
-
/month
-
-
-
- -
-
- {{ feature }}
-
-
-
+
-
+
-
+
\ No newline at end of file
diff --git a/frontend/src/app/app.ts b/frontend/src/app/app.ts
index cc4f720..6fbf1ae 100644
--- a/frontend/src/app/app.ts
+++ b/frontend/src/app/app.ts
@@ -1,19 +1,21 @@
import { CommonModule } from '@angular/common';
-import { Component, OnDestroy, OnInit, HostListener } from '@angular/core';
+import { Component, OnDestroy, OnInit, HostListener, signal } from '@angular/core';
import { Navigation } from './components/navigation/navigation';
import { Feature } from './interfaces/feature';
import { Plan } from './interfaces/plan';
import { Stat } from './interfaces/stat';
import { Footer } from './components/footer/footer';
import { ContactModal } from './components/contact-modal/contact-modal';
+import { PriceCard } from './components/price-card/price-card';
@Component({
selector: 'app-root',
- imports: [CommonModule, Navigation, Footer, ContactModal],
+ imports: [CommonModule, Navigation, Footer, ContactModal, PriceCard],
templateUrl: './app.html',
styleUrl: './app.css'
})
export class App implements OnInit, OnDestroy {
+ contactOpen = signal(false);
mobileMenuOpen = false;
scrolled = false;
diff --git a/frontend/src/app/components/contact-modal/contact-modal.html b/frontend/src/app/components/contact-modal/contact-modal.html
index daf5632..57c7501 100644
--- a/frontend/src/app/components/contact-modal/contact-modal.html
+++ b/frontend/src/app/components/contact-modal/contact-modal.html
@@ -1,13 +1,13 @@
-
diff --git a/frontend/src/app/components/contact-modal/contact-modal.ts b/frontend/src/app/components/contact-modal/contact-modal.ts
index 93d1014..9837026 100644
--- a/frontend/src/app/components/contact-modal/contact-modal.ts
+++ b/frontend/src/app/components/contact-modal/contact-modal.ts
@@ -8,7 +8,7 @@ import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angula
styles: ``,
})
export class ContactModal {
- open = model(false);
+ open = model.required();
contactForm = new FormGroup({
name: new FormControl(''),
@@ -17,7 +17,7 @@ export class ContactModal {
}, { validators: Validators.required })
toggleOpen() {
- this.open.update(value => !value);
+ this.open.update(prev => !prev);
}
handleSubmit() {
diff --git a/frontend/src/app/components/footer/footer.html b/frontend/src/app/components/footer/footer.html
index 9b00cec..551328b 100644
--- a/frontend/src/app/components/footer/footer.html
+++ b/frontend/src/app/components/footer/footer.html
@@ -11,7 +11,7 @@
\ No newline at end of file
diff --git a/frontend/src/app/components/footer/footer.ts b/frontend/src/app/components/footer/footer.ts
index 61dbaee..9ec4365 100644
--- a/frontend/src/app/components/footer/footer.ts
+++ b/frontend/src/app/components/footer/footer.ts
@@ -1,4 +1,4 @@
-import { Component } from '@angular/core';
+import { Component, model } from '@angular/core';
@Component({
selector: 'app-footer',
@@ -7,5 +7,9 @@ import { Component } from '@angular/core';
styles: ``,
})
export class Footer {
+ contactOpen = model.required();
+ toggleContactModal() {
+ this.contactOpen.update(prev => !prev);
+ }
}
diff --git a/frontend/src/app/components/price-card/price-card.html b/frontend/src/app/components/price-card/price-card.html
new file mode 100644
index 0000000..72d4bfd
--- /dev/null
+++ b/frontend/src/app/components/price-card/price-card.html
@@ -0,0 +1,30 @@
+
+
+ Most Popular
+
+
+
{{ plan().name }}
+
{{ plan().price }}
+
/month
+
+
+
+ -
+
+ {{ feature }}
+
+
+
\ No newline at end of file
diff --git a/frontend/src/app/components/price-card/price-card.spec.ts b/frontend/src/app/components/price-card/price-card.spec.ts
new file mode 100644
index 0000000..7c1b89e
--- /dev/null
+++ b/frontend/src/app/components/price-card/price-card.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PriceCard } from './price-card';
+
+describe('PriceCard', () => {
+ let component: PriceCard;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [PriceCard]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(PriceCard);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/frontend/src/app/components/price-card/price-card.ts b/frontend/src/app/components/price-card/price-card.ts
new file mode 100644
index 0000000..0ab7d85
--- /dev/null
+++ b/frontend/src/app/components/price-card/price-card.ts
@@ -0,0 +1,13 @@
+import { Component, input } from '@angular/core';
+import { Plan } from '../../interfaces/plan';
+import { CommonModule } from '@angular/common';
+
+@Component({
+ selector: 'app-price-card',
+ imports: [CommonModule],
+ templateUrl: './price-card.html',
+ styles: ``,
+})
+export class PriceCard {
+ plan = input.required();
+}