generated from bisco/codex-bootstrap
feat: add editorial homepage and show list layout
This commit is contained in:
@@ -1,33 +1,29 @@
|
|||||||
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||||
import { RouterLink } from '@angular/router';
|
import { RouterLink } from '@angular/router';
|
||||||
import { MatButtonModule } from '@angular/material/button';
|
import { MatButtonModule } from '@angular/material/button';
|
||||||
import { MatCardModule } from '@angular/material/card';
|
import { MatCardModule } from '@angular/material/card';
|
||||||
|
|
||||||
import { API_BASE_URL } from '../services/api-config.token';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [RouterLink, MatButtonModule, MatCardModule],
|
imports: [RouterLink, MatButtonModule, MatCardModule],
|
||||||
template: `
|
template: `
|
||||||
<section class="hero page">
|
<section class="hero">
|
||||||
<div class="hero-copy">
|
<div class="hero-inner page">
|
||||||
<p class="eyebrow">AzioneLab</p>
|
<div class="hero-copy">
|
||||||
<h1>Un luogo dove il teatro prende forma, voce e relazione.</h1>
|
<p class="hero-kicker">AZIONELAB</p>
|
||||||
<p class="supporting">
|
<h1>Laboratori teatrali & produzioni audio/visive</h1>
|
||||||
AzioneLab intreccia laboratori teatrali, produzioni audio/visive e momenti scenici costruiti con cura. Qui il pubblico trova una casa aperta: puo' scoprire gli spettacoli, prenotare con semplicita' e arrivare in sala con la leggerezza di chi sa gia' dove andare.
|
<p class="hero-direction">Direzione artistica a cura di Ernesto Estatico</p>
|
||||||
</p>
|
<p class="supporting">
|
||||||
<div class="hero-actions">
|
Un luogo di ricerca, presenza e relazione, dove il teatro incontra la formazione e la scena si apre al pubblico con un ritmo piu' umano, piu' vicino, piu' vivo.
|
||||||
<a mat-flat-button color="primary" routerLink="/shows">Entra nella programmazione</a>
|
</p>
|
||||||
<a mat-stroked-button routerLink="/check-in">Vai all'accoglienza</a>
|
<div class="hero-actions">
|
||||||
|
<a mat-flat-button color="primary" routerLink="/shows">Scopri gli spettacoli</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="hero-stage" aria-hidden="true">
|
<div class="hero-aside" aria-hidden="true">
|
||||||
<div class="curtain"></div>
|
<p>Programmazioni, laboratori e attraversamenti scenici pensati per spazi raccolti e sguardi attenti.</p>
|
||||||
<div class="stage-glow"></div>
|
<span>AzioneLab abita il tempo dell'incontro prima ancora di quello della prenotazione.</span>
|
||||||
<div class="stage-copy">
|
|
||||||
<span>Questa sera in scena</span>
|
|
||||||
<strong>Ti aspettiamo in sala con il tempo giusto per entrare nell'atmosfera</strong>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -35,273 +31,201 @@ import { API_BASE_URL } from '../services/api-config.token';
|
|||||||
<section class="overview page">
|
<section class="overview page">
|
||||||
<div class="section-heading">
|
<div class="section-heading">
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Perche' AzioneLab</p>
|
<p class="eyebrow">Uno spazio da attraversare</p>
|
||||||
<h2>Non solo prenotazioni: un invito a entrare nel lavoro, nell'ascolto e nella scena</h2>
|
<h2>Il sito accompagna il pubblico verso gli spettacoli senza perdere il tono di una compagnia teatrale</h2>
|
||||||
</div>
|
</div>
|
||||||
<p class="supporting">Ogni passaggio e' pensato per restare umano: guardi cosa c'e', scegli la data, ricevi conferma e arrivi in teatro senza attriti.</p>
|
<p class="supporting">Ogni passaggio resta leggibile e misurato: si guarda, si sceglie, si prenota, si arriva in sala con la sensazione di essere attesi.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="feature-grid">
|
<div class="feature-grid">
|
||||||
<mat-card class="feature-card">
|
<mat-card class="feature-card">
|
||||||
<mat-card-title>Trova la serata che fa per te</mat-card-title>
|
<mat-card-title>Una programmazione da leggere con calma</mat-card-title>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<p>Le schede tengono vicini i dettagli che contano davvero: luogo, orario, disponibilita' e respiro dello spettacolo.</p>
|
<p>Le schede mettono in evidenza i dettagli utili senza appesantire la scena: titolo, sintesi, immagini e accesso alla prenotazione.</p>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
<mat-card class="feature-card">
|
<mat-card class="feature-card">
|
||||||
<mat-card-title>Una conferma semplice, senza fretta</mat-card-title>
|
<mat-card-title>Una prenotazione semplice e rassicurante</mat-card-title>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<p>Ricevi un'email, confermi quando vuoi e la tua prenotazione prende forma in modo chiaro e affidabile.</p>
|
<p>La conferma via email mantiene il percorso leggero per chi prenota e affidabile per chi organizza la capienza.</p>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
<mat-card class="feature-card">
|
<mat-card class="feature-card">
|
||||||
<mat-card-title>Accoglienza attenta all'ingresso</mat-card-title>
|
<mat-card-title>Un'accoglienza pensata per il lavoro in sala</mat-card-title>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<p>Lo staff puo' accompagnare l'arrivo del pubblico con uno strumento rapido, discreto e pensato per il lavoro in sala.</p>
|
<p>Dall'ingresso alla verifica del QR code, tutto resta discreto, chiaro e adatto a un contesto teatrale.</p>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="journey-grid page">
|
<section class="journey page">
|
||||||
<div class="journey-copy">
|
<div class="journey-copy">
|
||||||
<p class="eyebrow">Il percorso del pubblico</p>
|
<p class="eyebrow">Il percorso del pubblico</p>
|
||||||
<h2>Dalla curiosita' al posto in sala, con naturalezza</h2>
|
<h2>Dalla scoperta dello spettacolo all'ingresso, in pochi passaggi essenziali</h2>
|
||||||
<ol>
|
|
||||||
<li>Scopri la programmazione e lasciati guidare dalla scheda di ogni spettacolo.</li>
|
|
||||||
<li>Richiedi i posti per la replica che preferisci e conferma dall'email ricevuta.</li>
|
|
||||||
<li>Conserva il QR code sul telefono oppure stampalo e portalo con te all'ingresso.</li>
|
|
||||||
</ol>
|
|
||||||
</div>
|
</div>
|
||||||
|
<ol class="journey-steps">
|
||||||
<mat-card class="meta-card">
|
<li>Esplora gli spettacoli in programma e apri la scheda che ti incuriosisce.</li>
|
||||||
<mat-card-title>Dietro le quinte</mat-card-title>
|
<li>Invia la richiesta di prenotazione e confermala dall'email ricevuta.</li>
|
||||||
<mat-card-content>
|
<li>Porta con te il QR code sul telefono o su carta e raggiungi la sala con semplicita'.</li>
|
||||||
<p class="meta-label">Collegamento API</p>
|
</ol>
|
||||||
<code>{{ apiBaseUrl }}</code>
|
|
||||||
<p class="meta-note">La parte pubblica del sito dialoga con le API Django esistenti senza cambiare il comportamento del backend.</p>
|
|
||||||
</mat-card-content>
|
|
||||||
</mat-card>
|
|
||||||
</section>
|
</section>
|
||||||
`,
|
`,
|
||||||
styles: [`
|
styles: [`
|
||||||
.hero {
|
.hero {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 0 72px;
|
||||||
|
padding: 56px 0 72px;
|
||||||
|
background:
|
||||||
|
linear-gradient(180deg, rgba(47, 125, 87, 0.05), rgba(47, 125, 87, 0) 42%),
|
||||||
|
linear-gradient(180deg, #fcfbf8 0%, #f8f6f0 100%);
|
||||||
|
border-bottom: 1px solid var(--azionelab-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-inner {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1.3fr) minmax(280px, 0.9fr);
|
grid-template-columns: minmax(0, 1.3fr) minmax(240px, 0.7fr);
|
||||||
gap: 28px;
|
gap: 36px;
|
||||||
align-items: stretch;
|
align-items: end;
|
||||||
padding: 12px 0 24px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-copy {
|
.hero-copy {
|
||||||
padding: 34px 0 20px;
|
padding-top: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-kicker {
|
||||||
|
margin: 0 0 18px;
|
||||||
|
color: var(--azionelab-accent);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: 800;
|
||||||
|
letter-spacing: 0.18em;
|
||||||
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
max-width: 10.5ch;
|
max-width: 11ch;
|
||||||
font-size: 3.6rem;
|
font-size: 4.3rem;
|
||||||
|
line-height: 0.96;
|
||||||
}
|
}
|
||||||
|
|
||||||
.supporting {
|
.hero-direction {
|
||||||
margin: 20px 0 0;
|
margin: 20px 0 0;
|
||||||
font-size: 1.06rem;
|
color: var(--azionelab-ink-soft);
|
||||||
|
font-size: 1.05rem;
|
||||||
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-actions {
|
.hero-actions {
|
||||||
display: flex;
|
margin-top: 34px;
|
||||||
gap: 12px;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin-top: 28px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-stage {
|
.hero-aside {
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
min-height: 420px;
|
|
||||||
border-radius: var(--azionelab-radius-lg);
|
|
||||||
border: 1px solid rgba(255, 250, 245, 0.16);
|
|
||||||
background:
|
|
||||||
linear-gradient(180deg, rgba(31, 18, 18, 0.1), rgba(27, 18, 14, 0.62)),
|
|
||||||
linear-gradient(135deg, #b04b40 0%, #7f251f 24%, #43261f 56%, #211b1a 100%);
|
|
||||||
box-shadow: var(--azionelab-shadow-strong);
|
|
||||||
}
|
|
||||||
|
|
||||||
.curtain {
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
background:
|
|
||||||
linear-gradient(90deg, rgba(255, 255, 255, 0.08) 0, rgba(255, 255, 255, 0) 22%, rgba(255, 255, 255, 0.08) 48%, rgba(255, 255, 255, 0) 74%, rgba(255, 255, 255, 0.08) 100%),
|
|
||||||
repeating-linear-gradient(90deg, rgba(75, 18, 14, 0.2) 0 18px, rgba(160, 60, 52, 0.08) 18px 36px);
|
|
||||||
opacity: 0.9;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stage-glow {
|
|
||||||
position: absolute;
|
|
||||||
left: 50%;
|
|
||||||
bottom: -80px;
|
|
||||||
width: 340px;
|
|
||||||
height: 340px;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
border-radius: 50%;
|
|
||||||
background: radial-gradient(circle, rgba(245, 214, 150, 0.9) 0, rgba(245, 214, 150, 0.22) 44%, rgba(245, 214, 150, 0) 72%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.stage-copy {
|
|
||||||
position: absolute;
|
|
||||||
left: 24px;
|
|
||||||
right: 24px;
|
|
||||||
bottom: 24px;
|
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 8px;
|
gap: 16px;
|
||||||
padding: 18px 20px;
|
padding: 0 0 10px;
|
||||||
border-radius: 18px;
|
color: var(--azionelab-muted);
|
||||||
background: rgba(24, 17, 15, 0.52);
|
|
||||||
backdrop-filter: blur(8px);
|
|
||||||
color: rgba(255, 247, 239, 0.94);
|
|
||||||
border: 1px solid rgba(255, 247, 239, 0.12);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.stage-copy span {
|
.hero-aside p,
|
||||||
text-transform: uppercase;
|
.hero-aside span {
|
||||||
font-size: 0.76rem;
|
margin: 0;
|
||||||
letter-spacing: 0.08em;
|
line-height: 1.75;
|
||||||
color: rgba(255, 227, 192, 0.84);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.stage-copy strong {
|
.hero-aside span {
|
||||||
font-family: var(--azionelab-serif);
|
max-width: 24ch;
|
||||||
font-size: 1.4rem;
|
|
||||||
font-weight: 700;
|
|
||||||
line-height: 1.15;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.overview,
|
.overview,
|
||||||
.journey-grid {
|
.journey {
|
||||||
margin-top: 34px;
|
margin-top: 0;
|
||||||
|
margin-bottom: 72px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-heading {
|
.section-heading {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1fr) minmax(260px, 420px);
|
grid-template-columns: minmax(0, 1fr) minmax(300px, 460px);
|
||||||
gap: 24px;
|
gap: 28px;
|
||||||
align-items: end;
|
align-items: end;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-heading h2,
|
.section-heading h2,
|
||||||
.journey-copy h2 {
|
.journey-copy h2 {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
max-width: 18ch;
|
max-width: 16ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
.feature-grid {
|
.feature-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
gap: 18px;
|
gap: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.feature-card,
|
.feature-card {
|
||||||
.meta-card {
|
|
||||||
border-radius: var(--azionelab-radius-md);
|
border-radius: var(--azionelab-radius-md);
|
||||||
border: 1px solid var(--azionelab-border);
|
border: 1px solid var(--azionelab-border);
|
||||||
background: linear-gradient(180deg, rgba(255, 253, 250, 0.98), rgba(251, 245, 236, 0.94));
|
background: var(--azionelab-surface);
|
||||||
box-shadow: var(--azionelab-shadow);
|
box-shadow: var(--azionelab-shadow);
|
||||||
}
|
}
|
||||||
|
|
||||||
.feature-card {
|
.feature-card {
|
||||||
min-height: 210px;
|
min-height: 220px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.feature-card mat-card-title,
|
.feature-card mat-card-title {
|
||||||
.meta-card mat-card-title {
|
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
font-family: var(--azionelab-serif);
|
font-family: var(--azionelab-serif);
|
||||||
font-size: 1.18rem;
|
font-size: 1.28rem;
|
||||||
font-weight: 700;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.feature-card p,
|
.feature-card p {
|
||||||
.meta-card p {
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: var(--azionelab-muted);
|
color: var(--azionelab-muted);
|
||||||
line-height: 1.6;
|
line-height: 1.72;
|
||||||
}
|
|
||||||
|
|
||||||
.journey-grid {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: minmax(0, 1.2fr) minmax(280px, 0.9fr);
|
|
||||||
gap: 24px;
|
|
||||||
align-items: start;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.journey-copy {
|
.journey-copy {
|
||||||
padding: 10px 0;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
ol {
|
.journey-steps {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 12px;
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
margin: 20px 0 0;
|
gap: 20px;
|
||||||
|
margin: 0;
|
||||||
padding-left: 22px;
|
padding-left: 22px;
|
||||||
color: var(--azionelab-ink-soft);
|
color: var(--azionelab-ink-soft);
|
||||||
line-height: 1.65;
|
line-height: 1.65;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meta-label {
|
|
||||||
margin: 0 0 10px;
|
|
||||||
font-size: 0.8rem;
|
|
||||||
font-weight: 700;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--azionelab-muted);
|
|
||||||
letter-spacing: 0.08em;
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 10px 12px;
|
|
||||||
border-radius: 12px;
|
|
||||||
background: rgba(34, 28, 24, 0.06);
|
|
||||||
color: var(--azionelab-ink-soft);
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
.meta-note {
|
|
||||||
margin: 18px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 900px) {
|
@media (max-width: 900px) {
|
||||||
.hero,
|
.hero-inner,
|
||||||
.section-heading,
|
.section-heading,
|
||||||
.journey-grid,
|
.journey-steps,
|
||||||
.feature-grid {
|
.feature-grid {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 2.8rem;
|
font-size: 3.2rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
@media (max-width: 640px) {
|
||||||
|
.hero {
|
||||||
|
margin-bottom: 56px;
|
||||||
|
padding: 40px 0 56px;
|
||||||
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 2.2rem;
|
font-size: 2.4rem;
|
||||||
}
|
|
||||||
|
|
||||||
.hero-stage {
|
|
||||||
min-height: 320px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stage-copy {
|
|
||||||
left: 16px;
|
|
||||||
right: 16px;
|
|
||||||
bottom: 16px;
|
|
||||||
padding: 16px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`],
|
`],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
})
|
})
|
||||||
export class HomePageComponent {
|
export class HomePageComponent {
|
||||||
protected readonly apiBaseUrl = inject(API_BASE_URL);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service';
|
|||||||
<header class="page-header">
|
<header class="page-header">
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Programmazione</p>
|
<p class="eyebrow">Programmazione</p>
|
||||||
<h1>Spettacoli</h1>
|
<h1>Spettacoli in programma</h1>
|
||||||
</div>
|
</div>
|
||||||
<p class="supporting">
|
<p class="supporting">
|
||||||
Scopri le produzioni di AzioneLab, apri la scheda di ogni spettacolo e avvicinati alla prenotazione con semplicità.
|
Una selezione di lavori, attraversamenti scenici e appuntamenti da leggere con calma, immagine dopo immagine, scheda dopo scheda.
|
||||||
</p>
|
</p>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
@@ -59,21 +59,24 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service';
|
|||||||
<div class="show-grid">
|
<div class="show-grid">
|
||||||
@for (show of shows(); track show.slug) {
|
@for (show of shows(); track show.slug) {
|
||||||
<mat-card class="show-card">
|
<mat-card class="show-card">
|
||||||
@if (show.image_url) {
|
@if (getShowImage(show); as showImage) {
|
||||||
<div class="show-image-wrap">
|
<div class="show-image-wrap">
|
||||||
<img class="show-image" [src]="show.image_url" [alt]="show.title" />
|
<img class="show-image" [src]="showImage" [alt]="show.title" />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="card-topline">
|
<div class="card-body">
|
||||||
<span class="card-label">Spettacolo in evidenza</span>
|
<div class="card-topline">
|
||||||
|
<span class="card-label">In programma</span>
|
||||||
|
</div>
|
||||||
|
<mat-card-title>{{ show.title }}</mat-card-title>
|
||||||
|
<mat-card-content>
|
||||||
|
<p>{{ show.summary }}</p>
|
||||||
|
<p class="show-note">Apri la scheda per vedere le prossime date e i dettagli di prenotazione.</p>
|
||||||
|
</mat-card-content>
|
||||||
|
<mat-card-actions>
|
||||||
|
<a mat-button [routerLink]="['/shows', show.slug]">{{ getShowCta(show) }}</a>
|
||||||
|
</mat-card-actions>
|
||||||
</div>
|
</div>
|
||||||
<mat-card-title>{{ show.title }}</mat-card-title>
|
|
||||||
<mat-card-content>
|
|
||||||
<p>{{ show.summary }}</p>
|
|
||||||
</mat-card-content>
|
|
||||||
<mat-card-actions>
|
|
||||||
<a mat-button [routerLink]="['/shows', show.slug]">Apri scheda</a>
|
|
||||||
</mat-card-actions>
|
|
||||||
</mat-card>
|
</mat-card>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@@ -83,21 +86,21 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service';
|
|||||||
styles: [`
|
styles: [`
|
||||||
.page-header {
|
.page-header {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: minmax(0, 1fr) minmax(260px, 410px);
|
grid-template-columns: minmax(0, 1fr) minmax(300px, 430px);
|
||||||
gap: 24px;
|
gap: 28px;
|
||||||
align-items: end;
|
align-items: end;
|
||||||
margin-bottom: 28px;
|
margin-bottom: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.supporting {
|
.supporting {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
max-width: 34ch;
|
max-width: 36ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
.show-grid {
|
.show-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||||
gap: 22px;
|
gap: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-panel,
|
.status-panel,
|
||||||
@@ -139,21 +142,19 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service';
|
|||||||
.show-card {
|
.show-card {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
min-height: 360px;
|
min-height: 520px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border-radius: var(--azionelab-radius-md);
|
border-radius: var(--azionelab-radius-md);
|
||||||
border: 1px solid var(--azionelab-border);
|
border: 1px solid var(--azionelab-border);
|
||||||
background: linear-gradient(180deg, rgba(255, 253, 249, 0.98), rgba(250, 243, 233, 0.94));
|
background: var(--azionelab-surface);
|
||||||
box-shadow: var(--azionelab-shadow);
|
box-shadow: var(--azionelab-shadow);
|
||||||
}
|
}
|
||||||
|
|
||||||
.show-image-wrap {
|
.show-image-wrap {
|
||||||
aspect-ratio: 15 / 10;
|
aspect-ratio: 4 / 5;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border-bottom: 1px solid var(--azionelab-border);
|
border-bottom: 1px solid var(--azionelab-border);
|
||||||
background:
|
background: var(--azionelab-bg-strong);
|
||||||
linear-gradient(135deg, rgba(207, 71, 51, 0.14), rgba(15, 22, 36, 0.06)),
|
|
||||||
#f8f1ea;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.show-image {
|
.show-image {
|
||||||
@@ -165,23 +166,29 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service';
|
|||||||
}
|
}
|
||||||
|
|
||||||
.show-card:hover .show-image {
|
.show-card:hover .show-image {
|
||||||
transform: scale(1.03);
|
transform: scale(1.015);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-body {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 22px 22px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-topline {
|
.card-topline {
|
||||||
padding: 18px 18px 0;
|
padding: 0 0 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-label {
|
.card-label {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
min-height: 28px;
|
min-height: 24px;
|
||||||
padding: 0 12px;
|
color: var(--azionelab-accent);
|
||||||
border-radius: 999px;
|
font-size: 0.76rem;
|
||||||
background: rgba(143, 51, 45, 0.08);
|
|
||||||
color: var(--azionelab-accent-strong);
|
|
||||||
font-size: 0.78rem;
|
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.show-card mat-card-content {
|
.show-card mat-card-content {
|
||||||
@@ -191,28 +198,43 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service';
|
|||||||
.show-card mat-card-title,
|
.show-card mat-card-title,
|
||||||
.show-card mat-card-content,
|
.show-card mat-card-content,
|
||||||
.show-card mat-card-actions {
|
.show-card mat-card-actions {
|
||||||
padding-left: 18px;
|
padding-left: 0;
|
||||||
padding-right: 18px;
|
padding-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.show-card mat-card-title {
|
.show-card mat-card-title {
|
||||||
margin-top: 10px;
|
margin-top: 0;
|
||||||
font-family: var(--azionelab-serif);
|
font-family: var(--azionelab-serif);
|
||||||
font-size: 1.45rem;
|
font-size: 1.85rem;
|
||||||
font-weight: 700;
|
font-weight: 600;
|
||||||
line-height: 1.12;
|
line-height: 1.04;
|
||||||
}
|
}
|
||||||
|
|
||||||
.show-card p {
|
.show-card p {
|
||||||
color: var(--azionelab-muted);
|
color: var(--azionelab-muted);
|
||||||
line-height: 1.6;
|
line-height: 1.74;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.show-note {
|
||||||
|
margin-top: 18px !important;
|
||||||
|
padding-top: 18px;
|
||||||
|
border-top: 1px solid var(--azionelab-border);
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-card mat-card-actions {
|
||||||
|
padding-top: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 860px) {
|
@media (max-width: 860px) {
|
||||||
.page-header {
|
.page-header {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.show-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
`],
|
`],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
@@ -233,6 +255,14 @@ export class ShowListPageComponent {
|
|||||||
this.loadShows();
|
this.loadShows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected getShowImage(show: ShowListItem): string {
|
||||||
|
return show.image_url || show.poster_image || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected getShowCta(_show: ShowListItem): string {
|
||||||
|
return 'Scopri lo spettacolo';
|
||||||
|
}
|
||||||
|
|
||||||
private loadShows(): void {
|
private loadShows(): void {
|
||||||
this.isLoading.set(true);
|
this.isLoading.set(true);
|
||||||
this.errorMessage.set('');
|
this.errorMessage.set('');
|
||||||
|
|||||||
Reference in New Issue
Block a user