.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.
{
"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.
@deks-js/document. Sus exportscreateDeksFile y readDeksFile crean y leen el mismo archivo que usan Web y Desktop.El host resuelve; el renderer dibuja
- El documento referencia un asset por identidad estable.
- El host obtiene los bytes locales o valida la URL HTTPS remota.
- El
AssetResolverentrega una URLblob:o HTTPS al snapshot. - El renderer la usa sin hacer fetch ni conocer filesystem, ZIP, S3 o R2.
- El host ejecuta
URL.revokeObjectURLcuando termina el ciclo de vida de una object URL.