Field kit
The types and helpers @gronare/stomme/kit exports for writing a block's catalog entry.
BlockDef
| Key | Required | What it holds |
|---|---|---|
type |
yes | the block's type in content, and its key in the renderer's registry |
label |
yes | the block's name in the CMS |
fields |
yes | a list of Field |
group |
no | the CMS group, in this order: Hero & headers, Text, Cards & lists, Media, Quote & highlight, Numbers, From collections, Calls to action, Automatic. A block with another group, or none, comes after them, and the block gallery files a block with none under Other |
shape |
no | the sketch the block gallery draws for it: hero, band, prose, split, grid, gallery, steps, checklist, pairs, quote, panel, chips, list, box, stats or auto; anything else draws prose |
summary |
no | a line describing the block |
collection |
no | a collection the block reads; the CMS offers the block only while that collection is on |
feature |
no | a feature flag the block needs |
sample, samples |
no | content /lookbook renders; a sample's _label names it |
Field
| Key | What it holds |
|---|---|
name, label |
the key in content and the label in the CMS |
widget |
string, text, markdown, number, boolean, select, image, file, list, object or hidden |
required |
false makes the field optional; Sveltia's default is required |
default, hint |
the value a new block starts with, and the help line |
options |
for select: { label, value } items, or a source: $pages, $services, $faq, $faqTags, $documentGroups, $catalogListings, $articleListings (the site's listings of that preset, by label, valued by id) |
soleDefault |
for select: true preselects the only option when the source has exactly one |
hiddenBelow |
for select: with fewer options than this, the field is written as hidden, so the CMS keeps the value a page holds without offering a choice |
media_folder, public_folder |
leave these unset: stomme cms gives every collection its upload folders, and a field of its own would put uploads where the image pipeline does not look |
multiple |
for select, several values |
fields, field |
the children of an object or list |
summary, label_singular, collapsed |
how the CMS shows a list or object |
A new field should mean "off" when it is absent, so content written before the field existed renders as it did. Its default must be what the block renders with the field absent, because the CMS writes the default into every block that lacks the field when the page is opened: a boolean defaults to false, a list to nothing. Put suggested wording in hint, never in default.
Helpers
| Export | What it gives |
|---|---|
headingFields |
eyebrow, heading, intro |
headingFieldsSuggesting(eyebrow, heading) |
the same, with Suggestion: "…" in the eyebrow and heading hints |
buttonField(name, label = 'Button', opts?) |
an optional, collapsed button group of label and link. opts.hint sets the group's hint, opts.labelHint the label's, and opts.optionalLabel: true lets the label be left empty |
linkField(name = 'href', label = 'Link') |
a link: page or url; the url wins when both are set |
imageField(name = 'image', label = 'Image', hint?) |
an optional image |
iconField(name = 'icon', label = 'Icon') |
an optional select over the icon set, ICON_NAMES |
commandField, anchorField |
command and anchor |
videoFields |
video, videoWebm, videoUrl |
cardListField, linkedCardListField |
items[] of title and body, or with icon, tag and cta too; a cta with no label reads strings.readMore, "Read more" by default |
group(name, label, hint, fields) |
a collapsed object |
mediaGroup(hint, fields, summary?) |
the media group |
layoutGroup(fields) |
the layout group, with beside added |
styleGroup(fields?) |
the style group, by default surface and accent; always the last field |
surfaceField, accentField, widthField, besideField |
the single fields those groups use. Their defaults: surface standard (also tint, panel, band, dark, gradient), accent brand (also secondary, highlight), width narrow (or full), beside below (also equal, narrow, wide) |