CreativeStudioModule backs the Creative Studio design editor and its library. Plain CRUD — opening or deleting a design — stays on the repository routes; these routes are the operations where the server has to compute something: searched and sorted pages, unique names, stored previews and copies.
A design is a creative_studio record. data.content holds the Fabric.js canvas JSON, data.workAreas the frames the user designs inside, and data.thumbnail a PNG preview kept in the platform's file storage. data.name is the record's unique slug; data.title is what people see and rename (older designs have only a name, so reads fall back to it).
Routes
/creative-studio/designs/listJWT/creative-studio/designs/createJWT/creative-studio/designs/:id/saveJWT/creative-studio/designs/:id/renameJWT/creative-studio/designs/:id/duplicateJWT/creative-studio/designs/:id/thumbnailJWT/creative-studio/assetsJWTLibrary
designs/list takes { search, sort, type, page, pageSize }. search matches title, name and tags; sort is recent (default) · oldest · name; type is image or design. pageSize defaults to 24, capped at 100. Rows come back without the canvas JSON, as summaries: sk, name, title, type, status, thumbnail, width, height (from the first frame), frameCount, hasContent, createdate, modifydate. The response adds total, page, pageSize, hasNext.
Designs
create—{ title?, size: { width, height, name?, platform? } }. Each side must be 16–10000 pixels. Makes a draft with one white frame of that size and a unique name built from the title.save— the editor's save. Writes onlycontent,workAreas,activeWorkAreaId,viewport,designSystem,externalContext,platform,format,tags, andtitleif sent; everything else is server-owned.width/heightfollow the first frame. Athumbnaildata URL in the body is stored as the new preview.rename—{ title }; an empty title answers400.duplicate— a full copy under "‹title› (copy)", as a draft, with its own preview file so the two never share a picture. Export and finalized state are not copied.thumbnail—{ image }, a PNG, JPEG or WebP data URL. Resized to fit 640 pixels and stored as PNG; the URL carries a version so caches refresh.
Uploaded images
assets takes { path, url?, name? } for a file already uploaded to storage. It becomes a library item of type image: one frame the size of the picture with the picture waiting to be placed in it, and a preview made from the file. A file that is not an image answers 400.