Endless Angular Theme is pure angular theme, Yes! you read correct, it's No Jquery angular admin theme including all feature and functionality with ease of integration for your project.Endless theme document will help you to understand angular from scratch to making perfect real time dream application.
Follow the documentation carefully for solving your issues in minutes, Apart from that if you don't find when you following the docs you can raise a support ticket from pixelstrap.freshdesk.com
DependenciesYes! again No Jquery dependency.
Welcome to Angular! Angular helps you build modern applications for the web, mobile, or desktop.
For getting started an Angular application you needs two things as Prerequisites.
Before you begin, make sure your development environment includes Node and an npm package manager.
Angular CLI, and Angular apps depend on features and functionality provided by libraries that are available as npm packages. To download and install npm packages, you must have an npm package manager. This Quick Start uses the npm client command line interface, which is installed with Node.js by default. To check that you have the npm client installed, run npm -v in a terminal/console window.
For better understanding angular we suggest you to once go through official documentation of an Angular from angular.io
You use the Angular CLI to create projects, generate application and library code, and perform a variety of ongoing development tasks such as testing, bundling, and deployment.
Install the Angular CLI globally.
To install the CLI using npm, open a terminal/console window and enter the following command:
npm install -g @angular/cli
ng new my-app
cd my-app
ng serve --open
If you have already download and install node.js and Angular CLI then ignore prerequisites accordingly.
Download latest version of node.js from 20.19 & below 22 version nodejs.org.
Install Angular CLI Using:
npm install -g @angular/cli
cd theme-folder
npm install
ng serve

npm install

