import { NgOptimizedImage } from '@angular/common' import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core' import { RouterLink } from '@angular/router' import { AREAS, findArea } from '../../content/areas' import { PROJECTS } from '../../content/projects' import { SeoService } from '../core/seo.service' import { PageHeader } from '../shared/page-header' import { PlaceholderBadge } from '../shared/placeholder-badge' import { QuoteCta } from '../shared/quote-cta' /** * /realizzazioni: galleria da src/content/projects.ts, filtrabile per area con ?area= * (link veri, quindi il filtro funziona anche senza JavaScript e lato server). */ @Component({ selector: 'app-projects-page', imports: [NgOptimizedImage, RouterLink, PageHeader, PlaceholderBadge, QuoteCta], changeDetection: ChangeDetectionStrategy.OnPush, template: `
`, styles: ` @use 'mixins' as mq; .body { padding-block: var(--space-5) var(--space-4); } .filters { display: flex; flex-wrap: wrap; gap: var(--space-2); margin: 0 0 var(--space-5); padding: 0; list-style: none; a { display: inline-flex; align-items: center; min-height: 44px; padding-inline: var(--space-4); border: 1px solid var(--color-line); border-radius: var(--radius-pill); color: var(--color-ink); text-decoration: none; &[aria-current='true'] { border-color: var(--color-primary); background: var(--color-primary); color: var(--color-on-primary); } } } .gallery { display: grid; gap: var(--space-5); margin: 0; padding: 0; list-style: none; @include mq.up(md) { grid-template-columns: repeat(2, 1fr); } @include mq.up(lg) { grid-template-columns: repeat(3, 1fr); } } .card { overflow: hidden; border: 1px solid var(--color-line); border-radius: var(--radius-lg); img { width: 100%; height: auto; } } .text { padding: var(--space-4) var(--space-5) var(--space-5); h2 { font-size: var(--font-size-lg); margin-bottom: var(--space-2); } p:last-child { margin: 0; color: var(--color-ink-muted); } } .meta { margin-bottom: var(--space-2); font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; letter-spacing: 0.04em; color: var(--color-secondary); } `, }) export default class ProjectsPage { /** Query param ?area= (withComponentInputBinding). */ readonly area = input() protected readonly areas = AREAS protected readonly hasPlaceholders = PROJECTS.some((p) => p.placeholder) protected readonly selected = computed(() => (this.area() && findArea(this.area()!) ? this.area() : undefined)) protected readonly projects = computed(() => { const area = this.selected() return area ? PROJECTS.filter((p) => p.area === area) : PROJECTS }) protected readonly areaLabel = (slug: string) => findArea(slug)?.label ?? slug constructor() { // Una sola pagina canonica: i filtri ?area= puntano tutti a /realizzazioni inject(SeoService).setPage({ title: 'Realizzazioni', description: 'Impianti fotovoltaici, pompe di calore, sistemi di trattamento acqua e ricarica realizzati da ITI TECHNOLOGY.', path: '/realizzazioni', }) } }