Components

Complete reference for all layer components.

Overview

The layer ships 50+ components organized by function across the core layer and opt-in modules. All components follow the complexity budget: max 50 lines, max 5 props, max 2 abstraction layers.

Convert Components

Signal capture components. All include data-testid for testing.

Form

Email/field capture form with anti-spam protection.

No credit card required

::convert-form
  ---
  location: hero
  submitLabel: Get Early Access
  note: No credit card required
  fields:
    - name: email
      type: email
      required: true
    - name: company
      type: text
      placeholder: Company name
  ---
  ::
fields
FieldDef[]
Form field definitions. Defaults to email field.
location
string required
Tracking location identifier for analytics.
submitLabel
string
Submit button text. Defaults to 'Get Access'.
note
string
Helper text displayed below the form.
layout
'stacked' | 'horizontal'
Field layout direction. Defaults to 'stacked'.
successRedirect
string
Redirect URL after successful submission.
offerSlug
OfferId
Offer tracking identifier.

data-testid: convert-form

External

Link to external payment/booking (Stripe, LemonSqueezy, Cal.com).

::convert-external
---
to: https://buy.stripe.com/...
type: presale
location: pricing
label: Buy Now
variant: button
buttonSize: xl
buttonColor: primary
---
::
PropTypeDefaultDescription
tostring— (required)External destination URL
typeOfferId— (required)Offer type identifier
locationstring— (required)Tracking location
labelstringButton/card label
iconstringIcon name
titlestringCard title (card variant)
descriptionstringCard description
pricestringPrice display
originalPricestringStrikethrough price
priceNotestringPrice footnote
badgestringCorner badge text
variant'button' | 'card''button'Display variant
highlightedbooleanfalseVisual emphasis
buttonSizeButtonProps['size']'xl'Button size
buttonVariantButtonProps['variant']'solid'Button variant
buttonColorButtonProps['color']'primary'Button color
blockbooleanfalseFull-width button
  • data-testid: convert-external

Internal

Link to internal pages (offers, success pages).

PropTypeDefaultDescription
offerSlugOfferIdOffer tracking identifier
tostringInternal destination path
labelstringButton/card label
iconstringIcon name
variant'button' | 'card''button'Display variant
sizeButtonProps['size']'md'Button size
blockbooleanFull-width button
colorButtonProps['color']'primary'Button color
buttonVariantButtonProps['variant']'solid'Button variant
descriptionstringCard description
cardVariantPageCardProps['variant']Card variant
spotlightPageCardProps['spotlight']Card spotlight effect
locationstring— (required)Tracking location
  • data-testid: convert-internal

Pricing

Pricing cards with booking links.

PropTypeDefaultDescription
optionsBookingOption[]— (required)Pricing tier definitions

Each BookingOption has: url, title, price, originalPrice?, priceNote?, priceInterval?, description, badge?, location, buttonLabel?, buttonVariant?, buttonColor?, highlighted?, features?.

  • data-testid: convert-pricing

Social

Social media icon links.

::convert-social
---
location: footer
size: lg
variant: subtle
color: secondary
rounded: true
gap: normal
---
::
PropTypeDefaultDescription
locationstring— (required)Tracking location
sizeButtonProps['size']'xl'Icon button size
variantButtonProps['variant']'subtle'Button variant
colorButtonProps['color']'secondary'Button color
roundedbooleantrueRounded buttons
gap'tight' | 'normal' | 'relaxed''normal'Spacing between icons
showEmailbooleanfalseInclude email link
  • data-testid: convert-social

SocialShare

Page sharing menu (Twitter, LinkedIn, Facebook, Email, clipboard).

::convert-social-share
---
title: Check out this article
description: A comprehensive guide to product validation
label: Share
size: md
variant: subtle
color: primary
---
::
PropTypeDefaultDescription
labelstring'Share Page'Button label
sizeButtonProps['size']'xl'Button size
colorButtonProps['color']'primary'Button color
variantButtonProps['variant']'subtle'Button variant
trailingIconstring'i-lucide-share'Trailing icon
titlestring— (required)Share title
descriptionstring— (required)Share description
urlstringOverride share URL
  • data-testid: convert-social-share

Rss

RSS feed subscription with reader links (Feedly, Inoreader, NewsBlur, The Old Reader).

PropTypeDefaultDescription
feedPathstring'decisions'Feed collection path
feedUrlstringOverride feed URL
locationstring— (required)Tracking location
sizeSelectMenuProps['size']'lg'Menu size
variantSelectMenuProps['variant']'ghost'Menu variant
colorSelectMenuProps['color']'neutral'Menu color
showLabelbooleantrueShow RSS label
labelstring'RSS'Button label text
  • Slots: #item (scoped: { item })
  • data-testid: convert-rss

Section Components

SectionWrapper

Wraps landing page sections with consistent layout, anchors, and data-testid.

PropTypeDefaultDescription
sectionIdstringSection identifier (used for data-testid and anchor)
...PageSectionPropsAll Nuxt UI PageSection props pass through
  • Slots: #title plus all PageSection slots
  • data-testid: section-{sectionId} (auto-generated)

Content Components

VideoHtml

