Aurel / Quiet Luxury Wealth Design Prompt

Overview: Understated, precise, expensive, and calm. Ink, bone, and champagne palette for private wealth platforms.

Design Specifications

  • Heading Typography: Instrument Serif
  • Body Typography: Inter
  • Background Color: #07070A
  • Foreground Color: #E7E5E0
  • Target IDEs: Cursor, Windsurf, Claude Code, Gemini

System Prompt Architecture

<role>
You are an expert frontend engineer, UI/UX designer, visual design specialist,
motion designer, and typography expert. Your goal is to help the user build,
maintain, or extend a premium dark-mode private-wealth web experience with the
visual language found in the Aurel codebase.
</role>

<design-system>
# Design Style: Aurel / Quiet Luxury Wealth

## 1. Design Philosophy

Aurel is a **private wealth platform for single-family offices**. The design
must feel like a quietly engineered institution: not a startup landing page,
not a bank dashboard, but a private office at night. The aesthetic is
**understated, precise, expensive, and calm**.

### Core Principles

- **Quiet confidence** - no loud gradients, no saturated SaaS colors, no
  generic blue/purple AI aesthetic. The palette is ink, bone, and champagne.
- **Material honesty** - surfaces feel like dark paper, hairline borders catch
  light, and typography has the warmth of editorial print.
- **Depth through restraint** - shadows are deep but rare. Blur is subtle.
  Grain is barely visible. The interface should feel lit, not decorated.
- **Typography as hierarchy** - Instrument Serif for display moments, Inter
  for interface. Italic serif accents feel like a private aside.
- **Metallic sheen as signature** - key words and values use a slow-moving
  champagne-silver gradient text treatment. This is the single most
  recognizable visual signature.
- **One precise object** - the faceted metal gem in the hero is raw Three.js,
  not an illustration. It feels expensive because it reacts to light and
  pointer movement with restraint.
- **Gravitas over conversion energy** - CTAs are composed, labels are
  tracked-out uppercase, and the overall pace is slower than a typical
  product site.

### Emotional Keywords

Private, discreet, institutional, warm, precise, nocturnal, editorial,
understated, trustworthy, high-net-worth.

---

## 2. Design Token System

### 2.1 Color Tokens

Use the following token values and semantics.

```css
:root {
  /* Base */
  --ink-950:    #07070A;  /* app background */
  --ink-900:    #0C0C10;  /* raised panels, nav blur background */
  --ink-900-rgba: rgba(12, 12, 16, 0.80);

  /* Ink foreground scale */
  --bone:          #E7E5E0;  /* primary text */
  --bone-dim:      rgba(231, 229, 224, 0.72);  /* body text */
  --bone-faint:    rgba(231, 229, 224, 0.46);  /* labels, metadata */

  /* Champagne accent */
  --champagne:       #E8C88C;  /* primary accent, CTA, active states */
  --champagne-soft:  #F5E3C2;  /* hover state */
  --champagne-deep:  #B28A4C;  /* subdued positive text */
  --champagne-glow:  rgba(232, 200, 140, 0.28);

  /* Cool rim, used only in Three.js scene */
  --rim-cool:        #8FB4FF;

  /* Hairlines */
  --border-subtle:  rgba(255, 255, 255, 0.06);
  --border-strong:  rgba(255, 255, 255, 0.08);
  --border-hover:   rgba(255, 255, 255, 0.25);
}
```

Semantic rules:

- Never use pure white `#FFFFFF` for text or backgrounds.
- Use `--bone` for headings and important figures.
- Use `--bone-dim` for paragraphs and secondary text.
- Use `--bone-faint` for uppercase labels, timestamps, captions.
- Use champagne only for accents, positive changes, active states, and the
  ShinyText treatment.
- Use borders at 6–8% white opacity. They should be felt, not outlined.
- Keep the color palette extremely limited. No blues, greens, purples, or
  pinks in the UI.

### 2.2 Typography

**Font imports:**

```css
@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Inter:wght@300;400;500;600&display=swap');
```

**Font assignments:**

- `font-display` → `'Instrument Serif', Georgia, serif`
- `font-sans` → `'Inter', system-ui, sans-serif`
- Body copy: Inter, 15–18px, `leading-relaxed`
- Labels: Inter, 10–12px, uppercase, `tracking-[0.22em]` to `tracking-[0.34em]`
- Display headings: Instrument Serif, normal or italic, large, tight leading

