Technical Document

System Design

Complete technical specification — design system, data schemas, API routes, authentication and integrations.

ColoursTypographySpacingComponentsIconsDocsSchemasAPI RoutesAuthWebhooks
01Design System

Colour Palette

The palette is built to convey refinement and artistic sensibility. Gold on a dark background creates the premium contrast that positions the brand in the luxury art market — the same visual language used by prestigious galleries and high-end auction houses.

Gold is the central colour of the identity. Each variation — from solid to 12% opacity — serves a specific purpose to maintain consistency across buttons, borders, badges and visual effects.

Primary#C9A84C--gold

The main colour. Action buttons, highlighted titles, icons, section labels. The first element the visitor notices.

Primary Hover#E8D48B--gold-light

Hover state for buttons and links. A lighter version that visually confirms the element is clickable.

On Primary#0A0A0A--bg

Text colour on gold buttons. The dark contrast on gold ensures legibility in CTAs.

Primary Mutedrgba(201,168,76,0.12)--gold-dim

Gold at 12% — background for badges, tags and highlight boxes. Subtle emphasis without competing with text.

Primary Glowrgba(201,168,76,0.25)--gold-glow

Gold at 25% — box-shadow on button hover. Creates the premium "light" sensation of fine art lighting.

Border Defaultrgba(201,168,76,0.18)--gold-border

Gold at 18% — borders for cards, inputs and dividers. Subtle in default state to avoid visual noise.

Border Hoverrgba(201,168,76,0.35)--gold-border-h

Gold at 35% — borders on hover, focus and active. The extra glow confirms the element is interactive.

Four dark layers that create visual depth. Each level is slightly lighter, allowing cards and elements to "float" above the background without heavy shadows.

Background#0A0A0A--bg

The base background of all pages. Near-black, but with enough warmth to avoid feeling industrial.

Card#101010--bg-card

Background for all cards, content boxes and the mobile menu. One level above the background to create visual separation.

Element#141414--bg-el

Background for interactive elements on hover — when the user interacts with a card, this level appears to give visual feedback.

Surface#1A1A1A--bg-surf

The highest level. Used in dropdowns and tooltips — elements that "float" above everything else.

Six text tones organised by visual hierarchy. Gold highlights navigation elements and accents; neutral tones guide the visitor's eye from title to supporting content.

Gold (Accent)#C9A84C--gold

Text colour for section labels (01 — WHO WE ARE), accents in titles with <em>, brand name in header, links on hover and icons.

Gold Hover#E8D48B--gold-light

Gold text on hover state — navigation links, menu items and buttons when the user interacts.

Primary#F0EDE6--text

All titles, names and information the visitor needs to see first. A warm tone that is gentle on the eyes against a dark background.

Secondary#C8C3B8--text-s

Paragraphs and supporting text. Visible enough for comfortable reading, but does not compete with titles.

Muted#8A8578--text-m

Short descriptions, form placeholders and metadata. Guides the eye without dominating the page.

Disabled#5A5549--text-d

Tertiary information — timestamps, legal notes and footer. Present but discreet.

Colours reserved for communicating states to the user — success of a form submission, an important warning or supporting information. Never used for decoration.

Success#6FCF97--green

Confirmation of successful actions — form submitted, order confirmed, feature included in plan.

Success Mutedrgba(111,207,151,0.1)--green-dim

Soft background for success badges. Used in the shipping table to indicate included items.

Danger#E87461--red-soft

Alerts requiring attention — form errors, stock warnings, weak points in competitive analysis.

Info#7B9EFF--blue

Neutral information that deserves highlighting — "should have" badges, reference links, technical area in features.

Info Mutedrgba(100,140,255,0.1)--blue-dim

Soft background for informational badges. Used in "should" priority tags and "v2" version.

02Design System

Typography

Three typeface families, each with a clear role. The combination of a classical serif for impact, a modern sans-serif for legibility and a monospaced face for technical precision creates the premium visual language of the project.

Playfair Display

Display & Headings
--serifGoogle Fonts
Why this font?

A serif with artistic personality. The curves and stroke contrast convey sophistication and authority — ideal for a brand selling fine art. The visitor feels "premium" before reading a word.

Where does it appear on the site?

All section titles, the hero headline, artwork names and collection headings.

Fallback: Georgia, serif
Original Paintings by The Artist400 · 2rem
A Collection of Landscapes & Portraits600 · 1.6rem
Commission a Bespoke Artwork700 · 1.4rem
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 !@#$%&*().,;:?

Outfit

Body & UI
--sansGoogle Fonts
Why this font?

A clean geometric sans-serif that ensures maximum legibility at any screen size. Light weight (300) creates elegant paragraphs; Semi-Bold (600) gives firmness to card titles and buttons.

