Einheitliche Team-Porträts einbauen
- Neue Studio-Porträts für Atena, Ahmad, Ali, Younes und Mo (gleicher Hintergrund, gleiches Licht, schwarzes Shirt) statt der gemischten Originalfotos - Zusätzlich quadratische Thumbnails (320 px) für Fotoraster und Preis-Thumbnails, damit dort keine großen Bilder geladen werden - Team-Liste: Bildausschnitt auf Kopf und Schultern ausgerichtet, neutraler Hintergrund hinter den Porträts - README: Hinweise zu den Porträts und zum fehlenden Foto von Amin Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KBHsCnWNXAB2Le3gAEsivF
No files matched your search
@@ -31,10 +31,15 @@ npm run preview # Build lokal ansehen
|
||||
| Favicon, App-Icon, Vorschaubild zum Teilen | `public/` |
|
||||
| Impressum & Datenschutz | `impressum.html`, `datenschutz.html` |
|
||||
|
||||
**Fotos:** Alle Bilder stammen aus den Team-Fotos der Setmore-Seite (Logo-Wand im Salon). Für den
|
||||
**Fotos:** Hero, „Über uns“ und Menü nutzen die Fotos von der Logo-Wand im Salon (Setmore-Seite). Für den
|
||||
Hero lohnt sich ein eigenes, hochauflösendes Foto (mind. 2400 px breit), z. B. ein Barber bei der Arbeit.
|
||||
Einfach `salon-wand.webp` bzw. `salon-wand-800.webp` ersetzen.
|
||||
|
||||
**Team-Porträts:** Einheitliche Studio-Porträts (per Bild-KI aus den Originalfotos erstellt), je zweimal
|
||||
abgelegt: `name.webp` (1000 px breit, Team-Liste) und `name-thumb.webp` (320 × 320, Fotoraster und
|
||||
Preis-Thumbnails). Für Amin fehlt noch ein Foto – bis dahin zeigt die Seite bei ihm das Wandlogo. Neues
|
||||
Porträt als `amin.webp` / `amin-thumb.webp` ablegen und in `src/data/salon.ts` eintragen.
|
||||
|
||||
**Direktbuchung:** Jede Leistung trägt ihre Setmore-ID (`id`). Wird bei Setmore eine Leistung
|
||||
neu angelegt, bekommt sie eine neue ID. Sie steht im Buchungslink der Leistung auf der
|
||||
Setmore-Seite hinter `products=`.
|
||||
|
||||
|
After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 43 KiB |
@@ -11,7 +11,7 @@ const YEAR = new Date().getFullYear()
|
||||
|
||||
// 3 × 2 Fotoraster zwischen den Wörtern: fünf Porträts und das Logo an der Wand
|
||||
const tiles = [
|
||||
...team.filter((m) => m.key !== 'amin').map((m) => ({ src: m.photo, alt: m.name })),
|
||||
...team.filter((m) => m.key !== 'amin').map((m) => ({ src: m.thumb, alt: m.name })),
|
||||
{ src: image('photos/emblem-quadrat'), alt: 'Logo an der Salonwand' },
|
||||
]
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ function Faces({ keys, className }: { keys: string[]; className?: string }) {
|
||||
return (
|
||||
<img
|
||||
key={key}
|
||||
src={m.photo}
|
||||
src={m.thumb}
|
||||
alt={m.name}
|
||||
title={m.name}
|
||||
loading="lazy"
|
||||
|
||||
@@ -43,7 +43,7 @@ export function TeamList() {
|
||||
))}
|
||||
</ul>
|
||||
|
||||
<div className="relative order-1 aspect-square overflow-hidden bg-ink md:order-2 md:aspect-auto md:min-h-[32rem]">
|
||||
<div className="relative order-1 aspect-square overflow-hidden bg-[#cfccc6] md:order-2 md:aspect-auto md:min-h-[32rem]">
|
||||
{team.map((m, i) => (
|
||||
<img
|
||||
key={m.key}
|
||||
@@ -52,7 +52,7 @@ export function TeamList() {
|
||||
loading="lazy"
|
||||
decoding="async"
|
||||
className={cn(
|
||||
'absolute inset-0 size-full object-cover',
|
||||
'absolute inset-0 size-full object-cover object-[50%_20%]',
|
||||
i === active
|
||||
? 'z-20 [clip-path:inset(0_0_0_0)] transition-[clip-path] duration-700 ease-out-expo'
|
||||
: i === previous
|
||||
|
||||
@@ -134,7 +134,16 @@ export const services: ServiceCategory[] = [
|
||||
},
|
||||
]
|
||||
|
||||
export type Member = { key: string; name: string; short: string; role: string; photo: string }
|
||||
export type Member = {
|
||||
key: string
|
||||
name: string
|
||||
short: string
|
||||
role: string
|
||||
/** großes Porträt für die Team-Liste */
|
||||
photo: string
|
||||
/** quadratischer Ausschnitt fürs Fotoraster und die kleinen Porträts bei den Preisen */
|
||||
thumb: string
|
||||
}
|
||||
|
||||
const images = import.meta.glob<string>(['../assets/team/*.webp', '../assets/photos/*.webp'], {
|
||||
eager: true,
|
||||
@@ -144,12 +153,12 @@ const images = import.meta.glob<string>(['../assets/team/*.webp', '../assets/pho
|
||||
export const image = (path: string) => images[`../assets/${path}.webp`]
|
||||
|
||||
export const team: Member[] = [
|
||||
{ key: 'amin', name: 'Amin B. Ahmadi', short: 'Amin', role: 'Inhaber · Barber', photo: image('photos/emblem-breit-900') },
|
||||
{ key: 'atena', name: 'Atena', short: 'Atena', role: 'Damen · Farbe · Beauty', photo: image('team/atena') },
|
||||
{ key: 'ahmad', name: 'Ahmad', short: 'Ahmad', role: 'Barber', photo: image('team/ahmad') },
|
||||
{ key: 'ali', name: 'Ali', short: 'Ali', role: 'Barber', photo: image('team/ali') },
|
||||
{ key: 'younes', name: 'Younes', short: 'Younes', role: 'Barber', photo: image('team/younes') },
|
||||
{ key: 'mo', name: 'Mo Bargus', short: 'Mo', role: 'Barber', photo: image('team/mo') },
|
||||
{ key: 'amin', name: 'Amin B. Ahmadi', short: 'Amin', role: 'Inhaber · Barber', photo: image('photos/emblem-breit-900'), thumb: image('photos/emblem-quadrat') },
|
||||
{ key: 'atena', name: 'Atena', short: 'Atena', role: 'Damen · Farbe · Beauty', photo: image('team/atena'), thumb: image('team/atena-thumb') },
|
||||
{ key: 'ahmad', name: 'Ahmad', short: 'Ahmad', role: 'Barber', photo: image('team/ahmad'), thumb: image('team/ahmad-thumb') },
|
||||
{ key: 'ali', name: 'Ali', short: 'Ali', role: 'Barber', photo: image('team/ali'), thumb: image('team/ali-thumb') },
|
||||
{ key: 'younes', name: 'Younes', short: 'Younes', role: 'Barber', photo: image('team/younes'), thumb: image('team/younes-thumb') },
|
||||
{ key: 'mo', name: 'Mo Bargus', short: 'Mo', role: 'Barber', photo: image('team/mo'), thumb: image('team/mo-thumb') },
|
||||
]
|
||||
|
||||
export const member = (key: string) => team.find((m) => m.key === key)!
|
||||