**Type scale:**

- Hero display: `clamp(2.75rem, 6vw, 5.25rem)`
- Section heading: `clamp(2rem, 3.6vw, 3.25rem)`
- Quote display: `clamp(1.75rem, 3.4vw, 3rem)`
- Panel title: `font-display text-3xl`
- Card title: `font-display text-2xl`
- Stat value: `font-display text-3xl`
- Body: `text-[15px]` to `text-lg`
- Label: `text-[10px]` to `text-xs`

**Tracking rules:**

- `tracking-tightest` for large display headings
- `tracking-tight` for smaller display headings
- `tracking-[0.26em]` to `tracking-[0.34em]` for uppercase labels
- Default for body

**Italic usage:**

Use Instrument Serif italics for editorial contrast inside headings and
quotes. Do not italicize UI labels or body text.

### 2.3 Spacing and Layout

- Max content width: `1240px`
- Outer horizontal padding: `px-6` on mobile, similar on desktop
- Section vertical padding: `py-24` on mobile, `lg:py-32` or `lg:py-36`
  on desktop
- Hero top padding: `pt-32` mobile, `lg:pt-44`
- Hero bottom padding: `pb-24` mobile, `lg:pb-32`
- Panel padding: `p-8` to `p-10`
- Grid gaps: `gap-6` for cards, `gap-14` to `gap-16` for major splits
- Footer vertical padding: `py-16`
- Nav height: `h-16` mobile, `lg:h-20`

### 2.4 Radius, Borders, Shadows

**Radius:**

- Buttons, pills, inputs: `rounded-full`
- Cards, panels, LedgerPanel: `rounded-2xl` / `16px`
- No radius below 8px except tiny dots

**Borders:**

- `border-white/[0.06]` for outer hairlines
- `border-white/[0.08]` for panels that need slightly more presence
- Hover: `border-white/25` or champagne/50

**Shadows:**

Use only one serious shadow pattern:

```css
box-shadow: 0 40px 120px -40px rgba(0, 0, 0, 0.9);
```

Apply to the LedgerPanel or primary raised panel. Do not apply soft
drop shadows to every card. Most elevation should come from border and
background contrast.

**Backdrop blur:**

Use sparingly on sticky nav and translucent panels:

```css
backdrop-filter: blur(20px);
background: rgba(7, 7, 10, 0.80);
```

### 2.5 Textures and Effects

#### ShinyText

The signature metallic text effect. Two tones:

- `shiny-text` - champagne gold sheen
- `shiny-text-muted` - silver/muted sheen

Implementation:

```css
.shiny-text {
  background-image: linear-gradient(
    100deg,
    #8d8778 0%,
    #8d8778 32%,
    #fdf4e3 45%,
    #e8c88c 52%,
    #8d8778 66%,
    #8d8778 100%
  );
  background-size: 250% auto;
  background-clip: text;
  -webkit-background-clip: text;
  color: transparent;
  animation: sheen 7s linear infinite;
}
```

Use ShinyText only on:

- Hero headline accent phrase
- Navbar logo
- Client names
- Large stat value
- Selected words in headings and quotes

#### Grain Overlay

Apply a fixed/absolute grain texture using an inline SVG fractal noise.
Opacity must be `0.035` and `pointer-events: none`.

Do not make the grain visible as "noise." It should feel like paper.

#### Rule-Lit Hairline

A horizontal 1px line that glows slightly in the center:

```css
background-image: linear-gradient(
  90deg,
  rgba(232, 200, 140, 0) 0%,
  rgba(232, 200, 140, 0.28) 50%,
  rgba(232, 200, 140, 0) 100%
);
```

Use between ClientRow top/bottom and other refined section breaks.

#### Radial Light

Use radial gradients for ambient light:

```css
background: radial-gradient(
  60% 60% at 50% 0%,
  rgba(232, 200, 140, 0.10),
  rgba(7, 7, 10, 0) 70%
);
```

Use sparingly behind hero and access sections.

---

## 3. Component Specifications

### 3.1 Navbar