npm install node-sass --save-dev
Here we represent Angular Folder Structure and Style Customize
We have provided a bunch of page layouts and menu layouts that can be implemented with just a options change to body! Please refer the below table for corresponding classes.
| Layout | Options |
|---|---|
| Boxed Layout | Class: box-layout |
| RTL Layout | Class: rtl |
| Light layout | - |
| Dark Page-body | Attribute: main-theme-layout="main-theme-layout-2" |
| Dark Page-body & Sidebar | Attribute: main-theme-layout="main-theme-layout-3" |
| Dark Layout | Attribute: main-theme-layout="main-theme-layout-4" |
We have some inbuilt themes for sidebar that can be switched with just a class change
| Sidebar | Options |
|---|---|
| Default Sidebar layout | Attribute: native-default |
| native scroll | Attribute: native-scroll |
| Bordered Navigation | Attribute: navigation-bordered |
| Right Side icons | Attribute: navigation-rightside |
| Background Image | Attribute: native-image-bg |
| Dark Sidebar layout | Attribute: main-theme-layout="main-theme-layout-1" |
We have some inbuilt themes for header that can be switched with just a class change
| Header | semilight-bg-color |
|---|---|
| Light version | bg-default |
| Primary version | bg-Primary |
| secondary version | bg-secondary |
| danger version | bg-danger |
| success version | bg-success |
| info version | bg-info |
npm i @ngx-translate/core npm i @ngx-translate/http-loader
The @ngx-translate/core contains the core routines for the translation: The TranslateService and some pipes.
The @ngx-translate/http-loader loads the translation files from your webserver.
Now you have to init the translation TranslateModule in your app.config.ts:
import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideAnimations } from '@angular/platform-browser/animations';
import { provideCharts, withDefaultRegisterables, } from 'ng2-charts';
import { provideToastr } from 'ngx-toastr';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { HttpClient, provideHttpClient } from '@angular/common/http';
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideAnimations(),
provideHttpClient(),
provideRouter(routes),
importProvidersFrom(
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
}),
),
]
};
app.html:
<ul class="language-dropdown onhover-show-div p-20">
<li><a href="javascript:void(0)" data-lng="en" (click)="changeLanguage('en')"><i
class="flag-icon flag-icon-is"></i> English</a></li>
<li><a href="javascript:void(0)" data-lng="es" (click)="changeLanguage('es')"><i
class="flag-icon flag-icon-um"></i> German</a></li>
<ul>
Add TranslateService in app.ts:
import {Component} from '@angular/core';
import {TranslateService} from '@ngx-translate/core';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-root',
imports: [CommonModule,TranslateModule],
providers:[TranslateService],
templateUrl: './app.html',
styleUrls: ['./app.scss']
})
export class App {
constructor(private translate: TranslateService) {
translate.setDefaultLang('en');
}
public changeLanguage(lang){
this.translate.use(lang)
}
}
So by doing this you set the default language of your application using translate.setDefaultLang('en'). In a real app you can of course load language from the user's settings.
Reloading the app now shows an error in the browser console:
Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:4200/assets/i18n/en.json
Now we have to make json file accroding to language which we want:Now use variable with translate any where in your HTML structureEach language is stored in a separate .json file. Let's create the JSON file for the English translation: assets/i18n/en.json.
{
"title": "Translation demo",
"text": "This is a simple demonstration app for ngx-translate"
}
To switch language you'll first have to add other language Json file. Let's create a German translation for the demo: assets/i18n/de.json
{
"title": "Übersetzungs-Demo",
"text": "Dies ist eine einfache Applikation um die Funktionen von ngx-transalte zu demonstrieren."
}
Now use variable with translate any where in your HTML structure
<!-- translation: translation pipe -->
<h1>{{ 'title' | translate }}</h1>
<!-- translation: directive (key as attribute)-->
<p [translate]="'demo.text'"></p>
<!-- translation: directive (key as content of element) -->
<p translate>demo.text</p>
General HTML structure is the same throughout the template. Here is the header structure.
<div class="page-main-header">
<div class="main-header-right row">
<div class="main-header-left d-lg-none">
........
</div>
<div class="nav-right col p-0">
........
</div>
</div>
</div>
Generate endless content area using following structure.
<div class="page-body">
<div class="container-fluid">
........
</div>
<!-- Container-fluid starts-->
<div class="container-fluid">
.......
</div>
<!-- Container-fluid Ends-->
</div>
Footer structure to complete endless structure.
<footer class="footer">
<div class="container-fluid">
.............
</div>
</footer>
<span class="badge badge-primary">Primary</span>
<span class="badge badge-secondary">Secondary</span>
<span class="badge badge-success">Success</span>
<span class="badge badge-info">Info</span>
<span class="badge badge-warning">Warning</span>
<span class="badge badge-danger">Danger</span>
<span class="badge badge-light">Light</span>
<span class="badge badge-dark tag-pills-sm-mb">Dark</span>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
</div>
<div class="progress">
<div class="progress-bar bg-primary" role="progressbar" style="width: 25%" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">
</div>
<div class="progress">
<div class="progress-bar bg-secondary" role="progressbar" style="width: 50%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">
</div>
<div class="progress">
<div class="progress-bar bg-success" role="progressbar" style="width: 75%" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
</div>
<div class="progress">
<div class="progress-bar bg-info" role="progressbar" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
</div>
<div class="alert alert-primary dark" role="alert">This is a info alert—check it out!</div>
<div class="alert alert-secondary dark" role="alert">This is a light alert—check it out!</div>
<div class="alert alert-success dark" role="alert">This is a success alert—check it out!</div>
<div class="alert alert-info dark" role="alert">This is a danger alert—check it out!</div>
<div class="alert alert-warning dark" role="alert">This is a secondary alert—check it out!</div>
<div class="alert alert-danger dark" role="alert">This is a warning alert—check it out!</div>
<div class="alert alert-light dark" role="alert">This is a dark alert—check it out!</div>
<div class="alert alert-dark dark" role="alert">This is a dark alert—check it out!</div>
<button type="button" class="btn btn-primary example-popover mr-1" data-toggle="popover" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?"> Click to toggle popover
</button>
<a tabindex="0" class="example-popover btn btn-secondary" role="button" data-toggle="popover" data-trigger="focus" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?">
Dismissible popover</a>
<button type="button" data-trigger="hover" class="example-popover btn btn-success" data-container="body" data-toggle="popover" data-placement="bottom" title="Popover title" data-offset="-20px -20px" data-content="Vivamus sagittis lacus vel
augue laoreet rutrum faucibus." >On Hover Tooltip</button>
</div>
<h6> class="p-t-20 p-b-20">To use java script you have to add the following script tag</h6>
<div class="card-body">
<!--popover js-->
<script src="../assets/js/popover-custom.js">
</script>
<button type="button" class="example-popover btn btn-primary" placement="top" ngbTooltip="Popover title">
Hover Me
</button>
<div ngbDropdown class="d-inline-block" placement="bottom">
<button class="btn btn-outline-primary" id="dropdownBasic1" ngbDropdownToggle >Dropdown Button</button>
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
<button class="dropdown-item">Action</button>
<button class="dropdown-item">Another Action</button>
<button class="dropdown-item">Something Else Here</button>
</div>
</div>
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting,remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting,remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum
<ngb-tabset>
<ngb-tab title="Home">
<ng-template ngbTabContent>
<p class="mb-0 m-t-30">Lorem Ipsum is simply dummy text of the printing and typesetting
industry. Lorem Ipsum has been the industry's standard dummy text ever since the
1500s, when an unknown printer took a galley of type and scrambled it to make a type
specimen book. It has survived not only five centuries, but also the leap into
electronic typesetting,remaining essentially unchanged. It was popularised in the
1960s with the release of Letraset sheets containing Lorem Ipsum passages,and more
recently with desktop publishing software like Aldus PageMaker including versions of
Lorem Ipsum</p>
</ng-template>
</ngb-tab>
<ngb-tab>
....
</ngb-tab>
<ngb-tab title="Disabled" [disabled]="true">
....
</ngb-tab>
</ngb-tabset>
<div class="card">
<ngb-accordion [closeOthers]="true" activeIds="static-1">
<ngb-panel id="static-1" title="Collapsible Group Item #1">
<ng-template ngbPanelContent>
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf
moon officia
aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf
moon tempor,
sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim
keffiyeh helvetica,
craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo.
Leggings
occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them
accusamus
labore sustainable VHS.
</ng-template>
</ngb-panel>
<ngb-panel id="static-2">
<ng-template ngbPanelTitle>
<span>Collapsible Group Item #1</span>
</ng-template>
<ng-template ngbPanelContent>
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf
moon officia
aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf
moon tempor,
sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim
keffiyeh helvetica,
craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo.
Leggings
occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them
accusamus
labore sustainable VHS.
</ng-template>
</ngb-panel>
<ngb-panel id="static-3" title="Collapsible Group Item #3" >
<ng-template ngbPanelContent>
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf
moon officia
aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf
moon tempor,
sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim
keffiyeh helvetica,
craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo.
Leggings
occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them
accusamus
labore sustainable VHS.
</ng-template>
</ngb-panel>
</ngb-accordion>
</div>
<div class="shadow-lg p-25 shadow-showcase text-center">
<h6 class="m-0 f-18">Larger shadow</h5>
</div>
<h6 class="sub-title mb-5 mt-5">Regular shadow</h6>
<div class="shadow shadow-showcase p-25 text-center">
<h6 class="m-0 f-18">Regular shadow</h5>
</div>
<h6 class="sub-title mb-5 mt-5">small shadow</h6>
<div class="shadow-sm shadow-showcase p-25 text-center mb-5">
<h6 class="m-0 f-18">Small shadow</h5>
</div>
A beautiful, responsive, customizable, accessible (WAI-ARIA) replacement for JavaScript's popup boxes. Zero dependencies.
npm install --save sweetalert2
<div class="card-body btn-showcase">
<button type="button" class="btn btn-primary" (click)="basicAlert()">Basic</button>
</div>
// ES6 Modules or TypeScript
import { CommonModule } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import Swal from 'sweetalert2';
@Component({
selector: 'app-sweet-alert',
imports: [CommonModule],
templateUrl: './sweet-alert.component.html',
styleUrls: ['./sweet-alert.component.scss']
})
export class SweetAlertComponent implements OnInit {
constructor() { }
ngOnInit() { }
basicAlert() {
Swal.fire('Any fool can use a computer')
}
}
This is an Angular wrapper library for the Dropzone. To use this library you should get familiar with the Dropzone documentation as well since this documentation only explains details specific to this wrapper.
npm i ngx-dropzone-wrapper
<div class="card-body">
<div class="dropzone dropzone-primary" [dropzone]="config1" (error)="onUploadError($event)" (success)="onUploadSuccess($event)">
</div>
</div>
import { CommonModule } from '@angular/common';
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { DropzoneConfigInterface, DropzoneModule } from "ngx-dropzone-wrapper";
import { NgxDropzoneChangeEvent } from 'ngx-dropzone';
@Component({
selector: 'app-ngx-dropzone',
imports: [CommonModule,DropzoneModule],
templateUrl: './ngx-dropzone.component.html',
styleUrls: ['./ngx-dropzone.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class NgxDropzoneComponent implements OnInit {
public config1: DropzoneConfigInterface = {
url: 'https://httpbin.org/post',
clickable: true,
maxFiles: 1,
addRemoveLinks: true,
uploadMultiple: false,
autoReset: null,
errorReset: null,
cancelReset: null
};
public onUploadError(args: any): void { }
public onUploadSuccess(args: any): void { }
ngOnInit() {
}
}
npm install ngx-toastr --save
Add css in app.scsspage.
@import '~ngx-toastr/toastr.css';
<div class="card-body btn-showcase">
<button type="button" class="btn btn-warning" (click)="warning()">Warning</button>
</div>
import { CommonModule } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { ToastrModule, ToastrService } from 'ngx-toastr';
@Component({
selector: 'app-ngx-toastr',
imports: [CommonModule,ToastrModule],
templateUrl: './ngx-toastr.component.html',
styleUrls: ['./ngx-toastr.component.scss']
})
export class NgxToastrComponent implements OnInit {
constructor(private toastrService: ToastrService) { }
ngOnInit() { }
// warning Type
warning() {
this.toastrService.warning('My name is John Dio. You killed my father, prepare to die!');
}
}
import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideAnimations } from '@angular/platform-browser/animations';
import { provideCharts, withDefaultRegisterables, } from 'ng2-charts';
import { provideToastr } from 'ngx-toastr';
import { HttpClient, provideHttpClient } from '@angular/common/http';
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideAnimations(),
provideToastr(),
provideHttpClient(),
provideCharts(withDefaultRegisterables()),
provideRouter(routes),
]
};
ngx-owl-carousel-o is built for Angular >=20.0.0. It doesn't use jQuery.
npm i ngx-owl-carousel-o
<owl-carousel-o [options]="owlcarousel1Options">
@for(img of owlcarousel1; track img){
<ng-template carouselSlide class="item">
<img [src]="[img.img]" alt="" />
</ng-template>
}
</owl-carousel-o>
import { CommonModule } from "@angular/common";
import { Component, OnInit } from "@angular/core";
import { CarouselModule } from "ngx-owl-carousel-o";
@Component({
selector: "app-owl-carousel",
imports: [CommonModule, CarouselModule],
templateUrl: "./owl-carousel.html",
styleUrls: ["./owl-carousel.scss"],
})
export class OwlCarousel implements OnInit {
constructor() { }
ngOnInit() { }
owlcarousel1 = [
{ img: "assets/images/slider/1.jpg" },
{ img: "assets/images/slider/2.jpg" },
{ img: "assets/images/slider/3.jpg" },
{ img: "assets/images/slider/4.jpg" },
{ img: "assets/images/slider/5.jpg" },
{ img: "assets/images/slider/6.jpg" },
{ img: "assets/images/slider/7.jpg" },
{ img: "assets/images/slider/8.jpg" },
{ img: "assets/images/slider/9.jpg" },
{ img: "assets/images/slider/10.jpg" },
];
//Options
owlcarousel1Options = {
loop: true,
margin: 10,
nav: false,
responsive: {
0: {
items: 1,
},
600: {
items: 3,
},
1000: {
items: 5,
},
},
};
}
Self-contained, mobile friendly slider component for Angular 20+ based on angularjs-slider.
npm i @angular-slider/ngx-slider
<ngx-slider [options]="simpleSliderOptions" [formControl]="simpleSliderControl"></ngx-slider>
import { LabelType, NgxSliderModule, Options } from '@angular-slider/ngx-slider';
import { CommonModule } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
@Component({
selector: 'app-range-slider',
standalone: true,
imports: [CommonModule,NgxSliderModule,FormsModule,ReactiveFormsModule],
templateUrl: './range-slider.html',
styleUrls: ['./range-slider.scss']
})
export class RangeSlider implements OnInit {
constructor() { }
ngOnInit() { }
simpleSliderOptions: Options = {
floor: 0,
ceil: 250
};
simpleSliderControl: FormControl = new FormControl(100);
}
npm install @angular/google-maps --save
<!-- this creates a google map on the page with the given lat/lng from -->
<google-map width="100%" height="450px" [zoom]="zoom">
@for(marker of markers;track marker){
<map-marker [position]="marker.position" [label]="marker.label">
</map-marker>
}
</google-map>
import { AfterViewInit, Component, OnInit, ViewChild } from "@angular/core";
import { GoogleMap, GoogleMapsModule } from "@angular/google-maps";
@Component({
selector: "app-google-map",
imports: [GoogleMapsModule],
templateUrl: "./google-map.html",
styleUrls: ["./google-map.scss"],
})
export class GoogleMaps implements OnInit, AfterViewInit {
public markers: IMapMarker[];
public markers1: IMapMarker[];
public zoom: number;
constructor() {
this.markers = [];
this.zoom = 2;
}
ngOnInit() {
this.markers1.push({
position: {
lat: 12.97,
lng: 77.59,
},
label: {
color: "red",
text: "Arial",
},
Option: {
draggable: true,
animation: google.maps.Animation.DROP,
zoomControl: false,
mapTypeControl: false,
streetViewControl: false,
fullscreenControl: false,
},
});
this.markers.push({
position: {
lat: 35.717,
lng: 139.731,
},
label: {
color: "black",
text: "Madrid",
},
Option: {
draggable: true,
animation: google.maps.Animation.DROP,
},
});
this.markers.push({
position: {
lat: 48.8615515,
lng: 2.3112233,
},
label: {
color: "black",
text: "Paris",
},
});
}
//Street View
@ViewChild(GoogleMap) map!: GoogleMap;
ngAfterViewInit() {
const streetView = this.map.getStreetView();
streetView.setOptions({
position: { lat: 38.9938386, lng: -77.2515373 },
pov: { heading: 70, pitch: -10 },
});
streetView.setVisible(true);
const bounds = this.getBounds(this.markers);
this.map.googleMap?.fitBounds(bounds);
}
getBounds(markers: IMapMarker[]): google.maps.LatLngBoundsLiteral {
if (!markers.length) {
// Fallback bounds or throw error
return {
north: 0,
south: 0,
east: 0,
west: 0,
};
}
let north = markers[0].position.lat;
let south = markers[0].position.lat;
let east = markers[0].position.lng;
let west = markers[0].position.lng;
for (const marker of markers) {
north = Math.max(north, marker.position.lat);
south = Math.min(south, marker.position.lat);
east = Math.max(east, marker.position.lng);
west = Math.min(west, marker.position.lng);
}
return { north, south, east, west };
}
}
Leaflet packages for Angular. Provides flexible and extensible components for integrating Leaflet v20 into Angular projects. Supports Angular v20,and use in Angular-CLI based projects.
npm install leaflet
npm i @bluehalo/ngx-leaflet
<div class="map-height" leaflet [leafletOptions]="options1"></div>
//import file in angular.on
import { Component, OnInit } from '@angular/core';
import * as L from 'leaflet';
import { HttpClient } from "@angular/common/http";
import { LeafletModule } from '@bluehalo/ngx-leaflet';
import { CommonModule } from '@angular/common';
import { GeoJsonObject } from 'geojson';
@Component({
selector: 'app-leaflet-map',
imports: [CommonModule, LeafletModule],
templateUrl: './leaflet-map.html',
styleUrls: ['./leaflet-map.scss']
})
export class LeafletMap implements OnInit {
constructor(private http: HttpClient) { }
//First map options
options1 = {
layers: [
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' })
],
zoom: 5,
center: L.latLng(46.879966, -121.726909)
};
layersControl = {
baseLayers: {
'Open Street Map': L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' }),
'Open Cycle Map': L.tileLayer('http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', { maxZoom: 18, attribution: '...' })
},
overlays: {
'Big Circle': L.circle([46.95, -122], { radius: 5000 }),
'Big Square': L.polygon([[46.8, -121.55], [46.9, -121.55], [46.9, -121.7], [46.8, -121.7]])
}
}
}
//import file in global scss
@import "leaflet/dist/leaflet.css";
The CKEditor component for angular(3.x+)
npm i ngx-editor
<div class="NgxEditor__Wrapper">
<ngx-editor-menu [editor]="editor"> </ngx-editor-menu>
<ngx-editor [editor]="editor" [ngModel]="html" [disabled]="false" [placeholder]="'Type here...'"></ngx-editor>
</div>
import { CommonModule } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { AngularEditorModule } from '@kolkov/angular-editor';
import { FormsModule } from '@angular/forms';
import { Editor, NgxEditorModule } from 'ngx-editor';
@Component({
selector: 'app-editor'
imports: [CommonModule, AngularEditorModule, FormsModule, NgxEditorModule],
templateUrl: './editor.html',
styleUrls: ['./editor.scss']
})
export class AngularEditorConfig implements OnInit {
public editor: Editor;
public html = '';
constructor() { }
ngOnInit(): void {
this.editor = new Editor();
}
// make sure to destory the editor
ngOnDestroy(): void {
this.editor.destroy();
}
}
A simple native wysiwyg editor for Angular 20
npm install @kolkov/angular-editor --save
<angular-editor [placeholder]="'Enter text here...'" [(ngModel)]="htmlContent" [config]="editorConfig"></angular-editor>
import { CommonModule } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { AngularEditorConfig, AngularEditorModule } from '@kolkov/angular-editor';
import { FormsModule } from '@angular/forms';
import { Editor, NgxEditorModule } from 'ngx-editor';
@Component({
selector: 'app-editor',
imports: [CommonModule, AngularEditorModule, FormsModule, NgxEditorModule],
templateUrl: './editor.html',
styleUrls: ['./editor.scss']
})
export class Editor implements OnInit {
public htmlContent = '';
public editor: Editor;
constructor() { }
editorConfig: AngularEditorConfig = {
editable: true,
spellcheck: true,
height: 'auto',
minHeight: '0',
maxHeight: 'auto',
width: 'auto',
minWidth: '0',
translate: 'yes',
enableToolbar: true,
showToolbar: true,
placeholder: 'Enter text here...',
defaultParagraphSeparator: '',
defaultFontName: '',
defaultFontSize: '',
fonts: [
{class: 'arial', name: 'Arial'},
{class: 'times-new-roman', name: 'Times New Roman'},
{class: 'calibri', name: 'Calibri'},
{class: 'comic-sans-ms', name: 'Comic Sans MS'}
],
customClasses: [
{
name: 'quote',
class: 'quote',
},
{
name: 'redText',
class: 'redText'
},
{
name: 'titleText',
class: 'titleText',
tag: 'h1',
},
],
}
}
<div class="container-fluid">
<div class="row">
<div class="col-sm-12 col-xl-6">
<div class="card">
<div class="card-header">
<h5>Basic Card</h5>
</div>
<div class="card-body">
<p class="mb-0"> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem
Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer
took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and
typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the
1500s, when an unknown printer took a galley of type and scrambled. </p>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-sm-12 col-xl-6">
<div class="card ">
<div class="card-header b-l-primary">
<h5>Border left</h5>
</div>
<div class="card-body">
<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been
the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley
of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting
industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an
unknown printer took a galley of type and scrambled.</p>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-xl-6 xl-100 col-lg-12">
<div class="card">
<div class="card-header">
<h5 class="pull-left">Simple Tab</h5>
</div>
<div class="card-body">
<ngb-tabset type="pills" class="tabbed-card">
<ngb-tab title="Home" class="pull-right nav nav-pills nav-primary">
<ng-template ngbTabContent class="tab-content">
<div class="tab-pane fade show">
<p>
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem
Ipsum is simply dummy text of the printing and typesetting industry. text ever
since the 1500s, when an unknown printer took a galley of type and scrambled it
to make a type specimen book. It has survived not only five centuries, but also
the leap into electronic typesetting, remaining essentially unchanged. It was
popularised in the 1960s with the release of Letraset sheets containing Lorem
Ipsum passages, and more recently with desktop publishing software like Aldus
PageMaker including versions of Lorem Ipsum
</p>
</div>
</ng-template>
</ngb-tab>
<ngb-tab>
<ng-template ngbTabTitle class="pull-right nav nav-pills nav-primary">Profile</ng-template>
<ng-template ngbTabContent class="tab-content">
<div class="tab-pane fade show">
<p>
Lorem Ipsum is simply dummy text of the printing and typesetting industry. dummy
text of the printing and typesetting industry. since the 1500s, when an unknown
printer took a galley of type and scrambled it to make a type specimen book. It
has survived not only five centuries, but also the leap into electronic
typesetting, remaining essentially unchanged. It was popularised in the 1960s
with the release of Letraset sheets containing Lorem Ipsum passages, and more
recently with desktop publishing software like Aldus PageMaker including
versions of Lorem Ipsum
</p>
</div>
</ng-template>
</ngb-tab>
<ngb-tab title="Contact" ngbTabTitle class="pull-right nav nav-pills nav-primary">
<ng-template ngbTabContent class="tab-content">
<div class="tab-pane fade show">
<p>
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem
Ipsum has been the industry's standard dummy text ever since the 1500s, when an
unknown printer took a galley of type and scrambled it to make a type specimen
book. It has survived not only five centuries, but also the leap into electronic
typesetting, remaining essentially unchanged. It was popularised in the 1960s
with the release of Letraset sheets containing Lorem Ipsum passages, and more
recently with desktop publishing software like Aldus PageMaker including
versions of Lorem Ipsum
</p>
</div>
</ng-template>
</ngb-tab>
</ngb-tabset>
</div>
</div>
</div>
</div>
</div>
npm i --save ng-chartist chartist
<x-chartist [configuration]="chart1"></x-chartist>
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import * as chartData from '../../../shared/data/chart/chartist';
import { ChartistModule } from 'ng-chartist';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-chartist',
imports: [CommonModule, ChartistModule],
templateUrl: './chartist.html',
styleUrls: ['./chartist.scss'],
encapsulation: ViewEncapsulation.None
})
export class Chartist {
constructor() { }
public chart1 = chartData.chart1;
}
//data
export var chart1: Chart = {
type: "Line",
data: {
labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
series: [
[12, 9, 7, 8, 5, 4, 6, 2, 3, 3, 4, 6],
[4, 5, 3, 7, 3, 5, 5, 3, 4, 4, 5, 5],
[5, 3, 4, 5, 6, 3, 3, 4, 5, 6, 3, 4],
[3, 4, 5, 6, 7, 6, 4, 5, 6, 7, 6, 3],
],
},
options: {
low: 0,
showArea: false,
fullWidth: true,
height: 450,
},
};
npm i ng2-charts
<canvas baseChart class="chart" [datasets]="barChartData" [labels]="barChartLabels"
[options]="barChartOptions" [legend]="barChartLegend"
[type]="barChartType" (chartHover)="chartHovered($event)"
(chartClick)="chartClicked($event)"></canvas>
import { Component, ViewEncapsulation } from '@angular/core';
import * as chartData from '../../../shared/data/chart/chartjs';
import { BaseChartDirective } from 'ng2-charts';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-chartjs',
standalone: true,
imports: [CommonModule, BaseChartDirective],
templateUrl: './chartjs.html',
styleUrls: ['./chartjs.scss'],
encapsulation:ViewEncapsulation.None
})
export class chartjs3 {
constructor() { }
// barChart
public barChartOptions = chartData.barChartOptions;
public barChartLabels = chartData.barChartLabels;
public barChartType = chartData.barChartType;
public barChartLegend = chartData.barChartLegend;
public barChartData = chartData.barChartData;
public barChartColors = chartData.barChartColors;
}
// barChart
export var barChartOptions: barChartOption = {
scaleShowVerticalLines: false,
responsive: true
};
export var barChartLabels: string[] = ["January", "February", "March", "April", "May", "June", "July"];
export var barChartType :string = 'bar';
export var barChartLegend = false;
export var barChartData: ChartistSeries[] = [
{ data: [35, 59, 80, 81, 56, 55, 40], label: 'Series A' },
{ data: [28, 48, 40, 19, 86, 27, 90], label: 'Series B' }
];
export var barChartColors: BarChartColor[] = [
{
backgroundColor: '#4466f2',
borderColor: "rgba(30, 166, 236, 0.8)",
borderWidth: 1,
},
{
backgroundColor: '#1ea6ec',
borderColor: "rgba(68, 102, 242, 0.8)",
borderWidth: 1,
},
];
import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideAnimations } from '@angular/platform-browser/animations';
import { provideCharts, withDefaultRegisterables, } from 'ng2-charts';
import { provideToastr } from 'ngx-toastr';
import { HttpClient, provideHttpClient } from '@angular/common/http';
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideAnimations(),
provideToastr(),
provideHttpClient(),
provideCharts(withDefaultRegisterables()),
provideRouter(routes),
]
};
npm i ng2-google-charts
<google-chart [data]="pieChart1"></google-chart>
import { Component } from '@angular/core';
import * as chartData from '../../../shared/data/chart/google-chart';
import { CommonModule } from '@angular/common';
import { Ng2GoogleChartsModule } from 'ng2-google-charts';
@Component({
selector: 'app-google',
imports: [CommonModule,Ng2GoogleChartsModule],
templateUrl: './google.html',
styleUrls: ['./google.scss']
})
export class Google {
// Pie Chart
public pieChart1 = chartData.pieChart1;
public pieChart2 = chartData.pieChart2;
public pieChart3 = chartData.pieChart3;
public pieChart4 = chartData.pieChart4;
}
export var pieChart1 = {
chartType: 'PieChart',
dataTable: [
['Task', 'Hours per Day'],
['Work', 5],
['Eat', 10],
['Commute', 15],
['Watch TV', 20],
['Sleep', 25]
],
options: {
title: 'My Daily Activities',
width: '100%',
height: 400,
colors: ["#4466f2", "#1ea6ec", "#22af47", "#007bff", "#FF5370"],
backgroundColor:'transparent'
},
};
npm i @swimlane/ngx-graph
<ngx-charts-bar-vertical [scheme]="barChartColorScheme" [results]="barChartsingle"
[gradient]="barChartGradient" [xAxis]="barChartShowXAxis" [yAxis]="barChartShowYAxis"
[legend]="barChartShowLegend" [showXAxisLabel]="barChartShowXAxisLabel"
[showYAxisLabel]="barChartShowYAxisLabel" [xAxisLabel]="barChartXAxisLabel"
[yAxisLabel]="barChartYAxisLabel" [roundEdges]="false" (select)="onSelect($event)">
</ngx-charts-bar-vertical>
import { Component, OnInit } from '@angular/core';
import { barChartSingle, pieChart, multiData, single } from '../../../shared/data/chart/ngx-chart';
import * as graphoptions from '../../../shared/data/chart/config';
import { CommonModule } from '@angular/common';
import { NgxChartsModule } from '@swimlane/ngx-charts';
@Component({
selector: 'app-ngx-chart',
imports: [CommonModule,NgxChartsModule],
templateUrl: './ngx-chart.html',
styleUrls: ['./ngx-chart.scss']
})
export class NgxChart implements OnInit {
ngOnInit() { }
// Bar-chart options
public barChartShowYAxis = graphoptions.barChartShowYAxis;
public barChartShowXAxis = graphoptions.barChartShowXAxis;
public barChartGradient = graphoptions.barChartGradient;
public barChartShowLegend = graphoptions.barChartShowLegend;
public barChartShowXAxisLabel = graphoptions.barChartShowXAxisLabel;
public barChartXAxisLabel = graphoptions.barChartXAxisLabel;
public barChartShowYAxisLabel = graphoptions.barChartShowYAxisLabel;
public barChartYAxisLabel = graphoptions.barChartYAxisLabel;
public barChartColorScheme = graphoptions.barChartColorScheme;
public barChartshowGridLines = graphoptions.barChartshowGridLines;
}
export var barChartShowXAxis = true;
export var barChartShowYAxis = true;
export var barChartGradient = true;
export var barChartShowLegend = false;
export var barChartShowXAxisLabel = true;
export var barChartXAxisLabel = 'Country';
export var barChartShowYAxisLabel = true;
export var barChartYAxisLabel = 'Population';
export var roundEdges: boolean = true;
export var barChartshowGridLines = false;
export var barChartColorScheme :any = {
domain: ["#007bff", "#ff9f40", "#ff5370", "#1ea6ec"]
};
Simple table extension with sorting, filtering, paging... for Angular apps.
npm install @ng-bootstrap/ng-bootstrap
<form>
<div class="mb-3 row">
<label for="table-complete-search" class="col-xs-3 col-sm-auto col-form-label">Full text search:</label>
<div class="col-xs-3 col-sm-auto">
<input
id="table-complete-search"
type="text"
class="form-control"
name="searchTerm"
[(ngModel)]="service.searchTerm"
/>
</div>
@if (service.loading$ | async) {
<span class="col col-form-label">Loading...</span>
}
</div>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col" sortable="name" (sort)="onSort($event)">Country</th>
<th scope="col" sortable="area" (sort)="onSort($event)">Area</th>
<th scope="col" sortable="population" (sort)="onSort($event)">Population</th>
</tr>
</thead>
<tbody>
@for (country of countries$ | async; track country.id) {
<tr>
<th scope="row">{{ country.id }}</th>
<td>
<img
[src]="'https://upload.wikimedia.org/wikipedia/commons/' + country.flag"
[alt]="'The flag of ' + country.name"
class="me-2"
style="width: 20px"
/>
<ngb-highlight [result]="country.name" [term]="service.searchTerm" />
</td>
<td><ngb-highlight [result]="country.area | number" [term]="service.searchTerm" /></td>
<td><ngb-highlight [result]="country.population | number" [term]="service.searchTerm" /></td>
</tr>
} @empty {
<tr>
<td colspan="4" style="text-align: center">No countries found</td>
</tr>
}
</tbody>
</table>
<div class="d-flex justify-content-between p-2">
<ngb-pagination [collectionSize]="(total$ | async)!" [(page)]="service.page" [pageSize]="service.pageSize">
</ngb-pagination>
<select class="form-select" style="width: auto" name="pageSize" [(ngModel)]="service.pageSize">
<option [ngValue]="2">2 items per page</option>
<option [ngValue]="4">4 items per page</option>
<option [ngValue]="6">6 items per page</option>
</select>
</div>
import { AsyncPipe, DecimalPipe } from '@angular/common';
import { Component, QueryList, ViewChildren } from '@angular/core';
import { Observable } from 'rxjs';
import { Country } from './country';
import { CountryService } from './country.service';
import { NgbdSortableHeader, SortEvent } from './sortable.directive';
import { FormsModule } from '@angular/forms';
import { NgbHighlight, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
@Component({
selector: 'ngbd-table-complete',
imports: [DecimalPipe, FormsModule, AsyncPipe, NgbHighlight, NgbdSortableHeader, NgbPaginationModule],
templateUrl: './table-complete.html',
providers: [CountryService, DecimalPipe],
})
export class NgbdTableComplete {
countries$: Observable;
total$: Observable;
@ViewChildren(NgbdSortableHeader) headers: QueryList;
constructor(public service: CountryService) {
this.countries$ = service.countries$;
this.total$ = service.total$;
}
onSort({ column, direction }: SortEvent) {
// resetting other headers
this.headers.forEach((header) => {
if (header.sortable !== column) {
header.direction = '';
}
});
this.service.sortColumn = column;
this.service.sortDirection = direction;
}
}
import { Injectable, PipeTransform } from '@angular/core';
import { BehaviorSubject, Observable, of, Subject } from 'rxjs';
import { Country } from './country';
import { COUNTRIES } from './countries';
import { DecimalPipe } from '@angular/common';
import { debounceTime, delay, switchMap, tap } from 'rxjs/operators';
import { SortColumn, SortDirection } from './sortable.directive';
interface SearchResult {
countries: Country[];
total: number;
}
interface State {
page: number;
pageSize: number;
searchTerm: string;
sortColumn: SortColumn;
sortDirection: SortDirection;
}
const compare = (v1: string | number, v2: string | number) => (v1 < v2 ? -1 : v1 > v2 ? 1 : 0);
function sort(countries: Country[], column: SortColumn, direction: string): Country[] {
if (direction === '' || column === '') {
return countries;
} else {
return [...countries].sort((a, b) => {
const res = compare(a[column], b[column]);
return direction === 'asc' ? res : -res;
});
}
}
function matches(country: Country, term: string, pipe: PipeTransform) {
return (
country.name.toLowerCase().includes(term.toLowerCase()) ||
pipe.transform(country.area).includes(term) ||
pipe.transform(country.population).includes(term)
);
}
@Injectable({ providedIn: 'root' })
export class CountryService {
private _loading$ = new BehaviorSubject(true);
private _search$ = new Subject();
private _countries$ = new BehaviorSubject([]);
private _total$ = new BehaviorSubject(0);
private _state: State = {
page: 1,
pageSize: 4,
searchTerm: '',
sortColumn: '',
sortDirection: '',
};
constructor(private pipe: DecimalPipe) {
this._search$
.pipe(
tap(() => this._loading$.next(true)),
debounceTime(200),
switchMap(() => this._search()),
delay(200),
tap(() => this._loading$.next(false)),
)
.subscribe((result) => {
this._countries$.next(result.countries);
this._total$.next(result.total);
});
this._search$.next();
}
get countries$() {
return this._countries$.asObservable();
}
get total$() {
return this._total$.asObservable();
}
get loading$() {
return this._loading$.asObservable();
}
get page() {
return this._state.page;
}
get pageSize() {
return this._state.pageSize;
}
get searchTerm() {
return this._state.searchTerm;
}
set page(page: number) {
this._set({ page });
}
set pageSize(pageSize: number) {
this._set({ pageSize });
}
set searchTerm(searchTerm: string) {
this._set({ searchTerm });
}
set sortColumn(sortColumn: SortColumn) {
this._set({ sortColumn });
}
set sortDirection(sortDirection: SortDirection) {
this._set({ sortDirection });
}
private _set(patch: Partial) {
Object.assign(this._state, patch);
this._search$.next();
}
private _search(): Observable {
const { sortColumn, sortDirection, pageSize, page, searchTerm } = this._state;
// 1. sort
let countries = sort(COUNTRIES, sortColumn, sortDirection);
// 2. filter
countries = countries.filter((country) => matches(country, searchTerm, this.pipe));
const total = countries.length;
// 3. paginate
countries = countries.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);
return of({ countries, total });
}
}
import { Country } from './country';
export const COUNTRIES: Country[] = [
{
id: 1,
name: 'Russia',
flag: 'f/f3/Flag_of_Russia.svg',
area: 17075200,
population: 146989754,
},
{
id: 2,
name: 'France',
flag: 'c/c3/Flag_of_France.svg',
area: 640679,
population: 64979548,
},
{
id: 3,
name: 'Germany',
flag: 'b/ba/Flag_of_Germany.svg',
area: 357114,
population: 82114224,
},
{
id: 4,
name: 'Portugal',
flag: '5/5c/Flag_of_Portugal.svg',
area: 92090,
population: 10329506,
},
{
id: 5,
name: 'Canada',
flag: 'c/cf/Flag_of_Canada.svg',
area: 9976140,
population: 36624199,
},
{
id: 6,
name: 'Vietnam',
flag: '2/21/Flag_of_Vietnam.svg',
area: 331212,
population: 95540800,
},
{
id: 7,
name: 'Brazil',
flag: '0/05/Flag_of_Brazil.svg',
area: 8515767,
population: 209288278,
},
{
id: 8,
name: 'Mexico',
flag: 'f/fc/Flag_of_Mexico.svg',
area: 1964375,
population: 129163276,
},
{
id: 9,
name: 'United States',
flag: 'a/a4/Flag_of_the_United_States.svg',
area: 9629091,
population: 324459463,
},
{
id: 10,
name: 'India',
flag: '4/41/Flag_of_India.svg',
area: 3287263,
population: 1324171354,
},
{
id: 11,
name: 'Indonesia',
flag: '9/9f/Flag_of_Indonesia.svg',
area: 1910931,
population: 263991379,
},
{
id: 12,
name: 'Tuvalu',
flag: '3/38/Flag_of_Tuvalu.svg',
area: 26,
population: 11097,
},
{
id: 13,
name: 'China',
flag: 'f/fa/Flag_of_the_People%27s_Republic_of_China.svg',
area: 9596960,
population: 1409517397,
},
];
export interface Country {
id: number;
name: string;
flag: string;
area: number;
population: number;
}
import { Directive, EventEmitter, Input, Output } from '@angular/core';
import { Country } from './country';
export type SortColumn = keyof Country | '';
export type SortDirection = 'asc' | 'desc' | '';
const rotate: { [key: string]: SortDirection } = { asc: 'desc', desc: '', '': 'asc' };
export interface SortEvent {
column: SortColumn;
direction: SortDirection;
}
@Directive({
selector: 'th[sortable]',
standalone: true,
host: {
'[class.asc]': 'direction === "asc"',
'[class.desc]': 'direction === "desc"',
'(click)': 'rotate()',
},
})
export class NgbdSortableHeader {
@Input() sortable: SortColumn = '';
@Input() direction: SortDirection = '';
@Output() sort = new EventEmitter();
rotate() {
this.direction = rotate[this.direction];
this.sort.emit({ column: this.sortable, direction: this.direction });
}
}




npm install --save angular-calendar date-fns
Add following import statement in your app.config.ts and then use calender app as per your wish.
import { ApplicationConfig, importProvidersFrom } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideAnimations } from '@angular/platform-browser/animations';
import { CalendarModule, DateAdapter } from 'angular-calendar';
import { adapterFactory } from 'angular-calendar/date-adapters/date-fns';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { HttpClient, provideHttpClient } from '@angular/common/http';
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideAnimations(),
provideHttpClient(),
provideRouter(routes),
importProvidersFrom(
CalendarModule.forRoot({
provide: DateAdapter,
useFactory: adapterFactory
}),
),
]
};
Apart from that, if you needs any extra / customization work then also you can get in touch with our experts by raising ticket to help you in customize with affordable extra budget.