
Modules
Module Overview
This document provides a comprehensive overview of all available modules (blocks), collections, and globals in the RobinCMS Payload project, including their configurable options.
Table of Contents
Shared Fields
These field groups are reused across most blocks:
Block Colors (blockColorFields)
A group with five text fields using the ThemeColorPickerField component:
| Field | Description |
|---|---|
backgroundColor | Background color override |
textPrimaryColor | Headings & body text color override |
textSecondaryColor | Subtitles & captions color override |
buttonBgColor | Override filled-button background color |
buttonTextColor | Override filled-button text color |
backgroundPattern | Optional decorative SVG pattern layered over the background color (default: none) |
patternColor | Color of the pattern overlay (shown when a pattern is selected, ThemeColorPicker) |
patternOpacity | Opacity of the pattern overlay, 0–1 (default: 0.1, shown when a pattern is selected) |
The background pattern library ships 40 tileable SVG patterns across 8 categories (Abstract, Geometric, Basic, Futuristic, Minimal, Tile, Music, Food), defined in src/lib/patterns.ts.
Applied to all blocks except Spacer and Separator.
Block Typography (blockTypographyFields)
A group that overrides the global theme typography for an individual block. Every option defaults to Inherit (use the global Theme & Styling settings).
| Field | Type | Description |
|---|---|---|
fontFamily | select | Font family for all text in the block (Inherit + Google Fonts, with live preview) |
fontWeight | select | Inherit / 300 / 400 / 500 / 600 / 700 / 800 / 900 |
fontSize | select | Inherit / small / medium / large / xlarge — scales all text relative to the theme size |
Applied to Hero, Bento Gallery, Vinyl Player, and other blocks that opt in.
Button Icon Fields (buttonIconFields)
Reusable icon fields spread into button arrays on Hero, CTA, CardGrid, and ImageText blocks:
| Field | Type | Description |
|---|---|---|
icon | select | Optional Heroicon displayed inside the button (default: none) |
iconPosition | select | left (default) or right — shown only when an icon is selected |
Block Spacing (blockSpacingFields)
A group with two collapsible sub-groups — Padding and Margin — each containing:
| Field | Type | Description |
|---|---|---|
top / right / bottom / left | select | none / small / medium / large / custom |
topCustom / rightCustom / bottomCustom / leftCustom | text | Custom pixel value (shown when "custom" is selected) |
Applied to all blocks.
Block Width (blockLayoutFields)
| Field | Type | Description |
|---|---|---|
blockWidth | select | contained (default) or full |
Padding Size (paddingSizeField)
| Field | Type | Description |
|---|---|---|
paddingSize | select | none / small / medium (default) / large |
Animation (animationField)
| Field | Type | Description |
|---|---|---|
animation | select | fadeUp (default) / fadeIn / slideLeft / slideRight / scale / none |
Blocks
Hero
Block Slug: hero
Description: Full-width hero section with multiple layout styles and scroll-driven visual effects.
| Field | Type | Required | Description |
|---|---|---|---|
style | select | No | fullscreen (default) / split / centered / minimal |
heading | text | Yes | Main heading text |
subheading | textarea | No | Secondary heading text |
backgroundImage | upload (media) | No | Background or hero image |
overlay | checkbox | No | Dark overlay on background image (default: true) |
overlayOpacity | number | No | Overlay opacity 0–100 (default: 40, shown when overlay is enabled) |
scrollEffect | select | No | none / zoomIn / parallax / blur (shown when background image is set) |
bottomGradient | checkbox | No | Fade gradient at bottom edge |
bottomGradientColor | text | No | Color to fade into (ColorPicker, conditional) |
bottomGradientHeight | select | No | 50% / 75% (default) / 100% (conditional) |
alignment | select | No | left / center (default) / right |
minHeight | select | No | auto / 50vh / 75vh / 100vh (default) |
ctaButtons | array (max 3) | No | label (text, req), link (text, req), variant (filled/outlined/text), newTab (checkbox), icon (select, heroicon), iconPosition (left/right) |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
paddingSize | select | No | none / small / medium / large (default) |
blockWidth | select | No | contained / full (default) |
animation | select | No | Entrance animation |
Rich Text
Block Slug: richText
Description: A flexible rich text content block using the Lexical rich text editor.
| Field | Type | Required | Description |
|---|---|---|---|
content | richText | Yes | Rich text content (headings, lists, links, bold, italic, etc.) |
columns | select | No | 1 (default) or 2 column layout |
maxWidth | select | No | narrow (720px) / medium (960px, default) / wide (1200px) / full |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
paddingSize | select | No | none / small / medium (default) / large |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / slideLeft / slideRight / scale / none |
Image + Text
Block Slug: imageText
Description: Side-by-side image and rich text content.
| Field | Type | Required | Description |
|---|---|---|---|
layout | select | No | imageLeft (default) / imageRight / textOnly / imageOnly |
image | upload (media) | No | Image (hidden when layout is textOnly) |
imageSize | select | No | small (33%) / medium (50%, default) / large (66%) — hidden for imageOnly |
imageOnlyWidth | select | No | small (480px) / medium (720px) / large (960px, default) / full — imageOnly only |
imageMask | select | No | none (default) / circle / rounded / blob / wave / heart / star / flower / burst / splash / torn (torn paper) / cross / drop (teardrop) |
roundedImage | checkbox | No | Rounded corners on image (default: true) — hidden for imageOnly |
content | richText | No | Text content (hidden for imageOnly) |
buttons | array (max 3) | No | label (req), link (req), variant, newTab, icon (heroicon), iconPosition (left/right) — hidden for imageOnly |
verticalAlignment | select | No | top / center (default) / bottom — hidden for imageOnly and textOnly |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
paddingSize | select | No | none / small / medium (default) / large |
blockWidth | select | No | contained (default) / full |
animation | select | No | fadeUp / fadeIn / slideLeft / slideRight / scale / none |
Call to Action (CTA)
Block Slug: cta
Description: Prominent call-to-action sections with multiple layout styles.
| Field | Type | Required | Description |
|---|---|---|---|
style | select | No | standard / banner / card / inline |
heading | text | Yes | CTA heading |
description | textarea | No | Supporting text |
buttons | array (max 3) | No | label (text, req), link (text, req), variant (filled/filledTonal/outlined/text/elevated), newTab (checkbox), icon (heroicon), iconPosition (left/right) |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / scale / none |
Accordion / Tabs
Block Slug: accordionTabs
Description: Collapsible accordion or tabbed content with animated transitions.
| Field | Type | Required | Description |
|---|---|---|---|
displayMode | select | No | accordion (default) or tabs |
items | array (min 1) | Yes | title (text, req), icon (upload→media, optional), content (richText, req) |
defaultOpen | number | No | Index of item open by default (0 = first) |
allowMultiple | checkbox | No | Allow multiple items open (accordion mode only) |
iconStyle | select | No | chevron (default) or plus (accordion mode only) |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
paddingSize | select | No | none / small / medium (default) / large |
blockWidth | select | No | contained (default) / full |
animation | select | No | fadeUp / fadeIn / slideLeft / slideRight / scale / none |
Card Grid
Block Slug: cardGrid
Description: A grid layout displaying multiple cards with four visual variants.
| Field | Type | Required | Description |
|---|---|---|---|
variant | select | Yes | standard / horizontal / overlay / minimal |
columns | select | Yes | 1 / 2 / 3 / 4 |
heading | text | No | Optional heading above grid |
subheading | textarea | No | Optional subheading |
cardVariant | select | No | elevated / filled / outlined |
cardBorderRadius | text | No | Custom card border radius |
cardBackgroundColor | text | No | Custom card background color (ThemeColorPicker) |
gap | select | No | small / medium (default) / large |
equalHeight | checkbox | No | Force equal card heights (default: true) |
horizontalImagePosition | select | No | left / right / alternate (horizontal variant only) |
overlayGradient | select | No | bottom / full / none (overlay variant only) |
minimalAccentColor | text | No | Accent color (minimal variant only, ThemeColorPicker) |
cards | array (1–12) | Yes | Each card: image (upload), imageAspectRatio (select), overline (text), title (text, req), description (textarea), button group (label, link, variant, newTab, icon heroicon, iconPosition), icon (text) |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | Entrance animation |
Carousel
Block Slug: carousel
Description: An image carousel/slider with multiple layout and interaction options.
| Field | Type | Required | Description |
|---|---|---|---|
items | array (min 2) | Yes | image (upload, req), caption (text), alt (text), link (text), linkNewTab (checkbox, conditional) |
layout | select | No | standard / fill / mixed |
gap | select | No | none / small / medium (default) / large |
overflow | checkbox | No | Extend beyond container |
loop | checkbox | No | Infinite scrolling (default: true) |
snap | checkbox | No | Snap between items (default: true) |
autoplay | checkbox | No | Auto-advance slides (default: false) |
autoplayInterval | number | No | Seconds between slides (default: 5, shown when autoplay enabled) |
showArrows | checkbox | No | Show navigation arrows (default: true) |
showDots | checkbox | No | Show dot indicators (default: true) |
showCaptions | checkbox | No | Show image captions (default: true) |
aspectRatio | select | No | auto / 1:1 / 4:3 / 16:9 / 3:2 / 21:9 |
roundedCorners | checkbox | No | Rounded image corners (default: true) |
itemHeight | select | No | auto / 250 / 400 / 550 / 700 px |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | Entrance animation |
Quote / Testimonial
Block Slug: quote
Description: A styled quote or testimonial block.
| Field | Type | Required | Description |
|---|---|---|---|
style | select | No | card (default) / minimal / large |
quote | textarea | Yes | The quote text |
author | text | No | Author name |
role | text | No | Author role or title |
avatar | upload (media) | No | Author avatar image |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / scale / none |
Photo Gallery
Block Slug: gallery
Description: Image gallery with multiple layout options and lightbox support.
| Field | Type | Required | Description |
|---|---|---|---|
layout | select | No | grid (default) / masonry / carousel / single |
images | array (min 1) | Yes | image (upload, req), caption (text), alt (text) |
columns | select | No | 2 / 3 (default) / 4 (grid or masonry layout only) |
gap | select | No | small / medium (default) / large |
aspectRatio | select | No | auto / 1:1 / 4:3 / 16:9 / 3:2 (grid layout only) |
enableLightbox | checkbox | No | Enable lightbox on click (default: true) |
roundedCorners | checkbox | No | Rounded image corners (default: true) |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / scale / stagger / none |
Bento Gallery
Block Slug: bentoGallery
Description: A scroll-driven bento-grid gallery with a Ken Burns zoom effect that animates toward a focus image as the visitor scrolls, plus an optional floating title.
| Field | Type | Required | Description |
|---|---|---|---|
title | text | No | Floating title displayed over the centre of the gallery |
titleSize | select | No | small / medium / large (default) / xlarge (shown when title set) |
titleColor | text | No | Title color (default: #ffffff, ColorPicker, shown when title set) |
titleFontWeight | select | No | 400 / 500 / 600 / 700 (default) / 800 / 900 (shown when title set) |
titleVisibility | select | No | start (fades out as zoom begins, default) / reveal (fades in when zoom completes) / sticky (always visible) |
images | array (1–6) | Yes | Each: image (upload, req), alt (text), isFocusImage (checkbox — image that zooms to fill the screen) |
zoomMode | select | No | focusOnly (non-focus cells fade, focus expands, default) / zoomGrid (entire grid scales toward focus) |
gap | select | No | none / small (default) / medium / large |
roundedCorners | checkbox | No | Rounded corners on cells (default: true) |
scrubSpeed | select | No | slow / normal (default) / fast — scroll distance needed to complete the animation |
imageZoom | number | No | Ken Burns zoom scale per image, 1–2 (default: 1.12) |
+ blockTypographyFields | group | — | Per-block typography overrides |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
Video
Block Slug: video
Description: YouTube and Vimeo video embed block.
| Field | Type | Required | Description |
|---|---|---|---|
url | text | Yes | YouTube or Vimeo URL (validated with regex) |
caption | text | No | Optional caption below the video |
aspectRatio | select | No | 16:9 (default) / 4:3 / 1:1 |
posterImage | upload (media) | No | Custom poster/thumbnail image |
fullWidth | checkbox | No | Stretch to full width |
maxWidth | select | No | small (640px) / medium (960px, default) / large (1200px) / full (shown when not fullWidth) |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / scale / none |
Markdown Document
Block Slug: markdownDoc
Description: Render GFM Markdown content with syntax highlighting and auto-generated table of contents.
| Field | Type | Required | Description |
|---|---|---|---|
markdownSource | select | No | editor (default) or upload |
markdownContent | textarea | Yes | GFM Markdown content with 20-row editor (shown when source = editor) |
markdownFile | upload (media) | No | Upload a .md file (shown when source = upload) |
markdownFileContent | textarea | No | Read-only extracted content from uploaded file |
showTableOfContents | checkbox | No | Auto-generate TOC from headings (default: true) |
maxWidth | select | No | narrow (720px) / medium (960px, default) / wide (1200px) / full |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
paddingSize | select | No | none / small / medium (default) / large |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / slideLeft / slideRight / scale / none |
Embed
Block Slug: embed
Description: Raw HTML embed code for iframes, widgets, maps, etc.
| Field | Type | Required | Description |
|---|---|---|---|
code | code (HTML) | Yes | Paste embed code (iframes, widgets, maps, etc.) |
maxWidth | select | No | small (640px) / medium (960px, default) / large (1200px) / full |
alignment | select | No | left / center (default) / right |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / none |
Contact Form
Block Slug: contactForm
Description: A simple contact form that collects a visitor's name, email, and message, and stores submissions in the Contact Messages collection.
| Field | Type | Required | Description |
|---|---|---|---|
heading | text | No | Form heading (default: "Get in Touch") |
description | textarea | No | Optional text displayed above the form |
submitLabel | text | No | Submit button label (default: "Send Message") |
successMessage | text | No | Message shown after successful submission (default: "Thank you! Your message has been sent.") |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
blockWidth | select | No | contained / full |
animation | select | No | fadeUp / fadeIn / slideLeft / slideRight / scale / none |
Anti-spam: honeypot website input, 3-second minimum open time, and server-side rate limiting (5 submissions per IP / 10 min). Endpoint: POST /api/contact
Separator
Block Slug: separator
Description: Decorative section dividers with multiple visual styles.
| Field | Type | Required | Description |
|---|---|---|---|
style | select | Yes | wave (default) / blob / handDrawn / slant / line |
color | text | No | Separator color (default: #fe7a7a, ColorPicker) |
useGradient | checkbox | No | Enable gradient coloring |
gradientEndColor | text | No | Gradient end color (shown when useGradient enabled, ColorPicker) |
flipVertical | checkbox | No | Flip vertically |
flipHorizontal | checkbox | No | Flip horizontally |
height | number | No | Height in pixels, 20–300 (default: 80) |
animationType | select | No | none (default) / draw / fadeIn / slideIn / waveMotion / float / shimmer |
animationDuration | number | No | Duration in seconds, 0.2–10 (default: 1.5, shown when animationType ≠ none) |
animationDelay | number | No | Delay in seconds before animation starts, 0–5 (default: 0, shown when animationType ≠ none) |
animationIntensity | select | No | subtle / standard (default) / expressive (shown when animationType ≠ none) |
animationLoop | checkbox | No | Loop animation continuously (default: true, shown for waveMotion / float / shimmer) |
+ blockSpacingFields | group | — | Per-block spacing (no blockColorFields) |
Spacer
Block Slug: spacer
Description: A vertical spacing block to add whitespace between sections.
| Field | Type | Required | Description |
|---|---|---|---|
size | select | No | small (32px) / medium (64px, default) / large (96px) / xl (128px) / custom |
customHeight | number | No | Custom height in pixels, 8–500 (shown when size = custom) |
+ blockSpacingFields | group | — | Per-block spacing (no blockColorFields) |
Timeline
Block Slug: timeline
Description: A timeline of events or milestones in either an immersive horizontal (full-background-image with tabs) or a classic vertical (alternating left/right) layout.
| Field | Type | Required | Description |
|---|---|---|---|
orientation | select | No | horizontal (default) — immersive, full-background image tabs / vertical — classic alternating items |
heading | text | No | Optional section heading displayed above the timeline |
subheading | textarea | No | Optional intro text below the heading |
overlayOpacity | number | No | Dark overlay on background image, 0–100 (default: 50) — horizontal only |
minHeight | text | No | Minimum height of the section (default: 80vh) — horizontal only |
lineColor | text | No | CSS value for the vertical connecting line (default: var(--color-text-secondary)) — vertical only |
items | array (min 1) | Yes | Each item: date (text, req), title (text, req), subtitle (text), description (textarea), image (upload — used as background in horizontal mode) |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
paddingSize | select | No | none / small / medium (default) / large |
blockWidth | select | No | contained / full |
animation | select | No | Entrance animation |
Horizontal Text
Block Slug: horizontalText
Description: A marquee-style strip of text that scrolls horizontally across the screen, with optional letter fly-in animation as it enters the viewport.
| Field | Type | Required | Description |
|---|---|---|---|
text | text | Yes | Text that scrolls horizontally across the screen |
separator | text | No | Separator inserted between repetitions (default: •) |
font | select | No | Font family for the scrolling text (FontSelect, default: Inter) |
fontWeight | select | No | 300 / 400 / 500 / 600 / 700 (default) / 800 / 900 |
fontSize | select | No | small / medium / large (default) / xlarge |
direction | select | No | left (default) or right scroll direction |
speed | number | No | Scroll speed multiplier, 0.1–5 (default: 1) |
repeat | number | No | Times the text repeats, 0–20 (default: 6; 0 = single sentence, no scroll) |
flyIn | select | No | none / scattered (from all sides, default) / fromOpposite (from the opposite side of the scroll) |
textColor | text | No | Text color override (ThemeColorPicker, defaults to theme primary text) |
paddingSize | select | No | none / small / medium (default) / large |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
Vinyl Player
Block Slug: vinylPlayer
Description: An interactive turntable showcase that slides records onto a spinning vinyl. Each record has a cover sleeve, a center label, and optional audio playback.
| Field | Type | Required | Description |
|---|---|---|---|
heading | text | No | Optional section heading above the player |
subheading | textarea | No | Optional intro text below the heading |
items | array (1–5) | Yes | Each record: songTitle (text, req), artist (text), duration (text, e.g. 3:45), audioUrl (text — direct audio file URL), spotifyUrl (text — Spotify link, uses embedded player), soundcloudUrl (text — SoundCloud link, uses embedded player), coverImage (upload, req), vinylImage (upload — center label, optional). Source priority: Spotify → SoundCloud → audio file. |
vinylSize | select | No | 25 (small, side-by-side, default) / 50 (medium) / 75 (large, stacked) — width of the vinyl stage |
animation | select | No | Entrance animation |
paddingSize | select | No | none / small / medium (default) / large |
+ blockTypographyFields | group | — | Per-block typography overrides |
+ blockColorFields | group | — | Per-block color overrides |
+ blockSpacingFields | group | — | Per-block spacing |
Collections
Pages
Collection Slug: pages
Description: Content pages composed from blocks. Supports drafts with autosave and scheduled publishing.
- Versions: Drafts with autosave (375 ms interval), scheduled publish
- Hooks:
afterChange/afterDeleterevalidate the page path and home (/) - Live Preview: Enabled
| Field | Type | Required | Description |
|---|---|---|---|
title | text | Yes | Page title |
slug | text | Yes (unique) | URL slug (auto-generated from title, sidebar) |
pageBackgroundColor | text | No | Optional page background color (ColorPicker, sidebar) |
hideHeader | checkbox | No | Hide the site header on this page (default: false, sidebar) |
hideFooter | checkbox | No | Hide the site footer on this page (default: false, sidebar) |
| Content tab | |||
savedBlocksImport | ui | — | SavedBlocksImportField component — allows importing saved block templates |
layout | blocks | Yes | All 19 blocks: Hero, RichText, AccordionTabs, Gallery, ImageText, Video, Separator, Spacer, Embed, Quote, CTA, MarkdownDoc, Carousel, CardGrid, ContactForm, Timeline, BentoGallery, HorizontalText, VinylPlayer |
| SEO tab | |||
meta.title | text | No | Custom meta title |
meta.description | textarea | No | Meta description |
meta.image | upload (media) | No | Open Graph image |
meta.keywords | text | No | Comma-separated keywords |
Media
Collection Slug: media
Description: Uploaded images, videos, and PDFs with automatic image resizing.
- Upload: Static dir
media; focal point enabled; mime types:image/*,video/*,application/pdf - Image sizes: thumbnail (400×300), card (768×512), hero (1920×auto), og (1200×630)
- Hooks:
beforeChange— auto-fillsaltfrom filename if not set (strips extension, replaces hyphens/underscores with spaces) - Access: Read open to all; create/update/delete requires non-viewer
| Field | Type | Required | Description |
|---|---|---|---|
alt | text | Yes | Alt text for accessibility |
caption | text | No | Optional caption |
Users
Collection Slug: users
Description: Admin and editor accounts with Payload built-in auth.
| Field | Type | Required | Description |
|---|---|---|---|
name | text | No | Display name |
role | select | No | admin / editor (default) / viewer (read-only, cannot create/update/delete) |
- Access: Read: any authenticated user. Create/update/delete: admin role only.
Contact Messages
Collection Slug: contact-messages
Description: Stores contact form submissions from the public-facing Contact Form block.
- Admin group: Site Configuration
- Access: Create open to all (public form); read/update/delete requires authenticated non-viewer
- Timestamps: Enabled
| Field | Type | Required | Description |
|---|---|---|---|
firstname | text | Yes | Sender's first name |
email | Yes | Sender's email address | |
message | textarea | Yes | The message content |
read | checkbox | No | Mark the message as read (sidebar field, default: false) |
Votes
Collection Slug: votes
Description: Stores star ratings and optional text feedback from the vote popup.
- Admin group: Site Configuration
- Access: Read/create open to all; update/delete requires authentication
- Timestamps: Enabled
| Field | Type | Required | Description |
|---|---|---|---|
blockId | text | Yes | Indexed. Identifies which vote block + page |
rating | number | Yes | Star rating, 1–5 |
firstName | text | No | Optional voter first name |
reply | textarea | No | Optional feedback message |
voterFingerprint | text | No | Indexed, read-only. Hash to prevent duplicate votes |
page | text | No | URL path where the vote was cast |
Saved Blocks
Collection Slug: saved-blocks
Description: Reusable block templates that can be imported into any page.
- Admin group: Content
- Access: Read open to all; create/update/delete requires authenticated non-viewer
| Field | Type | Required | Description |
|---|---|---|---|
name | text | Yes | Descriptive name (e.g. "Homepage Hero", "FAQ Accordion") |
category | select | No | heroes / content / media / navigation / cta / testimonials / layout / other |
description | textarea | No | Optional notes about when or where to use this block |
block | blocks (max 1) | Yes | A single configured block from 15 types: Hero, RichText, AccordionTabs, Gallery, ImageText, Video, Separator, Spacer, Embed, Quote, CTA, MarkdownDoc, Carousel, CardGrid, Timeline (ContactForm, BentoGallery, HorizontalText, and VinylPlayer excluded) |
Globals
Header
Global Slug: header
Admin Group: Navigation
| Field | Type | Description |
|---|---|---|
logo | upload (media) | Site logo image |
navItems | array (max 8) | Navigation items. Each: label (text, req), link group (type: page/custom/anchor, page relation, url text, anchor text, newTab), children array (max 8, nested dropdown items with label, description, icon, link group) |
ctaButton | group | show (checkbox), label, link, variant (filled/outlined/text), icon (select, heroicon), iconPosition (left/right) — all conditional on show |
sticky | checkbox | Stick to top on scroll (default: true) |
transparent | checkbox | Transparent header style (default: false) |
desktopMenuStyle | select | horizontal-nav (default) / fullscreen-overlay |
mobileMenuStyle | select | side-drawer (default) / fullscreen-overlay |
menuBreakpoint | select | sm (640px) / md (768px) / lg (1024px, default) / xl (1280px) |
overlaySettings | group | Shown when either menu style is fullscreen-overlay. Contains: overlayBgColor, overlayBgOpacity (100/95/90/85/80), overlayTextColor, overlayAccentColor, overlayCloseColor — all with ColorPickerField |
Footer
Global Slug: footer
Admin Group: Navigation
Content tab: columns array (max 4) — each column title (text, req) + links array (label, url, newTab); description (textarea, top of footer).
Settings tab: showSocialLinks (checkbox, default true), showNewsletter (checkbox), newsletterHeading / newsletterDescription (text, conditional), bottomBar.copyrightOverride (text), bottomBar.bottomLinks array (label, url).
Site Settings
Global Slug: site-settings
Admin Group: Site Configuration
General tab: siteTitle (text, req, default "Robin CMS"), siteDescription (textarea), logo, logoDark, favicon, ogImage (all upload → media).
SEO Defaults tab: defaultMeta.title (text), defaultMeta.description (textarea), defaultMeta.keywords (text).
Social Links tab: socialLinks array — platform (twitter/github/linkedin/instagram/youtube/facebook/tiktok/dribbble/behance/discord/mastodon/bluesky), url.
Analytics & Scripts tab: analytics.googleAnalyticsId, analytics.googleTagManagerId; customScripts.headScripts / bodyStartScripts / bodyEndScripts (code HTML injected into <head>, after <body>, before </body>).
Miscellaneous tab: copyrightText (default "© {year} Robin CMS…"), maintenanceMode (checkbox), robotsTxt (textarea).
Vote Popup tab: votePopup.enabled (checkbox), scrollPercentage (number 5–100, default 75), blockId (default site-popup-vote), heading, subheading, replyPrompt, thankYouMessage (text); colors accentColor (default #ff9529), backgroundColor, textColor, textSecondaryColor (ThemeColorPicker); borderRadius (global / 0 / 4 / 8 / 16 / 24 / 9999), shadow (none / small / medium / large, default large).
Theme
Global Slug: theme
Admin Group: Site Configuration
Colors tab:
- Brand Colors:
primary(#4e73ae),secondary(#4c9d8d),accent(#fe7a7a),highlight(#f4c371),dark(#743939) - Surface Colors:
background(#fefefe),surface(#f8f8f8),surfaceVariant(#f0f0f0),surfaceContainer(#eaeaea),surfaceContainerHigh(#e0e0e0) - Text Colors:
primary(#1a1a2e),secondary(#555770)
Typography tab:
- Fonts (FontSelectField):
heading(Playfair Display),body(Inter),button(Inter),nav(inherit / body) - Heading Overrides:
h1–h6per-heading font override (inherit) - Typography Settings:
headingWeight(700),bodyWeight(400),headingLetterSpacing,bodyLetterSpacing,headingTextTransform,headingLineHeight(1.2),bodyLineHeight(1.6),paragraphSpacing - Font Scale:
fontScale— compact / default / large / xl
Layout tab:
containerMaxWidth(1200px) — 1000 / 1200 / 1400 / 1600sectionPadding— small / medium / largeborderRadius— none / small / medium / large / xl / pill
Buttons tab:
- Button Style:
filledBg,filledText,outlinedBorderWidth,fontWeight,textTransform - Button Padding:
paddingPreset,borderRadius(button-specific override) - Button Hover:
hoverEffect(lift / glow / darken / none),hoverScale,hoverShadow,transitionDuration
Animation tab:
enableAnimations(true) — toggle all entrance animationsanimationIntensity— subtle / standard / expressiveenableDarkMode(false) — enable dark mode support
Components
Vote Popup
File: src/components/VotePopup.tsx
A scroll-triggered feedback widget that collects star ratings and optional text feedback from visitors.
- Scroll trigger — appears once the user scrolls past
scrollPercentage(default: 75%). - Star rating — 5-star system with emoji feedback (😡 😕 😐 😊 🤩) and labels; clicking a star submits via
POST /api/vote. - Optional feedback — a reply form (first name + textarea) slides in; both fields optional. Empty submit shows the thank-you state without an API call; otherwise updates the vote record.
- Skip — bypass feedback straight to the thank-you state.
- localStorage persistence — votes and dismiss/minimize state persist so the popup won't re-appear.
- Average score — after submission, fetches and displays the average from
/api/vote-results. - Delete vote — a "Delete my vote" link removes the rating.
Props: all configured via Site Settings → Vote Popup (see that section for fields and defaults).
API Routes
POST /api/contact
Submit a contact form message. Body: { firstname, email, message, website, _t }
websitehoneypot and_ttimestamp (< 3s) both silently succeed (bot detected).- Rate-limited to 5 submissions per IP per 10 min (
429). - Validates required fields with length limits; on success creates a
contact-messagesdocument.
POST /api/vote
Submit a star rating. Body: { blockId, rating, reply?, firstName?, page? }
- Validates
blockIdandrating(1–5); builds a fingerprint from IP + User-Agent + blockId to prevent duplicates. - Existing vote + new
reply→ updates it; existing vote, no reply →409 { alreadyVoted: true }; otherwise creates a vote and returns{ success, id }.
DELETE /api/vote
Body: { voteId } (single) or { blockId } (all for that block). Returns { success, deleted }.
GET /api/vote-results
Groups all votes by blockId. Returns { totalVotes, blocks: [{ blockId, totalVotes, averageRating, distribution: { 1–5 }, replies: [...] }] }.
Auto-generated Payload APIs
/api/[...slug]— REST API for all collections and globals/api/graphql— GraphQL endpoint/api/graphql-playground— GraphQL Playground (dev)
Note: This document reflects the current state of all modules. If new blocks are added or existing ones are modified, please update this overview accordingly.