@imgly/codesign-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (816) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +158 -0
  3. package/assets/docs/api/SKILL.md +49 -0
  4. package/assets/docs/api/index.d.ts +10518 -0
  5. package/assets/docs/guide/SKILL.md +142 -0
  6. package/assets/docs/guide/actions.md +1038 -0
  7. package/assets/docs/guide/animation/create/base.md +467 -0
  8. package/assets/docs/guide/animation/create/text.md +453 -0
  9. package/assets/docs/guide/animation/create.md +558 -0
  10. package/assets/docs/guide/animation/edit.md +501 -0
  11. package/assets/docs/guide/animation/overview.md +22 -0
  12. package/assets/docs/guide/animation/types.md +430 -0
  13. package/assets/docs/guide/animation.md +23 -0
  14. package/assets/docs/guide/api/AssetAPI.md +602 -0
  15. package/assets/docs/guide/api/BlockAPI.md +6152 -0
  16. package/assets/docs/guide/api/CreativeEngine.md +180 -0
  17. package/assets/docs/guide/api/EditorAPI.md +1261 -0
  18. package/assets/docs/guide/api/EventAPI.md +25 -0
  19. package/assets/docs/guide/api/SceneAPI.md +729 -0
  20. package/assets/docs/guide/api/VariableAPI.md +59 -0
  21. package/assets/docs/guide/api/types.md +71 -0
  22. package/assets/docs/guide/api-reference/overview.md +20 -0
  23. package/assets/docs/guide/automation/auto-resize.md +412 -0
  24. package/assets/docs/guide/automation/batch-processing.md +474 -0
  25. package/assets/docs/guide/automation/data-merge.md +406 -0
  26. package/assets/docs/guide/automation/design-generation.md +107 -0
  27. package/assets/docs/guide/automation/overview.md +16 -0
  28. package/assets/docs/guide/automation.md +24 -0
  29. package/assets/docs/guide/browser-support.md +38 -0
  30. package/assets/docs/guide/capabilities.md +18 -0
  31. package/assets/docs/guide/colors/adjust.md +551 -0
  32. package/assets/docs/guide/colors/apply.md +349 -0
  33. package/assets/docs/guide/colors/basics.md +440 -0
  34. package/assets/docs/guide/colors/conversion.md +504 -0
  35. package/assets/docs/guide/colors/create-color-palette.md +426 -0
  36. package/assets/docs/guide/colors/for-print/cmyk.md +577 -0
  37. package/assets/docs/guide/colors/for-print/spot.md +751 -0
  38. package/assets/docs/guide/colors/for-print.md +21 -0
  39. package/assets/docs/guide/colors/for-screen/p3.md +60 -0
  40. package/assets/docs/guide/colors/for-screen/srgb.md +463 -0
  41. package/assets/docs/guide/colors/for-screen.md +21 -0
  42. package/assets/docs/guide/colors/overview.md +20 -0
  43. package/assets/docs/guide/colors/replace.md +535 -0
  44. package/assets/docs/guide/colors.md +28 -0
  45. package/assets/docs/guide/compatibility.md +27 -0
  46. package/assets/docs/guide/concepts/architecture.md +99 -0
  47. package/assets/docs/guide/concepts/assets.md +360 -0
  48. package/assets/docs/guide/concepts/blocks.md +750 -0
  49. package/assets/docs/guide/concepts/buffers.md +546 -0
  50. package/assets/docs/guide/concepts/design-units.md +333 -0
  51. package/assets/docs/guide/concepts/edit-modes.md +431 -0
  52. package/assets/docs/guide/concepts/editing-workflow.md +303 -0
  53. package/assets/docs/guide/concepts/events.md +466 -0
  54. package/assets/docs/guide/concepts/headless-mode/browser.md +291 -0
  55. package/assets/docs/guide/concepts/pages.md +396 -0
  56. package/assets/docs/guide/concepts/resources.md +496 -0
  57. package/assets/docs/guide/concepts/scenes.md +443 -0
  58. package/assets/docs/guide/concepts/templating.md +194 -0
  59. package/assets/docs/guide/concepts/terminology.md +296 -0
  60. package/assets/docs/guide/concepts/undo-and-history.md +461 -0
  61. package/assets/docs/guide/concepts.md +38 -0
  62. package/assets/docs/guide/configuration.md +469 -0
  63. package/assets/docs/guide/conversion/overview.md +22 -0
  64. package/assets/docs/guide/conversion/to-base64.md +234 -0
  65. package/assets/docs/guide/conversion/to-pdf.md +616 -0
  66. package/assets/docs/guide/conversion/to-png.md +290 -0
  67. package/assets/docs/guide/conversion.md +23 -0
  68. package/assets/docs/guide/create-audio/audio/add-music.md +430 -0
  69. package/assets/docs/guide/create-audio/audio/add-sound-effects.md +664 -0
  70. package/assets/docs/guide/create-audio/audio/loop.md +370 -0
  71. package/assets/docs/guide/create-audio/audio.md +336 -0
  72. package/assets/docs/guide/create-composition/add-background.md +395 -0
  73. package/assets/docs/guide/create-composition/blend-modes.md +372 -0
  74. package/assets/docs/guide/create-composition/collage.md +432 -0
  75. package/assets/docs/guide/create-composition/group-and-ungroup.md +388 -0
  76. package/assets/docs/guide/create-composition/layer-management.md +503 -0
  77. package/assets/docs/guide/create-composition/layout.md +396 -0
  78. package/assets/docs/guide/create-composition/lock-design.md +362 -0
  79. package/assets/docs/guide/create-composition/multi-page.md +204 -0
  80. package/assets/docs/guide/create-composition/overview.md +18 -0
  81. package/assets/docs/guide/create-composition/programmatic.md +593 -0
  82. package/assets/docs/guide/create-composition.md +30 -0
  83. package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +688 -0
  84. package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +600 -0
  85. package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +647 -0
  86. package/assets/docs/guide/create-templates/add-dynamic-content.md +307 -0
  87. package/assets/docs/guide/create-templates/add-to-template-library.md +297 -0
  88. package/assets/docs/guide/create-templates/edit-or-remove.md +441 -0
  89. package/assets/docs/guide/create-templates/from-scratch.md +558 -0
  90. package/assets/docs/guide/create-templates/import/from-scene-file.md +440 -0
  91. package/assets/docs/guide/create-templates/import.md +244 -0
  92. package/assets/docs/guide/create-templates/lock.md +325 -0
  93. package/assets/docs/guide/create-templates/overview.md +16 -0
  94. package/assets/docs/guide/create-templates.md +32 -0
  95. package/assets/docs/guide/create-video/audio/adjust-speed.md +302 -0
  96. package/assets/docs/guide/create-video/audio/adjust-volume.md +346 -0
  97. package/assets/docs/guide/create-video/control.md +285 -0
  98. package/assets/docs/guide/create-video/limitations.md +396 -0
  99. package/assets/docs/guide/create-video/overview.md +224 -0
  100. package/assets/docs/guide/create-video/timeline-editor.md +622 -0
  101. package/assets/docs/guide/create-video/update-caption-presets.md +676 -0
  102. package/assets/docs/guide/create-video.md +32 -0
  103. package/assets/docs/guide/edit-image/add-watermark.md +497 -0
  104. package/assets/docs/guide/edit-image/overview.md +22 -0
  105. package/assets/docs/guide/edit-image/remove-bg.md +420 -0
  106. package/assets/docs/guide/edit-image/replace-colors.md +680 -0
  107. package/assets/docs/guide/edit-image/transform/crop.md +523 -0
  108. package/assets/docs/guide/edit-image/transform/move.md +279 -0
  109. package/assets/docs/guide/edit-image/transform/resize.md +301 -0
  110. package/assets/docs/guide/edit-image/transform/rotate.md +408 -0
  111. package/assets/docs/guide/edit-image/transform/scale.md +278 -0
  112. package/assets/docs/guide/edit-image/transform.md +24 -0
  113. package/assets/docs/guide/edit-image/vectorize.md +204 -0
  114. package/assets/docs/guide/edit-image.md +25 -0
  115. package/assets/docs/guide/edit-video/add-captions.md +589 -0
  116. package/assets/docs/guide/edit-video/add-watermark.md +429 -0
  117. package/assets/docs/guide/edit-video/join-and-arrange.md +540 -0
  118. package/assets/docs/guide/edit-video/redaction.md +544 -0
  119. package/assets/docs/guide/edit-video/split.md +634 -0
  120. package/assets/docs/guide/edit-video/transform/crop.md +380 -0
  121. package/assets/docs/guide/edit-video/transform/flip.md +182 -0
  122. package/assets/docs/guide/edit-video/transform/move.md +413 -0
  123. package/assets/docs/guide/edit-video/transform/resize.md +534 -0
  124. package/assets/docs/guide/edit-video/transform/rotate.md +312 -0
  125. package/assets/docs/guide/edit-video/transform/scale.md +603 -0
  126. package/assets/docs/guide/edit-video/transform.md +25 -0
  127. package/assets/docs/guide/edit-video/trim.md +773 -0
  128. package/assets/docs/guide/engine-interface.md +108 -0
  129. package/assets/docs/guide/export-save-publish/create-thumbnail.md +292 -0
  130. package/assets/docs/guide/export-save-publish/export/compress.md +639 -0
  131. package/assets/docs/guide/export-save-publish/export/overview.md +576 -0
  132. package/assets/docs/guide/export-save-publish/export/partial-export.md +694 -0
  133. package/assets/docs/guide/export-save-publish/export/size-limits.md +401 -0
  134. package/assets/docs/guide/export-save-publish/export/to-html5.md +474 -0
  135. package/assets/docs/guide/export-save-publish/export/to-jpeg.md +312 -0
  136. package/assets/docs/guide/export-save-publish/export/to-mp4.md +364 -0
  137. package/assets/docs/guide/export-save-publish/export/to-pdf.md +389 -0
  138. package/assets/docs/guide/export-save-publish/export/to-png.md +255 -0
  139. package/assets/docs/guide/export-save-publish/export/to-raw-data.md +303 -0
  140. package/assets/docs/guide/export-save-publish/export/to-webp.md +261 -0
  141. package/assets/docs/guide/export-save-publish/export/with-color-mask.md +278 -0
  142. package/assets/docs/guide/export-save-publish/export.md +36 -0
  143. package/assets/docs/guide/export-save-publish/for-printing.md +423 -0
  144. package/assets/docs/guide/export-save-publish/for-social-media.md +318 -0
  145. package/assets/docs/guide/export-save-publish/pre-export-validation.md +698 -0
  146. package/assets/docs/guide/export-save-publish/save.md +340 -0
  147. package/assets/docs/guide/export-save-publish/store-custom-metadata.md +367 -0
  148. package/assets/docs/guide/file-format-support.md +34 -0
  149. package/assets/docs/guide/fills/color.md +678 -0
  150. package/assets/docs/guide/fills/image.md +539 -0
  151. package/assets/docs/guide/fills/overview.md +144 -0
  152. package/assets/docs/guide/fills/video.md +641 -0
  153. package/assets/docs/guide/fills.md +24 -0
  154. package/assets/docs/guide/filters-and-effects/apply.md +1019 -0
  155. package/assets/docs/guide/filters-and-effects/blur.md +382 -0
  156. package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +445 -0
  157. package/assets/docs/guide/filters-and-effects/create-custom-filters.md +614 -0
  158. package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +426 -0
  159. package/assets/docs/guide/filters-and-effects/distortion.md +527 -0
  160. package/assets/docs/guide/filters-and-effects/duotone.md +602 -0
  161. package/assets/docs/guide/filters-and-effects/gradients.md +1311 -0
  162. package/assets/docs/guide/filters-and-effects/overview.md +22 -0
  163. package/assets/docs/guide/filters-and-effects/support.md +623 -0
  164. package/assets/docs/guide/filters-and-effects.md +28 -0
  165. package/assets/docs/guide/get-started/agent-skills.md +119 -0
  166. package/assets/docs/guide/get-started/build-with-ai.md +45 -0
  167. package/assets/docs/guide/get-started/mcp-server.md +119 -0
  168. package/assets/docs/guide/get-started/overview.md +28 -0
  169. package/assets/docs/guide/get-started/vanilla-js/quickstart.md +175 -0
  170. package/assets/docs/guide/grid-and-rulers.md +222 -0
  171. package/assets/docs/guide/guides/export-save-publish/export/audio.md +224 -0
  172. package/assets/docs/guide/guides/text/rendering-internals.md +796 -0
  173. package/assets/docs/guide/guides.md +49 -0
  174. package/assets/docs/guide/import-media/asset-library.md +23 -0
  175. package/assets/docs/guide/import-media/asset-panel/basics.md +324 -0
  176. package/assets/docs/guide/import-media/asset-panel/customize.md +478 -0
  177. package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +415 -0
  178. package/assets/docs/guide/import-media/asset-panel/thumbnails.md +633 -0
  179. package/assets/docs/guide/import-media/capture-from-camera/record-video.md +137 -0
  180. package/assets/docs/guide/import-media/capture-from-camera.md +20 -0
  181. package/assets/docs/guide/import-media/concepts.md +173 -0
  182. package/assets/docs/guide/import-media/content-json-schema.md +615 -0
  183. package/assets/docs/guide/import-media/default-assets.md +381 -0
  184. package/assets/docs/guide/import-media/edit-or-remove-assets.md +489 -0
  185. package/assets/docs/guide/import-media/file-format-support.md +178 -0
  186. package/assets/docs/guide/import-media/from-local-source/user-upload.md +438 -0
  187. package/assets/docs/guide/import-media/from-local-source.md +20 -0
  188. package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +390 -0
  189. package/assets/docs/guide/import-media/from-remote-source/getty-images.md +627 -0
  190. package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +625 -0
  191. package/assets/docs/guide/import-media/from-remote-source/pexels.md +692 -0
  192. package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +473 -0
  193. package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +497 -0
  194. package/assets/docs/guide/import-media/from-remote-source/third-party.md +51 -0
  195. package/assets/docs/guide/import-media/from-remote-source/unsplash.md +914 -0
  196. package/assets/docs/guide/import-media/from-remote-source/your-server.md +764 -0
  197. package/assets/docs/guide/import-media/from-remote-source.md +28 -0
  198. package/assets/docs/guide/import-media/overview.md +32 -0
  199. package/assets/docs/guide/import-media/retrieve-mimetype.md +274 -0
  200. package/assets/docs/guide/import-media/size-limits.md +20 -0
  201. package/assets/docs/guide/import-media/source-sets.md +476 -0
  202. package/assets/docs/guide/import-media.md +32 -0
  203. package/assets/docs/guide/insert-media/audio.md +291 -0
  204. package/assets/docs/guide/insert-media/images.md +380 -0
  205. package/assets/docs/guide/insert-media/position-and-align.md +734 -0
  206. package/assets/docs/guide/insert-media/shapes-or-stickers.md +799 -0
  207. package/assets/docs/guide/insert-media/videos.md +308 -0
  208. package/assets/docs/guide/insert-media.md +24 -0
  209. package/assets/docs/guide/key-capabilities.md +24 -0
  210. package/assets/docs/guide/key-concepts.md +83 -0
  211. package/assets/docs/guide/licensing.md +45 -0
  212. package/assets/docs/guide/llms-txt.md +53 -0
  213. package/assets/docs/guide/open-the-editor/blank-canvas.md +124 -0
  214. package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +228 -0
  215. package/assets/docs/guide/open-the-editor/from-image.md +205 -0
  216. package/assets/docs/guide/open-the-editor/from-template.md +189 -0
  217. package/assets/docs/guide/open-the-editor/from-video.md +274 -0
  218. package/assets/docs/guide/open-the-editor/import-design/from-archive.md +504 -0
  219. package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +680 -0
  220. package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +865 -0
  221. package/assets/docs/guide/open-the-editor/import-design.md +481 -0
  222. package/assets/docs/guide/open-the-editor/load-scene.md +178 -0
  223. package/assets/docs/guide/open-the-editor/overview.md +20 -0
  224. package/assets/docs/guide/open-the-editor/set-zoom-level.md +303 -0
  225. package/assets/docs/guide/open-the-editor/uri-resolver.md +347 -0
  226. package/assets/docs/guide/open-the-editor.md +29 -0
  227. package/assets/docs/guide/outlines/overview.md +14 -0
  228. package/assets/docs/guide/outlines/shadows-and-glows.md +515 -0
  229. package/assets/docs/guide/outlines/strokes.md +292 -0
  230. package/assets/docs/guide/outlines.md +22 -0
  231. package/assets/docs/guide/overview.md +22 -0
  232. package/assets/docs/guide/performance.md +217 -0
  233. package/assets/docs/guide/plugins/asset-sources.md +553 -0
  234. package/assets/docs/guide/plugins/print-ready-pdf.md +549 -0
  235. package/assets/docs/guide/plugins.md +36 -0
  236. package/assets/docs/guide/rules/asset-handling.md +180 -0
  237. package/assets/docs/guide/rules/common-pitfalls.md +272 -0
  238. package/assets/docs/guide/rules/content-fill-mode.md +29 -0
  239. package/assets/docs/guide/rules/enforce-brand-guidelines.md +672 -0
  240. package/assets/docs/guide/rules/lock-content.md +478 -0
  241. package/assets/docs/guide/rules/moderate-content.md +761 -0
  242. package/assets/docs/guide/rules/overview.md +514 -0
  243. package/assets/docs/guide/rules/silent-init-errors.md +137 -0
  244. package/assets/docs/guide/rules/verify-properties-before-use.md +78 -0
  245. package/assets/docs/guide/rules.md +23 -0
  246. package/assets/docs/guide/security.md +199 -0
  247. package/assets/docs/guide/serve-assets.md +332 -0
  248. package/assets/docs/guide/settings.md +199 -0
  249. package/assets/docs/guide/shapes.md +23 -0
  250. package/assets/docs/guide/starterkits/3d-mockup-editor.md +748 -0
  251. package/assets/docs/guide/starterkits/advanced-editor.md +698 -0
  252. package/assets/docs/guide/starterkits/advanced-video-editor.md +696 -0
  253. package/assets/docs/guide/starterkits/ai-editor.md +749 -0
  254. package/assets/docs/guide/starterkits/airtable-image-editor.md +672 -0
  255. package/assets/docs/guide/starterkits/apparel-ui.md +188 -0
  256. package/assets/docs/guide/starterkits/assets.md +27 -0
  257. package/assets/docs/guide/starterkits/auto-resize.md +586 -0
  258. package/assets/docs/guide/starterkits/automated-video-generation.md +692 -0
  259. package/assets/docs/guide/starterkits/background-removal-editor.md +480 -0
  260. package/assets/docs/guide/starterkits/content-moderation.md +863 -0
  261. package/assets/docs/guide/starterkits/creative-automation.md +28 -0
  262. package/assets/docs/guide/starterkits/custom-built-uis.md +26 -0
  263. package/assets/docs/guide/starterkits/customization.md +29 -0
  264. package/assets/docs/guide/starterkits/cutout-lines-editor.md +470 -0
  265. package/assets/docs/guide/starterkits/data-merge.md +850 -0
  266. package/assets/docs/guide/starterkits/design-editor.md +698 -0
  267. package/assets/docs/guide/starterkits/design-generation.md +719 -0
  268. package/assets/docs/guide/starterkits/design-validation.md +808 -0
  269. package/assets/docs/guide/starterkits/editor-ui-configurations.md +14 -0
  270. package/assets/docs/guide/starterkits/export-options.md +724 -0
  271. package/assets/docs/guide/starterkits/export-using-renderer.md +708 -0
  272. package/assets/docs/guide/starterkits/extensibility.md +28 -0
  273. package/assets/docs/guide/starterkits/force-crop-editor.md +675 -0
  274. package/assets/docs/guide/starterkits/form-based-template-adoption.md +522 -0
  275. package/assets/docs/guide/starterkits/getty-images-editor.md +700 -0
  276. package/assets/docs/guide/starterkits/html5-ads-exporter.md +719 -0
  277. package/assets/docs/guide/starterkits/indesign-template-import.md +580 -0
  278. package/assets/docs/guide/starterkits/layouts-editor.md +724 -0
  279. package/assets/docs/guide/starterkits/mobile-ui.md +185 -0
  280. package/assets/docs/guide/starterkits/mockup-editor.md +745 -0
  281. package/assets/docs/guide/starterkits/multi-image-generation.md +542 -0
  282. package/assets/docs/guide/starterkits/page-sizes-editor.md +657 -0
  283. package/assets/docs/guide/starterkits/pexels-image-editor.md +665 -0
  284. package/assets/docs/guide/starterkits/photo-editor.md +755 -0
  285. package/assets/docs/guide/starterkits/photo-ui.md +186 -0
  286. package/assets/docs/guide/starterkits/photobook-ui.md +188 -0
  287. package/assets/docs/guide/starterkits/placeholders.md +678 -0
  288. package/assets/docs/guide/starterkits/player.md +405 -0
  289. package/assets/docs/guide/starterkits/plugins.md +25 -0
  290. package/assets/docs/guide/starterkits/postcard-editor.md +202 -0
  291. package/assets/docs/guide/starterkits/pptx-template-import.md +581 -0
  292. package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +746 -0
  293. package/assets/docs/guide/starterkits/product-editor.md +773 -0
  294. package/assets/docs/guide/starterkits/psd-template-import.md +580 -0
  295. package/assets/docs/guide/starterkits/qr-code-editor.md +470 -0
  296. package/assets/docs/guide/starterkits/single-page-editor.md +661 -0
  297. package/assets/docs/guide/starterkits/start-with-image.md +684 -0
  298. package/assets/docs/guide/starterkits/start-with-video.md +651 -0
  299. package/assets/docs/guide/starterkits/t-shirt-designer.md +742 -0
  300. package/assets/docs/guide/starterkits/templating.md +23 -0
  301. package/assets/docs/guide/starterkits/theming.md +662 -0
  302. package/assets/docs/guide/starterkits/translation-internationalization.md +662 -0
  303. package/assets/docs/guide/starterkits/unsplash-editor.md +839 -0
  304. package/assets/docs/guide/starterkits/vectorizer-editor.md +466 -0
  305. package/assets/docs/guide/starterkits/version-history.md +745 -0
  306. package/assets/docs/guide/starterkits/video-animations.md +853 -0
  307. package/assets/docs/guide/starterkits/video-captions.md +884 -0
  308. package/assets/docs/guide/starterkits/video-editing.md +25 -0
  309. package/assets/docs/guide/starterkits/video-editor.md +696 -0
  310. package/assets/docs/guide/starterkits/video-export-options.md +676 -0
  311. package/assets/docs/guide/starterkits/viewer.md +400 -0
  312. package/assets/docs/guide/starterkits.md +41 -0
  313. package/assets/docs/guide/stickers-and-shapes/combine.md +743 -0
  314. package/assets/docs/guide/stickers-and-shapes/create-cutout.md +425 -0
  315. package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +794 -0
  316. package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +290 -0
  317. package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +211 -0
  318. package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +362 -0
  319. package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +208 -0
  320. package/assets/docs/guide/stickers.md +21 -0
  321. package/assets/docs/guide/text/add.md +641 -0
  322. package/assets/docs/guide/text/adjust-spacing.md +288 -0
  323. package/assets/docs/guide/text/auto-size.md +404 -0
  324. package/assets/docs/guide/text/custom-fonts.md +401 -0
  325. package/assets/docs/guide/text/decorations.md +330 -0
  326. package/assets/docs/guide/text/edit.md +458 -0
  327. package/assets/docs/guide/text/effects.md +244 -0
  328. package/assets/docs/guide/text/emojis.md +310 -0
  329. package/assets/docs/guide/text/enumerations.md +258 -0
  330. package/assets/docs/guide/text/language-support.md +604 -0
  331. package/assets/docs/guide/text/overview.md +14 -0
  332. package/assets/docs/guide/text/styling.md +390 -0
  333. package/assets/docs/guide/text/text-designs.md +834 -0
  334. package/assets/docs/guide/text.md +33 -0
  335. package/assets/docs/guide/to-v1-10.md +131 -0
  336. package/assets/docs/guide/to-v1-13.md +165 -0
  337. package/assets/docs/guide/to-v1-19.md +315 -0
  338. package/assets/docs/guide/to-v1-32.md +110 -0
  339. package/assets/docs/guide/to-v1-69.md +468 -0
  340. package/assets/docs/guide/to-v1-72.md +193 -0
  341. package/assets/docs/guide/upgrade.md +25 -0
  342. package/assets/docs/guide/use-templates/apply-template.md +279 -0
  343. package/assets/docs/guide/use-templates/generate.md +405 -0
  344. package/assets/docs/guide/use-templates/library.md +450 -0
  345. package/assets/docs/guide/use-templates/overview.md +20 -0
  346. package/assets/docs/guide/use-templates/programmatic.md +482 -0
  347. package/assets/docs/guide/use-templates/replace-content.md +399 -0
  348. package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +428 -0
  349. package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +337 -0
  350. package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +853 -0
  351. package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +1045 -0
  352. package/assets/docs/guide/user-interface/ai-integration/image-generation.md +641 -0
  353. package/assets/docs/guide/user-interface/ai-integration/integrate.md +966 -0
  354. package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +99 -0
  355. package/assets/docs/guide/user-interface/ai-integration/text-generation.md +498 -0
  356. package/assets/docs/guide/user-interface/ai-integration/video-generation.md +493 -0
  357. package/assets/docs/guide/user-interface/ai-integration.md +30 -0
  358. package/assets/docs/guide/user-interface/appearance/change-ui-font.md +316 -0
  359. package/assets/docs/guide/user-interface/appearance/custom-labels.md +509 -0
  360. package/assets/docs/guide/user-interface/appearance/icons.md +373 -0
  361. package/assets/docs/guide/user-interface/appearance/theming.md +665 -0
  362. package/assets/docs/guide/user-interface/appearance.md +23 -0
  363. package/assets/docs/guide/user-interface/build-your-own-ui.md +620 -0
  364. package/assets/docs/guide/user-interface/customization/canvas-menu.md +412 -0
  365. package/assets/docs/guide/user-interface/customization/canvas.md +281 -0
  366. package/assets/docs/guide/user-interface/customization/color-palette.md +413 -0
  367. package/assets/docs/guide/user-interface/customization/crop-presets.md +384 -0
  368. package/assets/docs/guide/user-interface/customization/disable-or-enable.md +676 -0
  369. package/assets/docs/guide/user-interface/customization/dock.md +399 -0
  370. package/assets/docs/guide/user-interface/customization/force-crop.md +289 -0
  371. package/assets/docs/guide/user-interface/customization/inspector-bar.md +371 -0
  372. package/assets/docs/guide/user-interface/customization/navigation-bar.md +516 -0
  373. package/assets/docs/guide/user-interface/customization/page-format.md +436 -0
  374. package/assets/docs/guide/user-interface/customization/panel.md +605 -0
  375. package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +531 -0
  376. package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +358 -0
  377. package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +374 -0
  378. package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +323 -0
  379. package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +294 -0
  380. package/assets/docs/guide/user-interface/customization/quick-start.md +12 -0
  381. package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +519 -0
  382. package/assets/docs/guide/user-interface/customization/reference/component-reference.md +333 -0
  383. package/assets/docs/guide/user-interface/customization/reference.md +12 -0
  384. package/assets/docs/guide/user-interface/customization.md +39 -0
  385. package/assets/docs/guide/user-interface/localization.md +633 -0
  386. package/assets/docs/guide/user-interface/overview.md +167 -0
  387. package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +411 -0
  388. package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +721 -0
  389. package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +331 -0
  390. package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +553 -0
  391. package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +672 -0
  392. package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +415 -0
  393. package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +521 -0
  394. package/assets/docs/guide/user-interface/ui-extensions.md +26 -0
  395. package/assets/docs/guide/user-interface.md +25 -0
  396. package/assets/docs/guide/what-is-cesdk.md +319 -0
  397. package/assets/docs/handbook/SKILL.md +521 -0
  398. package/assets/prompts/evals-assetGenerate.md +12 -0
  399. package/assets/prompts/evals-brutalistCore.md +34 -0
  400. package/assets/prompts/evals-danskCatalogue.md +31 -0
  401. package/assets/prompts/evals-exportRoundTrip.md +12 -0
  402. package/assets/prompts/evals-inspectPriorCode.md +16 -0
  403. package/assets/prompts/evals-listProjectFiles.md +6 -0
  404. package/assets/prompts/evals-readAndExplainScript.md +6 -0
  405. package/assets/prompts/evals-resumeAcrossRestart.md +15 -0
  406. package/assets/prompts/evals-rewindRecovery.md +10 -0
  407. package/assets/prompts/evals-searchAcrossFiles.md +6 -0
  408. package/assets/prompts/evals-weddingCard.md +20 -0
  409. package/assets/prompts/explain.md +6 -0
  410. package/assets/prompts/review.md +6 -0
  411. package/dist/assets/inline.generated.d.ts +2 -0
  412. package/dist/assets/inline.generated.d.ts.map +1 -0
  413. package/dist/assets/inline.generated.js +413 -0
  414. package/dist/assets/inline.generated.js.map +1 -0
  415. package/dist/assets/load-browser.d.ts +8 -0
  416. package/dist/assets/load-browser.d.ts.map +1 -0
  417. package/dist/assets/load-browser.js +11 -0
  418. package/dist/assets/load-browser.js.map +1 -0
  419. package/dist/assets/load-node.d.ts +8 -0
  420. package/dist/assets/load-node.d.ts.map +1 -0
  421. package/dist/assets/load-node.js +11 -0
  422. package/dist/assets/load-node.js.map +1 -0
  423. package/dist/cli/http.d.ts +2 -0
  424. package/dist/cli/http.d.ts.map +1 -0
  425. package/dist/cli/http.js +231 -0
  426. package/dist/cli/http.js.map +1 -0
  427. package/dist/cli/redirect-console.d.ts +10 -0
  428. package/dist/cli/redirect-console.d.ts.map +1 -0
  429. package/dist/cli/redirect-console.js +18 -0
  430. package/dist/cli/redirect-console.js.map +1 -0
  431. package/dist/cli/resolve-license.d.ts +2 -0
  432. package/dist/cli/resolve-license.d.ts.map +1 -0
  433. package/dist/cli/resolve-license.js +13 -0
  434. package/dist/cli/resolve-license.js.map +1 -0
  435. package/dist/cli/stdio.d.ts +2 -0
  436. package/dist/cli/stdio.d.ts.map +1 -0
  437. package/dist/cli/stdio.js +124 -0
  438. package/dist/cli/stdio.js.map +1 -0
  439. package/dist/cli/trial-license.generated.d.ts +2 -0
  440. package/dist/cli/trial-license.generated.d.ts.map +1 -0
  441. package/dist/cli/trial-license.generated.js +4 -0
  442. package/dist/cli/trial-license.generated.js.map +1 -0
  443. package/dist/cli.d.ts +3 -0
  444. package/dist/cli.d.ts.map +1 -0
  445. package/dist/cli.js +64 -0
  446. package/dist/cli.js.map +1 -0
  447. package/dist/config.d.ts +61 -0
  448. package/dist/config.d.ts.map +1 -0
  449. package/dist/config.js +102 -0
  450. package/dist/config.js.map +1 -0
  451. package/dist/cross-ref.d.ts +2 -0
  452. package/dist/cross-ref.d.ts.map +1 -0
  453. package/dist/cross-ref.js +31 -0
  454. package/dist/cross-ref.js.map +1 -0
  455. package/dist/dashboard/router.d.ts +3 -0
  456. package/dist/dashboard/router.d.ts.map +1 -0
  457. package/dist/dashboard/router.js +19 -0
  458. package/dist/dashboard/router.js.map +1 -0
  459. package/dist/dashboard/spa-assets.generated.d.ts +2 -0
  460. package/dist/dashboard/spa-assets.generated.d.ts.map +1 -0
  461. package/dist/dashboard/spa-assets.generated.js +220 -0
  462. package/dist/dashboard/spa-assets.generated.js.map +1 -0
  463. package/dist/engine/asset-sources.d.ts +17 -0
  464. package/dist/engine/asset-sources.d.ts.map +1 -0
  465. package/dist/engine/asset-sources.js +75 -0
  466. package/dist/engine/asset-sources.js.map +1 -0
  467. package/dist/engine/cesdk-adapter.d.ts +10 -0
  468. package/dist/engine/cesdk-adapter.d.ts.map +1 -0
  469. package/dist/engine/cesdk-adapter.js +19 -0
  470. package/dist/engine/cesdk-adapter.js.map +1 -0
  471. package/dist/engine/index.d.ts +3 -0
  472. package/dist/engine/index.d.ts.map +1 -0
  473. package/dist/engine/index.js +3 -0
  474. package/dist/engine/index.js.map +1 -0
  475. package/dist/engine/mutex.d.ts +5 -0
  476. package/dist/engine/mutex.d.ts.map +1 -0
  477. package/dist/engine/mutex.js +42 -0
  478. package/dist/engine/mutex.js.map +1 -0
  479. package/dist/engine/session.d.ts +50 -0
  480. package/dist/engine/session.d.ts.map +1 -0
  481. package/dist/engine/session.js +95 -0
  482. package/dist/engine/session.js.map +1 -0
  483. package/dist/engine/uri-resolver.d.ts +14 -0
  484. package/dist/engine/uri-resolver.d.ts.map +1 -0
  485. package/dist/engine/uri-resolver.js +12 -0
  486. package/dist/engine/uri-resolver.js.map +1 -0
  487. package/dist/frontmatter.d.ts +15 -0
  488. package/dist/frontmatter.d.ts.map +1 -0
  489. package/dist/frontmatter.js +46 -0
  490. package/dist/frontmatter.js.map +1 -0
  491. package/dist/gateway/hosted-stub.d.ts +6 -0
  492. package/dist/gateway/hosted-stub.d.ts.map +1 -0
  493. package/dist/gateway/hosted-stub.js +11 -0
  494. package/dist/gateway/hosted-stub.js.map +1 -0
  495. package/dist/gateway/index.d.ts +4 -0
  496. package/dist/gateway/index.d.ts.map +1 -0
  497. package/dist/gateway/index.js +4 -0
  498. package/dist/gateway/index.js.map +1 -0
  499. package/dist/gateway/local.d.ts +14 -0
  500. package/dist/gateway/local.d.ts.map +1 -0
  501. package/dist/gateway/local.js +41 -0
  502. package/dist/gateway/local.js.map +1 -0
  503. package/dist/gateway/types.d.ts +24 -0
  504. package/dist/gateway/types.d.ts.map +1 -0
  505. package/dist/gateway/types.js +7 -0
  506. package/dist/gateway/types.js.map +1 -0
  507. package/dist/http/server.d.ts +80 -0
  508. package/dist/http/server.d.ts.map +1 -0
  509. package/dist/http/server.js +183 -0
  510. package/dist/http/server.js.map +1 -0
  511. package/dist/http/session-manager.d.ts +42 -0
  512. package/dist/http/session-manager.d.ts.map +1 -0
  513. package/dist/http/session-manager.js +82 -0
  514. package/dist/http/session-manager.js.map +1 -0
  515. package/dist/http/workspace-auth.d.ts +9 -0
  516. package/dist/http/workspace-auth.d.ts.map +1 -0
  517. package/dist/http/workspace-auth.js +29 -0
  518. package/dist/http/workspace-auth.js.map +1 -0
  519. package/dist/index.d.ts +10 -0
  520. package/dist/index.d.ts.map +1 -0
  521. package/dist/index.js +10 -0
  522. package/dist/index.js.map +1 -0
  523. package/dist/metrics/mount.d.ts +11 -0
  524. package/dist/metrics/mount.d.ts.map +1 -0
  525. package/dist/metrics/mount.js +13 -0
  526. package/dist/metrics/mount.js.map +1 -0
  527. package/dist/metrics/recorder.d.ts +55 -0
  528. package/dist/metrics/recorder.d.ts.map +1 -0
  529. package/dist/metrics/recorder.js +97 -0
  530. package/dist/metrics/recorder.js.map +1 -0
  531. package/dist/revisions/hash.d.ts +7 -0
  532. package/dist/revisions/hash.d.ts.map +1 -0
  533. package/dist/revisions/hash.js +24 -0
  534. package/dist/revisions/hash.js.map +1 -0
  535. package/dist/revisions/index.d.ts +4 -0
  536. package/dist/revisions/index.d.ts.map +1 -0
  537. package/dist/revisions/index.js +4 -0
  538. package/dist/revisions/index.js.map +1 -0
  539. package/dist/revisions/store.d.ts +69 -0
  540. package/dist/revisions/store.d.ts.map +1 -0
  541. package/dist/revisions/store.js +196 -0
  542. package/dist/revisions/store.js.map +1 -0
  543. package/dist/revisions/types.d.ts +39 -0
  544. package/dist/revisions/types.d.ts.map +1 -0
  545. package/dist/revisions/types.js +2 -0
  546. package/dist/revisions/types.js.map +1 -0
  547. package/dist/server.d.ts +51 -0
  548. package/dist/server.d.ts.map +1 -0
  549. package/dist/server.js +175 -0
  550. package/dist/server.js.map +1 -0
  551. package/dist/skill-tools.d.ts +3 -0
  552. package/dist/skill-tools.d.ts.map +1 -0
  553. package/dist/skill-tools.js +105 -0
  554. package/dist/skill-tools.js.map +1 -0
  555. package/dist/test/test/cli/dispatcher.test.d.ts +2 -0
  556. package/dist/test/test/cli/dispatcher.test.d.ts.map +1 -0
  557. package/dist/test/test/cli/dispatcher.test.js +47 -0
  558. package/dist/test/test/cli/dispatcher.test.js.map +1 -0
  559. package/dist/test/test/cross-ref.test.d.ts +2 -0
  560. package/dist/test/test/cross-ref.test.d.ts.map +1 -0
  561. package/dist/test/test/cross-ref.test.js +39 -0
  562. package/dist/test/test/cross-ref.test.js.map +1 -0
  563. package/dist/test/test/engine/session.test.d.ts +2 -0
  564. package/dist/test/test/engine/session.test.d.ts.map +1 -0
  565. package/dist/test/test/engine/session.test.js +144 -0
  566. package/dist/test/test/engine/session.test.js.map +1 -0
  567. package/dist/test/test/engine/uri-resolver.test.d.ts +2 -0
  568. package/dist/test/test/engine/uri-resolver.test.d.ts.map +1 -0
  569. package/dist/test/test/engine/uri-resolver.test.js +38 -0
  570. package/dist/test/test/engine/uri-resolver.test.js.map +1 -0
  571. package/dist/test/test/frontmatter.test.d.ts +2 -0
  572. package/dist/test/test/frontmatter.test.d.ts.map +1 -0
  573. package/dist/test/test/frontmatter.test.js +55 -0
  574. package/dist/test/test/frontmatter.test.js.map +1 -0
  575. package/dist/test/test/gateway/hosted-stub.test.d.ts +2 -0
  576. package/dist/test/test/gateway/hosted-stub.test.d.ts.map +1 -0
  577. package/dist/test/test/gateway/hosted-stub.test.js +11 -0
  578. package/dist/test/test/gateway/hosted-stub.test.js.map +1 -0
  579. package/dist/test/test/gateway/local.test.d.ts +2 -0
  580. package/dist/test/test/gateway/local.test.d.ts.map +1 -0
  581. package/dist/test/test/gateway/local.test.js +29 -0
  582. package/dist/test/test/gateway/local.test.js.map +1 -0
  583. package/dist/test/test/handbook-contract.test.d.ts +2 -0
  584. package/dist/test/test/handbook-contract.test.d.ts.map +1 -0
  585. package/dist/test/test/handbook-contract.test.js +71 -0
  586. package/dist/test/test/handbook-contract.test.js.map +1 -0
  587. package/dist/test/test/http/server.test.d.ts +2 -0
  588. package/dist/test/test/http/server.test.d.ts.map +1 -0
  589. package/dist/test/test/http/server.test.js +245 -0
  590. package/dist/test/test/http/server.test.js.map +1 -0
  591. package/dist/test/test/http/session-manager.test.d.ts +2 -0
  592. package/dist/test/test/http/session-manager.test.d.ts.map +1 -0
  593. package/dist/test/test/http/session-manager.test.js +83 -0
  594. package/dist/test/test/http/session-manager.test.js.map +1 -0
  595. package/dist/test/test/revisions/hash.test.d.ts +2 -0
  596. package/dist/test/test/revisions/hash.test.d.ts.map +1 -0
  597. package/dist/test/test/revisions/hash.test.js +33 -0
  598. package/dist/test/test/revisions/hash.test.js.map +1 -0
  599. package/dist/test/test/revisions/store.test.d.ts +2 -0
  600. package/dist/test/test/revisions/store.test.d.ts.map +1 -0
  601. package/dist/test/test/revisions/store.test.js +245 -0
  602. package/dist/test/test/revisions/store.test.js.map +1 -0
  603. package/dist/test/test/server.test.d.ts +2 -0
  604. package/dist/test/test/server.test.d.ts.map +1 -0
  605. package/dist/test/test/server.test.js +157 -0
  606. package/dist/test/test/server.test.js.map +1 -0
  607. package/dist/test/test/skill-tools.test.d.ts +2 -0
  608. package/dist/test/test/skill-tools.test.d.ts.map +1 -0
  609. package/dist/test/test/skill-tools.test.js +84 -0
  610. package/dist/test/test/skill-tools.test.js.map +1 -0
  611. package/dist/test/test/smoke.test.d.ts +2 -0
  612. package/dist/test/test/smoke.test.d.ts.map +1 -0
  613. package/dist/test/test/smoke.test.js +8 -0
  614. package/dist/test/test/smoke.test.js.map +1 -0
  615. package/dist/test/test/tools/asset-generate.test.d.ts +2 -0
  616. package/dist/test/test/tools/asset-generate.test.d.ts.map +1 -0
  617. package/dist/test/test/tools/asset-generate.test.js +66 -0
  618. package/dist/test/test/tools/asset-generate.test.js.map +1 -0
  619. package/dist/test/test/tools/edit.test.d.ts +2 -0
  620. package/dist/test/test/tools/edit.test.d.ts.map +1 -0
  621. package/dist/test/test/tools/edit.test.js +205 -0
  622. package/dist/test/test/tools/edit.test.js.map +1 -0
  623. package/dist/test/test/tools/export.test.d.ts +2 -0
  624. package/dist/test/test/tools/export.test.d.ts.map +1 -0
  625. package/dist/test/test/tools/export.test.js +144 -0
  626. package/dist/test/test/tools/export.test.js.map +1 -0
  627. package/dist/test/test/tools/history.test.d.ts +2 -0
  628. package/dist/test/test/tools/history.test.d.ts.map +1 -0
  629. package/dist/test/test/tools/history.test.js +29 -0
  630. package/dist/test/test/tools/history.test.js.map +1 -0
  631. package/dist/test/test/tools/inspect.test.d.ts +2 -0
  632. package/dist/test/test/tools/inspect.test.d.ts.map +1 -0
  633. package/dist/test/test/tools/inspect.test.js +62 -0
  634. package/dist/test/test/tools/inspect.test.js.map +1 -0
  635. package/dist/test/test/tools/list.test.d.ts +2 -0
  636. package/dist/test/test/tools/list.test.d.ts.map +1 -0
  637. package/dist/test/test/tools/list.test.js +23 -0
  638. package/dist/test/test/tools/list.test.js.map +1 -0
  639. package/dist/test/test/tools/open-editor.test.d.ts +2 -0
  640. package/dist/test/test/tools/open-editor.test.d.ts.map +1 -0
  641. package/dist/test/test/tools/open-editor.test.js +53 -0
  642. package/dist/test/test/tools/open-editor.test.js.map +1 -0
  643. package/dist/test/test/tools/preview.test.d.ts +2 -0
  644. package/dist/test/test/tools/preview.test.d.ts.map +1 -0
  645. package/dist/test/test/tools/preview.test.js +73 -0
  646. package/dist/test/test/tools/preview.test.js.map +1 -0
  647. package/dist/test/test/tools/rename.test.d.ts +2 -0
  648. package/dist/test/test/tools/rename.test.d.ts.map +1 -0
  649. package/dist/test/test/tools/rename.test.js +17 -0
  650. package/dist/test/test/tools/rename.test.js.map +1 -0
  651. package/dist/test/test/viewer/broadcaster.test.d.ts +2 -0
  652. package/dist/test/test/viewer/broadcaster.test.d.ts.map +1 -0
  653. package/dist/test/test/viewer/broadcaster.test.js +53 -0
  654. package/dist/test/test/viewer/broadcaster.test.js.map +1 -0
  655. package/dist/test/test/viewer/resource-route.test.d.ts +2 -0
  656. package/dist/test/test/viewer/resource-route.test.d.ts.map +1 -0
  657. package/dist/test/test/viewer/resource-route.test.js +70 -0
  658. package/dist/test/test/viewer/resource-route.test.js.map +1 -0
  659. package/dist/test/test/viewer/router.test.d.ts +2 -0
  660. package/dist/test/test/viewer/router.test.d.ts.map +1 -0
  661. package/dist/test/test/viewer/router.test.js +171 -0
  662. package/dist/test/test/viewer/router.test.js.map +1 -0
  663. package/dist/test/test/viewer/url-builder.test.d.ts +2 -0
  664. package/dist/test/test/viewer/url-builder.test.d.ts.map +1 -0
  665. package/dist/test/test/viewer/url-builder.test.js +31 -0
  666. package/dist/test/test/viewer/url-builder.test.js.map +1 -0
  667. package/dist/test/test/workspace/hosted-stub.test.d.ts +2 -0
  668. package/dist/test/test/workspace/hosted-stub.test.d.ts.map +1 -0
  669. package/dist/test/test/workspace/hosted-stub.test.js +30 -0
  670. package/dist/test/test/workspace/hosted-stub.test.js.map +1 -0
  671. package/dist/test/test/workspace/in-memory.test.d.ts +2 -0
  672. package/dist/test/test/workspace/in-memory.test.d.ts.map +1 -0
  673. package/dist/test/test/workspace/in-memory.test.js +4 -0
  674. package/dist/test/test/workspace/in-memory.test.js.map +1 -0
  675. package/dist/test/test/workspace/node-fs.test.d.ts +2 -0
  676. package/dist/test/test/workspace/node-fs.test.d.ts.map +1 -0
  677. package/dist/test/test/workspace/node-fs.test.js +20 -0
  678. package/dist/test/test/workspace/node-fs.test.js.map +1 -0
  679. package/dist/test/test/workspace/shared-contract.d.ts +3 -0
  680. package/dist/test/test/workspace/shared-contract.d.ts.map +1 -0
  681. package/dist/test/test/workspace/shared-contract.js +92 -0
  682. package/dist/test/test/workspace/shared-contract.js.map +1 -0
  683. package/dist/test/tsconfig.test.tsbuildinfo +1 -0
  684. package/dist/test/vitest.config.d.ts +3 -0
  685. package/dist/test/vitest.config.d.ts.map +1 -0
  686. package/dist/test/vitest.config.js +8 -0
  687. package/dist/test/vitest.config.js.map +1 -0
  688. package/dist/tools/asset-generate.d.ts +12 -0
  689. package/dist/tools/asset-generate.d.ts.map +1 -0
  690. package/dist/tools/asset-generate.js +112 -0
  691. package/dist/tools/asset-generate.js.map +1 -0
  692. package/dist/tools/asset-search.d.ts +10 -0
  693. package/dist/tools/asset-search.d.ts.map +1 -0
  694. package/dist/tools/asset-search.js +120 -0
  695. package/dist/tools/asset-search.js.map +1 -0
  696. package/dist/tools/content-types.d.ts +11 -0
  697. package/dist/tools/content-types.d.ts.map +1 -0
  698. package/dist/tools/content-types.js +2 -0
  699. package/dist/tools/content-types.js.map +1 -0
  700. package/dist/tools/edit.d.ts +29 -0
  701. package/dist/tools/edit.d.ts.map +1 -0
  702. package/dist/tools/edit.js +165 -0
  703. package/dist/tools/edit.js.map +1 -0
  704. package/dist/tools/engine.d.ts +31 -0
  705. package/dist/tools/engine.d.ts.map +1 -0
  706. package/dist/tools/engine.js +59 -0
  707. package/dist/tools/engine.js.map +1 -0
  708. package/dist/tools/export.d.ts +19 -0
  709. package/dist/tools/export.d.ts.map +1 -0
  710. package/dist/tools/export.js +179 -0
  711. package/dist/tools/export.js.map +1 -0
  712. package/dist/tools/history.d.ts +7 -0
  713. package/dist/tools/history.d.ts.map +1 -0
  714. package/dist/tools/history.js +54 -0
  715. package/dist/tools/history.js.map +1 -0
  716. package/dist/tools/index.d.ts +35 -0
  717. package/dist/tools/index.d.ts.map +1 -0
  718. package/dist/tools/index.js +72 -0
  719. package/dist/tools/index.js.map +1 -0
  720. package/dist/tools/inspect.d.ts +7 -0
  721. package/dist/tools/inspect.d.ts.map +1 -0
  722. package/dist/tools/inspect.js +80 -0
  723. package/dist/tools/inspect.js.map +1 -0
  724. package/dist/tools/list.d.ts +7 -0
  725. package/dist/tools/list.d.ts.map +1 -0
  726. package/dist/tools/list.js +18 -0
  727. package/dist/tools/list.js.map +1 -0
  728. package/dist/tools/metrics.d.ts +11 -0
  729. package/dist/tools/metrics.d.ts.map +1 -0
  730. package/dist/tools/metrics.js +28 -0
  731. package/dist/tools/metrics.js.map +1 -0
  732. package/dist/tools/open-editor.d.ts +10 -0
  733. package/dist/tools/open-editor.d.ts.map +1 -0
  734. package/dist/tools/open-editor.js +62 -0
  735. package/dist/tools/open-editor.js.map +1 -0
  736. package/dist/tools/preview.d.ts +12 -0
  737. package/dist/tools/preview.d.ts.map +1 -0
  738. package/dist/tools/preview.js +104 -0
  739. package/dist/tools/preview.js.map +1 -0
  740. package/dist/tools/rename.d.ts +7 -0
  741. package/dist/tools/rename.d.ts.map +1 -0
  742. package/dist/tools/rename.js +39 -0
  743. package/dist/tools/rename.js.map +1 -0
  744. package/dist/tools/result.d.ts +12 -0
  745. package/dist/tools/result.d.ts.map +1 -0
  746. package/dist/tools/result.js +55 -0
  747. package/dist/tools/result.js.map +1 -0
  748. package/dist/tools/save.d.ts +19 -0
  749. package/dist/tools/save.d.ts.map +1 -0
  750. package/dist/tools/save.js +117 -0
  751. package/dist/tools/save.js.map +1 -0
  752. package/dist/viewer/broadcaster.d.ts +13 -0
  753. package/dist/viewer/broadcaster.d.ts.map +1 -0
  754. package/dist/viewer/broadcaster.js +44 -0
  755. package/dist/viewer/broadcaster.js.map +1 -0
  756. package/dist/viewer/index.d.ts +7 -0
  757. package/dist/viewer/index.d.ts.map +1 -0
  758. package/dist/viewer/index.js +7 -0
  759. package/dist/viewer/index.js.map +1 -0
  760. package/dist/viewer/listener.d.ts +16 -0
  761. package/dist/viewer/listener.d.ts.map +1 -0
  762. package/dist/viewer/listener.js +30 -0
  763. package/dist/viewer/listener.js.map +1 -0
  764. package/dist/viewer/presigned-r2-url-builder.d.ts +30 -0
  765. package/dist/viewer/presigned-r2-url-builder.d.ts.map +1 -0
  766. package/dist/viewer/presigned-r2-url-builder.js +40 -0
  767. package/dist/viewer/presigned-r2-url-builder.js.map +1 -0
  768. package/dist/viewer/resource-route.d.ts +9 -0
  769. package/dist/viewer/resource-route.d.ts.map +1 -0
  770. package/dist/viewer/resource-route.js +59 -0
  771. package/dist/viewer/resource-route.js.map +1 -0
  772. package/dist/viewer/router.d.ts +20 -0
  773. package/dist/viewer/router.d.ts.map +1 -0
  774. package/dist/viewer/router.js +142 -0
  775. package/dist/viewer/router.js.map +1 -0
  776. package/dist/viewer/session-mount.d.ts +10 -0
  777. package/dist/viewer/session-mount.d.ts.map +1 -0
  778. package/dist/viewer/session-mount.js +24 -0
  779. package/dist/viewer/session-mount.js.map +1 -0
  780. package/dist/viewer/spa-assets.generated.d.ts +2 -0
  781. package/dist/viewer/spa-assets.generated.d.ts.map +1 -0
  782. package/dist/viewer/spa-assets.generated.js +989 -0
  783. package/dist/viewer/spa-assets.generated.js.map +1 -0
  784. package/dist/viewer/url-builder.d.ts +48 -0
  785. package/dist/viewer/url-builder.d.ts.map +1 -0
  786. package/dist/viewer/url-builder.js +38 -0
  787. package/dist/viewer/url-builder.js.map +1 -0
  788. package/dist/workspace/hosted-stub.d.ts +28 -0
  789. package/dist/workspace/hosted-stub.d.ts.map +1 -0
  790. package/dist/workspace/hosted-stub.js +44 -0
  791. package/dist/workspace/hosted-stub.js.map +1 -0
  792. package/dist/workspace/in-memory.d.ts +23 -0
  793. package/dist/workspace/in-memory.d.ts.map +1 -0
  794. package/dist/workspace/in-memory.js +161 -0
  795. package/dist/workspace/in-memory.js.map +1 -0
  796. package/dist/workspace/index.d.ts +6 -0
  797. package/dist/workspace/index.d.ts.map +1 -0
  798. package/dist/workspace/index.js +6 -0
  799. package/dist/workspace/index.js.map +1 -0
  800. package/dist/workspace/node-fs.d.ts +23 -0
  801. package/dist/workspace/node-fs.d.ts.map +1 -0
  802. package/dist/workspace/node-fs.js +90 -0
  803. package/dist/workspace/node-fs.js.map +1 -0
  804. package/dist/workspace/s3.d.ts +32 -0
  805. package/dist/workspace/s3.d.ts.map +1 -0
  806. package/dist/workspace/s3.js +191 -0
  807. package/dist/workspace/s3.js.map +1 -0
  808. package/dist/workspace/scoped.d.ts +32 -0
  809. package/dist/workspace/scoped.d.ts.map +1 -0
  810. package/dist/workspace/scoped.js +76 -0
  811. package/dist/workspace/scoped.js.map +1 -0
  812. package/dist/workspace/types.d.ts +75 -0
  813. package/dist/workspace/types.d.ts.map +1 -0
  814. package/dist/workspace/types.js +18 -0
  815. package/dist/workspace/types.js.map +1 -0
  816. package/package.json +80 -0
