The closed authoring vocabulary
The closed authoring vocabulary — slot types, direct() sources, derived() transforms, with selection semantics.
Three closed sets. A slot’s type picks its runtime value shape; a slot’s
source (direct() or derived()) picks which fact or computation fills it.
This page is a selection reference — which one to pick — not a restatement
of their field shapes.
Slot types
Section titled “Slot types”| type | runtime value shape | pick it when |
|---|---|---|
text |
string (string | null if optional) |
one editable line/paragraph (size short|medium|long) |
number |
number (number | null if optional) |
a numeric fact with formatting |
select |
string (string | null if optional) |
a closed set of choices the user picks from |
image |
ImageValue (ImageValue | null if optional) |
one framed photo (add crop/frame) |
image_collection |
ImageCollectionValue |
a gallery of framed photos |
video |
VideoValue (VideoValue | null if optional) |
one hosted video (add frame/playback) |
video_collection |
VideoCollectionValue |
several hosted videos |
list |
string[] for a text element, unknown[] otherwise |
a flat list of scalar items |
poi_list |
PoiRow[] |
neighborhood points of interest |
url |
string (string | null if optional) |
a link the user edits in a URL field |
object_list |
Record<string, unknown>[] |
repeating, independently-editable multi-field items |
The full per-type field shapes live in your editor’s autocomplete and schema-system.md — this page is only which to pick.
direct() sources
Section titled “direct() sources”The property facts a slot binds verbatim. A bad name is a compile error at
the direct(...) call site.
Property facts (resolve once per property):
address— the full formatted addresslisting_intent— for-sale vs. for-rent statestatus— the listing status, free text as shown on the listing (e.g. “For Sale”)property_type— the property type (single_family|condo_townhome|multi_family|investment)year_built— the year the property was builtlot_size— the lot size, pre-formatted text
Per-unit facts (resolve against the current/single unit row):
unit_label— the unit’s display label (e.g. “Unit 3B”)beds— bedroom count for this unitbaths— bathroom count for this unitsqft— square footage for this unitprice— this unit’s price, pre-formatted textnotes— free-text notes on this unit
List sources (bind the whole array verbatim — pick these for object_list
slots that repeat over every row):
units— every unit row on the propertycontacts— every contact attached to the section
Per-contact fields (resolve against the attached contact):
name— the contact’s display nametitle— the contact’s job title/rolebio— the contact’s bio copyemail— the contact’s email addressphone— the contact’s phone numberwebsite— the contact’s website URLinstagram— the contact’s Instagram handle/URLlinkedin— the contact’s LinkedIn handle/URLx— the contact’s X (Twitter) handle/URLfacebook— the contact’s Facebook handle/URL
Contact images (bind only to image slots):
headshot— the contact’s headshot photologo_dark— the contact’s logo, dark-background variantlogo_light— the contact’s logo, light-background variant
derived() transforms
Section titled “derived() transforms”Computed values, grouped by family. A bad name is a compile error at the
derived(...) call site.
| transform | what it computes |
|---|---|
units.bedsPrimary |
beds of the primary (lowest-position) unit |
units.bathsPrimary |
baths of the primary unit |
units.sqftPrimary |
sqft of the primary unit |
units.pricePrimary |
price of the primary unit, pre-formatted text |
units.bedsRange |
formatted beds range across all units (e.g. “2–4”), collapsing to one value when uniform |
units.priceStart |
the lowest numeric unit price; falls back to the first non-numeric price (e.g. “Sold”) when none is numeric |
units.bedsMin |
the minimum beds across all units, formatted |
units.bedsMax |
the maximum beds across all units, formatted |
units.bathsMin |
the minimum baths across all units, formatted |
units.bathsMax |
the maximum baths across all units, formatted |
units.sqftMax |
the maximum sqft across all units, formatted |
address.line1 |
the property address’s street line |
address.line2 |
the property address’s city/state/zip line |
contact_address.line1 |
a contact’s address street line |
contact_address.line2 |
a contact’s address city/state/zip line |
clock.currentYear |
the current year (e.g. for a copyright line) |
coordinate.lat |
latitude, split from the property’s geocode |
coordinate.lng |
longitude, split from the property’s geocode |