HTML5 video player with aspect ratio control.

PropTypeDefaultDescription
srcstring— (required)Video source URL
altstring'video'Video description
posterstringPoster image
aspectRatio'square' | 'video' | 'portrait' | 'wide' | 'auto''video'Aspect ratio
autoplaybooleanfalseAutoplay on load
loopbooleanfalseLoop playback
mutedbooleantrueMuted audio
loading'eager' | 'lazy''lazy'Loading strategy

VideoIframe

Iframe video embed (YouTube, Vimeo).

PropTypeDefaultDescription
srcstring— (required)Embed URL
titlestring'video'Iframe title
aspectRatio'square' | 'video' | 'portrait' | 'wide''video'Aspect ratio
loading'eager' | 'lazy''lazy'Loading strategy

CaseStudy

Client testimonial card with optional partner logos.

PropTypeDefaultDescription
clientClient— (required)Client info (name, role, company, avatar?, website?, action?)
quotestring— (required)Testimonial text
partner{ label?, logos? }Partner logo bar

Changelog

Changelog timeline with author lookup. Provided by the changelog module.

PropTypeDefaultDescription
labelFieldkeyof ChangelogCollectionItem'label'Grouping label field
sortFieldkeyof ChangelogCollectionItem'date'Sort field
sortOrder'ASC' | 'DESC''DESC'Sort direction
showAuthorbooleantrueShow author info
showImagebooleantrueShow entry images
showScrollTopbooleantrueShow scroll-to-top button
scrollTopThresholdnumber500Scroll threshold for button
emptyTitlestring'No items yet'Empty state title
emptyDescriptionstring'Check back soon for updates.'Empty state text
emptyIconstring'i-lucide-inbox'Empty state icon

ComparisonList

Two-column comparison (e.g., "Without Foundry" vs "With Foundry").

PropTypeDefaultDescription
titlestringSection title
leftColumn— (required)Left column (title, icon?, color?, description?, items?)
rightColumn— (required)Right column
  • Slots: default (optional alert slot)

FeatureGrid

Grid of feature cards.

PropTypeDefaultDescription
featuresFeature[]— (required)Feature items (title?, description?, icon?, to?, target?)
columns2 | 3 | 43Grid columns
orientation'horizontal' | 'vertical''vertical'Card layout

FaqAccordion

FAQ accordion with content-driven items.

PropTypeDefaultDescription
itemsAccordionItemData[]FAQ items (label, content, icon?, color?, slot?)
typesstring[]Filter by FAQ type

FounderBio

Founder profile card.

PropTypeDefaultDescription
namestring— (required)Founder name
introstring— (required)Introduction text
avatarstringAvatar image path

Cited / Defn

Inline citation and definition markers for academic content. Provided by the docs module (Cited requires citations: true, Defn requires glossary: true).

ComponentPropTypeDescription
Citedidstring (required)Citation reference ID
Defnidstring (required)Glossary term ID

Both provide default slot for wrapping content.

Confetti

Celebration animation trigger.

PropTypeDefaultDescription
particleCountnumber100Number of particles
spreadnumber70Spread angle
originYnumber0.6Y origin position

App Components

AppBanner

Site-wide banner bar. Configured via navigation.yml banner field. No props — reads from injected banner_config.

Site logo with light/dark variants from app config.

PropTypeDefaultDescription
titlestringOverride logo title

AppHeader / AppFooter

Structural wrapper components that compose header and footer from sub-components. No direct props — sub-components read from injected navigation data.

Header slots: #title, #body, #right, #toggle (scoped: { open, toggle })

Footer slots: #top, #left, #right, #bottom

Anchor

In-page anchor point for scroll navigation.

PropTypeDefaultDescription
idstring— (required)Anchor identifier

Cta

Call-to-action card with configurable layout.

PropTypeDefaultDescription
ctaCtaConfigCTA config (headline?, message?, primary?, button)
titlestringOverride title
descriptionstringOverride description
variant'outline' | 'solid' | 'soft' | 'subtle' | 'naked''outline'Card variant
orientation'vertical' | 'horizontal''vertical'Layout direction
  • Slots: #links

Page Components

PageSplit

Two-column page layout.

PropTypeDefaultDescription
maxWidth'xl' | '2xl' | ... | 'full''7xl'Container max width
gapnumber8Column gap
  • Slots: #left, #right

OG Image Components

OgImageDocs / OgImageLanding

Open Graph image generation templates for docs and landing pages.

PropTypeDefaultDescription
titlestring'title'OG image title
descriptionstring'description'OG image description
headlinestringOptional headline

Docs Components

Provided by the docs module. These are registered when docs.enabled is true in your layer config.

DocsAsideLeftBody, DocsAsideLeftTop, DocsAsideRightBottom, DocsPageHeaderLinks — Structural docs layout components with no props. They read from injected navigation data and useContentConfig().

Bibliography, GlossaryTable, SourcesTable — Content feature components for citations and glossary. Registered when their respective sub-features are enabled (citations: true, glossary: true).

ProseA

Custom prose anchor override with external link detection.

PropTypeDefaultDescription
hrefstring''Link URL
targetstringLink target
  • Slots: default