Template
Heronfield
An enterprise landing site for autonomous AI agents that run finance operations such as billing, reconciliation and commissions. It speaks to finance leaders with restraint: editorial light serif headlines, monospace labels, stark black and white bands and quantified outcomes, supported by a dark reports dashboard and photo-backed customer quotes.
AI finance-agent enterprise landing site · Website · SaaS landing page · static site
A mock-up of the homepage, drawn from this design’s layout, palette and typefaces. A build follows the full prompt below.
Add app screens
Pick up to 6 screens, such as a dashboard, settings or an empty state. Each is built in this design’s own palette and typefaces, with its states and guardrails.
Start from this templateRead the build prompt
Typefaces
Petrona has a genuinely graceful light weight for the private-bank headlines and figures, while the Hanken Grotesk body and Geist Mono labels are kept as the design names them.
- PetronaHeadings: hero 62px 300, H2 52px, figures 64px, -0.05em
- Hanken GroteskBody: body 16px/1.5 400, buttons 14px 500
- Geist MonoFigures and code: eyebrows, stat labels and roles 12px uppercase +0.1em
Patterns
- funding-news pill above hero
- two-tone serif headline (second line muted)
- left vertical hairline rail anchoring content
- alternating black and off-white full-bleed bands
- monospace uppercase micro-labels with square bullet
- logo marquee on black
- three big-number stat columns with dividers
- product screenshot on dark photographic backdrop
- numbered metric pairs
- industry cards
- photo-backed testimonial cards with serif quotes
- FAQ accordion
States it is designed for
- Demo request: invalid work email, submitting, scheduled confirmation, failure with retry
- Log in link to app auth (outside scope) with loading
- Reduced motion: figures static, no parallax, marquee static
- Long company names in testimonials truncate gracefully
- Screenshots loading with dark placeholder of same ratio
Who it is for
- CFOs and finance directors
- Controllers and accounting managers
- Revenue operations leads
- Finance teams at scaling companies
Layout
- Top bar on black: logo mark + wordmark, links (Product, Customers, Pricing, Company, Blog), text 'Log in' and white pill 'Request demo'
- Hero on black left-aligned beside a thin vertical rail: funding-news pill with arrow, 62px light serif headline on two lines (second line in warm grey), two-line sans paragraph, white pill CTA
- Logo marquee of invented wordmarks along the bottom of the black hero
- Off-white band: square-bullet mono eyebrow, 52px serif heading, paragraph, black pill; three stat columns with vertical dividers, huge serif figures and mono uppercase labels
- Black band: centred eyebrow, serif heading, one-line proof, white pill; then stacked feature blocks offset right: dark photographic backdrop with a product screenshot (sidebar, reports, line and bar charts), serif title + 'Learn more' pill, paragraph, two numbered metrics
- Industries grid, results section, photo-backed testimonial cards (logo, serif quote, name + mono role), FAQ, final CTA, footer
- Breakpoints: rail moves to 16px from the edge; feature blocks go full width; stat columns stack with horizontal dividers; testimonial cards stack
Palette
restrained, authoritative, editorial, premium. A private-bank annual report that happens to be about AI.
- black band
#030303 - off-white band
#f9f9f9 - text on black / pill fill
#ffffff - ink on light
#080808 - muted headline line / muted on black
#969290 - muted text on light
#636363 - rail and dividers on light
#8a8a8a - rail and dividers on black
#5b5b5b - chip on black
#3b3b3b
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | white text on black band | 20.62:1 | 4.5:1 |
| Aa | muted serif line on black | 6.69:1 | 4.5:1 |
| Aa | ink on off-white band | 19.02:1 | 4.5:1 |
| Aa | muted text on off-white | 5.71:1 | 4.5:1 |
| Aa | black pill label on white pill | 20.62:1 | 4.5:1 |
| Aa | white on news chip | 11.20:1 | 4.5:1 |
| rail/divider on off-white | 3.28:1 | 3:1 | |
| rail/divider on black | 3.04:1 | 3:1 | |
| Aa | white quote on photo scrim (worst case, scrim #030303 at 60%) | 5.74:1 | 4.5:1 |
As vibld’s tokens
The palette on the fifteen colour tokens vibld styles a project with, each text colour on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.
- background
- card
- muted
- primary *
- secondary
- accent
- destructive *
Type scale
- Display
- Petrona 300 (similar to the observed light contemporary serif), hero 62px/1.1 with -0.05em tracking, h2 52px, figures 64px
- Body
- Hanken Grotesk 400 (similar to the observed neutral grotesk), 16px/1.5; buttons 14px 500
Geist Mono 12px uppercase with 0.1em tracking for eyebrows, stat labels and roles. Light serif weight used only at 24px and above.
Spacing and imagery
Wide editorial margins, 1200px container with a 30px left rail; 140px section spacing; images 0-4px radius (square, architectural); pills fully rounded 45px; no shadows; hairline dividers.
Dark architectural and material photography (wood, steel, stone) as backdrops for product screenshots and testimonials; greyscale UI with subtle charts; monochrome wordmarks.
Components
- News pill
- Two-tone serif headline
- Vertical content rail
- Pill buttons (white on black, black on light)
- Logo marquee
- Mono eyebrow with square bullet
- Stat column with divider
- Screenshot on photo backdrop
- Numbered metric
- Industry card
- Photo testimonial card
- FAQ accordion
Interactions
- Headline lines fade in sequentially; figures count up when in view
- Marquee drifts slowly and pauses on hover/focus
- Screenshots parallax slightly within their photo frames
- Pills invert colours on hover
- Testimonial photos darken to improve legibility on hover focus
- Accordion expands with a thin plus/minus
Data
Stat{value, prefix, suffix, label}FeatureBlock{title, body, image, metrics[{order, value, label}], href}Industry{name, blurb, icon}Testimonial{company_mark, quote, person, role, backdrop}Faq{question, answer}DemoRequest{name, work_email, company, finance_team_size, created_at}
Guardrails
Experience
- One CTA label everywhere (Request demo) so intent is unambiguous
- Stats show unit and what they measure; mark as illustrative until verified
- Keep serif for headings and figures only; everything else sans or mono
- Screenshots stay legible: crop rather than shrink on mobile
- Testimonials include role and company type, not only a name
Accessibility
- Muted grey headline line uses #969290 on black (passes 4.5)
- Text over testimonial photos sits on a 60% black scrim; checked against white worst case
- Mono labels are 12px minimum with 0.1em tracking
- Light serif weight only at 24px and larger
- Focus ring: 2px white on black bands, 2px black on light bands
- Marquee and count-ups respect reduced motion
Security
- Demo form: zod validation both sides and work-email domain check
- RLS on demo_requests: anon insert only, sales role select
- Rate limit and honeypot; no finance data collected on the site
- Log in link goes to a separate app origin with its own auth; no credentials handled on the marketing site
Build prompt
The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.
The baseline
### How to use these prompts Paste an entry's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project. ### Engineering baseline - TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind). - Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone. - Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only. - Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables. ### Data and auth baseline (full-stack entries) - Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views. - Store roles in a separate table checked by a security-definer function, never in a user-editable profile field. - Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs. - Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms. - Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data. ### Accessibility and UX baseline - Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any colour change. - Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels. - Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labelled form fields, and alt text on meaningful images. - Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives. - Build mobile-first and test at 375px, 768px and 1280px. ### Content guardrails - Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text. - Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs. ### SaaS screen baseline - Design every screen for its full set of states: first-run empty, loading skeleton, partial data, error with retry, permission-denied, and success feedback. Each entry lists the states its screen needs. - Keep destructive actions (delete, revoke, downgrade, remove member) behind a confirmation that names the object, and prefer undo over a second dialog where the action is reversible. - Enforce authorisation on the server for every action a screen exposes. Hiding a button is not access control; check the role again in the API or RLS policy. - Never show secrets (API keys, tokens) in full after creation. Show them once, then mask them, and offer rotate and revoke. - Keep the app shell (navigation, workspace switcher, account menu) consistent across screens, and preserve filters, sort and scroll position when the user navigates back.
### Goal
Build the landing site for **Heronfield**, autonomous AI agents that run finance operations (billing, reconciliation, commissions, reporting). The audience is finance leadership, so the design is restrained and editorial: alternating black and off-white bands, a light serif for headlines and figures, monospace micro-labels, dark architectural photography and a greyscale product UI. Single conversion: request a demo.
### Stack
Next.js with React and TypeScript, Tailwind CSS, shadcn/ui on Radix (Accordion, Sheet, Dialog), lucide-react, Motion for staggered reveals, count-ups, marquee and parallax, react-hook-form + zod for the demo form, Supabase for demo requests.
### Pages & layout
1. **Home**: black top bar (mark + wordmark, five links, "Log in" text link, white "Request demo" pill). Black hero beside a thin vertical rail: news pill ("Now in general availability" with arrow), 62px light serif headline with a muted second line, two-line paragraph, white pill. Logo marquee of invented wordmarks.
Off-white band: mono eyebrow with square bullet, 52px serif heading, paragraph, black pill; three stat columns with vertical hairlines, 64px serif figures and mono labels.
Black band: centred eyebrow, heading, one-line proof, pill; then stacked feature blocks on the right two-thirds: product screenshot (sidebar, Reports view, line and bar charts in greys) on a dark wood/steel photo, serif title + "Learn more" pill, paragraph, two numbered metrics.
Industries grid, results, photo-backed testimonial cards (invented company mark, serif quote, name, mono role) on a scrim, FAQ, final CTA, footer.
2. **Product**, **Customers**, **Pricing** (contact-sales tiers), **Company**, **Blog**, **Request demo** page.
Mobile: rail at 16px, blocks full width, stats stacked with horizontal dividers.
### Design system
```
--black: #030303; --paper: #f9f9f9; --white: #ffffff; --ink: #080808;
--muted-dark: #969290; --muted-light: #636363; --rule-light: #8a8a8a;
--rule-dark: #5b5b5b; --chip-dark: #3b3b3b;
```
Fonts: Petrona 300 (similar to the observed light serif) for headings and figures (62/52/64px, tracking -0.05em); Hanken Grotesk 400 body 16px/1.5; Geist Mono 12px uppercase +0.1em for labels. Spacing 8px base, 140px sections, 1200px container, 30px rail inset. Radius: images 4px, pills full. No shadows. Motion: 500ms fades with 120ms stagger, 1.2s count-ups, 60s marquee, parallax 0.08.
### Components & interactions
TopBar (Sheet on mobile), NewsPill, TwoToneHeadline, Rail, Pill (light | dark, invert on hover), LogoMarquee, MonoEyebrow, StatColumns (count-up), FeatureBlock (PhotoFrame + Screenshot parallax, NumberedMetric), IndustryCard, TestimonialCard (scrim over photo), FaqAccordion, DemoForm.
### Data & state
Content JSON: `stats`, `featureBlocks`, `industries`, `testimonials` (invented firms like "Pinecrest Holdings"), `faqs`, `logos`. Demo form writes `demo_requests(id, name, work_email, company, finance_team_size, created_at)`. Client state: menu, form status.
### Accessibility
Muted serif line passes on black; muted light text passes on paper. Testimonial text on a 60% black scrim (checked as #666666 worst case against white). Light serif only at 24px+; mono labels 12px minimum. Focus rings invert per band. Reduced motion disables count-ups, parallax and marquee. Screenshots have alt summaries.
Verified contrast: white text on black band: #ffffff on #030303 = 20.62:1; muted serif line on black: #969290 on #030303 = 6.69:1; ink on off-white band: #080808 on #f9f9f9 = 19.02:1; muted text on off-white: #636363 on #f9f9f9 = 5.71:1; black pill label on white pill: #030303 on #ffffff = 20.62:1; white on news chip: #ffffff on #3b3b3b = 11.2:1; rail/divider on off-white: #8a8a8a on #f9f9f9 = 3.28:1; rail/divider on black: #5b5b5b on #030303 = 3.04:1; white quote on photo scrim (worst case, scrim #030303 at 60%): #ffffff on #666666 = 5.74:1.
### Security
Zod on both sides, work-email domain check, length limits. RLS on `demo_requests`: enable, anon insert-only, select only for a `sales` role. Rate limit and honeypot. Log in links to a separate app origin; the marketing site never handles credentials or finance data. Secrets server-only.
### Performance & SEO
Static generation; photo backdrops AVIF with fixed ratios, lazy below the fold; screenshots crisp at 2x. Self-host fonts with swap. Metadata, OG image, Organization and FAQPage JSON-LD. Lighthouse 95+.
### Guardrails
- Invent all logos, firms, people, quotes, funding news and figures; label metrics as illustrative.
- No claims about accuracy, compliance or audit guarantees.
- Typed components, no `any`, content in JSON.
- Acceptance criteria: (1) every band keeps its contrast with its own focus style; (2) demo form handles all states; (3) testimonials readable on any photo via scrim; (4) no horizontal scroll at 390px; (5) every recorded contrast pair passes.