Skip to main content
vibld

Style gallery

Loamby

Editorial online store site on warm off-white with a vermilion lead color

Light · Editorial serif · E-commerce · front-end app (local state)

A light, serif-led, print-inspired visual system for a consumer brand store. Its look rests on 500-weight display type up to 50px, tight display tracking (-0.100em) and a vermilion lead color on a warm off-white canvas. Apply it to a marketing site or the public pages of an app; the tokens and component specs carry the identity.

Build in this styleRead the build prompt

In the builder, open Gallery under the message and search for Loamby.

What makes it

  • 500-weight display type up to 50px
  • tight display tracking (-0.100em)
  • serif headlines over a sans-serif body
  • monospace used for labels, metadata or code
  • short uppercase labels with open tracking
  • small 3px corners on controls
  • no shadows; depth comes from surface tone steps
  • several saturated colors used as section and card fills

Colors

Calm, literate, considered. The warm off-white canvas and tight display tracking (-0.100em) carry most of the character.

  • canvas / primary action label#fff9f2
  • surface / divider (decorative)#f6ede3
  • text#522c25
  • muted text#7e6660
  • input border#b87d3b
  • accent / primary action fill / link text / focus ring#c03001
  • supporting accent (decorative), never behind text#c46500
  • second supporting accent (decorative), never behind text#febf6f

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on canvas11.50:14.5:1
Aabody text on surface10.39:14.5:1
Aamuted text on canvas5.08:14.5:1
Aamuted text on surface4.59:14.5:1
Aaprimary action label on fill5.48:14.5:1
Aalink text on canvas5.48:14.5:1
focus ring on canvas5.48:13:1
focus ring on surface4.95:13:1
input border on canvas3.33:13:1
accent icons and active marks on canvas5.48:13:1

Typefaces

monospace accents in Roboto Mono; uppercase only for short labels, with at least 0.05em tracking; no text below 12px; weights of 300 or lighter only at 24px and above; fonts are open Google Fonts chosen to match the observed letterforms

  • Source Serif 4Headings
  • InterBody
  • Roboto MonoFigures and code

Type scale

50px Source Serif 4 500

22px Inter 400

20px Inter 400

16px Inter 400

14px Inter 400

12px Inter 400

Corners and shadows

  • cards: 8px
  • badges: 3px
  • images: 8px
  • inputs: 3px
  • buttons: 3px

No shadows: depth comes from surfaces and lines.

Spacing and imagery

comfortable density on a 4px base unit; container 1200px; section gap 40px-64px; card padding 24px-36px; element gap 6px-12px; radii cards 8px, badges 3px, images 8px, inputs 3px, buttons 3px; no shadows

Photography, illustration, 3d renders, abstract gradients. Use placeholder or generated imagery only; partner marks are neutral placeholders in the muted text color. Photography is shown under a scrim wherever text overlaps it. Icons are outline style at 20-24px in the text or muted color.

Layout

  1. top navigation: wordmark left, 4-6 text links, primary action right; collapses to a menu sheet under 768px
  2. full-bleed hero with media behind a scrim and the headline anchored lower left
  3. tabbed showcase that swaps a panel per tab
  4. article or story cards with image, kicker, title and date
  5. large framed product view on a tinted surface
  6. horizontal card rail with previous/next buttons and snap scrolling
  7. testimonial cards with quote, name and role
  8. feature grid of icon, title and two-line description cells (3-4 columns desktop, 1 column mobile)
  9. row of placeholder partner marks in a single muted tone (wraps to two rows on mobile)
  10. product grid: image, name, price and quick-add, 4 columns desktop / 2 mobile
  11. footer with grouped link columns, legal line and social icons
  12. content sits in a 1200px centered container with 24px side padding (16px on mobile)
  13. sections are separated by 40px-64px of vertical space on desktop, roughly half that on mobile

Patterns

  • hero
  • tabbed showcase that swaps a panel per tab
  • article or story cards with image, kicker, title and date
  • large framed product view on a tinted surface
  • horizontal card rail with previous/next buttons and snap scrolling
  • testimonial cards with quote, name and role
  • feature grid of icon, title and two-line description cells (3-4 columns desktop, 1 column mobile)
  • row of placeholder partner marks in a single muted tone (wraps to two rows on mobile)
  • product grid