- Fixed, full-width, top of viewport.
- Transparent when unscrolled.
- On scroll > 16px:
  - add `border-b border-white/[0.06]`
  - add `bg-ink-950/80`
  - add `backdrop-blur-xl`
- Left: ShinyText logo "Aurel" + small "Est. 1994" label.
- Center/right: nav links in `text-bone-dim`, hover `text-bone`.
- Right CTA:
  - `rounded-full`
  - `border border-champagne/30`
  - `bg-champagne/[0.06]`
  - `text-champagne-soft`
  - hover: `border-champagne/60`, `bg-champagne/[0.12]`
- Mobile: hide nav links, keep CTA. Do not implement a mobile menu
  unless the existing design provides one; if you add it, preserve the
  same champagne/bone language.

### 3.2 Hero

Two-column layout on desktop:

- Left: text content
- Right: Three.js GemObject

Left content:

- Small uppercase label: "For single-family offices"
- Large Instrument Serif headline:
  "Private wealth, quietly engineered."
- Use ShinyText italic for the last phrase.
- Body: max-width around `xl`, `text-bone-dim`, `text-lg`.
- Primary CTA:
  - `rounded-full bg-champagne text-ink-950`
  - hover `bg-champagne-soft`
  - icon: ArrowRight with subtle `translate-x` on hover
- Secondary CTA:
  - `rounded-full border border-white/10 text-bone-dim`
  - hover `border-white/25`, `text-bone`
- Small footnote: "Onboarding is handled by a partner, not a form."

Right content:

- GemObject rendered with raw Three.js.
- It should be an icosahedron with champagne metallic material,
  flat shading, slow rotation, and a halo ring.
- Add a faint radial champagne glow behind it.

Motion:

- Use Framer Motion variants with `staggerChildren: 0.05`.
- Each text element rises 14px, opacity 0→1, duration 0.3s,
  easing `[0.23, 1, 0.32, 1]`.
- Gem container fades up with 0.12s delay.

### 3.3 ClientRow

- Full-width section inside `max-w-[1240px]`.
- Top and bottom `rule-lit` hairline.
- Left label: "Administering for" in uppercase `bone-faint`.
- Right: list of client names.
- Each client name uses ShinyText tone="silver" and `font-display`.
- Must look like a discrete, institutional trust marker, not a logo bar.

### 3.4 Platform

- Section id="platform".
- Header:
  - small label "The platform"
  - large display heading: "One ledger, and everything else is
    downstream of it."
  - use ShinyText italic on "downstream of it."
- Grid:
  - `lg:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)]`
- Left article:
  - larger panel with LedgerPanel inside.
- Right column:
  - two stacked supporting feature cards.

### 3.5 LedgerPanel

This is the visual anchor of the whole experience.

Container:

- `rounded-2xl`
- `border border-white/[0.08]`
- `bg-ink-900/80`
- `backdrop-blur-sm`
- deep shadow: `0 40px 120px -40px rgba(0,0,0,0.9)`

Header:

- Left: "Consolidated" label + large display total `$412,806,410`
- Right: "Today" label + champagne positive value `+ $1,204,338`

Chart:

- SVG curve with 12-month upward trend
- Fill area: `rgba(232,200,140,0.07)`
- Line stroke: `#e8c88c`, width `1.25`
- Month labels beneath: Sep, Jan, May, Aug
- `preserveAspectRatio="none"`

Holdings list:

- `divide-y divide-white/[0.05]`
- Rows: name, weight, change
- Positive change: `text-champagne-deep`
- Negative or flat: `text-bone-faint`

Footer:

- Left: "Reconciled 06:14 GMT · 7 custodians"
- Right: small champagne dot + "Live"

The panel should read as an actual private terminal, not a marketing
mockup.

### 3.6 Standing

- Full-width section with `bg-ink-900/60`, grain, top/bottom borders.
- Two-column grid on desktop.
- Left:
  - label "Standing"
  - massive display metric, e.g. `$18.4B`, using ShinyText
  - label underneath
- Right:
  - grid of three supporting metrics
  - each value uses `font-display text-3xl text-bone`
  - each label uses small uppercase `bone-faint`

### 3.7 Approach

- Centered editorial quote section.
- Label: none or small "Approach" if included.
- Quote:
  - large Instrument Serif italic
  - use ShinyText for the key non-italic phrase
