-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
Connect with Your Ideal Business Opportunity
+
BizMatch is your trusted partner in buying, selling, and valuing businesses in Texas.
+
+
+

+
+
+
+
+
-
-
-
- @for (city of cities$ | async; track city.id) { @let state = city.type==='city'?city.content.state:''; @let separator = city.type==='city'?' - ':'';
- {{ city.content.name }}{{ separator }}{{ state }}
- }
-
-
-
- @if (criteria.radius && !aiSearch){
-
-
-
-
-
-
-
-
- }
-
- @if(getNumberOfFiltersSet()>0 && numberOfResults$){
-
- }@else {
-
- }
-
+
+
+
+
+
Our Services
+
We offer comprehensive business brokerage services to help you navigate the complex process of buying or selling a business.
+
+
+
+
+
+
+
- }
-
+
Business Sales
+
We help business owners prepare and market their businesses to qualified buyers, ensuring confidentiality throughout the process.
+
+
+
+
+
+
+
+
Business Acquisitions
+
We assist buyers in finding the right business opportunity, perform due diligence, and negotiate favorable terms for acquisition.
+
+
+
+
+
+
+
+
Business Valuation
+
Our expert team provides accurate business valuations based on industry standards, financial performance, and market conditions.
+
+
+
+
+
+
+
See How We Work
+
+
+
+
+
+
+
+
+
+
+
+
Why Choose BizMatch
+
With decades of experience in the business brokerage industry, we provide unparalleled service to our clients.
+
+
+
+
+
+
+
+
Experience
+
Over 25 years of combined experience in business brokerage.
+
+
+
+
+
+
+
+
Confidentiality
+
We maintain strict confidentiality throughout the entire transaction process.
+
+
+
+
+
+
+
+
Network
+
Extensive network of qualified buyers and business owners throughout Texas.
+
+
+
+
+
+
+
+
Personalized Approach
+
Customized strategy for each client based on their unique business goals.
-
-
+
+
+
+
+
+
+
+
+
Visit Our Office
+
Our team of business brokers is ready to assist you at our Corpus Christi location.
+
+
BizMatch Headquarters
+
1001 Blucher Street
+
Corpus Christi, TX 78401
+
United States
+
Phone: (555) 123-4567
+
Email: info@bizmatch.net
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bizmatch/src/app/pages/home/home.component.scss b/bizmatch/src/app/pages/home/home.component.scss
index 8dc75a8..a9a03fd 100644
--- a/bizmatch/src/app/pages/home/home.component.scss
+++ b/bizmatch/src/app/pages/home/home.component.scss
@@ -1,72 +1,45 @@
-.bg-cover-custom {
- background-image: url('/assets/images/index-bg.webp');
- background-size: cover;
- background-position: center;
- border-radius: 20px;
+// Hero section styles
+.hero-section {
+ background: linear-gradient(135deg, #0046b5 0%, #00a0e9 100%);
+ // height: 70vh; // Made shorter as requested
+ // min-height: 500px; // Reduced from 600px
}
-select:not([size]) {
- background-image: unset;
-}
-[type='text'],
-[type='email'],
-[type='url'],
-[type='password'],
-[type='number'],
-[type='date'],
-[type='datetime-local'],
-[type='month'],
-[type='search'],
-[type='tel'],
-[type='time'],
-[type='week'],
-[multiple],
-textarea,
-select {
- border: unset;
-}
-.toggle-checkbox:checked {
- right: 0;
- border-color: rgb(125 211 252);
-}
-.toggle-checkbox:checked + .toggle-label {
- background-color: rgb(125 211 252);
-}
-:host ::ng-deep .ng-select.ng-select-single .ng-select-container {
- height: 48px;
- border: none;
- background-color: transparent;
- .ng-value-container .ng-input {
- top: 10px;
- }
- span.ng-arrow-wrapper {
- display: none;
+
+// Button hover effects
+.btn-primary {
+ background-color: #0046b5;
+ transition: all 0.3s ease;
+
+ &:hover {
+ background-color: #003492;
}
}
-select {
- color: #000; /* Standard-Textfarbe für das Dropdown */
- // background-color: #fff; /* Hintergrundfarbe für das Dropdown */
+
+// Service card animation
+.service-card {
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: translateY(-10px);
+ }
}
-select option {
- color: #000; /* Textfarbe für Dropdown-Optionen */
+// Responsive adjustments
+@media (max-width: 768px) {
+ .hero-section {
+ height: auto;
+ padding: 4rem 0;
+ }
}
-select.placeholder-selected {
- color: #999; /* Farbe für den Platzhalter */
-}
-input::placeholder {
- color: #555; /* Dunkleres Grau */
- opacity: 1; /* Stellt sicher, dass die Deckkraft 100% ist */
+// Make sure the Google Map is responsive
+google-map {
+ display: block;
+ width: 100%;
}
-/* Stellt sicher, dass die Optionen im Dropdown immer schwarz sind */
-select:focus option,
-select:hover option {
- color: #000 !important;
-}
-input[type='text'][name='aiSearchText'] {
- padding: 14px; /* Innerer Abstand */
- font-size: 16px; /* Schriftgröße anpassen */
- box-sizing: border-box; /* Padding und Border in die Höhe und Breite einrechnen */
- height: 48px;
+// Override Tailwind default styling for video
+video {
+ max-width: 100%;
+ object-fit: cover;
}
diff --git a/bizmatch/src/app/pages/home/home.component.ts b/bizmatch/src/app/pages/home/home.component.ts
index 15b92cd..d5c80b6 100644
--- a/bizmatch/src/app/pages/home/home.component.ts
+++ b/bizmatch/src/app/pages/home/home.component.ts
@@ -1,313 +1,56 @@
import { CommonModule } from '@angular/common';
-import { ChangeDetectorRef, Component, ElementRef, ViewChild } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { ActivatedRoute, Router, RouterModule } from '@angular/router';
-import { NgSelectModule } from '@ng-select/ng-select';
-import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
-import { initFlowbite } from 'flowbite';
-import { catchError, concat, debounceTime, distinctUntilChanged, lastValueFrom, Observable, of, Subject, Subscription, switchMap, tap } from 'rxjs';
-import { BusinessListingCriteria, CityAndStateResult, CommercialPropertyListingCriteria, GeoResult, KeycloakUser, UserListingCriteria } from '../../../../../bizmatch-server/src/models/main.model';
-import { ModalService } from '../../components/search-modal/modal.service';
-import { TooltipComponent } from '../../components/tooltip/tooltip.component';
-import { AiService } from '../../services/ai.service';
-import { AuthService } from '../../services/auth.service';
-import { CriteriaChangeService } from '../../services/criteria-change.service';
-import { GeoService } from '../../services/geo.service';
-import { ListingsService } from '../../services/listings.service';
-import { SearchService } from '../../services/search.service';
-import { SelectOptionsService } from '../../services/select-options.service';
-import { UserService } from '../../services/user.service';
-import {
- assignProperties,
- compareObjects,
- createEmptyBusinessListingCriteria,
- createEmptyCommercialPropertyListingCriteria,
- createEmptyUserListingCriteria,
- createEnhancedProxy,
- getCriteriaStateObject,
- map2User,
-} from '../../utils/utils';
-@UntilDestroy()
+import { Component, OnInit } from '@angular/core';
+import { RouterLink, RouterOutlet } from '@angular/router';
+
@Component({
selector: 'app-home',
- standalone: true,
- imports: [CommonModule, FormsModule, RouterModule, NgSelectModule, TooltipComponent],
templateUrl: './home.component.html',
- styleUrl: './home.component.scss',
+ styleUrls: ['./home.component.scss'],
+ standalone: true,
+ imports: [CommonModule, RouterOutlet, RouterLink],
})
-export class HomeComponent {
- placeholders: string[] = ['Property close to Houston less than 10M', 'Franchise business in Austin price less than 500K'];
- activeTabAction: 'business' | 'commercialProperty' | 'broker' = 'business';
- type: string;
- maxPrice: string;
- minPrice: string;
- criteria: BusinessListingCriteria | CommercialPropertyListingCriteria | UserListingCriteria;
- states = [];
- isMenuOpen = false;
- user: KeycloakUser;
- prompt: string;
- cities$: Observable
;
- cityLoading = false;
- cityInput$ = new Subject();
- cityOrState = undefined;
- private criteriaChangeSubscription: Subscription;
- numberOfResults$: Observable;
- numberOfBroker$: Observable;
- numberOfCommercial$: Observable;
- aiSearch = false;
- aiSearchText = '';
- aiSearchFailed = false;
- loadingAi = false;
- @ViewChild('aiSearchInput', { static: false }) searchInput!: ElementRef;
- typingSpeed: number = 100; // Geschwindigkeit des Tippens (ms)
- pauseTime: number = 2000; // Pausezeit, bevor der Text verschwindet (ms)
- index: number = 0;
- charIndex: number = 0;
- typingInterval: any;
- showInput: boolean = true; // Steuerung der Anzeige des Eingabefelds
- tooltipTargetBeta = 'tooltipTargetBeta';
- public constructor(
- private router: Router,
- private modalService: ModalService,
- private searchService: SearchService,
- private activatedRoute: ActivatedRoute,
- public selectOptions: SelectOptionsService,
+export class HomeComponent implements OnInit {
+ showMobileMenu = false;
- private criteriaChangeService: CriteriaChangeService,
- private geoService: GeoService,
- public cdRef: ChangeDetectorRef,
- private listingService: ListingsService,
- private userService: UserService,
- private aiService: AiService,
- private authService: AuthService,
- ) {}
- async ngOnInit() {
- setTimeout(() => {
- initFlowbite();
- }, 0);
- this.numberOfBroker$ = this.userService.getNumberOfBroker(createEmptyUserListingCriteria());
- this.numberOfCommercial$ = this.listingService.getNumberOfListings(createEmptyCommercialPropertyListingCriteria(), 'commercialProperty');
- const token = await this.authService.getToken();
- sessionStorage.removeItem('businessListings');
- sessionStorage.removeItem('commercialPropertyListings');
- sessionStorage.removeItem('brokerListings');
- this.criteria = createEnhancedProxy(getCriteriaStateObject('businessListings'), this);
- this.user = map2User(token);
- this.loadCities();
- this.setupCriteriaChangeListener();
- }
- async changeTab(tabname: 'business' | 'commercialProperty' | 'broker') {
- this.activeTabAction = tabname;
- this.cityOrState = null;
- if ('business' === tabname) {
- this.criteria = createEnhancedProxy(getCriteriaStateObject('businessListings'), this);
- } else if ('commercialProperty' === tabname) {
- this.criteria = createEnhancedProxy(getCriteriaStateObject('commercialPropertyListings'), this);
- } else if ('broker' === tabname) {
- this.criteria = createEnhancedProxy(getCriteriaStateObject('brokerListings'), this);
- } else {
- this.criteria = undefined;
- }
+ // Google Maps configuration
+ // mapOptions: google.maps.MapOptions = {
+ // center: { lat: 27.777, lng: -97.396 }, // Corpus Christi coordinates
+ // zoom: 15,
+ // mapTypeId: 'roadmap',
+ // scrollwheel: false,
+ // disableDefaultUI: true,
+ // zoomControl: true,
+ // streetViewControl: true,
+ // };
+
+ // Marker position for office location
+ // markerPosition: google.maps.LatLngLiteral = {
+ // lat: 27.777,
+ // lng: -97.396,
+ // };
+
+ constructor() {}
+
+ ngOnInit(): void {
+ // Add smooth scrolling for anchor links
+ this.setupSmoothScrolling();
}
- search() {
- this.router.navigate([`${this.activeTabAction}Listings`]);
- }
- private setupCriteriaChangeListener() {
- this.criteriaChangeSubscription = this.criteriaChangeService.criteriaChange$.pipe(untilDestroyed(this), debounceTime(400)).subscribe(() => this.setTotalNumberOfResults());
+ toggleMobileMenu(): void {
+ this.showMobileMenu = !this.showMobileMenu;
}
- toggleMenu() {
- this.isMenuOpen = !this.isMenuOpen;
- }
- onTypesChange(value) {
- if (value === '') {
- // Wenn keine Option ausgewählt ist, setzen Sie types zurück auf ein leeres Array
- this.criteria.types = [];
- } else {
- this.criteria.types = [value];
- }
- }
- onRadiusChange(value) {
- if (value === 'null') {
- // Wenn keine Option ausgewählt ist, setzen Sie types zurück auf ein leeres Array
- this.criteria.radius = null;
- } else {
- this.criteria.radius = parseInt(value);
- }
- }
- async openModal() {
- const accepted = await this.modalService.showModal(this.criteria);
- if (accepted) {
- this.router.navigate([`${this.activeTabAction}Listings`]);
- }
- }
- private loadCities() {
- this.cities$ = concat(
- of([]), // default items
- this.cityInput$.pipe(
- distinctUntilChanged(),
- tap(() => (this.cityLoading = true)),
- switchMap(term =>
- //this.geoService.findCitiesStartingWith(term).pipe(
- this.geoService.findCitiesAndStatesStartingWith(term).pipe(
- catchError(() => of([])), // empty list on error
- // map(cities => cities.map(city => city.city)), // transform the list of objects to a list of city names
- tap(() => (this.cityLoading = false)),
- ),
- ),
- ),
- );
- }
- trackByFn(item: GeoResult) {
- return item.id;
- }
- setCityOrState(cityOrState: CityAndStateResult) {
- if (cityOrState) {
- if (cityOrState.type === 'state') {
- this.criteria.state = cityOrState.content.state_code;
- } else {
- this.criteria.city = cityOrState.content as GeoResult;
- this.criteria.state = cityOrState.content.state;
- this.criteria.searchType = 'radius';
- this.criteria.radius = 20;
- }
- } else {
- this.criteria.state = null;
- this.criteria.city = null;
- this.criteria.radius = null;
- this.criteria.searchType = 'exact';
- }
- }
- getTypes() {
- if (this.criteria.criteriaType === 'businessListings') {
- return this.selectOptions.typesOfBusiness;
- } else if (this.criteria.criteriaType === 'commercialPropertyListings') {
- return this.selectOptions.typesOfCommercialProperty;
- } else {
- return this.selectOptions.customerSubTypes;
- }
- }
- getPlaceholderLabel() {
- if (this.criteria.criteriaType === 'businessListings') {
- return 'Business Type';
- } else if (this.criteria.criteriaType === 'commercialPropertyListings') {
- return 'Property Type';
- } else {
- return 'Professional Type';
- }
- }
- setTotalNumberOfResults() {
- if (this.criteria) {
- console.log(`Getting total number of results for ${this.criteria.criteriaType}`);
- if (this.criteria.criteriaType === 'businessListings' || this.criteria.criteriaType === 'commercialPropertyListings') {
- this.numberOfResults$ = this.listingService.getNumberOfListings(this.criteria, this.criteria.criteriaType === 'businessListings' ? 'business' : 'commercialProperty');
- } else if (this.criteria.criteriaType === 'brokerListings') {
- this.numberOfResults$ = this.userService.getNumberOfBroker(this.criteria);
- } else {
- this.numberOfResults$ = of();
- }
- }
- }
- getNumberOfFiltersSet() {
- if (this.criteria?.criteriaType === 'brokerListings') {
- return compareObjects(createEmptyUserListingCriteria(), this.criteria, ['start', 'length', 'page', 'searchType', 'radius']);
- } else if (this.criteria?.criteriaType === 'businessListings') {
- return compareObjects(createEmptyBusinessListingCriteria(), this.criteria, ['start', 'length', 'page', 'searchType', 'radius']);
- } else if (this.criteria?.criteriaType === 'commercialPropertyListings') {
- return compareObjects(createEmptyCommercialPropertyListingCriteria(), this.criteria, ['start', 'length', 'page', 'searchType', 'radius']);
- } else {
- return 0;
- }
- }
- toggleAiSearch() {
- this.aiSearch = !this.aiSearch;
- this.aiSearchFailed = false;
- if (!this.aiSearch) {
- this.aiSearchText = '';
- this.stopTypingEffect();
- } else {
- setTimeout(() => this.startTypingEffect(), 0);
- }
- }
- ngOnDestroy(): void {
- clearTimeout(this.typingInterval); // Stelle sicher, dass das Intervall gestoppt wird, wenn die Komponente zerstört wird
- }
-
- startTypingEffect(): void {
- if (!this.aiSearchText) {
- this.typePlaceholder();
- }
- }
-
- stopTypingEffect(): void {
- clearTimeout(this.typingInterval);
- }
- typePlaceholder(): void {
- if (!this.searchInput || !this.searchInput.nativeElement) {
- return; // Falls das Eingabefeld nicht verfügbar ist (z.B. durch ngIf)
- }
-
- if (this.aiSearchText) {
- return; // Stoppe, wenn der Benutzer Text eingegeben hat
- }
-
- const inputField = this.searchInput.nativeElement as HTMLInputElement;
- if (document.activeElement === inputField) {
- this.stopTypingEffect();
- return;
- }
-
- inputField.placeholder = this.placeholders[this.index].substring(0, this.charIndex);
-
- if (this.charIndex < this.placeholders[this.index].length) {
- this.charIndex++;
- this.typingInterval = setTimeout(() => this.typePlaceholder(), this.typingSpeed);
- } else {
- // Nach dem vollständigen Tippen eine Pause einlegen
- this.typingInterval = setTimeout(() => {
- inputField.placeholder = ''; // Schlagartiges Löschen des Platzhalters
- this.charIndex = 0;
- this.index = (this.index + 1) % this.placeholders.length;
- this.typingInterval = setTimeout(() => this.typePlaceholder(), this.typingSpeed);
- }, this.pauseTime);
- }
- }
- async generateAiResponse() {
- this.loadingAi = true;
- this.aiSearchFailed = false;
- try {
- const result = await this.aiService.generateAiReponse(this.aiSearchText);
- let criteria: BusinessListingCriteria | CommercialPropertyListingCriteria | UserListingCriteria | any;
- if (result.criteriaType === 'businessListings') {
- this.changeTab('business');
- criteria = result as BusinessListingCriteria;
- } else if (result.criteriaType === 'commercialPropertyListings') {
- this.changeTab('commercialProperty');
- criteria = result as CommercialPropertyListingCriteria;
- } else {
- this.changeTab('broker');
- criteria = result as UserListingCriteria;
- }
- const city = criteria.city as string;
- if (city && city.length > 0) {
- let results = await lastValueFrom(this.geoService.findCitiesStartingWith(city, criteria.state));
- if (results.length > 0) {
- criteria.city = results[0];
- } else {
- criteria.city = null;
+ private setupSmoothScrolling(): void {
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ e.preventDefault();
+ const target = document.querySelector((this as HTMLAnchorElement).getAttribute('href') || '');
+ if (target) {
+ target.scrollIntoView({
+ behavior: 'smooth',
+ });
}
- }
- if (criteria.radius && criteria.radius.length > 0) {
- criteria.radius = parseInt(criteria.radius);
- }
- this.loadingAi = false;
- this.criteria = assignProperties(this.criteria, criteria);
- this.search();
- } catch (error) {
- console.log(error);
- this.aiSearchFailed = true;
- this.loadingAi = false;
- }
+ });
+ });
}
}
diff --git a/bizmatch/src/assets/images/video-poster.png b/bizmatch/src/assets/images/video-poster.png
new file mode 100644
index 0000000..97131bd
Binary files /dev/null and b/bizmatch/src/assets/images/video-poster.png differ
diff --git a/bizmatch/src/assets/images/video-poster_.png b/bizmatch/src/assets/images/video-poster_.png
new file mode 100644
index 0000000..7a23ce2
Binary files /dev/null and b/bizmatch/src/assets/images/video-poster_.png differ
diff --git a/bizmatch/src/assets/videos/Bizmatch30Spot.mp4 b/bizmatch/src/assets/videos/Bizmatch30Spot.mp4
new file mode 100755
index 0000000..9b56200
Binary files /dev/null and b/bizmatch/src/assets/videos/Bizmatch30Spot.mp4 differ