Components

  • primary button: fill #c03001, label #fff9f2; 3px radius; padding 10px 12px; uppercase with at least 0.05em tracking
  • secondary button: transparent fill; 3px radius; 1px border; uppercase with at least 0.05em tracking
  • top navigation bar: colors: text #522c25; type 14px/400; uppercase with at least 0.05em tracking
  • hero block: colors: accent #c03001, text #522c25; type 51px/500
  • content card: colors: surface #f6ede3, text #522c25, muted text #7e6660; 8px radius; type 16px
  • content card (variant 2): colors: canvas #fff9f2, surface #f6ede3, muted text #7e6660; 8px radius; 1px border; type 14px
  • carousel: follows the shared tokens
  • top navigation bar (variant 2): colors: canvas #fff9f2, surface #f6ede3; 1px border; uppercase with at least 0.05em tracking
  • pill badge: colors: muted text #7e6660; type 12px/400
  • product frame: colors: text #522c25; type 14px
  • announcement strip: colors: canvas #fff9f2
  • carousel (variant 2): follows the shared tokens
  • secondary button (variant 2): fill accent #c03001; label canvas #fff9f2; 3px radius; uppercase with at least 0.05em tracking

Interactions and states

  • links underline on hover; images fade in on load
  • every interactive element shows a 2px #c03001 focus ring with 2px offset
  • primary action darkens or lightens by one step on hover and keeps its label color
  • card rail scrolls with snap points; previous/next buttons and keyboard arrows move one card
  • navigation collapses to a full-height menu sheet under 768px, trapping focus while open
  • all motion is disabled under prefers-reduced-motion
  • images show a surface-colored placeholder until loaded, with alt text if they fail
  • forms: inline validation, disabled submit while sending, success message and retryable error
  • mobile menu open and closed states
  • hover, focus-visible, active and disabled states for every button style
  • reduced-motion variant with no transitions beyond opacity
  • rail start and end: previous/next buttons disable at the ends
  • out-of-stock product tile with a disabled add button and 'Notify me' alternative
  • cart count badge updates after add

Guardrails