Where does it appear on the site?

All body text, card descriptions, buttons, navigation, forms and labels. The font the visitor reads most.

Fallback: system-ui, sans-serif
A Finnish artist based in London, creating original oil and watercolour paintings that capture light, colour and emotion.300 · 0.95rem
Free worldwide shipping on orders over £150600 · 0.95rem
The Artist700 · 0.85rem
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 !@#$%&*().,;:?

JetBrains Mono

Code & Labels
--monoGoogle Fonts
Why this font?

A monospaced font designed for legibility at small sizes. Used in technical and navigation contexts — conveys precision and attention to detail without being intimidating.

Where does it appear on the site?

Section labels (01 — SHOP), technology tags, priority badges, versions (v1/v2), prices and the navigation menu.

Fallback: monospace
01 — SHOP · v1 · MUST HAVE400 · 0.72rem
/api/checkout · POST · 201 Created500 · 0.72rem
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 !@#$%&*().,;:?

Each typographic weight has a function in the visual hierarchy. The rule is simple: the more important the information, the heavier the weight. This ensures the visitor always knows where to look first.

300
LightOutfit
Original oil and watercolour paintings, printed editions and bespoke commissions — each piece created with intention and care.
0.95rem--sansBody text — section description
Signed limited edition print on 300gsm archival paper. Edition of 50.
0.84rem--sansBody small — artwork card text
Week 1–2 · Milestone: Scope approved ✦
0.78rem--sansCaption — timeline metadata

The primary weight for long paragraphs. Thin enough to be elegant on a dark background, but fully legible on any device.

400
RegularOutfit · Playfair Display · JetBrains Mono
Original paintings shipped worldwide from London
2rem--serifHeading 1 — section title (serif)
Landscapes & Seascapes Collection
1.2rem--serifHeading 3 — collection title (serif)
01 — SHOP · v1 · MUST HAVE
0.72rem--monoLabel — code and labels (mono)

The "neutral" weight. Used in serif headings that should be elegant without shouting, and in base text where Light would be too subtle.

500
MediumOutfit · JetBrains Mono
SHOP · COLLECTIONS · COMMISSIONS
0.72rem--sansNav links — navigation menu
OIL · WATERCOLOUR · PRINT
0.6rem--monoTags — medium badges
01 — SHOP
0.62rem--monoSection label — section numbering

Creates gentle emphasis — navigation links and section labels use this weight to stand out from body text without being "bold".

600
Semi-BoldOutfit · Playfair Display
Original Oil on Canvas
0.95rem--sansHeading 4 — card title (sans)
Technical Details
1rem--sansSub-title — sub-section (sans)
ADD TO CART
0.82rem--sansButton — CTA text

The "action" weight. All card titles, buttons and sub-headings use Semi-Bold to indicate they are entry points into the content.

700
BoldOutfit · Playfair Display
The Artist
0.8rem--sansBrand — name in header (sans)
£ 850
0.88rem--monoPrice — artwork price
01
1.4rem--serifNumber — collection number (serif)

Reserved for high-impact information — the brand name, prices and milestone percentages. Used sparingly to maintain its power.

An 11-level scale covering everything from the hero title to the smallest medium tag. Each level has defined size, weight, font and spacing so that any element added to the site naturally fits the visual hierarchy.

Original Paintings
Display<h1 (hero)>
Sizeclamp(2.4rem, 5.5vw, 4.5rem)Line1.15Font--serifWeight400

The first thing the visitor sees. Responsive — 4.5rem on desktop, 2.4rem on mobile. Only one per page.

Original paintings shipped worldwide
Heading 1<h2 (section)>
Sizeclamp(1.8rem, 3.5vw, 2.6rem)Line1.25Font--serifWeight400

Title of each main section — "Shop", "Collections", "About". Marks the entrance to a new content block.

Landscapes & Seascapes
Heading 2<h3 (card group)>
Size1.5remLine1.3Font--serifWeight400

Sub-title within a section — collection heading, artwork medium, proposed positioning.

Setup & Design System
Heading 3<h3 (timeline)>
Size1.2remLine1.4Font--serifWeight400

Titles for timeline phases, collections and pillars. Large enough to be a visual stopping point.

Evening Light, Lake District
Heading 4<h4 (card)>
Size0.95remLine1.5Font--sansWeight600

Title of each individual card — artworks, collections, features. The visitor reads these to decide what to explore.

Technical Details
Sub-title<h3 (sub)>
Size1remLine1.5Font--sansWeight600

Introduces a sub-block within a section — "Commission Process", "Shipping Info", "Selected Works".

