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?.();
}
}