// sanctuaries.jsx — editorial statement for CAJE sanctuaries (no inventory, upon request)
function SanctuariesPage({ navigate, gridDensity, accent, openDetail }) {
const ref = useReveal();
const isMobile = useIsMobile();
const typologies = [
{ k: 'Private Residences', v: 'Villas, estates, compounds — held in full, staffed privately.' },
{ k: 'Clubs & Memberships', v: 'Annexes, quiet rooms, and houses opened by name only.' },
{ k: 'Historic Venues', v: 'Palazzi, châteaux, monasteries, private gardens.' },
{ k: 'Voyage', v: 'Yachts, charter aviation, and private rail, arranged without remark.' },
{ k: 'Encampments', v: 'Desert, mountain, and coastal assemblies built for the week.' },
{ k: 'Unlisted', v: 'Houses held by families; residences without an address.' },
];
return (
{/* Header */}
Anywhere in the world,
and nothing on the page.
We keep no public directory, no list, no standing inventory. Every residence, club, and venue is sourced to the specific note of your request — and held, when we commit to it, in full.
{/* Full-bleed image statement */}
“Tell us what you would like to feel,
and we will find the walls for it.”
— The standing invitation
{/* Typologies we source */}
A partial vocabulary — descriptive, not exhaustive.
{typologies.map((t, idx) => (
{['I','II','III','IV','V','VI'][idx]}
{t.k}
{t.v}
))}
{/* Process — since there's no catalogue, show what the dialogue looks like */}
How a sourcing unfolds.
{[
['01', 'Letter', 'Begin with a note — in your own words — of what you would like to feel, and for whom.'],
['02', 'Audience', 'A private call. We listen; we ask what has already been imagined, and what must not be.'],
['03', 'Proposal', 'A selection of possibilities — each held in confidence, each sourced to the request.'],
['04', 'Commission', 'The house, the week, the company is set. The standard does not move.'],
].map(([n, k, v], idx) => (
))}
{/* CTA */}
Tell us what you are looking for.
We reply to every letter within three days.
navigate('inquiry')} dark>Begin the Dialogue
);
}
// Detail view retained as a no-op pass-through (never invoked now that openDetail is unused)
function SanctuaryDetail({ s, close, navigate, accent }) {
React.useEffect(() => { if (close) close(); }, []);
return null;
}
Object.assign(window, { SanctuariesPage, SanctuaryDetail });