EmDash soporta 16 tipos de campo para definir esquemas de contenido. Cada tipo se mapea a un tipo de columna SQLite y proporciona una interfaz de administración apropiada.
Descripción General
La siguiente tabla lista cada tipo de campo y su columna SQLite:
| Tipo | Columna SQLite | Descripción |
|---|---|---|
string | TEXT | Entrada de texto corto |
text | TEXT | Texto multilínea |
url | TEXT | Valor URL |
number | REAL | Número decimal |
integer | INTEGER | Número entero |
boolean | INTEGER | Verdadero/falso |
datetime | TEXT | Fecha y hora |
select | TEXT | Selección única desde opciones |
multiSelect | JSON | Selecciones múltiples |
portableText | JSON | Contenido de texto enriquecido |
image | TEXT | Referencia de imagen |
file | TEXT | Referencia de archivo |
reference | TEXT | Referencia a otra entrada |
json | JSON | Datos JSON arbitrarios |
slug | TEXT | Identificador seguro para URL |
repeater | JSON | Grupo de campos repetitivos |
Tipos de Texto
string
Texto corto de una sola línea. Úselo para títulos, nombres y valores cortos.
{
slug: "title",
label: "Title",
type: "string",
required: true,
validation: {
minLength: 1,
maxLength: 200,
},
}
Opciones de validación:
minLength— Conteo mínimo de caracteresmaxLength— Conteo máximo de caracterespattern— Patrón regex a coincidir
Opciones de widget:
- Ninguna específica
text
Texto plano multilínea. Úselo para descripciones, extractos y texto plano más largo.
{
slug: "excerpt",
label: "Excerpt",
type: "text",
options: {
rows: 3,
},
}
Opciones de validación:
minLength— Conteo mínimo de caracteresmaxLength— Conteo máximo de caracteres
Opciones de widget:
rows— Número de filas en textarea (predeterminado: 3)
slug
Identificador seguro para URL. Generado automáticamente desde otro campo o ingresado manualmente.
{
slug: "slug",
label: "URL Slug",
type: "slug",
required: true,
unique: true,
}
Los slugs se sanitizan automáticamente: minúsculas, espacios reemplazados por guiones, caracteres especiales eliminados.
Tipos Numéricos
number
Número decimal. Úselo para precios, calificaciones y mediciones.
{
slug: "price",
label: "Price",
type: "number",
required: true,
validation: {
min: 0,
max: 999999.99,
},
}
Opciones de validación:
min— Valor mínimomax— Valor máximo
Almacenado como SQLite REAL (punto flotante de 64 bits).
integer
Número entero. Úselo para cantidades, conteos y valores de orden.
{
slug: "quantity",
label: "Quantity",
type: "integer",
defaultValue: 1,
validation: {
min: 0,
max: 1000,
},
}
Opciones de validación:
min— Valor mínimomax— Valor máximo
Almacenado como SQLite INTEGER.
boolean
Verdadero o falso. Úselo para interruptores y banderas.
{
slug: "featured",
label: "Featured",
type: "boolean",
defaultValue: false,
}
Almacenado como SQLite INTEGER (0 o 1).
Fecha y Hora
datetime
Valor de fecha y hora. Almacenado en formato ISO 8601.
{
slug: "publishedAt",
label: "Published At",
type: "datetime",
}
Opciones de validación:
min— Fecha mínima (cadena ISO)max— Fecha máxima (cadena ISO)
Formato de almacenamiento: 2025-01-24T12:00:00.000Z
Tipos de Selección
select
Selección única desde opciones predefinidas.
{
slug: "status",
label: "Status",
type: "select",
required: true,
defaultValue: "draft",
validation: {
options: ["draft", "published", "archived"],
},
}
Opciones de validación:
options— Array de valores permitidos (requerido)
Almacenado como TEXT conteniendo el valor seleccionado.
multiSelect
Selecciones múltiples desde opciones predefinidas.
{
slug: "tags",
label: "Tags",
type: "multiSelect",
validation: {
options: ["news", "tutorial", "review", "opinion"],
},
}
Opciones de validación:
options— Array de valores permitidos (requerido)
Almacenado como array JSON: ["news", "tutorial"]
Contenido Enriquecido
portableText
Contenido de texto enriquecido usando formato Portable Text. Soporta encabezados, listas, enlaces, imágenes y bloques personalizados.
{
slug: "content",
label: "Content",
type: "portableText",
required: true,
}
El valor se almacena como un array JSON de bloques Portable Text, por ejemplo:
[
{
"_type": "block",
"style": "normal",
"children": [{ "_type": "span", "text": "Hello world" }]
}
]
Los plugins pueden agregar tipos de bloques personalizados (incrustaciones, widgets, etc.) al editor. Estos aparecen en el menú de comandos slash y se renderizan automáticamente en el sitio. Ver componentes de renderizado de Portable Text.
Tipos de Medios
image
Referencia a una imagen cargada. Incluye metadatos como dimensiones y texto alternativo.
{
slug: "featuredImage",
label: "Featured Image",
type: "image",
options: {
showPreview: true,
},
}
Opciones de widget:
showPreview— Mostrar vista previa de imagen en admin (predeterminado: true)
El valor se almacena como un objeto con la referencia del medio y sus metadatos:
{
"id": "01HXK5MZSN...",
"url": "https://cdn.example.com/image.jpg",
"alt": "Description",
"width": 1920,
"height": 1080
}
file
Referencia a un archivo cargado como un documento o PDF.
{
slug: "document",
label: "Document",
type: "file",
}
El valor se almacena como un objeto con la referencia del archivo y sus metadatos:
{
"id": "01HXK5MZSN...",
"url": "https://cdn.example.com/doc.pdf",
"filename": "report.pdf",
"mimeType": "application/pdf",
"size": 102400
}
Tipos Relacionales
reference
Referencia a otra entrada de contenido.
{
slug: "author",
label: "Author",
type: "reference",
required: true,
options: {
collection: "authors",
},
}
Opciones de widget:
collection— Slug de colección objetivo (requerido)allowMultiple— Permitir múltiples referencias (predeterminado: false)
Una referencia única se almacena como el ID de la entrada objetivo:
"01HXK5MZSN..."
Múltiples referencias se almacenan como un array de IDs de entrada:
["01HXK5MZSN...", "01HXK6NATS..."]
Tipos Flexibles
json
Datos JSON arbitrarios. Úselo para estructuras anidadas complejas, integraciones de terceros o datos sin un esquema fijo.
{
slug: "metadata",
label: "Metadata",
type: "json",
}
Almacenado tal cual en la columna JSON de SQLite.
Propiedades de Campo
Todos los campos soportan estas propiedades comunes:
| Propiedad | Tipo | Descripción |
|---|---|---|
slug | string | Identificador único (requerido) |
label | string | Nombre de visualización (requerido) |
type | FieldType | Tipo de campo (requerido) |
required | boolean | Requerir un valor (predeterminado: false) |
unique | boolean | Forzar unicidad (predeterminado: false) |
defaultValue | unknown | Valor predeterminado para nuevas entradas |
validation | object | Reglas de validación específicas del tipo |
widget | string | Anulación de widget personalizado |
options | object | Configuración de widget |
sortOrder | number | Orden de visualización en admin |
Slugs de campo reservados
Estos slugs están reservados y no se pueden usar:
idslugstatusauthor_idprimary_byline_idcreated_atupdated_atpublished_atscheduled_atdeleted_atversionlive_revision_iddraft_revision_idtermsbylinesbyline
Tipos TypeScript
Importe las definiciones de tipo de campo para uso programático:
import type { FieldType, Field, CreateFieldInput } from "emdash";
const fieldTypes: FieldType[] = [
"string",
"text",
"url",
"number",
"integer",
"boolean",
"datetime",
"select",
"multiSelect",
"portableText",
"image",
"file",
"reference",
"json",
"slug",
"repeater",
];