Experience

  • Keep one primary action style (#c03001 fill, #fff9f2 label) and use it once per view; secondary actions stay outlined or text-only.
  • Give each saturated color a job (section, category or state) and keep text on neutral surfaces.
  • Use the 3px control radius consistently; do not mix in pill shapes.
  • Limit headline sizes to the type scale; the 50px display size appears once per page, in the hero.
  • Separate layers with surface tone and hairlines, not shadows.
  • Partner and customer marks are placeholders in one muted tone; never use real company logos.
  • Keep copy short and concrete: one idea per section, with a heading that states the benefit.

Accessibility

  • Text, links, focus rings and input borders use only the verified pairs listed in contrast checks.
  • Focus ring: 2px solid #c03001 with 2px offset on every interactive element.
  • Body text is 16px or larger at 1.5 line height; nothing is smaller than 12px.
  • Decorative colors (dividers and supporting accents) never carry text or the only signal of state.
  • Uppercase labels stay short, use at least 0.05em tracking and keep sentence-case text in the HTML source.
  • The card rail has visible previous/next buttons, is keyboard operable and never auto-advances.
  • Text over photos or gradients sits on a scrim that keeps it at 4.5:1 against the lightest area.
  • Respect prefers-reduced-motion; no parallax or autoplay video without a pause control.
  • Some observed colors were moved to the nearest passing shade of the same hue; use the palette values here, not lighter originals.

Security

  • Validate every form with a shared zod schema on the client and again in the edge function; reject unknown fields.
  • Rate-limit form endpoints per IP and add a honeypot field; store leads in a Supabase table with RLS allowing insert only for anonymous users and select only for staff.
  • Set a strict Content-Security-Policy, self-host fonts and icons, and avoid third-party scripts beyond privacy-friendly analytics.
  • Open external links with rel="noopener noreferrer" and never put secrets or API keys in client code.
  • Checkout goes through a hosted payment provider; the site never handles card data, and prices are re-validated on the server.

Build prompt

The rules every style in the gallery assumes, then this style’s own ten sections, from goal to guardrails. A build in the style also gets its tokens as a file, so the colors and type above are exact.

The rules every style assumes
### 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
- Enable Row Level Security on every table before inserting data. Default-deny, then add the narrowest policies the feature needs (for a lead form: insert-only for anonymous users, select for a staff role).
- Store roles in a separate table checked by a security-definer function, never in a user-editable profile field.
- 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 color 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, labeled form fields, and alt text on meaningful images.
- Respect `prefers-reduced-motion` for every animation. Give carousels and drag interactions keyboard and button alternatives, and never auto-advance them.
- Build mobile-first and test at 375px, 768px and 1280px.

### Content guardrails
- Use original copy, fictional sample data and placeholder or generated imagery. Do not reuse another product's name, logo, screenshots or marketing text.
- Partner and customer logo rows use neutral placeholder marks. Label demo testimonials and metrics as samples. Collect the minimum personal data a form needs.

### Style preset baseline
- Treat the entry's palette, type scale, radii, spacing and shadows as the complete token set. Do not introduce new colors; derive hover and pressed states by moving one step lighter or darker within the same hue, then re-check contrast.
- Colors marked decorative (dividers, supporting accents) never sit behind text and never carry meaning on their own.
- Fonts are open Google Fonts chosen to match the observed letterforms. Self-host them with `font-display: swap` and keep to the listed weights.
- Keep the signature moves listed for the entry, and keep everything else quiet so they stay recognizable.
- One primary action style per view. Secondary actions are outlined or text-only, and links are distinguishable by more than color (underline or weight).
### Goal
Build a responsive light-theme marketing site for a fictional consumer brand store in the "Loamby" style: serif-led, print-inspired, with 500-weight display type up to 50px, tight display tracking (-0.100em), serif headlines over a sans-serif body. Use invented copy and placeholder imagery throughout.

### Stack
React 18 + Vite, TypeScript, Tailwind CSS, shadcn/ui (Radix), lucide-react, TanStack Query, Motion, Embla Carousel, zod, Supabase (form submissions only). Design tokens live as CSS variables and are mapped into the Tailwind theme.

### Pages & layout
Home page sections, in order:
- top navigation: wordmark left, 4-6 text links, primary action right; collapses to a menu sheet under 768px
- full-bleed hero with media behind a scrim and the headline anchored lower left
- tabbed showcase that swaps a panel per tab
- article or story cards with image, kicker, title and date
- large framed product view on a tinted surface
- horizontal card rail with previous/next buttons and snap scrolling
- testimonial cards with quote, name and role
- feature grid of icon, title and two-line description cells (3-4 columns desktop, 1 column mobile)
- row of placeholder partner marks in a single muted tone (wraps to two rows on mobile)
- product grid: image, name, price and quick-add, 4 columns desktop / 2 mobile
- footer with grouped link columns, legal line and social icons
- content sits in a 1200px centered container with 24px side padding (16px on mobile)
- sections are separated by 40px-64px of vertical space on desktop, roughly half that on mobile
Also build a simple contact page with a lead form and a 404 page in the same style. Test at 375px, 768px and 1280px.

### Design system
```css
:root {
  --color-canvas: #fff9f2;
  --color-surface: #f6ede3;
  --color-text: #522c25;
  --color-muted-text: #7e6660;
  --color-input-border: #b87d3b;
  --color-accent: #c03001;
  --color-supporting-accent: #c46500;
  --color-second-supporting-accent: #febf6f;
  --text-12: 12px;
  --text-14: 14px;
  --text-16: 16px;
  --text-20: 20px;
  --text-22: 22px;
  --text-50: 50px;
  --radius-cards: 8px;
  --radius-badges: 3px;
  --radius-images: 8px;
  --radius-inputs: 3px;
  --radius-buttons: 3px;
  --space-unit: 4px;
  --container: 1200px;
}
```
Display Source Serif 4, body Inter, mono Roboto Mono (Google Fonts, self-hosted, font-display: swap).
Type scale (size/weight/line-height tracking): 12px/400/1.1 0.050em, 14px/400/1.6 0.050em, 16px/400/1.5, 20px/400/1.5 -0.100em, 22px/400/1.0 -0.100em, 50px/500/0.85 -0.100em.
Spacing: comfortable density on a 4px base unit; container 1200px; section gap 40px-64px; card padding 24px-36px; element gap 6px-12px; radii cards 8px, badges 3px, images 8px, inputs 3px, buttons 3px; no shadows.
Signature moves: 500-weight display type up to 50px; tight display tracking (-0.100em); serif headlines over a sans-serif body; monospace used for labels, metadata or code; short uppercase labels with open tracking; small 3px corners on controls; no shadows; depth comes from surface tone steps; several saturated colors used as section and card fills.

### Components & interactions
- **primary button**: fill #c03001, label #fff9f2; 3px radius; padding 10px 12px; uppercase with at least 0.05em tracking
- **secondary button**: transparent fill; 3px radius; 1px border; uppercase with at least 0.05em tracking
- **top navigation bar**: colors: text #522c25; type 14px/400; uppercase with at least 0.05em tracking
- **hero block**: colors: accent #c03001, text #522c25; type 51px/500
- **content card**: colors: surface #f6ede3, text #522c25, muted text #7e6660; 8px radius; type 16px
- **content card (variant 2)**: colors: canvas #fff9f2, surface #f6ede3, muted text #7e6660; 8px radius; 1px border; type 14px
- **carousel**: follows the shared tokens
- **top navigation bar (variant 2)**: colors: canvas #fff9f2, surface #f6ede3; 1px border; uppercase with at least 0.05em tracking
- **pill badge**: colors: muted text #7e6660; type 12px/400
- **product frame**: colors: text #522c25; type 14px
- **announcement strip**: colors: canvas #fff9f2
- **carousel (variant 2)**: follows the shared tokens
- **secondary button (variant 2)**: fill accent #c03001; label canvas #fff9f2; 3px radius; uppercase with at least 0.05em tracking
- links underline on hover; images fade in on load
- every interactive element shows a 2px #c03001 focus ring with 2px offset
- primary action darkens or lightens by one step on hover and keeps its label color
- card rail scrolls with snap points; previous/next buttons and keyboard arrows move one card
- navigation collapses to a full-height menu sheet under 768px, trapping focus while open
- all motion is disabled under prefers-reduced-motion

### Data & state
Content comes from typed local collections: Feature{icon, title, body}, Testimonial{quote, name, role, avatarUrl}, Post{slug, title, kicker, excerpt, coverUrl, publishedAt}, Product{slug, name, price, imageUrl, alt, inStock, swatches[]}, PartnerMark{label, placeholderSvg}, Lead{email, name?, message?, createdAt}. The lead form posts to a Supabase edge function. Handle these states:
- images show a surface-colored placeholder until loaded, with alt text if they fail
- forms: inline validation, disabled submit while sending, success message and retryable error
- mobile menu open and closed states
- hover, focus-visible, active and disabled states for every button style
- reduced-motion variant with no transitions beyond opacity
- rail start and end: previous/next buttons disable at the ends
- out-of-stock product tile with a disabled add button and 'Notify me' alternative
- cart count badge updates after add

### Accessibility
- Text, links, focus rings and input borders use only the verified pairs listed in contrast checks.
- Focus ring: 2px solid #c03001 with 2px offset on every interactive element.
- Body text is 16px or larger at 1.5 line height; nothing is smaller than 12px.
- Decorative colors (dividers and supporting accents) never carry text or the only signal of state.
- Uppercase labels stay short, use at least 0.05em tracking and keep sentence-case text in the HTML source.
- The card rail has visible previous/next buttons, is keyboard operable and never auto-advances.
- Text over photos or gradients sits on a scrim that keeps it at 4.5:1 against the lightest area.
- Respect prefers-reduced-motion; no parallax or autoplay video without a pause control.
- Some observed colors were moved to the nearest passing shade of the same hue; use the palette values here, not lighter originals.
Verified contrast: body text on canvas #522c25 on #fff9f2 = 11.5:1; body text on surface #522c25 on #f6ede3 = 10.39:1; muted text on canvas #7e6660 on #fff9f2 = 5.08:1; muted text on surface #7e6660 on #f6ede3 = 4.59:1; primary action label on fill #fff9f2 on #c03001 = 5.48:1; link text on canvas #c03001 on #fff9f2 = 5.48:1; focus ring on canvas #c03001 on #fff9f2 = 5.48:1; focus ring on surface #c03001 on #f6ede3 = 4.95:1; input border on canvas #b87d3b on #fff9f2 = 3.33:1; accent icons and active marks on canvas #c03001 on #fff9f2 = 5.48:1.

### Security
- Validate every form with a shared zod schema on the client and again in the edge function; reject unknown fields.
- Rate-limit form endpoints per IP and add a honeypot field; store leads in a Supabase table with RLS allowing insert only for anonymous users and select only for staff.
- Set a strict Content-Security-Policy, self-host fonts and icons, and avoid third-party scripts beyond privacy-friendly analytics.
- Open external links with rel="noopener noreferrer" and never put secrets or API keys in client code.
- Checkout goes through a hosted payment provider; the site never handles card data, and prices are re-validated on the server.

### Performance & SEO
- Static generation for every content page; ship no JavaScript to sections that do not need it.
- Images in AVIF/WebP with explicit width and height, lazy-loaded below the fold; preload the hero image and the display font only.
- One h1 per page, descriptive titles and meta descriptions, Open Graph tags with a generated preview image, and a sitemap.
- Target Lighthouse 95+ for performance, accessibility, best practices and SEO.

### Guardrails
- Keep one primary action style (#c03001 fill, #fff9f2 label) and use it once per view; secondary actions stay outlined or text-only.
- Give each saturated color a job (section, category or state) and keep text on neutral surfaces.
- Use the 3px control radius consistently; do not mix in pill shapes.
- Limit headline sizes to the type scale; the 50px display size appears once per page, in the hero.
- Separate layers with surface tone and hairlines, not shadows.
- Partner and customer marks are placeholders in one muted tone; never use real company logos.
- Keep copy short and concrete: one idea per section, with a heading that states the benefit.
Acceptance criteria:
- Every color in the build comes from the tokens above and every text pair matches a verified contrast pair.
- The page works with keyboard only, shows a visible focus ring everywhere and passes an automated axe check with no violations.
- No real brand names, logos, product screenshots or copied marketing text appear anywhere.
- Layout holds at 375px with no horizontal scrolling.

Open the builderThe whole gallery