import { Component, Input, Output, EventEmitter, Inject, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { BreakpointObserver } from '@angular/cdk/layout'; /** * Responsive action button — shows mat-raised-button with text+icon on desktop (>960px), * mat-mini-fab with icon-only + tooltip on mobile. * * Usage: * * * * Colors: 'primary' | 'accent' | 'warn' */ @Component({ selector: 'p3xr-responsive-button', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule], template: ` @if (isWide) { } @else { } `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }) export class P3xrResponsiveButtonComponent implements OnInit, OnDestroy { @Input() icon = ''; @Input() label = ''; @Input() color: 'primary' | 'accent' | 'warn' = 'primary'; @Input() disabled = false; @Output() clicked = new EventEmitter(); isWide = true; private unsub: (() => void) | null = null; constructor( @Inject(BreakpointObserver) private breakpointObserver: BreakpointObserver, @Inject(ChangeDetectorRef) private cdr: ChangeDetectorRef, ) {} ngOnInit(): void { const sub = this.breakpointObserver.observe('(min-width: 960px)').subscribe(r => { this.isWide = r.matches; this.cdr.markForCheck(); }); this.unsub = () => sub.unsubscribe(); } ngOnDestroy(): void { this.unsub?.(); } }