Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions docs/brand-origin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# The Founding Legend of Adazo

### Canon — Chapter One: The Alchemist's Atelier

*As it has been told, in the Brianza hills north of Milan, for three hundred years.*

---

In the summer of 1726, in a stone house at the edge of a hill town between Milan and the lake, a young woman named **Ada Zoppi** kept a small room off her family's kitchen where she mixed oils.

The town knew her as a maker of remedies — lavender for sleepless children, calendula for a husband's burned hand, rosewater for the parish priest's headaches. This was ordinary work for a woman of her station. What made the room behind the kitchen different was that Ada did not mix for cure. She mixed for beauty, and she did it in secret, because in 1726 there was no respectable word yet for what she was doing.

The legend says it began the night before her cousin Elisabetta's wedding.

Elisabetta had spent the day weeping — not from joy, but from the particular grief of a plain girl watching herself in a borrowed mirror, certain the morning would arrive and find her unchanged. Ada took her cousin's face in her hands the way she'd seen her own grandmother do, and told her something that would outlive both of them: *"La bellezza non si insegna. Si tramanda."* — **Beauty is not taught. It is passed down.**

Then she went to her room off the kitchen and, by lamplight, built a balm meant for exactly one purpose: to make a nervous girl believe, for one morning, that she had always been beautiful. Olive oil pressed from her own family's trees. Orris root, dried since spring. Bergamot rind, bitter and bright. A crushed thread of rose that had bloomed against the church wall. She warmed it slowly, the way you'd coax something shy into the open, and she gave it to Elisabetta before dawn.

What happened at that wedding is the part the family still argues about. What's certain is that within the year, women were arriving at Ada's door who had no remedy to seek — only a face they wanted to meet differently. She began keeping a ledger, not of sales, but of formulas: what she'd used, for whom, and why. Bound in dark leather, it became known simply as **il libro** — the book — and it would be added to by daughters and grand-daughters for the next three centuries. Nothing in it was ever published. Everything in it was eventually inherited.

It was Ada's own name, shortened by neighbors the way small towns shorten everything, that gave the house its mark. *Ada-zo* — "Ada's," in the clipped dialect of the hills — became, over generations, simply **Adazo**. The family adopted a small emblem for the book's cover not long after: a sun resting low over an olive branch, the two shapes together forming the rough outline of an **A**. It has marked every formula since.

By the time Ada was an old woman, she had stopped mixing balms for weddings and started mixing them for something closer to inheritance — a mother would come not for herself, but to learn, so that one day she could stand where Ada stood and hand something down instead of merely applying it. This was the true founding act of the house: not a product, but a transmission. Adazo was never meant to be bought once. It was meant to be *passed on*.

---

**Three hundred years later**, the room off the kitchen is gone, the hill town has grown into something closer to a suburb of Milan, and Ada Zoppi exists mostly as a name in a book no camera has ever photographed in full. But the sun-and-olive mark still opens every formula. The motto is still whispered, if only in the copy. And somewhere in every Adazo product is the same original instruction Ada gave her cousin before a wedding three centuries ago: *not* to look different — to finally recognize the face that was always there.

---

## Canon Reference

| Element | Canon Detail |
|---------|----------------|
| Founding matriarch | Ada Zoppi |
| Founding year | 1726 |
| Location | A hill town in the Brianza hills, between Milan and the lake |
| Origin object | *Il libro* — the leather-bound formula book |
| Naming myth | "Ada-zo" (dialect for "Ada's") → Adazo |
| House motto | *"La bellezza non si insegna. Si tramanda."* |
| Emblem | Sun over an olive branch, forming the shape of an "A" |
| Founding act | The wedding balm for cousin Elisabetta |
| Core brand idea | Beauty as inheritance/transmission, not correction |

## Voice (Chanel energy)

Write as if certainty were fashion: short, cool, decisive. Prefer inheritance over hype. No technical product-pipeline language on the storefront (*Edit series*, *gen 2*, *Amazon insert*, *BSR*, *Campaign*). One affiliate disclosure lives in the footer only.