A Finnish artist based in London, creating original oil and watercolour paintings.
Body<p>
Size0.95remLine1.7Font--sansWeight300

Descriptive paragraphs in sections. Generous line-height (1.7) for reading comfort on a dark background.

Oil on linen canvas, 60 × 80 cm. Signed and dated.
Body Small<p (card)>
Size0.84remLine1.7Font--sansWeight300

Text inside cards — artwork descriptions, collection details, feature text.

Edition 3 of 50 · Archival pigment print ✦
Caption<span>
Size0.78remLine1.6Font--sansWeight300

Contextual information — edition numbers, shipping metadata, footnotes.

01 — SHOP
Label<div/span>
Size0.62remLine1Font--monoWeight500

The "numbering" of each section. Always uppercase, with wide letter-spacing. Defines the page cadence.

OIL · CANVAS · ORIGINAL · V1
Tag<span>
Size0.6remLine1Font--monoWeight500

The smallest text elements. Medium badges, priority tags and versions. Always inside pills or with a background.

03Design System

Spacing

2xs4px0.25remInline gaps, badge padding
xs8px0.5remComponent internal gaps
sm12px0.75remInput padding, small gaps
md16px1remCard padding, standard gap
lg24px1.5remSection padding (mobile)
xl32px2remSection padding (desktop), spacers
2xl48px3remContent block margins
3xl64px4remSection vertical (mobile)
4xl96px6remSection vertical (desktop)
04Design System

Components

Add to CartSM

Button Primary

bg-gold text-dark, rounded, uppercase tracking-wide, hover shadow-gold + bg-gold-light

<Button variant="primary">
Request CommissionSM

Button Ghost

Transparent with border-gold, text-gold, hover border-gold-border-h

<Button variant="ghost">

Evening Light, Lake District

Oil on linen · 60 × 80 cm

OilOriginal

Card

bg-dark-card with shimmer top-line gradient, hover lift (-3px) and shadow-gold

<Card>
How long does shipping take?
UK orders arrive in 3–5 working days. International orders take 7–14 working days.
Do paintings come with a certificate?

Accordion

Collapsible with animated chevron (rotate 180°), bg-dark-card, gold border

<AccordionItem>
GoldInfoSuccessMuted

Badge

Pill in font-mono text-tag with variants: gold, info, success and muted

<Badge>
02 — SHOPOriginal paintings

Section Label

"01 — Title" in JetBrains Mono, text-gold, uppercase, tracking-[0.2em]

<SectionLabel>

Divider

Gradient line: transparent → gold/35 → transparent, GSAP scaleX reveal

<Divider>
★ ★ ★ ★ ★
“The painting is even more beautiful in person”

Sarah M. — London

Testimonial

Blockquote in Playfair Display, 5 gold stars, dot navigation with expand

<TestimonialSlider>
200+

Works Sold

32

Countries

Counter Up

Number animated from 0 to final value with cubic ease-out on viewport entry

<CounterUp>
Qualidade

Certificate of authenticity included

Trust Signal

Card with ◆ gold icon, Badge label and body-sm description

TrustSignal
The Artist
ShopCollectionsAboutShop Now

Header

Fixed top, transparent → blur bg on scroll, hide on scroll-down, show on scroll-up

<Header>
HomeShopCollectionsAbout
Shop Now

Mobile Drawer

Slide-in right 280px, backdrop blur, focus trap, body scroll lock, gold CTA

<MobileDrawer>
The Artist
IGPTFB
Shop

Paintings

Prints

Collections

Info

About

FAQ

Contact

© 2026 The ArtistPrivacy · Terms

Footer

4 columns: brand + social + 3 link groups, bottom bar with copyright and legal

<Footer>
Preview not available

Cart Drawer

Slide-in cart panel with item list, quantity controls, subtotal and checkout CTA

<CartDrawer>

We use cookies to improve your experience and analyse site traffic.

DeclineAccept

Cookie Banner

Slide-up with full-page backdrop blur, Decline (ghost) + Accept (gold)

<CookieBanner>
Email *
hello@artist.com
Full Name
Jane Smith

Form Field

Input bg-dark-el border-gold-border, label mono uppercase, focus ring-gold/30

<FormField>
Contact
2
Artwork
3
Details

Progress Bar

Circular step indicators w-8 h-8, connecting lines, active/completed in gold

<ProgressBar>
Preview not available

Commission Form

Multi-step commission request (react-hook-form + zod): contact → artwork → details

<CommissionForm>
Preview not available

Stripe Checkout

Embedded Stripe Payment Element with card, Apple Pay and Google Pay support

<StripeCheckout>
05Design System

Icons

Material Symbols Outlined via Google Fonts

