Capítulo de Creator de la guía de Neblla — el portal de creación: el muñeco, Flat, Templates, Mundo y Eco, «Mandar a mi app», las rutas de /api/creator y /api/store y las dos licencias de la tienda. El contrato base está en core.txt; el motor 3D, en mundo.txt.
# Neblla Creator
**Neblla Creator** (`https://creator.neblla.com`) es donde se hacen las cosas que una app necesita y que no son código: un personaje, un sprite o un atlas, el aspecto de la interfaz, un modelo 3D. Lo usan las personas (con una cuenta Neblla) y los developers; tu agente no lo maneja, pero lo que sale de él acaba en la app de tu developer y el agente lo lee con las herramientas de siempre.
## Los cinco estudios
- **El muñeco** (`/doll`): la persona que juega diseña **su** personaje, el mismo en todos los juegos de Mundo (`neblla.avatar`, en mundo.txt). Basta una cuenta Neblla.
- **Flat** (`/flat`): imágenes y animaciones en 2D: sprites, hojas de sprites (un atlas con su mapa JSON, también girado y con anclas con nombre), iconos, tipografías (las que escoges se guardan con la creación, también en árabe y de derecha a izquierda), SVG. Exporta PNG, WebP, SVG, GIF y sprites con estados.
- **Templates** (`/templates`): el aspecto de la interfaz de una app (colores, tipos de letra, bloques de pantalla). Una plantilla se aplica a una app («Ver en mi app») y puede pedir ayuda con un enlace de revisión sin cuenta.
- **Mundo** (`/mundo`): modelos 3D (formas, modificadores, huesos, accesorios para el muñeco, choques y puntos con nombre; también criaturas con esqueleto propio, piel y animaciones, como un lobo). Exporta `glb`, que `neblla.world` carga tal cual (mundo.txt, «Modelos 3D» y «Una criatura hecha en Mundo»).
- **Eco** (`/eco`): música, efectos de juego, grabaciones e instrumentos (sonido.txt). Exporta Opus (WebM), MP3 y WAV, con un `.json` de bucle al lado.
Flat, Templates, Mundo y Eco piden una cuenta de developer; el muñeco no. Un estudio que no está listo sale en la portada como «pronto».
### Animar en Flat y los sprites con estados
Flat tiene dos modos: **Dibujar** y **Animar** (el interruptor de la barra). En Animar aparece abajo la línea de tiempo común: una fila por capa, una celda por fotograma (se arrastran para moverlas; con `Alt` se enlazan) y un rombo por cada **posición clave**. Una posición clave mueve, gira, escala o aclara una capa de cualquier tipo (píxel, vector o texto) en un fotograma, y Flat calcula los de en medio con una curva (lineal, suave o rebote); las llaves no están en la capa, así una celda enlazada sigue siendo la misma en varios fotogramas. El GIF, el WebP, el atlas y la secuencia de PNG salen con los fotogramas ya calculados; «Convertir en dibujo» fija un fotograma calculado como dibujo de píxeles.
Las **etiquetas** de los fotogramas (`andar`, `saltar`, `agacharse`) son los **estados** de un sprite. El panel «Estados» da a cada uno si se repite, a qué estado pasa al acabar, si no se interrumpe (un golpe) y de qué otro es el espejo («andar a la izquierda» es `andar` con `flip`, sin dibujarlo); y a cada fotograma su anclaje (los pies), una caja de choque, una caja de golpe y eventos con nombre (`paso`). Exportar → Atlas → «Sprite con estados» da `nombre.png` y `nombre.nbsprite`, que es además un atlas Aseprite (Phaser 3 lo abre con `load.aseprite`). Para jugarlo en una página:
```html
```
`play(estado)` devuelve `false` si el estado no existe o si el que suena es «no se interrumpe» y no ha acabado. Un estado que no repite pasa solo a su `next` (de `saltar` a `caer`). `on('end' | 'loop' | 'state' | , fn)` avisa. Un fichero que no pasa `checkSprite` se rechaza con la lista de motivos (`error.errors`).
## Mis creaciones
Todo lo que hace un estudio es una **creación**: un documento editable (su «receta», que solo lee su estudio) con nombre, tipo (`flat`, `template`, `block`, `mundo`), miniatura y versiones, guardado en la cuenta de la persona. Se abre, se duplica, se renombra, se borra y se exporta. Una creación guarda hasta 20 versiones (las 10 con nombre no se pierden nunca) y una persona puede tener 500. El resto de límites (tamaño de la receta, ficheros por exportación, nota) los devuelve `GET /api/creator/creations` en `limits`.
## «Mandar a mi app»
Exportar pone lo que el estudio dibuja en los **Medios** de una app del developer, en la colección `creator`. Hasta 10 ficheros por exportación (un atlas lleva su imagen y su mapa), con una **nota para la IA del developer**: qué es y cómo lo usa `client.js`. Tu agente la lee con `neblla_media` (la nota viene en cada medio) y escribe el código que lo usa. Hace falta poder editar esa app (el dueño o su equipo). Lo mismo, en sentido contrario, es «Abrir desde mi app»: un estudio abre un medio de la app para seguir editándolo.
Una plantilla va por otro camino, «Ver en mi app»: escribe el aspecto en el borrador de la app (`main.css`, y con `layout` también las pantallas). Los ids que la app declara en `client.js` tienen que estar todos en la plantilla (`template_missing_ids`, con los nombres, antes de escribir nada). Con `publish` el borrador se publica; bajo los 14 años nada se publica (modo familia). «Volver al diseño anterior» lo deshace.
## Las rutas de /api/creator
Son las que llaman las páginas de Creator, con la **sesión Neblla** de la persona (cookie). Las escrituras solo se aceptan desde las páginas de Neblla (`forbidden_origin` desde otro origen); sin login, `401 login_required`. No son una API para el código de una app.
- **Quién y qué:** `GET /api/creator/me` (quién es y qué estudios ve), `GET /api/creator/age` y `PUT /api/creator/age` (la fecha de nacimiento, que decide quién puede vender), `GET /api/creator/prefs/:studio` y `PUT /api/creator/prefs/:studio` (los ajustes de exportación con nombre), `DELETE /api/creator/worn/:id` («Quitármelo»: la cosa sale del muñeco y se queda en el armario).
- **Creaciones:** `GET /api/creator/creations`, `POST /api/creator/creations`, `GET /api/creator/creations/:id`, `PUT /api/creator/creations/:id`, `DELETE /api/creator/creations/:id`, `POST /api/creator/creations/:id/duplicate`, `GET /api/creator/creations/:id/versions/:n`, `POST /api/creator/creations/:id/restore`, `GET /api/creator/creations/:id/thumb`.
- **Hacia una app:** `GET /api/creator/apps` (las apps a las que puede mandar), `POST /api/creator/creations/:id/export` («Mandar a mi app»), `GET /api/creator/apps/:appId/media` y `GET /api/creator/apps/:appId/media/:id/file` (abrir desde los Medios), `GET /api/creator/apps/:appId/products`, `GET /api/creator/apps/:appId/style`, `GET /api/creator/apps/:appId/testflow`, `GET /api/creator/creations/:id/recognises/:appId`, `POST /api/creator/creations/:id/apply` y `POST /api/creator/apps/:appId/unapply`.
- **Paletas y letras:** `GET /api/creator/palettes` y `PUT /api/creator/palettes`, `GET /api/creator/lospec/:slug`, `GET /api/creator/fonts/list`, `GET /api/creator/fonts/file`, `GET /api/creator/fonts/preview`.
- **Ficheros:** `GET /api/creator/blobs/:hash`, `HEAD /api/creator/blobs/:hash` y `PUT /api/creator/blobs/:hash` (los ficheros grandes de una creación, por su huella).
- **Lo mío en el muñeco:** `PUT /api/creator/own-things` y `DELETE /api/creator/own-things/:id` («Ponérmelo»: una cosa propia pasa la misma revisión que las de la tienda). Con `?kind=move&moveId=…` es un movimiento hecho en Animar: pasa la revisión de los movimientos de la tienda y va a `look.moves` del muñeco de quien lo hizo, solo suyo.
- **Pedir ayuda (Templates):** `POST /api/creator/creations/:id/review`, `GET /api/creator/creations/:id/review`, `DELETE /api/creator/creations/:id/review/:linkId`, `PUT /api/creator/creations/:id/review/:linkId/comments/:cid`; y, sin cuenta, `GET /api/creator/review/:token` y `POST /api/creator/review/:token/comments`: quien tiene el enlace lo ve y comenta, y el token de la dirección es el permiso.
- **Entregar a otra persona:** `POST /api/creator/creations/:id/deliver`, `GET /api/creator/delivery/:token` (sin cuenta, para verlo) y `POST /api/creator/delivery/:token/accept`.
- **Menores (modo familia):** `GET /api/creator/family`, `POST /api/creator/family/invite`, `GET /api/creator/family/invite/:token`, `POST /api/creator/family/invite/:token/accept`, `DELETE /api/creator/family/links/:id`, `GET /api/creator/family/minors/:link/creations/:id`, `PUT /api/creator/family/minors/:link/sell` y `DELETE /api/creator/family/minors/:link`: un adulto enlazado ve lo que hace el menor y decide si puede vender; bajo los 14 años nada se publica ni se vende.
## La tienda y sus dos licencias
La tienda (`https://creator.neblla.com/store`) vende lo que hacen los estudios. Lo que hay a la venta y cómo se usa en un juego está en mundo.txt («El catálogo de cosas de Neblla»); aquí, lo que importa de las licencias:
- **Dos licencias, una por portal.** La **de persona** (`person`) la compra una persona y la lleva en su muñeco en todos los juegos. La **de developer** (`dev`) la compra un developer una vez y la usa en todas sus apps y en lo que él vende. Ninguna deja revender ni compartir el fichero, y no se compra dos veces la misma.
- **Tipos:** `avatar` (una cosa para el muñeco), `piece`, `template`, `block` y `pack` (plantillas y bloques de Templates, que se venden como su receta, con versiones numeradas) y, desde Eco, Mundo y Flat, `move` (un baile o saludo: **también** con licencia de persona, que lo lleva en su muñeco si el juego lo permite, mundo.txt), `sound` (MP3, WAV u Opus), `instrument` (el JSON de un instrumento de Eco) y `art2d` (un ZIP de Flat con sus imágenes y su sprite). Los tres últimos tienen dos ficheros: el entero, **privado**, que solo recibe quien tiene la licencia de developer (`GET /api/store/download/:id`, un enlace de cinco minutos), y una **copia para escuchar o ver** de 30 s o menos que hace el estudio en el navegador (el servidor no transcodifica: comprueba las cabeceras). Se publican desde el botón **Vender** del estudio, que deja un borrador en `/author?product=`.
- **Cobra el autor.** Cada venta se cobra en la cuenta de Stripe del autor; las devoluciones y las disputas son suyas y Neblla se queda una comisión que baja con el precio. Mientras Neblla no abra la tienda de verdad, cobra en modo de pruebas de Stripe (`test: true` en el escaparate).
- **Antes de publicar, Neblla lo prueba** (peso, triángulos, texturas y, para el muñeco, cinco cuerpos y cinco posturas).
- **Carrito y créditos solo si Neblla los ha abierto.** Hasta entonces, `store_cart_closed` y `store_credits_closed` (409), y se compra de una en una.
- **Denunciar:** cualquier cosa de la tienda se puede denunciar (`POST /api/store/report`).
Las rutas, con la sesión Neblla:
- **Escaparate:** `GET /api/store/products`, `GET /api/store/products/:id`, `GET /api/store/products/:id/preview`, `GET /api/store/neblla` (las piezas gratis del catálogo de Mundo, paginadas), `GET /api/store/asset/:id` (la dirección del fichero con la licencia de developer, para `world.load('store:')`).
- **Comprar:** `GET /api/store/download/:id` (el fichero entero de un sonido, un instrumento o un pack 2D, con la licencia de developer), `POST /api/store/checkout`, `POST /api/store/cart/quote`, `POST /api/store/cart`, `GET /api/store/mine` (lo comprado), `POST /api/store/adopt` (llevarse una plantilla o un bloque comprado), `GET /api/store/outdated` y `POST /api/store/copies/:id/upgrade` (las copias que tienen versión nueva y su actualización).
- **Vender:** `GET /api/store/author`, `GET /api/store/author/sales`, `POST /api/store/author/quote`, `POST /api/store/author/products`, `PATCH /api/store/author/products/:id`, `PUT /api/store/author/products/:id/file` (con `?part=preview` es la copia para escuchar o ver), `POST /api/store/author/products/:id/publish`, `POST /api/store/author/products/:id/release` y `POST /api/store/author/products/:id/withdraw`. Desde un agente, lo mismo con `neblla_store` (mcp.txt).
## Errores
Todos responden `{ error: '' }`. Los de Creator empiezan por `creation_` (`creation_export_forbidden` si no puedes editar esa app, `creation_export_too_many`, `creation_file_bad`, `creation_note_bad`), `template_` (`template_missing_ids`, `template_duplicate_ids`, `template_checklist_failed`, `template_not_applied`) o `avatar_`; los de la tienda, por `store_` (`store_payouts_needed`: conecta tu cuenta de cobros antes de vender).