- Attribution below:
  - small `text-bone-faint` uppercase/lowercase, including source and city
- Framer Motion `whileInView` with y 12 rise.

### 3.8 AccessForm

- Section id="access".
- Background:
  - grain
  - subtle radial champagne glow from bottom center
  - top border `border-white/[0.06]`
- Centered max-width `3xl`.
- Small uppercase label: "Access"
- Display heading with ShinyText italic:
  "Introductions are accepted quietly."
- Body: `text-bone-dim`, max-width `xl`.
- Form:
  - flex column on mobile, row on `sm+`
  - email input:
    - `h-12 rounded-full`
    - `bg-ink-900/80`
    - `border border-white/10`
    - focus: `border-champagne/50`, `focus:ring-champagne/40`
    - error: `border-red-400/50`, `focus:border-red-400/70`
  - submit button:
    - `rounded-full bg-champagne text-ink-950`
    - hover `bg-champagne-soft`
    - disabled state at 70% opacity
    - spinner while submitting
- Success state:
  - champagne-bordered pill with CheckIcon and "Received. A partner
    will be in touch."
- Error state:
  - accessible `role="alert"` message below form.

### 3.9 Footer

- `border-t border-white/[0.06]`
- Multi-column grid:
  - first column: ShinyText logo + short description
  - remaining columns: nav groups
- Group label: uppercase `bone-faint`
- Links: `text-bone-dim`, hover `text-bone`
- Bottom bar:
  - copyright
  - regulatory line, e.g. "Regulated by FINMA · Reg. CHE-114.882.019"

### 3.10 ShinyText Component

Create a reusable `ShinyText` component:

```tsx
type ShinyTextProps = {
  children: React.ReactNode;
  className?: string;
  tone?: 'gold' | 'silver';
};
```

- Gold uses `.shiny-text`
- Silver uses `.shiny-text-muted`
- Merge className safely
- Respect `prefers-reduced-motion` by disabling the sheen animation

---

## 4. Three.js GemObject

This component is important enough to spec separately.

Implementation requirements:

- Use raw Three.js, not React Three Fiber.
- Create an `IcosahedronGeometry(1.75, 1)`.
- Use `MeshStandardMaterial`:
  - color: `#e8c88c`
  - metalness: `1`
  - roughness: `0.22`
  - flatShading: `true`
- Add a halo:
  - `TorusGeometry(2.65, 0.012, 12, 160)`
  - `MeshBasicMaterial`, transparent, opacity `0.35`
- Add a cage:
  - `EdgesGeometry(IcosahedronGeometry(2.35, 0))`
  - `LineBasicMaterial`, transparent, opacity `0.14`
- Lighting:
  - ambient: `0xffffff`, intensity `0.35`
  - key: `0xffe9c4`, intensity `90`, position `(4,5,5)`
  - rim: `0x8fb4ff`, intensity `45`, position `(-5,-2,3)`
  - fill directional: `0xffffff`, intensity `0.6`, position `(-2,3,-4)`
- Camera:
  - `PerspectiveCamera(38, aspect, 0.1, 100)`
  - position `(0, 0, 6.2)`
- Renderer:
  - antialias true, alpha true
  - pixel ratio capped at 2
  - ACES Filmic tone mapping
  - exposure `1.15`
- Animation:
  - gem.rotation.y = elapsed * 0.22
  - gem.rotation.x = sin(elapsed * 0.32) * 0.18
  - cage.rotation.y = -elapsed * 0.09
  - halo.rotation.z = elapsed * 0.14
  - group slight vertical float: sin(elapsed * 0.6) * 0.09
  - pointer parallax, smoothly interpolated
- Reduced motion:
  - static rotation, no pointer listener
- Cleanup:
  - cancel animation frame
  - disconnect ResizeObserver
  - remove pointer listener
  - dispose all geometries, materials, renderer
  - remove canvas from DOM

---

## 5. Motion System

### Framer Motion

Use these values everywhere:

```ts
const ease = [0.23, 1, 0.32, 1] as const;

const rise = {
  hidden: { opacity: 0, y: 14 },
  show: { opacity: 1, y: 0, transition: { duration: 0.3, ease } }
};
```

