Guía de archivos

Archivos, JSON y assets

Mueve presentaciones entre hosts sin mezclar el documento serializable con URLs o recursos de runtime.

Última actualización: 22 de agosto de 2026

.deks.json

Esta representación legible de DeksDocument sirve para ejemplos, revisión y desarrollo. El JSON canónico sigue siendo la fuente de verdad; los modelos relacionales y snapshots de render son proyecciones, no formatos alternativos.

mi-presentacion.deks.json
{
  "format": "deks",
  "id": "00000000-0000-4000-8000-000000000001",
  "name": "Launch",
  "revision": 1,
  "canvas": {
    "width": 1600,
    "height": 900
  },
  "motionBeatMs": 600,
  "motion": {
    "in": {
      "animation": {
        "kind": "fade"
      },
      "durationBeats": 1,
      "delayBeats": 0,
      "delayMs": 0,
      "easing": "ease-out"
    },
    "out": {
      "animation": {
        "kind": "fade"
      },
      "durationBeats": 1,
      "delayBeats": 0,
      "delayMs": 0,
      "easing": "ease-in"
    },
    "morph": {
      "animation": {
        "kind": "morph"
      },
      "durationBeats": 1,
      "delayBeats": 0,
      "delayMs": 0,
      "easing": "ease-in-out"
    }
  },
  "palette": {
    "primary": "#ff7043",
    "secondary": "#65c18c",
    "accent": "#73a7ff",
    "background": "#0b0c0e",
    "text": "#f2f1ec",
    "subtext": "#969da6"
  },
  "history": {
    "canUndo": false,
    "canRedo": false
  },
  "assets": [],
  "elements": [
    {
      "id": "20000000-0000-4000-8000-000000000001",
      "kind": "text",
      "name": "Title",
      "semanticRole": "title",
      "isLocked": false
    }
  ],
  "slides": [
    {
      "id": "30000000-0000-4000-8000-000000000001",
      "name": "Cover",
      "isTemplate": false,
      "background": {
        "kind": "solid",
        "color": "#0b0c0e"
      },
      "states": [
        {
          "elementId": "20000000-0000-4000-8000-000000000001",
          "x": 96,
          "y": 120,
          "width": 720,
          "height": 120,
          "rotationDeg": 0,
          "opacity": 1,
          "zIndex": 1,
          "content": "Slides que la IA puede automatizar",
          "fontFamily": "Poppins",
          "fontSize": 64,
          "fontWeight": 700,
          "lineHeight": 1.1,
          "letterSpacing": 0,
          "horizontalAlignment": "left",
          "verticalAlignment": "top",
          "overflowMode": "hidden",
          "fill": "#f2f1ec"
        }
      ]
    }
  ]
}

Valida al entrar al sistema

Trata cualquier archivo como input no confiable. EjecutaparseDeksJson para parsear JSON no confiable y assertDeksDocument cuando ya tienes un valor JavaScript. Ambos aplican los límites universales del formato antes de pasarlo al editor o renderer.

Documento y assets en un solo archivo

createDeksFile y readDeksFile implementan el formato empaquetado. Éste separa un manifest.json serializable de los binarios bajoassets/<hash>. Las referencias discriminadas indican si el recurso es embebido o remoto; los bytes y objetos Blob nunca se incrustan accidentalmente en el documento.

Esta facade forma parte del contrato publicado de @deks-js/document. Sus exportscreateDeksFile y readDeksFile crean y leen el mismo archivo que usan Web y Desktop.

El host resuelve; el renderer dibuja

  1. El documento referencia un asset por identidad estable.
  2. El host obtiene los bytes locales o valida la URL HTTPS remota.
  3. El AssetResolver entrega una URL blob: o HTTPS al snapshot.
  4. El renderer la usa sin hacer fetch ni conocer filesystem, ZIP, S3 o R2.
  5. El host ejecuta URL.revokeObjectURL cuando termina el ciclo de vida de una object URL.