@@ -0,0 +1,698 @@
1
+ > This is one page of the CE.SDK Vanilla JS/TS documentation. For a complete overview, see the [Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md). For all docs in one file, see [llms-full.txt](./llms-full.txt.md).
2
+
3
+ **Navigation:** [Guides](./guides.md) > [Export Media Assets](./export-save-publish/export.md) > [Pre-Export Validation](./export-save-publish/pre-export-validation.md)
4
+
5
+ ---
6
+
7
+ Validate your design before export by detecting elements outside the page,
8
+ protruding content, obscured text, and other issues that could affect the
9
+ final output quality.
10
+
11
+ ![Pre-Export Validation example showing validation workflow](https://img.ly/docs/cesdk/./assets/browser.hero.webp)
12
+
13
+ > **Reading time:** 10 minutes
14
+ >
15
+ > **Resources:**
16
+ >
17
+ > - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
18
+ > - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-export-save-publish-export-pre-export-validation-browser)
19
+ > - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-export-save-publish-export-pre-export-validation-browser)
20
+ > - [Live demo](https://img.ly/docs/cesdk/examples/guides-export-save-publish-export-pre-export-validation-browser/)
21
+
22
+ Pre-export validation catches layout and quality issues before export, preventing problems like cropped content, hidden text, and elements missing from the final output. Production-quality designs require elements to be properly positioned within the page boundaries.
23
+
24
+ ```typescript file=@cesdk_web_examples/guides-export-save-publish-export-pre-export-validation-browser/browser.ts reference-only
25
+ import type {
26
+ CreativeEngine,
27
+ EditorPlugin,
28
+ EditorPluginContext
29
+ } from '@cesdk/cesdk-js';
30
+ import type CreativeEditorSDK from '@cesdk/cesdk-js';
31
+
32
+ import {
33
+ BlurAssetSource,
34
+ ColorPaletteAssetSource,
35
+ CropPresetsAssetSource,
36
+ DemoAssetSources,
37
+ EffectsAssetSource,
38
+ FiltersAssetSource,
39
+ PagePresetsAssetSource,
40
+ StickerAssetSource,
41
+ TextAssetSource,
42
+ TextComponentAssetSource,
43
+ TypefaceAssetSource,
44
+ UploadAssetSources,
45
+ VectorShapeAssetSource
46
+ } from '@cesdk/cesdk-js/plugins';
47
+ import { DesignEditorConfig } from './design-editor/plugin';
48
+ import packageJson from './package.json';
49
+
50
+ type ValidationSeverity = 'error' | 'warning';
51
+
52
+ interface ValidationIssue {
53
+ type:
54
+ | 'outside_page'
55
+ | 'protruding'
56
+ | 'text_obscured'
57
+ | 'unfilled_placeholder';
58
+ severity: ValidationSeverity;
59
+ blockId: number;
60
+ blockName: string;
61
+ message: string;
62
+ }
63
+
64
+ interface ValidationResult {
65
+ errors: ValidationIssue[];
66
+ warnings: ValidationIssue[];
67
+ }
68
+
69
+ class Example implements EditorPlugin {
70
+ name = packageJson.name;
71
+ version = packageJson.version;
72
+
73
+ async initialize({ cesdk }: EditorPluginContext): Promise<void> {
74
+ if (!cesdk) {
75
+ throw new Error('CE.SDK instance is required for this plugin');
76
+ }
77
+ await cesdk.addPlugin(new DesignEditorConfig());
78
+
79
+ // Add asset source plugins
80
+ await cesdk.addPlugin(new BlurAssetSource());
81
+ await cesdk.addPlugin(new ColorPaletteAssetSource());
82
+ await cesdk.addPlugin(new CropPresetsAssetSource());
83
+ await cesdk.addPlugin(
84
+ new UploadAssetSources({ include: ['ly.img.image.upload'] })
85
+ );
86
+ await cesdk.addPlugin(
87
+ new DemoAssetSources({
88
+ include: [
89
+ 'ly.img.templates.blank.*',
90
+ 'ly.img.templates.presentation.*',
91
+ 'ly.img.templates.print.*',
92
+ 'ly.img.templates.social.*',
93
+ 'ly.img.image.*'
94
+ ]
95
+ })
96
+ );
97
+ await cesdk.addPlugin(new EffectsAssetSource());
98
+ await cesdk.addPlugin(new FiltersAssetSource());
99
+ await cesdk.addPlugin(new PagePresetsAssetSource());
100
+ await cesdk.addPlugin(new StickerAssetSource());
101
+ await cesdk.addPlugin(new TextAssetSource());
102
+ await cesdk.addPlugin(new TextComponentAssetSource());
103
+ await cesdk.addPlugin(new TypefaceAssetSource());
104
+ await cesdk.addPlugin(new VectorShapeAssetSource());
105
+
106
+ await cesdk.actions.run('scene.create', {
107
+ page: { width: 800, height: 600, unit: 'Pixel' }
108
+ });
109
+
110
+ const engine = cesdk.engine;
111
+
112
+ // Set role to adopter so placeholders can be replaced
113
+ engine.editor.setRole('Adopter');
114
+
115
+ const page = engine.block.findByType('page')[0];
116
+
117
+ await this.createDemoScene(engine, page);
118
+ this.overrideExportAction(cesdk, engine);
119
+ }
120
+
121
+ private async createDemoScene(
122
+ engine: CreativeEngine,
123
+ page: number
124
+ ): Promise<void> {
125
+ const pageWidth = engine.block.getWidth(page);
126
+ const pageHeight = engine.block.getHeight(page);
127
+ const centerY = pageHeight / 2;
128
+
129
+ // Row 1: Main validation examples (horizontally aligned)
130
+ const row1Y = centerY - 120;
131
+ const elementWidth = 150;
132
+ const elementHeight = 100;
133
+ const spacing = 20;
134
+
135
+ // Calculate positions for 4 elements in a row
136
+ const totalRowWidth = elementWidth * 4 + spacing * 3;
137
+ const startX = (pageWidth - totalRowWidth) / 2;
138
+
139
+ // Create an image that's outside the page (will trigger error)
140
+ // Positioned to the left of the page - completely outside
141
+ const outsideImage = engine.block.create('graphic');
142
+ engine.block.setName(outsideImage, 'Outside Image');
143
+ engine.block.setShape(outsideImage, engine.block.createShape('rect'));
144
+ const outsideFill = engine.block.createFill('image');
145
+ engine.block.setString(
146
+ outsideFill,
147
+ 'fill/image/imageFileURI',
148
+ 'https://img.ly/static/ubq_samples/sample_1.jpg'
149
+ );
150
+ engine.block.setFill(outsideImage, outsideFill);
151
+ engine.block.setWidth(outsideImage, elementWidth);
152
+ engine.block.setHeight(outsideImage, elementHeight);
153
+ engine.block.setPositionX(outsideImage, -elementWidth - 10); // Left of the page
154
+ engine.block.setPositionY(outsideImage, row1Y);
155
+ engine.block.appendChild(page, outsideImage);
156
+
157
+ // Create a properly placed image for reference (first in row)
158
+ const validImage = engine.block.create('graphic');
159
+ engine.block.setName(validImage, 'Valid Image');
160
+ engine.block.setShape(validImage, engine.block.createShape('rect'));
161
+ const validFill = engine.block.createFill('image');
162
+ engine.block.setString(
163
+ validFill,
164
+ 'fill/image/imageFileURI',
165
+ 'https://img.ly/static/ubq_samples/sample_3.jpg'
166
+ );
167
+ engine.block.setFill(validImage, validFill);
168
+ engine.block.setWidth(validImage, elementWidth);
169
+ engine.block.setHeight(validImage, elementHeight);
170
+ engine.block.setPositionX(validImage, startX);
171
+ engine.block.setPositionY(validImage, row1Y);
172
+ engine.block.appendChild(page, validImage);
173
+
174
+ // Create unfilled placeholder (second in row - triggers error)
175
+ const placeholder = engine.block.create('graphic');
176
+ engine.block.setName(placeholder, 'Unfilled Placeholder');
177
+ engine.block.setShape(placeholder, engine.block.createShape('rect'));
178
+ const placeholderFill = engine.block.createFill('image');
179
+ engine.block.setFill(placeholder, placeholderFill);
180
+ engine.block.setWidth(placeholder, elementWidth);
181
+ engine.block.setHeight(placeholder, elementHeight);
182
+ engine.block.setPositionX(placeholder, startX + elementWidth + spacing);
183
+ engine.block.setPositionY(placeholder, row1Y);
184
+ engine.block.appendChild(page, placeholder);
185
+ engine.block.setScopeEnabled(placeholder, 'fill/change', true);
186
+ engine.block.setPlaceholderBehaviorEnabled(placeholderFill, true);
187
+ engine.block.setPlaceholderEnabled(placeholder, true);
188
+ engine.block.setPlaceholderControlsOverlayEnabled(placeholder, true);
189
+ engine.block.setPlaceholderControlsButtonEnabled(placeholder, true);
190
+
191
+ // Create text that will be partially obscured (third in row)
192
+ const obscuredText = engine.block.create('text');
193
+ engine.block.setName(obscuredText, 'Obscured Text');
194
+ engine.block.setPositionX(
195
+ obscuredText,
196
+ startX + (elementWidth + spacing) * 2
197
+ );
198
+ engine.block.setPositionY(obscuredText, row1Y);
199
+ engine.block.setWidth(obscuredText, elementWidth);
200
+ engine.block.setHeight(obscuredText, elementHeight);
201
+ engine.block.replaceText(obscuredText, 'Hidden');
202
+ engine.block.setFloat(obscuredText, 'text/fontSize', 48);
203
+ engine.block.appendChild(page, obscuredText);
204
+
205
+ // Create a shape that overlaps the text (added after text = on top)
206
+ const overlappingShape = engine.block.create('graphic');
207
+ engine.block.setName(overlappingShape, 'Overlapping Shape');
208
+ engine.block.setShape(overlappingShape, engine.block.createShape('rect'));
209
+ const shapeFill = engine.block.createFill('color');
210
+ engine.block.setColor(shapeFill, 'fill/color/value', {
211
+ r: 0.2,
212
+ g: 0.4,
213
+ b: 0.8,
214
+ a: 0.8
215
+ });
216
+ engine.block.setFill(overlappingShape, shapeFill);
217
+ engine.block.setWidth(overlappingShape, elementWidth);
218
+ engine.block.setHeight(overlappingShape, elementHeight);
219
+ engine.block.setPositionX(
220
+ overlappingShape,
221
+ startX + (elementWidth + spacing) * 2
222
+ );
223
+ engine.block.setPositionY(overlappingShape, row1Y);
224
+ engine.block.appendChild(page, overlappingShape);
225
+
226
+ // Create an image that protrudes from the page (fourth in row - will trigger warning)
227
+ // Extends past right page boundary
228
+ const protrudingImage = engine.block.create('graphic');
229
+ engine.block.setName(protrudingImage, 'Protruding Image');
230
+ engine.block.setShape(protrudingImage, engine.block.createShape('rect'));
231
+ const protrudingFill = engine.block.createFill('image');
232
+ engine.block.setString(
233
+ protrudingFill,
234
+ 'fill/image/imageFileURI',
235
+ 'https://img.ly/static/ubq_samples/sample_2.jpg'
236
+ );
237
+ engine.block.setFill(protrudingImage, protrudingFill);
238
+ engine.block.setWidth(protrudingImage, elementWidth);
239
+ engine.block.setHeight(protrudingImage, elementHeight);
240
+ engine.block.setPositionX(protrudingImage, pageWidth - elementWidth / 2); // Extends 75px past right
241
+ engine.block.setPositionY(protrudingImage, row1Y);
242
+ engine.block.appendChild(page, protrudingImage);
243
+
244
+ // Add explanatory text below the row
245
+ const explanationText = engine.block.create('text');
246
+ engine.block.setPositionX(explanationText, 50);
247
+ engine.block.setPositionY(explanationText, row1Y + elementHeight + 40);
248
+ engine.block.setWidth(explanationText, pageWidth - 100);
249
+ engine.block.setHeightMode(explanationText, 'Auto');
250
+ engine.block.replaceText(
251
+ explanationText,
252
+ 'Click Export to run validation. Move elements to fix issues.'
253
+ );
254
+ engine.block.setFloat(explanationText, 'text/fontSize', 48);
255
+ engine.block.setEnum(explanationText, 'text/horizontalAlignment', 'Center');
256
+ engine.block.appendChild(page, explanationText);
257
+ }
258
+
259
+ private getBoundingBox(
260
+ engine: CreativeEngine,
261
+ blockId: number
262
+ ): [number, number, number, number] {
263
+ const x = engine.block.getGlobalBoundingBoxX(blockId);
264
+ const y = engine.block.getGlobalBoundingBoxY(blockId);
265
+ const width = engine.block.getGlobalBoundingBoxWidth(blockId);
266
+ const height = engine.block.getGlobalBoundingBoxHeight(blockId);
267
+ return [x, y, x + width, y + height];
268
+ }
269
+
270
+ private calculateOverlap(
271
+ box1: [number, number, number, number],
272
+ box2: [number, number, number, number]
273
+ ): number {
274
+ const [ax1, ay1, ax2, ay2] = box1;
275
+ const [bx1, by1, bx2, by2] = box2;
276
+
277
+ const overlapWidth = Math.max(0, Math.min(ax2, bx2) - Math.max(ax1, bx1));
278
+ const overlapHeight = Math.max(0, Math.min(ay2, by2) - Math.max(ay1, by1));
279
+ const overlapArea = overlapWidth * overlapHeight;
280
+
281
+ const box1Area = (ax2 - ax1) * (ay2 - ay1);
282
+ if (box1Area === 0) return 0;
283
+
284
+ return overlapArea / box1Area;
285
+ }
286
+
287
+ private getBlockName(engine: CreativeEngine, blockId: number): string {
288
+ const name = engine.block.getName(blockId);
289
+ if (name) return name;
290
+ const kind = engine.block.getKind(blockId);
291
+ return kind.charAt(0).toUpperCase() + kind.slice(1);
292
+ }
293
+
294
+ private getRelevantBlocks(engine: CreativeEngine): number[] {
295
+ return [
296
+ ...engine.block.findByType('text'),
297
+ ...engine.block.findByType('graphic')
298
+ ];
299
+ }
300
+
301
+ private findOutsideBlocks(
302
+ engine: CreativeEngine,
303
+ page: number
304
+ ): ValidationIssue[] {
305
+ const issues: ValidationIssue[] = [];
306
+ const pageBounds = this.getBoundingBox(engine, page);
307
+
308
+ for (const blockId of this.getRelevantBlocks(engine)) {
309
+ if (!engine.block.isValid(blockId)) continue;
310
+
311
+ const blockBounds = this.getBoundingBox(engine, blockId);
312
+ const overlap = this.calculateOverlap(blockBounds, pageBounds);
313
+
314
+ if (overlap === 0) {
315
+ // Element is completely outside the page
316
+ issues.push({
317
+ type: 'outside_page',
318
+ severity: 'error',
319
+ blockId,
320
+ blockName: this.getBlockName(engine, blockId),
321
+ message: 'Element is completely outside the visible page area'
322
+ });
323
+ }
324
+ }
325
+
326
+ return issues;
327
+ }
328
+
329
+ private findProtrudingBlocks(
330
+ engine: CreativeEngine,
331
+ page: number
332
+ ): ValidationIssue[] {
333
+ const issues: ValidationIssue[] = [];
334
+ const pageBounds = this.getBoundingBox(engine, page);
335
+
336
+ for (const blockId of this.getRelevantBlocks(engine)) {
337
+ if (!engine.block.isValid(blockId)) continue;
338
+
339
+ // Compare element bounds against page bounds
340
+ const blockBounds = this.getBoundingBox(engine, blockId);
341
+ const overlap = this.calculateOverlap(blockBounds, pageBounds);
342
+
343
+ // Protruding: partially inside (overlap > 0) but not fully inside (overlap < 1)
344
+ if (overlap > 0 && overlap < 0.99) {
345
+ issues.push({
346
+ type: 'protruding',
347
+ severity: 'warning',
348
+ blockId,
349
+ blockName: this.getBlockName(engine, blockId),
350
+ message: 'Element extends beyond page boundaries'
351
+ });
352
+ }
353
+ }
354
+
355
+ return issues;
356
+ }
357
+
358
+ private findObscuredText(
359
+ engine: CreativeEngine,
360
+ page: number
361
+ ): ValidationIssue[] {
362
+ const issues: ValidationIssue[] = [];
363
+ const children = engine.block.getChildren(page);
364
+ const textBlocks = engine.block.findByType('text');
365
+
366
+ for (const textId of textBlocks) {
367
+ if (!engine.block.isValid(textId)) continue;
368
+
369
+ const textIndex = children.indexOf(textId);
370
+ if (textIndex === -1) continue;
371
+
372
+ // Elements later in children array are rendered on top
373
+ const blocksAbove = children.slice(textIndex + 1);
374
+
375
+ for (const aboveId of blocksAbove) {
376
+ // Skip text blocks - they don't typically obscure other text
377
+ if (engine.block.getType(aboveId) === '//ly.img.ubq/text') continue;
378
+
379
+ const overlap = this.calculateOverlap(
380
+ this.getBoundingBox(engine, textId),
381
+ this.getBoundingBox(engine, aboveId)
382
+ );
383
+
384
+ if (overlap > 0) {
385
+ // Text is obscured by element above it
386
+ issues.push({
387
+ type: 'text_obscured',
388
+ severity: 'warning',
389
+ blockId: textId,
390
+ blockName: this.getBlockName(engine, textId),
391
+ message: 'Text may be partially hidden by overlapping elements'
392
+ });
393
+ break;
394
+ }
395
+ }
396
+ }
397
+
398
+ return issues;
399
+ }
400
+
401
+ private findUnfilledPlaceholders(engine: CreativeEngine): ValidationIssue[] {
402
+ const issues: ValidationIssue[] = [];
403
+ const placeholders = engine.block.findAllPlaceholders();
404
+
405
+ for (const blockId of placeholders) {
406
+ if (!engine.block.isValid(blockId)) continue;
407
+
408
+ if (!this.isPlaceholderFilled(engine, blockId)) {
409
+ issues.push({
410
+ type: 'unfilled_placeholder',
411
+ severity: 'error',
412
+ blockId,
413
+ blockName: this.getBlockName(engine, blockId),
414
+ message: 'Placeholder has not been filled with content'
415
+ });
416
+ }
417
+ }
418
+
419
+ return issues;
420
+ }
421
+
422
+ private isPlaceholderFilled(
423
+ engine: CreativeEngine,
424
+ blockId: number
425
+ ): boolean {
426
+ const fillId = engine.block.getFill(blockId);
427
+ if (!fillId || !engine.block.isValid(fillId)) return false;
428
+
429
+ const fillType = engine.block.getType(fillId);
430
+
431
+ // Check image fill - empty URI means unfilled placeholder
432
+ if (fillType === '//ly.img.ubq/fill/image') {
433
+ const imageUri = engine.block.getString(
434
+ fillId,
435
+ 'fill/image/imageFileURI'
436
+ );
437
+ return imageUri !== '' && imageUri !== undefined;
438
+ }
439
+
440
+ // Other fill types are considered filled
441
+ return true;
442
+ }
443
+
444
+ private validateDesign(engine: CreativeEngine): ValidationResult {
445
+ const page = engine.block.findByType('page')[0];
446
+
447
+ const outsideIssues = this.findOutsideBlocks(engine, page);
448
+ const protrudingIssues = this.findProtrudingBlocks(engine, page);
449
+ const obscuredIssues = this.findObscuredText(engine, page);
450
+ const placeholderIssues = this.findUnfilledPlaceholders(engine);
451
+
452
+ const allIssues = [
453
+ ...outsideIssues,
454
+ ...protrudingIssues,
455
+ ...obscuredIssues,
456
+ ...placeholderIssues
457
+ ];
458
+
459
+ return {
460
+ errors: allIssues.filter((i) => i.severity === 'error'),
461
+ warnings: allIssues.filter((i) => i.severity === 'warning')
462
+ };
463
+ }
464
+
465
+ private overrideExportAction(
466
+ cesdk: CreativeEditorSDK,
467
+ engine: CreativeEngine
468
+ ): void {
469
+ cesdk.ui.insertOrderComponent(
470
+ { in: 'ly.img.navigation.bar', position: 'end' },
471
+ {
472
+ id: 'ly.img.actions.navigationBar',
473
+ children: ['ly.img.exportImage.navigationBar']
474
+ }
475
+ );
476
+
477
+ const exportDesign = cesdk.actions.get('exportDesign');
478
+
479
+ cesdk.actions.register('exportDesign', async () => {
480
+ const result = this.validateDesign(engine);
481
+ const hasErrors = result.errors.length > 0;
482
+ const hasWarnings = result.warnings.length > 0;
483
+
484
+ // Log all issues to console for debugging
485
+ if (hasErrors || hasWarnings) {
486
+ console.log('Validation Results:', result);
487
+ }
488
+
489
+ // Block export for errors
490
+ if (hasErrors) {
491
+ cesdk.ui.showNotification({
492
+ message: `${result.errors.length} error(s) found - export blocked`,
493
+ type: 'error',
494
+ duration: 'long'
495
+ });
496
+
497
+ // Select first problematic block
498
+ const firstError = result.errors[0];
499
+ if (engine.block.isValid(firstError.blockId)) {
500
+ engine.block.select(firstError.blockId);
501
+ }
502
+ return;
503
+ }
504
+
505
+ // Show warning but allow export
506
+ if (hasWarnings) {
507
+ cesdk.ui.showNotification({
508
+ message: `${result.warnings.length} warning(s) found - proceeding with export`,
509
+ type: 'warning',
510
+ duration: 'medium'
511
+ });
512
+ }
513
+
514
+ // Proceed with export
515
+ exportDesign();
516
+ });
517
+ }
518
+ }
519
+
520
+ export default Example;
521
+ ```
522
+
523
+ This guide demonstrates how to detect elements outside the page, find protruding content, identify obscured text, and integrate validation into the export workflow.
524
+
525
+ ## Getting Element Bounds
526
+
527
+ To detect spatial issues, we need to get the bounding box of elements in global coordinates. The `getGlobalBoundingBox*` methods return positions that account for all transformations:
528
+
529
+ ```typescript highlight-get-bounding-box
530
+ const x = engine.block.getGlobalBoundingBoxX(blockId);
531
+ const y = engine.block.getGlobalBoundingBoxY(blockId);
532
+ const width = engine.block.getGlobalBoundingBoxWidth(blockId);
533
+ const height = engine.block.getGlobalBoundingBoxHeight(blockId);
534
+ return [x, y, x + width, y + height];
535
+ ```
536
+
537
+ This returns coordinates as `[x1, y1, x2, y2]` representing the top-left and bottom-right corners of the element. The overlap between element and page bounds is calculated as the intersection area divided by the element's total area. An overlap of 0 means completely outside, while 1 (100%) means fully inside.
538
+
539
+ ## Detecting Elements Outside the Page
540
+
541
+ Elements completely outside the page won't appear in the exported output. We find these by checking for blocks with zero overlap with the page bounds:
542
+
543
+ ```typescript highlight-find-outside-blocks
544
+ const blockBounds = this.getBoundingBox(engine, blockId);
545
+ const overlap = this.calculateOverlap(blockBounds, pageBounds);
546
+
547
+ if (overlap === 0) {
548
+ // Element is completely outside the page
549
+ ```
550
+
551
+ These issues are categorized as errors because the content is completely missing from the export.
552
+
553
+ ## Detecting Protruding Elements
554
+
555
+ Elements that extend beyond the page boundaries will be partially cropped in the export. For each block, compare its bounds against the page bounds and calculate the overlap ratio:
556
+
557
+ ```typescript highlight-find-protruding-blocks
558
+ // Compare element bounds against page bounds
559
+ const blockBounds = this.getBoundingBox(engine, blockId);
560
+ const overlap = this.calculateOverlap(blockBounds, pageBounds);
561
+
562
+ // Protruding: partially inside (overlap > 0) but not fully inside (overlap < 1)
563
+ if (overlap > 0 && overlap < 0.99) {
564
+ ```
565
+
566
+ An overlap between 0% and 100% indicates the element is partially inside the page. These issues are warnings because the content is partially visible but may not appear as intended.
567
+
568
+ ## Finding Obscured Text
569
+
570
+ Text hidden behind other elements may be unreadable in the final export. First, get the stacking order and all text blocks:
571
+
572
+ ```typescript highlight-find-obscured-text
573
+ const children = engine.block.getChildren(page);
574
+ const textBlocks = engine.block.findByType('text');
575
+ ```
576
+
577
+ The `getChildren()` method returns blocks in stacking order - elements later in the array are rendered on top. For each text block, check if any non-text element above it overlaps with its bounds:
578
+
579
+ ```typescript highlight-check-text-obscured
580
+ // Elements later in children array are rendered on top
581
+ const blocksAbove = children.slice(textIndex + 1);
582
+
583
+ for (const aboveId of blocksAbove) {
584
+ // Skip text blocks - they don't typically obscure other text
585
+ if (engine.block.getType(aboveId) === '//ly.img.ubq/text') continue;
586
+
587
+ const overlap = this.calculateOverlap(
588
+ this.getBoundingBox(engine, textId),
589
+ this.getBoundingBox(engine, aboveId)
590
+ );
591
+
592
+ if (overlap > 0) {
593
+ // Text is obscured by element above it
594
+ ```
595
+
596
+ We skip text-on-text comparisons since transparent text backgrounds don't typically obscure other text. When overlap is detected, we flag the text as potentially obscured.
597
+
598
+ ## Checking Placeholder Content
599
+
600
+ Placeholders mark areas where users must add content before export. First, find all placeholder blocks in the design:
601
+
602
+ ```typescript highlight-find-placeholders
603
+ const placeholders = engine.block.findAllPlaceholders();
604
+ ```
605
+
606
+ Then inspect each placeholder's fill to determine if content has been added. Get the fill block and check its type to determine the validation logic:
607
+
608
+ ```typescript highlight-check-placeholder-filled
609
+ const fillId = engine.block.getFill(blockId);
610
+ if (!fillId || !engine.block.isValid(fillId)) return false;
611
+
612
+ const fillType = engine.block.getType(fillId);
613
+
614
+ // Check image fill - empty URI means unfilled placeholder
615
+ if (fillType === '//ly.img.ubq/fill/image') {
616
+ const imageUri = engine.block.getString(fillId, 'fill/image/imageFileURI');
617
+ return imageUri !== '' && imageUri !== undefined;
618
+ }
619
+ ```
620
+
621
+ For image placeholders, check if the `fill/image/imageFileURI` property has a value. An empty or undefined URI indicates the placeholder hasn't been filled. Unfilled placeholders are treated as errors that block export, ensuring users complete all required content before exporting.
622
+
623
+ ## Overriding the Export Action
624
+
625
+ Intercept the navigation bar export action using `cesdk.actions.get()` and `cesdk.actions.register()`. The action ID `'exportDesign'` controls the export button in the CE.SDK interface:
626
+
627
+ ```typescript highlight-override-export-action
628
+ cesdk.actions.register('exportDesign', async () => {
629
+ const result = this.validateDesign(engine);
630
+ const hasErrors = result.errors.length > 0;
631
+ const hasWarnings = result.warnings.length > 0;
632
+
633
+ // Log all issues to console for debugging
634
+ if (hasErrors || hasWarnings) {
635
+ console.log('Validation Results:', result);
636
+ }
637
+
638
+ // Block export for errors
639
+ if (hasErrors) {
640
+ cesdk.ui.showNotification({
641
+ message: `${result.errors.length} error(s) found - export blocked`,
642
+ type: 'error',
643
+ duration: 'long'
644
+ });
645
+
646
+ // Select first problematic block
647
+ const firstError = result.errors[0];
648
+ if (engine.block.isValid(firstError.blockId)) {
649
+ engine.block.select(firstError.blockId);
650
+ }
651
+ return;
652
+ }
653
+
654
+ // Show warning but allow export
655
+ if (hasWarnings) {
656
+ cesdk.ui.showNotification({
657
+ message: `${result.warnings.length} warning(s) found - proceeding with export`,
658
+ type: 'warning',
659
+ duration: 'medium'
660
+ });
661
+ }
662
+
663
+ // Proceed with export
664
+ exportDesign();
665
+ });
666
+ ```
667
+
668
+ This override runs validation before export, shows notifications for errors or warnings, and selects the first problematic block to help users locate issues. Export proceeds only when validation passes.
669
+
670
+ ## API Reference
671
+
672
+ | Method | Purpose |
673
+ | --------------------------------------------- | ---------------------------------- |
674
+ | `engine.block.getGlobalBoundingBoxX(id)` | Get element's global X position |
675
+ | `engine.block.getGlobalBoundingBoxY(id)` | Get element's global Y position |
676
+ | `engine.block.getGlobalBoundingBoxWidth(id)` | Get element's global width |
677
+ | `engine.block.getGlobalBoundingBoxHeight(id)` | Get element's global height |
678
+ | `engine.block.findByType(type)` | Find all blocks of a specific type |
679
+ | `engine.block.getChildren(id)` | Get child blocks in stacking order |
680
+ | `engine.block.getType(id)` | Get the block's type string |
681
+ | `engine.block.getName(id)` | Get the block's display name |
682
+ | `engine.block.isValid(id)` | Check if block exists |
683
+ | `engine.block.select(id)` | Select a block in the editor |
684
+ | `engine.block.findAllPlaceholders()` | Find all placeholder blocks |
685
+ | `engine.block.getFill(id)` | Get the fill block |
686
+ | `engine.block.getString(id, property)` | Get a string property value |
687
+ | `cesdk.actions.get(actionId)` | Get an action function (browser) |
688
+ | `cesdk.actions.register(actionId, fn)` | Register an action (browser) |
689
+ | `cesdk.ui.showNotification(options)` | Display notification (browser) |
690
+
691
+ ---
692
+
693
+ ## More Resources
694
+
695
+ - **[Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md)** - Browse all Vanilla JS/TS documentation
696
+ - **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
697
+ - **[Web Documentation](./js.md)** - Interactive documentation with examples
698
+ - **[Support](mailto:support@img.ly)** - Contact IMG.LY support