@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,761 @@
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) > [Rules](./rules.md) > [Moderate Content](./rules/moderate-content.md)
4
+
5
+ ---
6
+
7
+ Use CE.SDK's engine APIs to extract images and text from designs, then integrate with third-party moderation services to detect inappropriate content.
8
+
9
+ > **Reading time:** 8 minutes
10
+ >
11
+ > **Resources:**
12
+ >
13
+ > - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
14
+ > - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-rules-moderate-content-browser)
15
+ > - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-rules-moderate-content-browser)
16
+ > - [Live demo](https://img.ly/docs/cesdk/examples/guides-rules-moderate-content-browser/)
17
+
18
+ ![Content moderation example showing a design with validation results panel displaying moderation checks for images and text](https://img.ly/docs/cesdk/./assets/browser.hero.webp)
19
+
20
+ CE.SDK does not provide prebuilt content moderation workflows. Instead, it provides powerful engine APIs that make it straightforward to extract images and text from designs for moderation by third-party services of your choice. This approach is intentional: content moderation requirements are highly specific to each business, including which categories to check, what thresholds to apply, and which services to use. Similarly, when and where to check content (during editing, before export, on upload) varies based on your workflow and user experience goals.
21
+
22
+ Content moderation helps maintain quality standards and comply with content policies. Unlike built-in validation rules that check technical aspects like resolution or layout, content moderation requires integration with external AI-powered services (Sightengine, AWS Rekognition, OpenAI Moderation API) to analyze visual content (images for weapons, drugs, nudity) and textual content (profanity, hate speech, threats).
23
+
24
+ ```typescript file=@cesdk_web_examples/guides-rules-moderate-content-browser/browser.ts reference-only
25
+ import type {
26
+ CreativeEngine,
27
+ EditorPlugin,
28
+ EditorPluginContext
29
+ } from '@cesdk/cesdk-js';
30
+ import packageJson from './package.json';
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
+
49
+ // Type definitions for content moderation
50
+ interface ImageBlockData {
51
+ blockId: number;
52
+ url: string;
53
+ blockType: string;
54
+ blockName: string;
55
+ }
56
+
57
+ interface TextBlockData {
58
+ blockId: number;
59
+ text: string;
60
+ blockType: string;
61
+ blockName: string;
62
+ }
63
+
64
+ interface ContentCategory {
65
+ name: string;
66
+ description: string;
67
+ state: 'success' | 'warning' | 'failed';
68
+ }
69
+
70
+ interface ValidationResult extends ContentCategory {
71
+ blockId: number;
72
+ blockType: string;
73
+ blockName: string;
74
+ id: string;
75
+ url?: string; // For image blocks
76
+ text?: string; // For text blocks
77
+ }
78
+
79
+ // Mock moderation caches
80
+ const imageCache: Record<string, ContentCategory[]> = {};
81
+ const textCache: Record<string, ContentCategory[]> = {};
82
+
83
+ /**
84
+ * CE.SDK Plugin: Content Moderation Guide
85
+ *
86
+ * Demonstrates implementing automated content moderation for both images and text
87
+ */
88
+ class Example implements EditorPlugin {
89
+ name = packageJson.name;
90
+ version = packageJson.version;
91
+
92
+ async initialize({ cesdk }: EditorPluginContext): Promise<void> {
93
+ if (!cesdk) {
94
+ throw new Error('CE.SDK instance is required for this plugin');
95
+ }
96
+ await cesdk.addPlugin(new DesignEditorConfig());
97
+
98
+ // Add asset source plugins
99
+ await cesdk.addPlugin(new BlurAssetSource());
100
+ await cesdk.addPlugin(new ColorPaletteAssetSource());
101
+ await cesdk.addPlugin(new CropPresetsAssetSource());
102
+ await cesdk.addPlugin(
103
+ new UploadAssetSources({ include: ['ly.img.image.upload'] })
104
+ );
105
+ await cesdk.addPlugin(
106
+ new DemoAssetSources({
107
+ include: [
108
+ 'ly.img.templates.blank.*',
109
+ 'ly.img.templates.presentation.*',
110
+ 'ly.img.templates.print.*',
111
+ 'ly.img.templates.social.*',
112
+ 'ly.img.image.*'
113
+ ]
114
+ })
115
+ );
116
+ await cesdk.addPlugin(new EffectsAssetSource());
117
+ await cesdk.addPlugin(new FiltersAssetSource());
118
+ await cesdk.addPlugin(new PagePresetsAssetSource());
119
+ await cesdk.addPlugin(new StickerAssetSource());
120
+ await cesdk.addPlugin(new TextAssetSource());
121
+ await cesdk.addPlugin(new TextComponentAssetSource());
122
+ await cesdk.addPlugin(new TypefaceAssetSource());
123
+ await cesdk.addPlugin(new VectorShapeAssetSource());
124
+
125
+ await cesdk.actions.run('scene.create', {
126
+ page: { width: 1200, height: 800, unit: 'Pixel' }
127
+ });
128
+
129
+ const engine = cesdk.engine;
130
+ const page = engine.block.findByType('page')[0];
131
+
132
+ const pageHeight = engine.block.getHeight(page);
133
+
134
+ // Create a single sample image
135
+ const imageWidth = 500;
136
+ const imageHeight = 400;
137
+ const imageUri = 'https://img.ly/static/ubq_samples/sample_1.jpg';
138
+
139
+ const imageBlock = await engine.block.addImage(imageUri, {
140
+ size: { width: imageWidth, height: imageHeight }
141
+ });
142
+
143
+ // Position image in center-left
144
+ engine.block.setPositionX(imageBlock, 100);
145
+ engine.block.setPositionY(imageBlock, (pageHeight - imageHeight) / 2);
146
+
147
+ engine.block.appendChild(page, imageBlock);
148
+
149
+ const textBlock = engine.block.create('text');
150
+ engine.block.setString(
151
+ textBlock,
152
+ 'text/text',
153
+ 'Sample text content for moderation testing'
154
+ );
155
+
156
+ // Position text on the right side of the image
157
+ engine.block.setPositionX(textBlock, 650);
158
+ engine.block.setPositionY(textBlock, (pageHeight - 120) / 2);
159
+ engine.block.setWidth(textBlock, 450);
160
+ engine.block.setHeight(textBlock, 120);
161
+
162
+ // Make text larger and more readable
163
+ engine.block.setFloat(textBlock, 'text/fontSize', 48);
164
+ engine.block.setEnum(textBlock, 'text/horizontalAlignment', 'Left');
165
+
166
+ engine.block.appendChild(page, textBlock);
167
+
168
+ await this.demonstrateContentModeration(engine);
169
+
170
+ // Zoom to fit the entire page in the viewport
171
+ await engine.scene.zoomToBlock(page, {
172
+ padding: {
173
+ left: 40,
174
+ top: 40,
175
+ right: 40,
176
+ bottom: 40
177
+ }
178
+ });
179
+ }
180
+
181
+ private async demonstrateContentModeration(
182
+ engine: CreativeEngine
183
+ ): Promise<void> {
184
+ // Check both images and text
185
+ const imageResults = await this.checkImageContent(engine);
186
+ const textResults = await this.checkTextContent(engine);
187
+ const allResults = [...imageResults, ...textResults];
188
+
189
+ // eslint-disable-next-line no-console
190
+ console.log(`Total moderation checks: ${allResults.length}`);
191
+
192
+ const failed = allResults.filter((r) => r.state === 'failed');
193
+ const warnings = allResults.filter((r) => r.state === 'warning');
194
+ const passed = allResults.filter((r) => r.state === 'success');
195
+
196
+ // eslint-disable-next-line no-console
197
+ console.log('Validation Summary:');
198
+ // eslint-disable-next-line no-console
199
+ console.log(` Violations: ${failed.length}`);
200
+ // eslint-disable-next-line no-console
201
+ console.log(` Warnings: ${warnings.length}`);
202
+ // eslint-disable-next-line no-console
203
+ console.log(` Passed: ${passed.length}`);
204
+
205
+ if (failed.length > 0) {
206
+ const blockToSelect = failed[0].blockId;
207
+ engine.block
208
+ .findAllSelected()
209
+ .forEach((id) => engine.block.setSelected(id, false));
210
+ engine.block.setSelected(blockToSelect, true);
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Extracts the image URL from a block's fill property
216
+ */
217
+ private getImageUrl(engine: CreativeEngine, blockId: number): string | null {
218
+ try {
219
+ const imageFill = engine.block.getFill(blockId);
220
+
221
+ const fillImageURI = engine.block.getString(
222
+ imageFill,
223
+ 'fill/image/imageFileURI'
224
+ );
225
+ if (fillImageURI) {
226
+ return fillImageURI;
227
+ }
228
+
229
+ const sourceSet = engine.block.getSourceSet(
230
+ imageFill,
231
+ 'fill/image/sourceSet'
232
+ );
233
+ if (sourceSet && sourceSet.length > 0) {
234
+ return sourceSet[0].uri;
235
+ }
236
+
237
+ return null;
238
+ } catch (error) {
239
+ return null;
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Extracts text content from a text block
245
+ */
246
+ private getTextContent(engine: CreativeEngine, blockId: number): string {
247
+ try {
248
+ return engine.block.getString(blockId, 'text/text');
249
+ } catch (error) {
250
+ return '';
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Checks all images in the design for inappropriate content
256
+ */
257
+ private async checkImageContent(
258
+ engine: CreativeEngine
259
+ ): Promise<ValidationResult[]> {
260
+ const imageBlockIds = engine.block.findByKind('image');
261
+ const imageBlocksData: ImageBlockData[] = imageBlockIds
262
+ .map((blockId) => ({
263
+ blockId,
264
+ url: this.getImageUrl(engine, blockId),
265
+ blockType: engine.block.getType(blockId),
266
+ blockName: engine.block.getName(blockId)
267
+ }))
268
+ .filter((data) => data.url !== null) as ImageBlockData[];
269
+
270
+ const imagesWithValidity = await Promise.all(
271
+ imageBlocksData.map(async (imageBlockData) => {
272
+ const categories = await this.checkImageContentAPI(imageBlockData.url);
273
+
274
+ return categories.map((checkResult) => ({
275
+ ...checkResult,
276
+ blockId: imageBlockData.blockId,
277
+ blockType: imageBlockData.blockType,
278
+ blockName: imageBlockData.blockName,
279
+ url: imageBlockData.url,
280
+ id: `${imageBlockData.blockId}-${checkResult.name}`
281
+ }));
282
+ })
283
+ );
284
+
285
+ return imagesWithValidity.flat();
286
+ }
287
+
288
+ /**
289
+ * Checks all text blocks in the design for inappropriate content
290
+ */
291
+ private async checkTextContent(
292
+ engine: CreativeEngine
293
+ ): Promise<ValidationResult[]> {
294
+ const textBlockIds = engine.block.findByType('//ly.img.ubq/text');
295
+ const textBlocksData: TextBlockData[] = textBlockIds
296
+ .map((blockId) => ({
297
+ blockId,
298
+ text: this.getTextContent(engine, blockId),
299
+ blockType: engine.block.getType(blockId),
300
+ blockName: engine.block.getName(blockId)
301
+ }))
302
+ .filter((data) => data.text.trim().length > 0);
303
+
304
+ const textsWithValidity = await Promise.all(
305
+ textBlocksData.map(async (textBlockData) => {
306
+ const categories = await this.checkTextContentAPI(textBlockData.text);
307
+
308
+ return categories.map((checkResult) => ({
309
+ ...checkResult,
310
+ blockId: textBlockData.blockId,
311
+ blockType: textBlockData.blockType,
312
+ blockName: textBlockData.blockName,
313
+ text: textBlockData.text,
314
+ id: `${textBlockData.blockId}-${checkResult.name}`
315
+ }));
316
+ })
317
+ );
318
+
319
+ return textsWithValidity.flat();
320
+ }
321
+
322
+ /**
323
+ * Simulates an image content moderation API call
324
+ */
325
+ private async checkImageContentAPI(url: string): Promise<ContentCategory[]> {
326
+ if (imageCache[url]) {
327
+ return imageCache[url];
328
+ }
329
+
330
+ await new Promise((resolve) => setTimeout(resolve, 100));
331
+
332
+ const results: ContentCategory[] = [
333
+ {
334
+ name: 'Weapons',
335
+ description: 'Handguns, rifles, machine guns, threatening knives',
336
+ state: this.percentageToState(Math.random() * 0.3)
337
+ },
338
+ {
339
+ name: 'Alcohol',
340
+ description: 'Wine, beer, cocktails, champagne',
341
+ state: this.percentageToState(Math.random() * 0.4)
342
+ },
343
+ {
344
+ name: 'Drugs',
345
+ description: 'Cannabis, syringes, glass pipes, bongs, pills',
346
+ state: this.percentageToState(Math.random() * 0.2)
347
+ },
348
+ {
349
+ name: 'Nudity',
350
+ description: 'Raw or partial nudity',
351
+ state: this.percentageToState(Math.random() * 0.3)
352
+ }
353
+ ];
354
+
355
+ imageCache[url] = results;
356
+ return results;
357
+ }
358
+
359
+ /**
360
+ * Simulates a text content moderation API call
361
+ */
362
+ private async checkTextContentAPI(text: string): Promise<ContentCategory[]> {
363
+ if (textCache[text]) {
364
+ return textCache[text];
365
+ }
366
+
367
+ await new Promise((resolve) => setTimeout(resolve, 100));
368
+
369
+ const results: ContentCategory[] = [
370
+ {
371
+ name: 'Profanity',
372
+ description: 'Offensive or vulgar language',
373
+ state: this.percentageToState(Math.random() * 0.3)
374
+ },
375
+ {
376
+ name: 'Hate Speech',
377
+ description: 'Content promoting hatred or discrimination',
378
+ state: this.percentageToState(Math.random() * 0.2)
379
+ },
380
+ {
381
+ name: 'Threats',
382
+ description: 'Threatening or violent language',
383
+ state: this.percentageToState(Math.random() * 0.1)
384
+ }
385
+ ];
386
+
387
+ textCache[text] = results;
388
+ return results;
389
+ }
390
+
391
+ /**
392
+ * Maps confidence scores to validation states
393
+ */
394
+ private percentageToState(
395
+ percentage: number
396
+ ): 'success' | 'warning' | 'failed' {
397
+ if (percentage > 0.8) {
398
+ return 'failed';
399
+ } else if (percentage > 0.4) {
400
+ return 'warning';
401
+ } else {
402
+ return 'success';
403
+ }
404
+ }
405
+ }
406
+
407
+ export default Example;
408
+ ```
409
+
410
+ This guide demonstrates how to use CE.SDK's engine APIs to find and extract content from designs, send it to moderation APIs, and display validation results.
411
+
412
+ ## Finding Content in Designs
413
+
414
+ Locate all images and text blocks, then extract the data needed for moderation.
415
+
416
+ **Images**: Use `findByKind('image')` to find image blocks, then extract URLs from fill properties:
417
+
418
+ ```typescript highlight-get-image-url
419
+ /**
420
+ * Extracts the image URL from a block's fill property
421
+ */
422
+ private getImageUrl(engine: CreativeEngine, blockId: number): string | null {
423
+ try {
424
+ const imageFill = engine.block.getFill(blockId);
425
+
426
+ const fillImageURI = engine.block.getString(
427
+ imageFill,
428
+ 'fill/image/imageFileURI'
429
+ );
430
+ if (fillImageURI) {
431
+ return fillImageURI;
432
+ }
433
+
434
+ const sourceSet = engine.block.getSourceSet(
435
+ imageFill,
436
+ 'fill/image/sourceSet'
437
+ );
438
+ if (sourceSet && sourceSet.length > 0) {
439
+ return sourceSet[0].uri;
440
+ }
441
+
442
+ return null;
443
+ } catch (error) {
444
+ return null;
445
+ }
446
+ }
447
+ ```
448
+
449
+ Process all images by checking each URL against the moderation API:
450
+
451
+ ```typescript highlight-check-all-images
452
+ /**
453
+ * Checks all images in the design for inappropriate content
454
+ */
455
+ private async checkImageContent(
456
+ engine: CreativeEngine
457
+ ): Promise<ValidationResult[]> {
458
+ const imageBlockIds = engine.block.findByKind('image');
459
+ const imageBlocksData: ImageBlockData[] = imageBlockIds
460
+ .map((blockId) => ({
461
+ blockId,
462
+ url: this.getImageUrl(engine, blockId),
463
+ blockType: engine.block.getType(blockId),
464
+ blockName: engine.block.getName(blockId)
465
+ }))
466
+ .filter((data) => data.url !== null) as ImageBlockData[];
467
+
468
+ const imagesWithValidity = await Promise.all(
469
+ imageBlocksData.map(async (imageBlockData) => {
470
+ const categories = await this.checkImageContentAPI(imageBlockData.url);
471
+
472
+ return categories.map((checkResult) => ({
473
+ ...checkResult,
474
+ blockId: imageBlockData.blockId,
475
+ blockType: imageBlockData.blockType,
476
+ blockName: imageBlockData.blockName,
477
+ url: imageBlockData.url,
478
+ id: `${imageBlockData.blockId}-${checkResult.name}`
479
+ }));
480
+ })
481
+ );
482
+
483
+ return imagesWithValidity.flat();
484
+ }
485
+ ```
486
+
487
+ **Text**: Use `findByType('//ly.img.ubq/text')` to find text blocks, then extract content using `getString()`:
488
+
489
+ ```typescript highlight-get-text-content
490
+ /**
491
+ * Extracts text content from a text block
492
+ */
493
+ private getTextContent(engine: CreativeEngine, blockId: number): string {
494
+ try {
495
+ return engine.block.getString(blockId, 'text/text');
496
+ } catch (error) {
497
+ return '';
498
+ }
499
+ }
500
+ ```
501
+
502
+ Process all text blocks by checking each text string against the moderation API:
503
+
504
+ ```typescript highlight-check-all-text
505
+ /**
506
+ * Checks all text blocks in the design for inappropriate content
507
+ */
508
+ private async checkTextContent(
509
+ engine: CreativeEngine
510
+ ): Promise<ValidationResult[]> {
511
+ const textBlockIds = engine.block.findByType('//ly.img.ubq/text');
512
+ const textBlocksData: TextBlockData[] = textBlockIds
513
+ .map((blockId) => ({
514
+ blockId,
515
+ text: this.getTextContent(engine, blockId),
516
+ blockType: engine.block.getType(blockId),
517
+ blockName: engine.block.getName(blockId)
518
+ }))
519
+ .filter((data) => data.text.trim().length > 0);
520
+
521
+ const textsWithValidity = await Promise.all(
522
+ textBlocksData.map(async (textBlockData) => {
523
+ const categories = await this.checkTextContentAPI(textBlockData.text);
524
+
525
+ return categories.map((checkResult) => ({
526
+ ...checkResult,
527
+ blockId: textBlockData.blockId,
528
+ blockType: textBlockData.blockType,
529
+ blockName: textBlockData.blockName,
530
+ text: textBlockData.text,
531
+ id: `${textBlockData.blockId}-${checkResult.name}`
532
+ }));
533
+ })
534
+ );
535
+
536
+ return textsWithValidity.flat();
537
+ }
538
+ ```
539
+
540
+ Both processes use `Promise.all()` to handle multiple items concurrently.
541
+
542
+ ## Integrating Moderation APIs
543
+
544
+ Integrate external AI services (Sightengine, AWS Rekognition, OpenAI Moderation API) to analyze content. Always proxy API requests through your backend to protect credentials.
545
+
546
+ **Image Moderation** — This example shows a simulated API call that you'll replace with your actual moderation service. The function returns content categories with confidence scores:
547
+
548
+ ```typescript highlight-image-moderation-api
549
+ /**
550
+ * Simulates an image content moderation API call
551
+ */
552
+ private async checkImageContentAPI(url: string): Promise<ContentCategory[]> {
553
+ if (imageCache[url]) {
554
+ return imageCache[url];
555
+ }
556
+
557
+ await new Promise((resolve) => setTimeout(resolve, 100));
558
+
559
+ const results: ContentCategory[] = [
560
+ {
561
+ name: 'Weapons',
562
+ description: 'Handguns, rifles, machine guns, threatening knives',
563
+ state: this.percentageToState(Math.random() * 0.3)
564
+ },
565
+ {
566
+ name: 'Alcohol',
567
+ description: 'Wine, beer, cocktails, champagne',
568
+ state: this.percentageToState(Math.random() * 0.4)
569
+ },
570
+ {
571
+ name: 'Drugs',
572
+ description: 'Cannabis, syringes, glass pipes, bongs, pills',
573
+ state: this.percentageToState(Math.random() * 0.2)
574
+ },
575
+ {
576
+ name: 'Nudity',
577
+ description: 'Raw or partial nudity',
578
+ state: this.percentageToState(Math.random() * 0.3)
579
+ }
580
+ ];
581
+
582
+ imageCache[url] = results;
583
+ return results;
584
+ }
585
+ ```
586
+
587
+ In production, replace the simulated logic with a real API call to your backend endpoint that proxies requests to services like Sightengine or AWS Rekognition.
588
+
589
+ **Text Moderation** — Similar to image moderation, this simulates an API call that checks text content. Replace this with your actual text moderation service:
590
+
591
+ ```typescript highlight-text-moderation-api
592
+ /**
593
+ * Simulates a text content moderation API call
594
+ */
595
+ private async checkTextContentAPI(text: string): Promise<ContentCategory[]> {
596
+ if (textCache[text]) {
597
+ return textCache[text];
598
+ }
599
+
600
+ await new Promise((resolve) => setTimeout(resolve, 100));
601
+
602
+ const results: ContentCategory[] = [
603
+ {
604
+ name: 'Profanity',
605
+ description: 'Offensive or vulgar language',
606
+ state: this.percentageToState(Math.random() * 0.3)
607
+ },
608
+ {
609
+ name: 'Hate Speech',
610
+ description: 'Content promoting hatred or discrimination',
611
+ state: this.percentageToState(Math.random() * 0.2)
612
+ },
613
+ {
614
+ name: 'Threats',
615
+ description: 'Threatening or violent language',
616
+ state: this.percentageToState(Math.random() * 0.1)
617
+ }
618
+ ];
619
+
620
+ textCache[text] = results;
621
+ return results;
622
+ }
623
+ ```
624
+
625
+ In production, replace the simulation with calls to services like OpenAI Moderation API or Perspective API through your backend.
626
+
627
+ **Processing Results**: Map confidence scores to severity levels (failed > 0.8, warning > 0.4, success ≤ 0.4):
628
+
629
+ ```typescript highlight-threshold-mapping
630
+ /**
631
+ * Maps confidence scores to validation states
632
+ */
633
+ private percentageToState(
634
+ percentage: number
635
+ ): 'success' | 'warning' | 'failed' {
636
+ if (percentage > 0.8) {
637
+ return 'failed';
638
+ } else if (percentage > 0.4) {
639
+ return 'warning';
640
+ } else {
641
+ return 'success';
642
+ }
643
+ }
644
+ ```
645
+
646
+ Implement caching to avoid redundant API calls for the same content.
647
+
648
+ ## Displaying Validation Results
649
+
650
+ Group results by severity (failed, warning, success) and display them in the UI:
651
+
652
+ ```typescript highlight-display-results
653
+ const failed = allResults.filter((r) => r.state === 'failed');
654
+ const warnings = allResults.filter((r) => r.state === 'warning');
655
+ const passed = allResults.filter((r) => r.state === 'success');
656
+
657
+ // eslint-disable-next-line no-console
658
+ console.log('Validation Summary:');
659
+ // eslint-disable-next-line no-console
660
+ console.log(` Violations: ${failed.length}`);
661
+ // eslint-disable-next-line no-console
662
+ console.log(` Warnings: ${warnings.length}`);
663
+ // eslint-disable-next-line no-console
664
+ console.log(` Passed: ${passed.length}`);
665
+ ```
666
+
667
+ Make results interactive by selecting the corresponding block when users click on a validation result:
668
+
669
+ ```typescript highlight-interactive-results
670
+ if (failed.length > 0) {
671
+ const blockToSelect = failed[0].blockId;
672
+ engine.block
673
+ .findAllSelected()
674
+ .forEach((id) => engine.block.setSelected(id, false));
675
+ engine.block.setSelected(blockToSelect, true);
676
+ }
677
+ ```
678
+
679
+ ## Integration Points
680
+
681
+ Choose when to run validation based on your workflow:
682
+
683
+ **Export Validation** — Validate when users export designs using `registerAction`:
684
+
685
+ ```typescript
686
+ cesdk.ui.registerAction('ly.img.export', async (engine) => {
687
+ const imageResults = await checkImageContent(engine);
688
+ const textResults = await checkTextContent(engine);
689
+ const violations = [...imageResults, ...textResults].filter(
690
+ (r) => r.state === 'failed'
691
+ );
692
+
693
+ if (violations.length > 0) {
694
+ alert(`Cannot export: ${violations.length} policy violation(s) detected.`);
695
+ return;
696
+ }
697
+
698
+ const blob = await engine.block.export(engine.scene.get(), 'image/png');
699
+ downloadBlob(blob, 'design.png');
700
+ });
701
+ ```
702
+
703
+ **Other Integration Points**:
704
+
705
+ - Pre-upload validation: Check before allowing uploads to your platform
706
+ - Review queue: Flag designs with warnings for manual review
707
+ - Batch validation: Check all content on-demand when users click a button
708
+
709
+ ## Best Practices
710
+
711
+ **Security**: Always proxy API requests through your backend to protect credentials. Implement rate limiting and authentication.
712
+
713
+ **Performance**: Cache results by URL/text to avoid redundant calls. Process items in parallel with `Promise.all()`.
714
+
715
+ **User Experience**: Run checks asynchronously without blocking the UI. Provide clear error messages and interactive results.
716
+
717
+ **Timing**: Validate at export time for the best balance between policy enforcement and creative freedom.
718
+
719
+ ## Troubleshooting
720
+
721
+ **Checks not running**: Verify engine is initialized, content exists, API endpoint is reachable, and credentials are valid.
722
+
723
+ **Content not found**: Ensure blocks have correct kind/type, images have fills, text blocks aren't empty, and scene has loaded.
724
+
725
+ **API errors**: Check API key validity, endpoint URL, image URL accessibility, rate limits, and service-specific error codes.
726
+
727
+ **Inconsistent results**: Verify caching works correctly, threshold values are appropriate, and API responses parse correctly.
728
+
729
+ ## API Reference
730
+
731
+ **Finding Content**:
732
+
733
+ - `engine.block.findByKind('image')` — Find all image blocks
734
+ - `engine.block.findByType('//ly.img.ubq/text')` — Find all text blocks
735
+
736
+ **Getting Data**:
737
+
738
+ - `engine.block.getFill(blockId)` — Get fill object for image
739
+ - `engine.block.getString(id, 'text/text')` — Get text content
740
+ - `engine.block.getString(fill, 'fill/image/imageFileURI')` — Get image URL
741
+ - `engine.block.getSourceSet(fill, 'fill/image/sourceSet')` — Get image source set
742
+
743
+ **Selection**:
744
+
745
+ - `engine.block.setSelected(id, bool)` — Select or deselect a block
746
+ - `engine.block.findAllSelected()` — Get currently selected blocks
747
+
748
+ ## Next Steps
749
+
750
+ Now that you understand content moderation, explore related validation features:
751
+
752
+ - [Rules Overview](./rules/overview.md) — Learn about CE.SDK's comprehensive validation system
753
+
754
+ ---
755
+
756
+ ## More Resources
757
+
758
+ - **[Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md)** - Browse all Vanilla JS/TS documentation
759
+ - **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
760
+ - **[Web Documentation](./js.md)** - Interactive documentation with examples
761
+ - **[Support](mailto:support@img.ly)** - Contact IMG.LY support