The house is luxury for treating yourself — or for the woman you love.
32 changes: 17 additions & 15 deletions src/components/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Menu, X } from 'lucide-react'
import { useState } from 'react'
import { formatExpiry, limitedTimeCopy } from '../data/catalog'
import { VIBE_LIST, vibePath } from '../data/vibes'
import { BRAND } from '../data/brand'
import { GlobalSeo } from './Seo'

/** Lean primary nav — categories live on /shop, not the header. */
Expand Down Expand Up @@ -34,12 +35,12 @@ export function Layout() {
to="/shop?limited=1"
className="hover:underline underline-offset-2"
>
<span className="font-semibold text-gold">Limited-time options</span>
{limited.count > 0 ? ` · ${limited.count} this week` : ''}
{until ? ` · Refresh ${until}` : ''}
<span className="font-semibold text-gold">This week’s selection</span>
{limited.count > 0 ? ` · ${limited.count} pieces` : ''}
{until ? ` · Until ${until}` : ''}
<span className="text-paper/70">
{' '}
· Shop on Adazo · Buy on Amazon
· {BRAND.mottoEn}
</span>
</Link>
</div>
Expand Down Expand Up @@ -118,7 +119,7 @@ export function Layout() {
className="block px-3 py-2.5 rounded-xl font-semibold text-ink hover:bg-paper-2"
onClick={() => setOpen(false)}
>
Product reels
Films
</Link>
<Link
to="/why"
Expand All @@ -140,12 +141,14 @@ export function Layout() {
<div className="lg:col-span-1">
<p className="font-display text-2xl font-semibold text-moss">Adazo</p>
<p className="text-sm text-ink-soft mt-3 leading-relaxed max-w-xs">
Curated Amazon Best Sellers and concern-first routines for women’s
health and beauty. Discover here. Buy on Amazon.
{BRAND.footerBlurb}
</p>
<p className="mt-4 text-xs font-semibold uppercase tracking-[0.14em] text-bamboo">
{BRAND.mark}
</p>
</div>
<div>
<p className="label-micro mb-3">Explore</p>
<p className="label-micro mb-3">The house</p>
<ul className="space-y-2 text-sm font-medium">
<li>
<Link to="/shop" className="hover:text-bamboo">
Expand All @@ -154,12 +157,12 @@ export function Layout() {
</li>
<li>
<Link to="/shop?limited=1" className="hover:text-bamboo">
This week’s edit
This week
</Link>
</li>
<li>
<Link to="/quiz" className="hover:text-bamboo">
Vibe check
Your persona
</Link>
</li>
<li>
Expand All @@ -169,13 +172,13 @@ export function Layout() {
</li>
<li>
<Link to="/reels" className="hover:text-bamboo">
Product reels
Films
</Link>
</li>
</ul>
</div>
<div>
<p className="label-micro mb-3">Vibes</p>
<p className="label-micro mb-3">Personas</p>
<ul className="space-y-2 text-sm font-medium">
{VIBE_LIST.map((v) => (
<li key={v.id}>
Expand All @@ -196,13 +199,12 @@ export function Layout() {
</li>
</ul>
<p className="text-xs text-muted mt-6 leading-relaxed">
As an Amazon Associate, Adazo earns from qualifying purchases.
Prices and availability are set by Amazon and may change.
{BRAND.affiliateDisclosure}
</p>
</div>
</div>
<div className="border-t border-line py-4 text-center text-xs text-muted">
© {new Date().getFullYear()} Adazo · adazo.com
© {new Date().getFullYear()} Adazo · Since {BRAND.founded} · adazo.com
</div>
</footer>
</div>
Expand Down
15 changes: 7 additions & 8 deletions src/components/MagazineFlip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -171,12 +171,11 @@ export function MagazineFlip({
<BookOpen className="size-3.5" /> The House Book
</p>
<h2 className="font-display text-3xl sm:text-5xl font-semibold text-white tracking-tight">
Flip the fashion edit
The house book
</h2>
<p className="mt-3 text-white/55 font-light max-w-xl text-sm sm:text-base leading-relaxed">
House campaigns, world travel, wild on-location, and red-carpet
glamour — every Adazo model, one magazine. Use the arrows or
swipe.
The atelier, abroad, the wild, the carpet — every house face, one
volume. Use the arrows or swipe.
</p>
</div>
<div className="flex flex-wrap gap-2" role="tablist" aria-label="Magazine series">
Expand Down Expand Up @@ -381,13 +380,13 @@ function PageFace({ page }: { page: MagazinePage }) {
<div className="mt-8 h-px w-16 bg-gradient-to-r from-transparent via-gold/50 to-transparent" />
<p className="mt-6 text-sm text-white/45 font-light max-w-xs leading-relaxed">
{page.series === 'house' &&
'Primary fashion campaigns of the Adazo house models.'}
'The faces you return to — the house, season after season.'}
{page.series === 'world' &&
'Travel editorials — destinations that finish the look.'}
'New cities. The same quiet authority.'}
{page.series === 'wild' &&
'On location with exotic animals. Pure fashion energy.'}
'Beauty that holds when the ground is uneven.'}
{page.series === 'carpet' &&
'Oscars & Cannes energy — red-carpet glamour, flash, and finish.'}
'Night light, jewels free, the room already hers.'}
</p>
</div>
)
Expand Down
15 changes: 6 additions & 9 deletions src/components/ReelInsertCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import type { CategoryReel } from '../data/reels'
import { trackEvent } from '../lib/analytics'

/**
* Amazon-insert-sized fashion tile (same 4:5 well as ProductCard).
* Muted autoplay when in view; links to the cross-promoted shop category.
* Fashion film tile in product grids (same 4:5 well as ProductCard).
* Muted autoplay when in view; links to the related shop category.
*/
export function ReelInsertCard({
reel,
Expand Down Expand Up @@ -62,17 +62,14 @@ export function ReelInsertCard({
loop
playsInline
preload="metadata"
aria-label={`${reel.title} fashion reel: ${reel.motionLabel}`}
aria-label={`${reel.title} film: ${reel.motionLabel}`}
/>
<div className="pointer-events-none absolute inset-0 bg-gradient-to-t from-charcoal/75 via-transparent to-charcoal/20" />
<span className="absolute top-3 left-3 inline-flex items-center gap-1.5">
<span className="inline-flex items-center gap-1 rounded-full bg-white/95 text-ink text-[10px] font-bold uppercase tracking-wider px-2.5 py-1 shadow-sm border border-line/80">
<Sparkles className="size-3 text-bamboo" aria-hidden />
Discover
</span>
<span className="rounded-full bg-moss/90 text-paper text-[10px] font-bold uppercase tracking-wider px-2 py-1">
G{reel.generation}
</span>
</span>
<span className="absolute top-3 right-3 inline-flex items-center justify-center size-8 rounded-full bg-black/45 text-white backdrop-blur-sm">
<Play className="size-3.5 fill-current ml-0.5" aria-hidden />
Expand All @@ -90,7 +87,7 @@ export function ReelInsertCard({
className={`flex flex-col flex-1 ${compact ? 'p-3.5 gap-1' : 'p-4 gap-1.5'}`}
>
<p className="text-[10px] font-semibold uppercase tracking-[0.14em] text-bamboo">
Cross the edit
From the house
</p>
<h3
className={`font-display font-semibold leading-snug text-ink group-hover:text-bamboo transition ${
Expand All @@ -104,10 +101,10 @@ export function ReelInsertCard({
</p>
<div className="mt-auto pt-3 flex items-end justify-between gap-2 border-t border-line/70">
<span className="text-xs font-semibold text-bamboo">
Browse category
Open the room
</span>
<span className="text-[11px] font-semibold text-bamboo opacity-0 group-hover:opacity-100 transition">
Open
Shop
</span>
</div>
</div>
Expand Down
33 changes: 33 additions & 0 deletions src/data/brand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* Adazo brand canon — founding legend & voice.
* Full narrative: docs/brand-origin.md
*/

export const BRAND = {
name: 'Adazo',
founder: 'Ada Zoppi',
founded: 1726,
place: 'the Brianza hills north of Milan',
mottoIt: 'La bellezza non si insegna. Si tramanda.',
mottoEn: 'Beauty is not taught. It is passed down.',
/** Short mark line for UI */
mark: 'Since 1726',
tagline: 'Beauty is not taught. It is passed down.',
/** One-line site positioning */
promise:
'Luxury for treating yourself — or for the woman you love.',
/** Footer / about blurb */
footerBlurb:
'Since 1726, beauty as inheritance. Discover the house here; complete your purchase on Amazon.',
affiliateDisclosure:
'As an Amazon Associate, Adazo earns from qualifying purchases. Prices and availability are set by Amazon and may change.',
} as const

/** Elegant series names — never show technical “Edit / Campaign / Gen” labels. */
export const SERIES_LABELS = {
house: { title: 'The Atelier', kicker: 'Volume I · The house' },
world: { title: 'Abroad', kicker: 'Volume II · Travel' },
wild: { title: 'The Wild', kicker: 'Volume III · On location' },
carpet: { title: 'The Carpet', kicker: 'Volume IV · Night light' },
cafe: { title: 'The Café', kicker: 'Volume V · Daylight' },
} as const
4 changes: 2 additions & 2 deletions src/data/bsr-snapshot.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"fetchedAt": "",
"expiresAt": "",
"marketing": {
"headline": "OPTIONS ONLY AVAILABLE FOR A LIMITED TIME",
"subhead": "This week's women's beauty edit — Amazon Best Sellers curated for Adazo. Lists refresh weekly.",
"headline": "FOR A LIMITED TIME ONLY",
"subhead": "A short selection of what the house is wearing now. It will not last.",
"refreshCadence": "weekly"
},
"products": []
Expand Down
16 changes: 8 additions & 8 deletions src/data/catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,27 +153,27 @@ export const collections = Array.from(
function collectionBlurb(label: string): string {
const map: Record<string, string> = {
'Luxury Beauty':
'Prestige skincare and makeup — highest Associates commission tier (~10%).',
Fragrance: 'Perfume and fine fragrance with gift-ready AOV.',
'Prestige skincare and makeup — weighty jars, considered formulas, the top shelf.',
Fragrance: 'Perfume and fine fragrance — the trail that arrives first.',
Skincare: 'Cleansers, serums, moisturizers, and barrier care.',
Hair: 'Treatments, oils, and refresh essentials.',
Makeup: 'Everyday color and finish staples.',
Body: 'Lotions, mists, and body care rituals.',
Tools: 'Stylers, dryers, and high-utility devices.',
Tools: 'Stylers, dryers, and devices that earn their place.',
SPF: 'Daily sun protection that wears well under makeup.',
Wellness: 'Collagen and beauty-adjacent wellness picks.',
Lips: 'Masks, balms, and soft-finish lip care.',
Jewelry: 'Fine jewelry $1,000+ — diamonds, designer, pre-loved polish.',
Handbags: 'Designer luxury handbags — big-ticket fashion finish.',
Handbags: 'Designer handbags — the piece that finishes the exit.',
'Luxury Handbags':
'Designer luxury handbags from Amazon ($900+ focus) — LV, Gucci, Prada, and more.',
'Designer handbags — LV, Gucci, Prada, and more. Big-ticket fashion finish.',
'Luxury Jewelry':
'Fine and designer jewelry $1,000+ — Cartier, Tiffany, diamonds, and more.',
'Fine and designer jewelry $1,000+ — diamonds, polish, quiet authority.',
'Luxury Watches':
'Luxury watches $1,000+ — Swiss and designer timepieces.',
Gold: 'Solid gold jewelry $500+ — chains, bands, and fine gold polish.',
Gold: 'Solid gold jewelry $500+ — chains, bands, and weight you can feel.',
}
return map[label] ?? 'Curated women\'s health and beauty for real routines.'
return map[label] ?? 'Curated for the vanity and the gift box.'
}

export function getProduct(slug: string): Product | undefined {
Expand Down
2 changes: 1 addition & 1 deletion src/data/categoryHeroes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ export const HEROES: Record<Category, CategoryHeroContent> = {
luxury: {
title: 'Luxury Beauty',
blurb:
'Prestige skincare and makeupthe highest Amazon Associates commission tier (~10%).',
'Prestige on the vanityweighty jars, considered formulas, the quiet of the top shelf.',
image: '/brand/categories/luxury.jpg',
objectPosition: 'center 40%',
alt: 'Prestige cream jars on a champagne marble vanity',
Expand Down
22 changes: 11 additions & 11 deletions src/data/magazine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,26 @@ export type MagazinePage = {

function seriesOf(campaign: VibeCampaign): MagazineSeries | null {
const s = campaign.season.toLowerCase()
// Café Edit is 16:9 lifestyle film — not a still magazine spread
// Café films are 16:9 lifestyle — not still magazine spreads
if (s.includes('café') || s.includes('cafe')) return null
if (s.includes('carpet') || s.includes('oscar') || s.includes('cannes')) {
return 'carpet'
}
if (s.includes('wild')) return 'wild'
if (s.includes('world')) return 'world'
if (s.includes('world') || s.includes('abroad')) return 'world'
return 'house'
}

function seriesLabel(series: MagazineSeries): { title: string; kicker: string } {
switch (series) {
case 'house':
return { title: 'House Campaign', kicker: 'Volume One · Fashion finish' }
return { title: 'The Atelier', kicker: 'Volume I · The house' }
case 'world':
return { title: 'World Edit', kicker: 'Volume Two · Travel' }
return { title: 'Abroad', kicker: 'Volume II · Travel' }
case 'wild':
return { title: 'Wild Edit', kicker: 'Volume Three · On location' }
return { title: 'The Wild', kicker: 'Volume III · On location' }
case 'carpet':
return { title: 'Carpet Edit', kicker: 'Volume Four · Red carpet' }
return { title: 'The Carpet', kicker: 'Volume IV · Night light' }
}
}

Expand All @@ -50,7 +50,7 @@ export function buildMagazinePages(): MagazinePage[] {
id: 'cover',
kind: 'cover',
title: 'ADAZO',
kicker: 'The House Book · Fashion Destination',
kicker: 'The House Book · Since 1726',
},
]

Expand Down Expand Up @@ -113,8 +113,8 @@ export const MAGAZINE_SERIES_FILTERS: {
label: string
}[] = [
{ id: 'all', label: 'Full issue' },
{ id: 'house', label: 'House' },
{ id: 'world', label: 'World' },
{ id: 'wild', label: 'Wild' },
{ id: 'carpet', label: 'Carpet' },
{ id: 'house', label: 'The Atelier' },
{ id: 'world', label: 'Abroad' },
{ id: 'wild', label: 'The Wild' },
{ id: 'carpet', label: 'The Carpet' },
]
4 changes: 2 additions & 2 deletions src/data/products.bsr.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ export const bsrWeekOf = '' as const
export const bsrFetchedAt = '' as const
export const bsrExpiresAt = '' as const
export const bsrMarketing = {
headline: 'OPTIONS ONLY AVAILABLE FOR A LIMITED TIME',
headline: 'FOR A LIMITED TIME ONLY',
subhead:
"This week's women's beauty edit — Amazon Best Sellers curated for Adazo. Lists refresh weekly.",
"A short selection of what the house is wearing now. It will not last.",
refreshCadence: 'weekly',
} as const

Expand Down
Loading
Loading