Recipes
Useful together.
Small, practical combinations for the interfaces developers build every day.
Dashboard metricsReadable numbers, explicit units.
Standalone component import { Component } from '@angular/core';
import { CompactNumberPipe, FormatUnitPipe } from 'extra-pipe';
@Component({
standalone:true,
imports:[CompactNumberPipe, FormatUnitPipe],
template: `{{12500 | compactNumber:'compact':1:'en'}}
{{12.5 | formatUnit:'kilometer':{unitDisplay:'long'}:'fr'}}`,
})
export class MetricsComponent {}
Visitors12.5K
Distance12,5 kilomètres
Profile & accountShow just enough information.
Standalone component import { Component } from '@angular/core';
import { InitialsPipe, MaskPipe } from 'extra-pipe';
@Component({
standalone:true,
imports:[InitialsPipe, MaskPipe],
template: `{{'Ana María' | initials:2}}
{{'4242424242424242' | mask:0:4}}`,
})
export class AccountComponent {}
Avatar labelAM
Account ending••••••••••••4242
Masking only changes displayed text. Never send secrets to the browser just because the label is masked.
Immutable collectionsKeep the newest record. Then sort.
Standalone component import { Component } from '@angular/core';
import { JsonPipe } from '@angular/common';
import { UniqueByPipe, OrderByPipe } from 'extra-pipe';
@Component({
standalone:true,
imports:[JsonPipe, UniqueByPipe, OrderByPipe],
template: `{{records | uniqueBy:'id':'last' | orderBy:'name':'asc':'en' | json}}`,
})
export class RecordsComponent {
readonly records=[{id:1,name:'old Ana'},{id:2,name:'Sam'},{id:1,name:'Ana'}];
}
[
{
"id": 1,
"name": "Ana"
},
{
"id": 2,
"name": "Sam"
}
]
Both pipes return new arrays and retain object identity. Precompute large collections outside the template.
ReportingTotal first. Format second.
Standalone component import { Component } from '@angular/core';
import { SumByPipe, CompactNumberPipe } from 'extra-pipe';
@Component({standalone:true, imports:[SumByPipe, CompactNumberPipe], template: `{{sales | sumBy:'amount' | compactNumber:'compact':1:'en'}}`})
export class SalesComponent { readonly sales=[{amount:2500},{amount:10000}]; }
12.5K
Aggregate finite numeric fields, then localize their display. Precompute large reports outside templates.
ContentA reading estimate, not a timer.
Standalone component import { Component } from '@angular/core';
import { WordCountPipe, ReadingTimePipe } from 'extra-pipe';
@Component({standalone:true, imports:[WordCountPipe, ReadingTimePipe], template: `{{article | wordCount:'en'}} words · {{article | readingTime:200:'en'}}`})
export class ArticleComponent { readonly article='Small pipes make thoughtful interfaces.'; }
5 words · 1 min
Uses an explicit words-per-minute rate and language segmentation; it does not measure an individual reader.