Field kinds and their controls
Every field type a Noun file takes, with its control in the Admin's list, record page and forms, and its JSON and Markdown renderings.
A field's declared type decides its control on each Admin screen. Each row is one type a Noun file takes, with the Lease field that uses it.
Controls
| Kind | In Lease | List | Record page | Forms | Rule |
|---|---|---|---|---|---|
string | residentName | text | text | one-line text box | control-text |
text | notes | left out | long text, full width | multi-line text box | control-long-text, wide-fields |
number | monthlyRent | number | number | number box | control-number |
integer | units, on Property | number | number | number box | control-number |
boolean | none | a check or a cross | a check or a cross | switch, never refused as empty | control-boolean |
date | startsOn, endsOn | date | date | date picker | control-date |
datetime | none | the date only | the date only | date picker, which edits the date only | control-date |
email | residentEmail | — | — | one-line text box | control-text |
url | listingUrl | — | — | one-line text box | control-text |
money | none | — | — | one-line text box | control-text |
A | B | status | text | text | one-line text box | control-text |
json | terms | left out | formatted JSON, full width | no input | control-json, wide-fields |
| a Noun name | property | the record's name, linked | the record's name, linked | picker that searches, never required | reference-forward |
T[] | documents | left out | values joined by commas | left out | list-columns, form-omits-arrays |
| any other type | none | text | text | one-line text box | control-text |
email, url, money and an enum each have a control rule of their own. Those 4 rules wait for code that serves them, so each kind takes control-text. A dash marks a display whose rule is not printable.
A field with no ? is required in both forms (required-input), except a boolean and a reference.
JSON rendering
Each field's kind in the Admin projection, as in /app-projection/leaseclock.json. A field carries kind only where a printable rule sets it.
| Kind | In the projection |
|---|---|
string | "kind": "text" |
text | "kind": "longText", "wide": true |
number, integer | "kind": "number" |
boolean | "kind": "boolean" |
date, datetime | "kind": "date" |
email, url, money | no kind |
A | B | "kind": "text" |
json | "kind": "json", "wide": true, "form": false |
| a Noun name | "kind": "reference", "to": "Property", "shows": "name" |
T[] | "array": true, "form": false |
PlanMarkdown rendering
In the design, every screen also renders as Markdown. Its rule, rendering-markdown, waits.
| Kind | Renders as |
|---|---|
string | Maya Ortiz |
text | the paragraphs as written |
number, integer | 1450 |
boolean | yes or no |
date | 2026-11-30 |
datetime | 2026-11-30T17:00:00Z |
email | <maya@example.com> |
url | <https://leaseclock.com/listings/14-elm-3b> |
money | 1,450.00 USD |
A | B | `active` |
json | a fenced json block |
| a Noun name | [14 Elm Street](/admin/properties/property_1) |
T[] | one bullet per value |
What an App reads from a Noun: depth
Representation, field types, relationships, lifecycle states and Events: what an App draws from each fact a Noun declares, traced through one Lease.
Verb inputs: what a form needs
Why a Verb that takes only its record gets a working button, and why a Verb with typed inputs gets a button but no form in the Admin.