diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index 9355b39..19be632 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -1,8 +1,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatToolbarModule } from '@angular/material/toolbar'; @Component({ selector: 'app-root', @@ -11,56 +9,108 @@ import { MatToolbarModule } from '@angular/material/toolbar'; RouterOutlet, RouterLink, RouterLinkActive, - MatToolbarModule, MatButtonModule, - MatIconModule, ], template: `
Before you submit
+Enter a token manually or scan a QR code to preview admission data and confirm entrance.
-Front of house
+AzioneLab Theatre Company
-- This Angular shell is wired for the existing Django APIs and ready for the next booking-focused iterations. + AzioneLab brings contemporary theatre into intimate venues. This public frontend is shaped around clear show discovery, lightweight booking, and a calm arrival experience at the door.
At a glance
+The public experience stays simple: browse a show, reserve seats, confirm by email, arrive with a QR code.
+API base URL
-{{ apiBaseUrl }}
- Placeholders are in place for public content, booking, and staff check-in flows.
+Show listings and detail pages keep venue, schedule, and availability visible without noise.
+Reservations stay pending until the audience member confirms, which keeps capacity trustworthy and easy to manage.
+Front-of-house staff can preview a token, validate it server-side, and record entry in one compact flow.
Audience journey
+{{ apiBaseUrl }}
+
+ Check-in URL: {{ confirmation()!.qr_code_url }}
Show detail
{{ show()!.description || show()!.summary }}
+- Browse current productions published from the AzioneLab backend. + Browse current productions, open a show page, and move toward booking without friction.
@@ -64,6 +64,9 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service';{{ show.summary }}
@@ -78,42 +81,23 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service'; `, styles: [` - .page { - max-width: 1180px; - margin: 0 auto; - } - .page-header { display: grid; - grid-template-columns: minmax(0, 1fr) minmax(260px, 380px); + grid-template-columns: minmax(0, 1fr) minmax(260px, 410px); gap: 24px; align-items: end; - margin-bottom: 24px; - } - - .eyebrow { - margin: 0 0 10px; - color: var(--azionelab-accent); - text-transform: uppercase; - font-size: 0.78rem; - font-weight: 700; - } - - h1 { - margin: 0; - font-size: clamp(2rem, 4vw, 3rem); + margin-bottom: 28px; } .supporting { margin: 0; - color: var(--azionelab-muted); - line-height: 1.6; + max-width: 34ch; } .show-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); - gap: 20px; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 22px; } .status-panel, @@ -131,9 +115,9 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service'; .status-card { max-width: 680px; - border-radius: 8px; + border-radius: var(--azionelab-radius-md); border: 1px solid var(--azionelab-border); - background: var(--azionelab-surface); + background: var(--azionelab-surface-strong); box-shadow: var(--azionelab-shadow); } @@ -155,15 +139,16 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service'; .show-card { display: flex; flex-direction: column; - min-height: 220px; - border-radius: 8px; + min-height: 360px; + overflow: hidden; + border-radius: var(--azionelab-radius-md); border: 1px solid var(--azionelab-border); - background: var(--azionelab-surface); + background: linear-gradient(180deg, rgba(255, 253, 249, 0.98), rgba(250, 243, 233, 0.94)); box-shadow: var(--azionelab-shadow); } .show-image-wrap { - aspect-ratio: 16 / 10; + aspect-ratio: 15 / 10; overflow: hidden; border-bottom: 1px solid var(--azionelab-border); background: @@ -176,15 +161,52 @@ import { ShowListItem, ShowsApiService } from '../services/shows-api.service'; height: 100%; display: block; object-fit: cover; + transition: transform 180ms ease; + } + + .show-card:hover .show-image { + transform: scale(1.03); + } + + .card-topline { + padding: 18px 18px 0; + } + + .card-label { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + background: rgba(143, 51, 45, 0.08); + color: var(--azionelab-accent-strong); + font-size: 0.78rem; + font-weight: 700; } .show-card mat-card-content { flex: 1; } + .show-card mat-card-title, + .show-card mat-card-content, + .show-card mat-card-actions { + padding-left: 18px; + padding-right: 18px; + } + + .show-card mat-card-title { + margin-top: 10px; + font-family: var(--azionelab-serif); + font-size: 1.45rem; + font-weight: 700; + line-height: 1.12; + } + .show-card p { color: var(--azionelab-muted); line-height: 1.6; + margin: 0; } @media (max-width: 860px) { diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 6e568db..3a10e0a 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -1,13 +1,28 @@ :root { - --azionelab-bg: #f3eee6; - --azionelab-surface: rgba(255, 255, 255, 0.78); - --azionelab-surface-strong: rgba(255, 255, 255, 0.92); - --azionelab-ink: #1e1b18; - --azionelab-muted: #645b53; - --azionelab-accent: #9f2f28; - --azionelab-accent-strong: #7f211c; - --azionelab-border: rgba(30, 27, 24, 0.12); - --azionelab-shadow: 0 18px 48px rgba(46, 28, 18, 0.12); + --azionelab-bg: #f5efe6; + --azionelab-bg-strong: #efe4d4; + --azionelab-surface: rgba(255, 251, 246, 0.84); + --azionelab-surface-strong: rgba(255, 252, 248, 0.96); + --azionelab-surface-dark: #342924; + --azionelab-ink: #221c18; + --azionelab-ink-soft: #3a302a; + --azionelab-muted: #6f6258; + --azionelab-accent: #8f332d; + --azionelab-accent-strong: #6e251f; + --azionelab-accent-soft: #c88f64; + --azionelab-highlight: #c6a768; + --azionelab-border: rgba(34, 28, 24, 0.11); + --azionelab-border-strong: rgba(34, 28, 24, 0.18); + --azionelab-shadow: 0 18px 48px rgba(46, 28, 18, 0.10); + --azionelab-shadow-strong: 0 26px 64px rgba(46, 28, 18, 0.16); + --azionelab-radius-sm: 10px; + --azionelab-radius-md: 16px; + --azionelab-radius-lg: 24px; + --azionelab-shell-width: 1180px; + --azionelab-copy-width: 64ch; + --azionelab-section-gap: 28px; + --azionelab-sans: "Segoe UI", "Helvetica Neue", Arial, sans-serif; + --azionelab-serif: Georgia, "Times New Roman", serif; --azionelab-success-bg: #edf7ef; --azionelab-success-ink: #1f5f2b; --azionelab-success-border: rgba(46, 125, 50, 0.18); @@ -23,12 +38,11 @@ html, body { margin: 0; min-height: 100%; - font-family: "Manrope", "Segoe UI", sans-serif; + font-family: var(--azionelab-sans); color: var(--azionelab-ink); background: - radial-gradient(circle at top right, rgba(159, 47, 40, 0.12), transparent 28%), - radial-gradient(circle at left center, rgba(140, 116, 86, 0.14), transparent 35%), - linear-gradient(180deg, #fbf7f2 0%, var(--azionelab-bg) 100%); + linear-gradient(180deg, rgba(143, 51, 45, 0.06), transparent 140px), + linear-gradient(180deg, #faf5ee 0%, var(--azionelab-bg) 52%, #efe4d6 100%); } body { @@ -36,18 +50,79 @@ body { } h1, h2, h3 { - font-family: "Fraunces", "Times New Roman", serif; - letter-spacing: -0.02em; + font-family: var(--azionelab-serif); + font-weight: 700; + letter-spacing: 0; + color: var(--azionelab-ink); +} + +h1 { + font-size: 2.5rem; + line-height: 1.02; +} + +h2 { + font-size: 1.65rem; + line-height: 1.12; +} + +h3 { + font-size: 1.15rem; + line-height: 1.2; } button, input, textarea { font: inherit; } -.material-symbols-outlined { - font-variation-settings: - 'FILL' 0, - 'wght' 500, - 'GRAD' 0, - 'opsz' 24; +a { + color: var(--azionelab-accent-strong); +} + +img { + max-width: 100%; +} + +code { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace; +} + +.page { + width: min(100%, var(--azionelab-shell-width)); + margin: 0 auto; +} + +.eyebrow { + margin: 0 0 12px; + color: var(--azionelab-accent); + text-transform: uppercase; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.08em; +} + +.supporting { + color: var(--azionelab-muted); + line-height: 1.65; + max-width: var(--azionelab-copy-width); +} + +@media (max-width: 900px) { + h1 { + font-size: 2.15rem; + } + + h2 { + font-size: 1.45rem; + } +} + +@media (max-width: 640px) { + h1 { + font-size: 1.9rem; + } + + h2 { + font-size: 1.3rem; + } }