Skip to content

RichTextFieldInput

Defined in: packages/core/src/fields/richtext/types.ts:82

Configuration input for a richtext() field.

Richtext fields store a single locale-agnostic RichTextDocument — an array of block-level nodes. Shape is validated structurally on save (array of { type, children } elements and { text } leaves, any depth); the specific node catalogue (headings, links, images, tables, …) is owned by whichever editor adapter is configured on VexClientConfig, never by core.

Defaults applied by richtext():

{
type: "richtext",
label: "", // inferred from the field key by defineCollection
required: false, // field is optional by default
defaultValue: [], // empty document
admin: {
hidden: false, // visible in the admin form
readOnly: false, // editable by default
position: "main", // placed in the main content column, not the sidebar
width: "100%", // spans the full form width, not half
cellAlignment: "left", // excerpt aligned left in the data table column
}
}
// Minimal — label inferred from the key ("Body")
body: richtext()
// Required — at least one node's plain-text excerpt must be non-empty
summary: richtext({ required: true })

BaseFieldInput for shared properties (label, description, required, admin, index, searchIndex)

TCollectionSlug extends VexResourceSlug = VexResourceSlug

TFieldKey extends string = never

TFieldMeta extends object = { }

optional admin?: FieldAdminConfigInput<TCollectionSlug, ComponentHKT>

Defined in: packages/core/src/fields/baseTypes.ts:531

Admin UI configuration for this field.

BaseFieldInput.admin


optional defaultValue?: RichTextDocument

Defined in: packages/core/src/fields/richtext/types.ts:108

Pre-filled value shown in the admin form when creating a new field. Does not apply to database values

BaseFieldInput.defaultValue


optional description?: string

Defined in: packages/core/src/fields/baseTypes.ts:516

Semantic description of the field. Used in three places:

  1. Helper text rendered below the field input in the admin form UI.
  2. As the Zod .meta({ description }) value for form validation.
  3. As the JSDoc comment on the generated document interface property.

To write a separate JSDoc comment, use interfaceDescription in addition.

BaseFieldInput.description


optional index?: FieldIndexConfigInput<TCollectionSlug, TFieldKey>

Defined in: packages/core/src/fields/baseTypes.ts:545

Create a database index on this field. The string value becomes the index name in Convex.

slug: { type: "text", index: "by_slug", required: true }
// Generates: .index("by_slug", ["slug"])
author: { type: "relationship", index: { name: "by_author_status", additionalFields: ["status"] } }
// Generates: .index("by_author_status", ["author", "status"])

BaseFieldInput.index


optional interfaceDescription?: string

Defined in: packages/core/src/fields/baseTypes.ts:518

The JSDoc comment on the generated document interface property

BaseFieldInput.interfaceDescription


optional label?: string

Defined in: packages/core/src/fields/baseTypes.ts:507

Display label for the field in the admin form.

BaseFieldInput.label


optional mediaCollectionSlug?: string

Defined in: packages/core/src/fields/richtext/types.ts:107

The slug of the media collection inline images upload into. Absent means the richtext editor’s image feature is hidden entirely — no dropzone, no paste/drag-and-drop upload, no “insert image” toolbar button — rather than rendering a feature that would immediately fail every upload.

Must match a media collection declared on defineConfig({ mediaCollections }), exactly like upload()’s to; an unknown slug throws VexStorageConfigError at defineConfig() time. Unlike to, it is optional — a richtext field without inline images is a normal, supported field.

richtext({ label: "Body", mediaCollectionSlug: "images" })

optional meta?: TFieldMeta

Defined in: packages/core/src/fields/baseTypes.ts:546

BaseFieldInput.meta


optional required?: boolean

Defined in: packages/core/src/fields/baseTypes.ts:524

Whether this field is required.

Default: false

BaseFieldInput.required

optional validate(props): void | Promise<void>

Defined in: packages/core/src/fields/richtext/types.ts:110

Server-only async validation with value typed as RichTextDocument.

FieldValidateProps<TCollectionSlug, RichTextDocument>

void | Promise<void>

FieldValidate

BaseFieldInput.validate