menumenu
closeclose
expand_moreexpand_more
expand_lessexpand_less
arrow_forwardarrow_forward
arrow_backarrow_back
arrow_downwardarrow_downward
palettepalette
photo_cameraphoto_camera
text_fieldstext_fields
articlearticle
descriptiondescription
auto_awesomeauto_awesome
searchsearch
drawdraw
exploreexplore
edit_documentedit_document
syncsync
bar_chartbar_chart
shopping_cartshopping_cart
paymentspayments
credit_cardcredit_card
inventory_2inventory_2
local_shippinglocal_shipping
locklock
checklistchecklist
account_treeaccount_tree
handshakehandshake
blockblock
calendar_todaycalendar_today
publicpublic
06Architecture & Scope

Detailed Documents

07Backend

Data Schemas

No traditional database — Sanity CMS for all content, Stripe for all orders. Schemas below reflect Sanity document types and Stripe objects.

artworks (Sanity)

All artworks — managed in Sanity Studio, no SQL database
FieldTypeConstraint
_idstringSanity document ID
titlestringNOT NULL
slugslugUNIQUE
mediumstringoil, watercolour, print, mixed
dimensionsobject{ width, height, unit }
pricenumberGBP
availablebooleanDEFAULT true
imagesimage[]Cloudinary via Sanity
descriptionrichText
collectionreference→ collections._id
tagsstring[][]
featuredbooleanDEFAULT false
_createdAtdatetimeauto

collections (Sanity)

Curated collections of artworks
FieldTypeConstraint
_idstringSanity document ID
titlestringNOT NULL
slugslugUNIQUE
coverImageimageCloudinary via Sanity
descriptionrichText
artistNoterichText
artworksreference[]→ artworks._id

commissionRequests (Sanity)

Commission requests submitted via the website form
FieldTypeConstraint
_idstringSanity document ID
namestringNOT NULL
emailstringNOT NULL
phonestring
subjectstringSubject or brief
messagetext
budgetstringBudget range
sizestringRequested dimensions
statusstringnew, reviewed, accepted, declined
_createdAtdatetimeauto

siteSettings (Sanity)

Global site settings and SEO defaults
FieldTypeConstraint
_idstringSingleton document
siteNamestring
siteDescriptiontext
contactEmailstring
socialLinksobject{ instagram, facebook, pinterest }
shippingInfotext

Orders (Stripe)

All orders are stored and managed in Stripe — no local orders table
FieldTypeConstraint
idstringStripe PaymentIntent ID
customer_emailstringNOT NULL
amountintegerIn pence (GBP)
currencystringDEFAULT "gbp"
statusstringsucceeded, pending, failed
metadataobject{ artwork_id, artwork_title, ... }
shippingobjectStripe shipping address object
createdtimestampStripe timestamp
08Backend

API Routes

Next.js App Router — validation via Zod, JSON responses.

POST/api/checkout

Create Stripe Checkout Session — returns session URL for redirect

{ items: [{ artworkId, title, price, quantity }], customerEmail }
POST/api/webhooks/stripe

Stripe webhook — handle payment_intent.succeeded, charge.refunded events

Stripe payload (signature verified)
POST/api/webhooks/sanity

Sanity webhook — trigger ISR revalidation on content publish

Sanity payload (secret verified)
POST/api/commission

Commission request form submission — saves to Sanity, sends confirmation email

{ name, email, phone?, subject, message, budget?, size? }
POST/api/contact

Simple contact form submission — sends email notification

{ name, email, message }
09Security

Checkout & Auth Flow

Artwork added to cart stored in localStorage / React context — no login required

arrow_downward

User clicks checkout → POST /api/checkout creates a Stripe Checkout Session

arrow_downward

Browser redirected to Stripe-hosted checkout page with pre-filled cart details

arrow_downward

Stripe handles payment, 3D Secure authentication and fraud detection

arrow_downward

Stripe sends payment_intent.succeeded event to /api/webhooks/stripe — verified via HMAC signature

arrow_downward

User redirected to /order-confirmation with session ID — confirmation email sent via Stripe

10Integrations

Webhooks & Data Flow

Data flow between Stripe, Sanity and the site.

payments

Customer completes checkout

Stripe payment_intent.succeeded → POST /api/webhooks/stripe → send confirmation email, mark artwork as sold in Sanity

block

Customer requests refund

Stripe charge.refunded → webhook → update artwork availability in Sanity → notify via email

sync

Artwork published in Sanity

Sanity webhook → POST /api/webhooks/sanity → trigger Next.js ISR revalidation of /shop and /collections pages

edit_document

Commission form submitted

POST /api/commission → save to Sanity commissionRequests → send confirmation to customer, notify artist via email