rm-ng-device-detection
Version:
A highly optimized and fully customizable pure angular component for value range selection.
484 lines (349 loc) • 13.5 kB
Markdown
# rm-ng-device-detection
<p align="center">
<img src="https://img.shields.io/npm/v/rm-ng-device-detection.svg" alt="npm version">
<img src="https://img.shields.io/npm/dm/rm-ng-device-detection.svg" alt="npm downloads">
<img src="https://img.shields.io/npm/l/rm-ng-device-detection.svg" alt="license">
<img src="https://img.shields.io/badge/Angular-14%2B-red.svg" alt="Angular 14+">
</p>
<p align="center">
A lightweight, tree-shakable Angular library for detecting and classifying devices. Identify device type, OS, browser, and more based on user agent strings to create responsive, device-specific user experiences.
</p>
## See It In Action
<div align="center">
<img src="https://github.com/malikrajat/rm-ng-device-detection/blob/main/assets/code.png" alt="rm-ng-device-detection Demo" width="800"/>
</div>
## Features
- **Device Detection** - Identify mobile, tablet, and desktop devices
- **OS & Browser Detection** - Detect operating systems and browsers
- **Lightweight & Fast** - Minimal bundle size with tree-shaking support
- **Easy Integration** - Simple service-based API
- **Standalone Support** - Works with Angular 14+ standalone components
- **No Dependencies** - Pure TypeScript implementation
- **SSR Compatible** - Works with Angular Universal
## Installation
Install the library using npm or yarn:
```bash
npm install rm-ng-device-detection --save
```
or
```bash
yarn add rm-ng-device-detection
```
## Quick Start
### Step 1: Import the Service
Import the service in your component (works with both standalone and module-based apps):
```typescript
import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService, DeviceInfo } from 'rm-ng-device-detection';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
deviceInfo: DeviceInfo | null = null;
constructor(private deviceService: RmNgDeviceDetectionService) {}
ngOnInit(): void {
this.detectDevice();
}
private detectDevice(): void {
// Get complete device information
this.deviceInfo = this.deviceService.getDeviceInfo();
// Use helper methods for specific checks
const isMobile = this.deviceService.isMobile();
const isTablet = this.deviceService.isTablet();
const isDesktop = this.deviceService.isDesktop();
console.log('Device Info:', this.deviceInfo);
console.log('Is Mobile:', isMobile);
console.log('Is Tablet:', isTablet);
console.log('Is Desktop:', isDesktop);
}
}
```
### Step 2: Use in Your Template
```html
<div *ngIf="deviceInfo">
<h2>Device Information</h2>
<p>Device Type: {{ deviceInfo.device }}</p>
<p>Browser: {{ deviceInfo.browser }}</p>
<p>Operating System: {{ deviceInfo.os }}</p>
<p>OS Version: {{ deviceInfo.os_version }}</p>
</div>
<!-- Conditional rendering based on device type -->
<div *ngIf="deviceService.isMobile()">
<p>Mobile-specific content</p>
</div>
<div *ngIf="deviceService.isDesktop()">
<p>Desktop-specific content</p>
</div>
```
## API Reference
### DeviceInfo Interface
The `getDeviceInfo()` method returns a `DeviceInfo` object with the following properties:
```typescript
interface DeviceInfo {
browser: string; // Browser name (e.g., 'Chrome', 'Firefox', 'Safari')
os: string; // Operating system (e.g., 'Windows', 'macOS', 'Android')
device: string; // Device type (e.g., 'mobile', 'tablet', 'desktop')
userAgent: string; // Full user agent string
os_version: string; // Operating system version
}
```
### Service Methods
#### `getDeviceInfo(): DeviceInfo`
Returns complete device information including browser, OS, device type, user agent, and OS version.
**Example:**
```typescript
const deviceInfo = this.deviceService.getDeviceInfo();
console.log(deviceInfo);
// Output: { browser: 'Chrome', os: 'Windows', device: 'desktop', ... }
```
#### `isMobile(): boolean`
Returns `true` if the device is a mobile device (Android, iPhone, Windows Phone, etc.).
**Example:**
```typescript
if (this.deviceService.isMobile()) {
// Load mobile-optimized components
}
```
#### `isTablet(): boolean`
Returns `true` if the device is a tablet (iPad, Android tablets, etc.).
**Example:**
```typescript
if (this.deviceService.isTablet()) {
// Adjust layout for tablets
}
```
#### `isDesktop(): boolean`
Returns `true` if the device is a desktop/laptop computer.
**Example:**
```typescript
if (this.deviceService.isDesktop()) {
// Enable advanced desktop features
}
```
## Usage Examples
### Example 1: Responsive Component Loading
```typescript
import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService } from 'rm-ng-device-detection';
@Component({
selector: 'app-responsive',
template: `
<ng-container *ngIf="isMobile">
<app-mobile-header></app-mobile-header>
</ng-container>
<ng-container *ngIf="!isMobile">
<app-desktop-header></app-desktop-header>
</ng-container>
`
})
export class ResponsiveComponent implements OnInit {
isMobile: boolean = false;
constructor(private deviceService: RmNgDeviceDetectionService) {}
ngOnInit(): void {
this.isMobile = this.deviceService.isMobile();
}
}
```
### Example 2: Analytics & Tracking
```typescript
import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService } from 'rm-ng-device-detection';
@Component({
selector: 'app-analytics'
})
export class AnalyticsComponent implements OnInit {
constructor(
private deviceService: RmNgDeviceDetectionService,
private analyticsService: AnalyticsService
) {}
ngOnInit(): void {
const deviceInfo = this.deviceService.getDeviceInfo();
// Send device info to analytics
this.analyticsService.trackEvent('device_info', {
device: deviceInfo.device,
browser: deviceInfo.browser,
os: deviceInfo.os,
os_version: deviceInfo.os_version
});
}
}
```
### Example 3: Device-Specific Styling
```typescript
import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService } from 'rm-ng-device-detection';
@Component({
selector: 'app-styled',
template: `
<div [class]="deviceClass">
<h1>Content adapts to your device</h1>
</div>
`,
styles: [`
.mobile { font-size: 14px; padding: 10px; }
.tablet { font-size: 16px; padding: 15px; }
.desktop { font-size: 18px; padding: 20px; }
`]
})
export class StyledComponent implements OnInit {
deviceClass: string = 'desktop';
constructor(private deviceService: RmNgDeviceDetectionService) {}
ngOnInit(): void {
if (this.deviceService.isMobile()) {
this.deviceClass = 'mobile';
} else if (this.deviceService.isTablet()) {
this.deviceClass = 'tablet';
} else {
this.deviceClass = 'desktop';
}
}
}
```
## 🎬 Live Demo
Try the library in action with our interactive demos:
| Platform | Link |
|----------|------|
| StackBlitz | [](https://stackblitz.com/edit/stackblitz-starters-terqbx) |
| npm | [](https://www.npmjs.com/package/rm-ng-device-detection) |
| GitHub | [](https://github.com/malikrajat/rm-ng-device-detection) |
## Compatibility
### Angular Version Support
| Angular Version | Supported | Standalone | Package Version |
|----------------|-----------|------------|-----------------|
| 14.x | Full | Yes | 1.x.x - 3.x.x |
| 15.x | Full | Yes | 1.x.x - 3.x.x |
| 16.x | Full | Yes | 1.x.x - 3.x.x |
| 17.x | Full | Yes | 1.x.x - 3.x.x |
| 18.x | Full | Yes | 1.x.x |
| 19.x | Full | Yes | 2.x.x |
| 20.x | Full | Yes | 3.x.x |
| 21.x | Full | Yes | Latest |
### Browser Support
| Browser | Minimum Version | Support Status |
|---------|-----------------|----------------|
| Chrome | 80+ | Full |
| Firefox | 75+ | Full |
| Safari | 13+ | Full |
| Edge | 80+ | Full |
| Opera | 67+ | Full |
## Configuration & Advanced Usage
### Server-Side Rendering (SSR)
The library is compatible with Angular Universal. The user agent is automatically detected from the request headers:
```typescript
// Works automatically with SSR - no special configuration needed
const deviceInfo = this.deviceService.getDeviceInfo();
```
### Custom User Agent
If you need to test with a custom user agent string, you can initialize the service with your own user agent:
```typescript
// Note: This is typically not needed as the library auto-detects
// This example is for testing purposes only
```
## Use Cases
- **Analytics**: Track device types, browsers, and OS versions
- **Responsive Design**: Load device-specific components and styles
- **Content Adaptation**: Serve different content based on device capabilities
- **Performance**: Lazy load features based on device type
- **Feature Detection**: Enable/disable features based on device capabilities
- **Progressive Web Apps**: Optimize PWA experience per device
- **A/B Testing**: Run device-specific experiments
## Tree-Shaking & Bundle Size
This library is optimized for modern Angular applications:
- Marked as `sideEffects: false` for aggressive tree-shaking
- Service-based API only imports what you use
- No external runtime dependencies
- Minimal bundle impact (~2KB gzipped)
## Development
Want to contribute or run the library locally?
### Setup
```bash
# Clone the repository
git clone https://github.com/malikrajat/rm-ng-device-detection.git
cd rm-ng-device-detection
# Install dependencies
pnpm install
# Start development server
pnpm start # Serves demo app on http://localhost:4200
```
### Build
```bash
# Build the library
pnpm build
# Run tests
pnpm test
# Run linter
pnpm lint
```
## Contributing
Contributions are welcome! Please follow these steps:
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
### Contribution Guidelines
- Follow the [Angular Style Guide](https://angular.dev/style-guide)
- Write unit tests for new features
- Update documentation for API changes
- Keep commits focused and descriptive
## Issues & Support
Need help or found a bug?
| Type | Link |
|------|------|
| Bug Report | [Report a Bug](https://github.com/malikrajat/rm-ng-device-detection/issues/new?template=bug_report.md) |
| Feature Request | [Request a Feature](https://github.com/malikrajat/rm-ng-device-detection/issues/new?template=feature_request.md) |
| Discussions | [Join Discussion](https://github.com/malikrajat/rm-ng-device-detection/discussions) |
| Email | [mr.rajatmalik@gmail.com](mailto:mr.rajatmalik@gmail.com?subject=rm-ng-device-detection%20Support) |
## Changelog
See [CHANGELOG.md](https://github.com/malikrajat/rm-ng-device-detection/blob/main/CHANGELOG.md) for release history.
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Author
**Rajat Malik**
- Website: [rajatmalik.dev](https://rajatmalik.dev)
- Email: [mr.rajatmalik@gmail.com](mailto:mr.rajatmalik@gmail.com)
- LinkedIn: [errajatmalik](https://linkedin.com/in/errajatmalik)
- GitHub: [@malikrajat](https://github.com/malikrajat)
## Support This Project
If **rm-ng-device-detection** has helped you build better Angular applications, please consider:
### ⭐ Star This Repository
A star helps other developers discover this library and shows your appreciation!
[](https://github.com/malikrajat/rm-ng-device-detection/stargazers)
### 🌟 Why Star?
- Help increase visibility in the Angular community
- Support ongoing development and improvements
- Show appreciation for free, quality tools
- Encourage more open-source contributions
### Explore More Libraries
Check out my other Angular libraries that might help your project:
[](https://github.com/malikrajat?tab=repositories)
## Acknowledgments
This library was inspired by the need for a lightweight, modern device detection solution for Angular applications. Special thanks to the Angular community for their feedback and contributions.
<p align="center">Made with ❤️ by <a href="https://rajatmalik.dev">Rajat Malik</a></p>
<p align="center">
<a href="https://github.com/malikrajat/rm-ng-device-detection"> Star on GitHub</a> •
<a href="https://www.npmjs.com/package/rm-ng-device-detection"> View on npm</a> •
<a href="https://github.com/malikrajat/rm-ng-device-detection/issues">Report Issue</a>
</p>