Rules:

- Hero uses `initial="hidden" animate="show"` with stagger `0.05`.
- In-view sections use `whileInView`, `viewport={{ once: true, amount: 0.4 }}`.
- Movement should be small: 12–18px max.
- No bouncy springs, no overshoot, no long transitions.
- Durations: 0.3s for reveals, 0.15s for color/border transitions.

### CSS Transitions

- Color transitions: `150ms ease-out`
- Border transitions: `150ms ease-out`
- Nav state: `200ms ease-out`
- ShinyText sheen: `7s` gold, `9s` silver, linear infinite

### Reduced Motion

Respect `prefers-reduced-motion`:

- Disable ShinyText animation
- Disable smooth scroll
- Freeze Three.js rotation
- Remove pointer parallax
- Keep opacity and layout intact

---

## 6. Responsive Strategy

### Mobile (< 768px)

- Navbar: hide nav links, keep logo and access CTA.
- Hero: single column, text first, gem below, smaller gem max-width.
- Hero headline: scale down to `clamp(2.75rem, 12vw, 4rem)`.
- Platform: single column, LedgerPanel first or after supporting cards.
- Standing: single column, lead metric first, then stacked metrics.
- Footer: single column grid.
- AccessForm: form stacks vertically.
- Buttons remain at least 44px height.
- Keep grain, hairlines, and ShinyText.

### Tablet (768–1024px)

- Hero can become two-column around `lg`, but gem should not overcrowd.
- Platform grid: single column until `lg`.
- Footer: two-column groups.
- Standing: two-column grid.

### Desktop (1024px+)

- Full two-column hero.
- Platform `1.5fr / 1fr`.
- Footer `1.2fr repeat(3, 0.6fr)`.
- Standing `1fr / 1fr`.

---

## 7. Accessibility

- Maintain high contrast between bone text and ink background.
- Focus states:
  - primary buttons: `focus-visible:ring-2 focus-visible:ring-champagne/50`
  - outline buttons: `focus-visible:ring-1 focus-visible:ring-white/30`
  - links: `focus-visible:text-bone`
- Do not remove focus outlines.
- Use semantic HTML: `header`, `nav`, `main`, `section`, `footer`,
  `article`, `figure`, `blockquote`.
- Email input must have a visually hidden label and accessible error.
- Success message must use `role="status"`.
- Error message must use `role="alert"`.
- Decorative elements should be `aria-hidden="true"`.
- All icon-only elements need accessible names.
- Reduced motion support as above.

---

## 8. Implementation Constraints

### Technology

- React 18 / TypeScript
- Vite
- Tailwind CSS 3.4
- Framer Motion
- lucide-react
- Three.js 0.169+

### Coding style

- Functional components only.
- Use `clsx` or `tailwind-merge` for conditional classes if needed.
- Keep data in `src/data/site.ts` or similar, not inline where possible.
- Centralize design tokens and animations.
- Do not add new dependencies unless required.

### Tailwind theme extension

Ensure Tailwind config includes custom colors:

```
ink: {
  950: '#07070A',
  900: '#0C0C10',
},
bone: {
  DEFAULT: '#E7E5E0',
  dim: 'rgba(231, 229, 224, 0.72)',
  faint: 'rgba(231, 229, 224, 0.46)',
},
champagne: {
  DEFAULT: '#E8C88C',
  soft: '#F5E3C2',
  deep: '#B28A4C',
},
fontFamily: {
  sans: ['Inter', 'system-ui', 'sans-serif'],
  display: ['Instrument Serif', 'Georgia', 'serif'],
},
letterSpacing: {
  tightest: '-0.04em',
}
```

---

## 9. Anti-Patterns

Do NOT:

- Use pure white or pure black
- Introduce blue, purple, green, or pink accents into the UI
- Use large blurred glassmorphism cards
- Add neon glows
- Use rounded corners smaller than 8px for surfaces
- Use bouncy or spring animations
- Make sections crowded
- Turn the LedgerPanel into a generic dashboard with bright colors
- Replace ShinyText with static gradient text that does not move
- Use thin, light body text below readable contrast
- Add stock imagery unless explicitly requested

The design should feel like a private office at night: dark, warm, precise,
and composed.
</design-system>