@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,914 @@
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) > [Import Media Assets](./import-media.md) > [Import From Remote Source](./import-media/from-remote-source.md) > [From a Custom Source](./import-media/from-remote-source/unsplash.md)
4
+
5
+ ---
6
+
7
+ Integrate Unsplash's vast library of royalty-free stock images directly into CE.SDK, allowing users to search and add photos to their designs.
8
+
9
+ ![Unsplash integration with custom asset source](https://img.ly/docs/cesdk/./assets/browser.hero.webp)
10
+
11
+ > **Reading time:** 15 minutes
12
+ >
13
+ > **Resources:**
14
+ >
15
+ > - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
16
+ > - [View source on GitHub](https://github.com/imgly/cesdk-web-examples)
17
+ > - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples)
18
+ > - [Live demo](https://img.ly/docs/cesdk/examples/guides-import-media-from-remote-source-unsplash-browser/)
19
+
20
+ Unsplash provides a vast library of high-quality, royalty-free stock images through their public API. This guide shows you how to integrate Unsplash's image search and browsing capabilities directly into CE.SDK using custom asset sources.
21
+
22
+ ```typescript file=@cesdk_web_examples/guides-import-media-from-remote-source-unsplash-browser/browser.ts reference-only
23
+ import type {
24
+ AssetDefinition,
25
+ AssetQueryData,
26
+ AssetResult,
27
+ AssetSource,
28
+ AssetsQueryResult,
29
+ EditorPlugin,
30
+ EditorPluginContext
31
+ } from '@cesdk/cesdk-js';
32
+ import { createApi } from 'unsplash-js';
33
+
34
+ import {
35
+ BlurAssetSource,
36
+ ColorPaletteAssetSource,
37
+ CropPresetsAssetSource,
38
+ DemoAssetSources,
39
+ EffectsAssetSource,
40
+ FiltersAssetSource,
41
+ PagePresetsAssetSource,
42
+ StickerAssetSource,
43
+ TextAssetSource,
44
+ TextComponentAssetSource,
45
+ TypefaceAssetSource,
46
+ UploadAssetSources,
47
+ VectorShapeAssetSource
48
+ } from '@cesdk/cesdk-js/plugins';
49
+ import { DesignEditorConfig } from './design-editor/plugin';
50
+ import type { Basic as UnsplashPhoto } from 'unsplash-js/dist/methods/photos/types';
51
+ import packageJson from './package.json';
52
+ import { calculateGridLayout } from './utils';
53
+
54
+ /**
55
+ * CE.SDK Plugin: Custom Asset Source with Unsplash
56
+ *
57
+ * Demonstrates integrating custom asset sources into CE.SDK:
58
+ * - Creating custom asset source definitions
59
+ * - Implementing findAssets callback for Unsplash API
60
+ * - Mapping external API responses to CE.SDK asset format
61
+ * - Handling pagination and search
62
+ * - Adding credits and licenses
63
+ * - Creating local asset sources
64
+ */
65
+ class Example implements EditorPlugin {
66
+ name = packageJson.name;
67
+ version = packageJson.version;
68
+
69
+ async initialize({ cesdk }: EditorPluginContext): Promise<void> {
70
+ if (!cesdk) {
71
+ throw new Error('CE.SDK instance is required for this plugin');
72
+ }
73
+
74
+ const engine = cesdk.engine;
75
+ await cesdk.addPlugin(new DesignEditorConfig());
76
+
77
+ // Add asset source plugins
78
+ await cesdk.addPlugin(new BlurAssetSource());
79
+ await cesdk.addPlugin(new ColorPaletteAssetSource());
80
+ await cesdk.addPlugin(new CropPresetsAssetSource());
81
+ await cesdk.addPlugin(
82
+ new UploadAssetSources({ include: ['ly.img.image.upload'] })
83
+ );
84
+ await cesdk.addPlugin(
85
+ new DemoAssetSources({
86
+ include: [
87
+ 'ly.img.templates.blank.*',
88
+ 'ly.img.templates.presentation.*',
89
+ 'ly.img.templates.print.*',
90
+ 'ly.img.templates.social.*',
91
+ 'ly.img.image.*'
92
+ ]
93
+ })
94
+ );
95
+ await cesdk.addPlugin(new EffectsAssetSource());
96
+ await cesdk.addPlugin(new FiltersAssetSource());
97
+ await cesdk.addPlugin(new PagePresetsAssetSource());
98
+ await cesdk.addPlugin(new StickerAssetSource());
99
+ await cesdk.addPlugin(new TextAssetSource());
100
+ await cesdk.addPlugin(new TextComponentAssetSource());
101
+ await cesdk.addPlugin(new TypefaceAssetSource());
102
+ await cesdk.addPlugin(new VectorShapeAssetSource());
103
+
104
+ await cesdk.actions.run('scene.create', {
105
+ page: { width: 1600, height: 1200, unit: 'Pixel' }
106
+ });
107
+
108
+ const [page] = engine.block.findByType('page');
109
+
110
+ // Calculate grid layout for displaying images
111
+ const pageWidth = engine.block.getWidth(page);
112
+ const pageHeight = engine.block.getHeight(page);
113
+ const layout = calculateGridLayout(pageWidth, pageHeight, 4);
114
+
115
+ // Create Unsplash API client with proxy URL
116
+ // The proxy securely handles API authentication without exposing keys in the frontend
117
+ const unsplashProxyUrl = import.meta.env.VITE_UNSPLASH_PROXY_URL;
118
+
119
+ if (!unsplashProxyUrl) {
120
+ throw new Error(
121
+ 'VITE_UNSPLASH_PROXY_URL environment variable is required'
122
+ );
123
+ }
124
+
125
+ const unsplashApi = createApi({
126
+ apiUrl: unsplashProxyUrl
127
+ });
128
+
129
+ const EMPTY_RESULT: AssetsQueryResult<AssetResult> = {
130
+ assets: [],
131
+ total: 0,
132
+ currentPage: 0,
133
+ nextPage: undefined
134
+ };
135
+
136
+ // Main asset query function for Unsplash
137
+ const findUnsplashAssets = async (
138
+ queryData: AssetQueryData
139
+ ): Promise<AssetsQueryResult<AssetResult>> => {
140
+ // Unsplash page indices are 1-based
141
+ const unsplashPage = queryData.page + 1;
142
+
143
+ if (queryData.query) {
144
+ // Search for images with a query string
145
+ const response = await unsplashApi.search.getPhotos({
146
+ query: queryData.query,
147
+ page: unsplashPage,
148
+ perPage: queryData.perPage
149
+ });
150
+
151
+ if (response.type === 'success') {
152
+ const { results, total, total_pages } = response.response;
153
+
154
+ return {
155
+ assets: await Promise.all(results.map(translateToAssetResult)),
156
+ total,
157
+ currentPage: queryData.page,
158
+ nextPage:
159
+ queryData.page + 1 < total_pages ? queryData.page + 1 : undefined
160
+ };
161
+ } else if (response.type === 'error') {
162
+ throw new Error(response.errors.join('. '));
163
+ } else {
164
+ return Promise.resolve(EMPTY_RESULT);
165
+ }
166
+ } else {
167
+ // List popular images when no query is provided
168
+ const response = await (unsplashApi.photos as any).list({
169
+ orderBy: 'popular',
170
+ page: unsplashPage,
171
+ perPage: queryData.perPage
172
+ });
173
+
174
+ if (response.type === 'success') {
175
+ const { results, total } = response.response;
176
+ const totalFetched =
177
+ queryData.page * queryData.perPage + results.length;
178
+ const nextPage =
179
+ totalFetched < total ? queryData.page + 1 : undefined;
180
+
181
+ return {
182
+ assets: await Promise.all(results.map(translateToAssetResult)),
183
+ total,
184
+ currentPage: queryData.page,
185
+ nextPage
186
+ };
187
+ } else if (response.type === 'error') {
188
+ throw new Error(response.errors.join('. '));
189
+ } else {
190
+ return Promise.resolve(EMPTY_RESULT);
191
+ }
192
+ }
193
+ };
194
+
195
+ // Helper function to get Unsplash download URL
196
+ const getUnsplashUrl = async (unsplashResult: UnsplashPhoto) => {
197
+ const trackDownloadResponse = await unsplashApi.photos.trackDownload({
198
+ downloadLocation: unsplashResult.links.download_location
199
+ });
200
+
201
+ if (trackDownloadResponse.type === 'error') {
202
+ throw new Error(trackDownloadResponse.errors.join('. '));
203
+ }
204
+ return trackDownloadResponse.response?.url || unsplashResult.urls.regular;
205
+ };
206
+
207
+ // Translate Unsplash image to CE.SDK asset format
208
+ async function translateToAssetResult(image: any): Promise<AssetResult> {
209
+ const artistName = image?.user?.name;
210
+ const artistUrl = image?.user?.links?.html;
211
+ const description =
212
+ image.description ?? image.alt_description ?? 'Unsplash Image';
213
+
214
+ return {
215
+ id: image.id,
216
+ locale: 'en',
217
+ label: description,
218
+ tags: image.tags ? image.tags.map((tag: any) => tag.title) : undefined,
219
+
220
+ meta: {
221
+ uri: await getUnsplashUrl(image),
222
+ thumbUri: image.urls.thumb,
223
+ blockType: '//ly.img.ubq/graphic',
224
+ fillType: '//ly.img.ubq/fill/image',
225
+ shapeType: '//ly.img.ubq/shape/rect',
226
+ kind: 'image',
227
+ width: image.width,
228
+ height: image.height
229
+ },
230
+
231
+ credits: artistName
232
+ ? {
233
+ name: artistName,
234
+ url: artistUrl
235
+ }
236
+ : undefined,
237
+
238
+ utm: {
239
+ source: 'CE.SDK Demo',
240
+ medium: 'referral'
241
+ }
242
+ };
243
+ }
244
+
245
+ // Define the custom asset source for Unsplash
246
+ const customSource: AssetSource = {
247
+ id: 'unsplash',
248
+ findAssets: findUnsplashAssets,
249
+ credits: {
250
+ name: 'Unsplash',
251
+ url: 'https://unsplash.com/'
252
+ },
253
+ license: {
254
+ name: 'Unsplash license (free)',
255
+ url: 'https://unsplash.com/license'
256
+ }
257
+ };
258
+
259
+ // Add the custom asset source to CE.SDK
260
+ engine.asset.addSource(customSource);
261
+
262
+ // Query for assets and display them (only if scene was created successfully)
263
+ const result = await engine.asset.findAssets(customSource.id, {
264
+ page: 0,
265
+ perPage: 4
266
+ });
267
+
268
+ // Add images from Unsplash to the scene in a grid layout
269
+ for (let i = 0; i < Math.min(result.assets.length, 4); i++) {
270
+ const asset = result.assets[i];
271
+ const position = layout.getPosition(i);
272
+
273
+ const block = await engine.asset.apply(customSource.id, asset);
274
+ engine.block.setPositionX(block, position.x);
275
+ engine.block.setPositionY(block, position.y);
276
+ engine.block.setWidth(block, layout.blockWidth);
277
+ engine.block.setHeight(block, layout.blockHeight);
278
+ }
279
+
280
+ // Create a local asset source for custom assets
281
+ const localSourceId = 'background-videos';
282
+ engine.asset.addLocalSource(localSourceId);
283
+
284
+ // Add a custom video asset to the local source
285
+ engine.asset.addAssetToSource(localSourceId, {
286
+ id: 'ocean-waves-1',
287
+ label: {
288
+ en: 'relaxing ocean waves',
289
+ es: 'olas del mar relajantes'
290
+ },
291
+ tags: {
292
+ en: ['ocean', 'waves', 'soothing', 'slow'],
293
+ es: ['mar', 'olas', 'calmante', 'lento']
294
+ },
295
+ meta: {
296
+ uri: 'https://img.ly/static/ubq_video_samples/bbb.mp4',
297
+ thumbUri: 'https://img.ly/static/ubq_samples/sample_1.jpg',
298
+ mimeType: 'video/mp4',
299
+ width: 1920,
300
+ height: 1080
301
+ }
302
+ } as AssetDefinition);
303
+
304
+ // Configure the asset library UI with a dedicated Unsplash dock entry
305
+ // This must be done at the end after all default assets are registered
306
+ cesdk.ui.addAssetLibraryEntry({
307
+ id: 'unsplash-entry',
308
+ sourceIds: ['unsplash'],
309
+ previewLength: 6,
310
+ gridColumns: 3,
311
+ gridItemHeight: 'square'
312
+ });
313
+
314
+ // Add Unsplash to the existing Images asset library
315
+ cesdk.ui.updateAssetLibraryEntry('ly.img.image', {
316
+ sourceIds: ({ currentIds }) => [...currentIds, 'unsplash']
317
+ });
318
+
319
+ // Add Unsplash as the first button in the dock with a separator
320
+ cesdk.ui.setComponentOrder({ in: 'ly.img.dock' }, [
321
+ {
322
+ id: 'ly.img.assetLibrary.dock',
323
+ key: 'unsplash',
324
+ label: 'Unsplash',
325
+ entries: ['unsplash-entry']
326
+ },
327
+ { id: 'ly.img.separator' },
328
+ ...cesdk.ui.getComponentOrder({ in: 'ly.img.dock' })
329
+ ]);
330
+ }
331
+ }
332
+
333
+ export default Example;
334
+ ```
335
+
336
+ This guide covers setting up the Unsplash API client, implementing search and discovery features, mapping API responses to CE.SDK's asset format, handling attribution requirements, and configuring the asset library UI.
337
+
338
+ ## Prerequisites
339
+
340
+ Before integrating Unsplash, ensure you have:
341
+
342
+ - An Unsplash API access key from the [Unsplash Developer portal](https://unsplash.com/developers)
343
+ - The `unsplash-js` library installed in your project
344
+ - Familiarity with Unsplash's API guidelines and rate limits
345
+ - A proxy server to handle Unsplash API authentication (recommended for production)
346
+
347
+ For production use, you'll need to register your application with Unsplash and implement a proxy server to handle API authentication securely without exposing your access key in the frontend.
348
+
349
+ ### Environment Configuration
350
+
351
+ Create a `.env` file (or copy `.env.example`) in your project root and configure the Unsplash proxy URL:
352
+
353
+ ```bash
354
+ VITE_UNSPLASH_PROXY_URL=YOUR_PROXY_URL_HERE
355
+ ```
356
+
357
+ You must set up your own proxy server to handle Unsplash API authentication. Use the pattern shown in `unsplashProxyFunction.ts.example` from the showcases as a reference implementation.
358
+
359
+ ## Setting Up the Unsplash API Client
360
+
361
+ We initialize the Unsplash API client using the `unsplash-js` library. Instead of directly passing an access key (which would expose it in the frontend), we use a proxy URL that handles authentication server-side.
362
+
363
+ ```typescript highlight-unsplash-api-creation
364
+ // Create Unsplash API client with proxy URL
365
+ // The proxy securely handles API authentication without exposing keys in the frontend
366
+ const unsplashProxyUrl = import.meta.env.VITE_UNSPLASH_PROXY_URL;
367
+
368
+ if (!unsplashProxyUrl) {
369
+ throw new Error('VITE_UNSPLASH_PROXY_URL environment variable is required');
370
+ }
371
+
372
+ const unsplashApi = createApi({
373
+ apiUrl: unsplashProxyUrl
374
+ });
375
+ ```
376
+
377
+ The code reads the proxy URL from the `VITE_UNSPLASH_PROXY_URL` environment variable. If the environment variable is not set, the initialization will fail with an error. This approach keeps your Unsplash API key secure by handling all authentication on the server side, following Unsplash's best practices for client-side applications.
378
+
379
+ ## Creating the Unsplash Asset Source Definition
380
+
381
+ CE.SDK uses asset sources to provide content to the asset library. We create a custom asset source by defining an object that implements the `AssetSource` interface.
382
+
383
+ ```typescript highlight-unsplash-definition
384
+ // Define the custom asset source for Unsplash
385
+ const customSource: AssetSource = {
386
+ id: 'unsplash',
387
+ findAssets: findUnsplashAssets,
388
+ credits: {
389
+ name: 'Unsplash',
390
+ url: 'https://unsplash.com/'
391
+ },
392
+ license: {
393
+ name: 'Unsplash license (free)',
394
+ url: 'https://unsplash.com/license'
395
+ }
396
+ };
397
+ ```
398
+
399
+ The asset source requires:
400
+
401
+ - `id`: A unique identifier for this source (we use `'unsplash'`)
402
+ - `findAssets`: A callback function that queries the Unsplash API and returns formatted results
403
+ - `credits` (optional): Attribution for the asset source
404
+ - `license` (optional): Licensing information for all assets from this source
405
+
406
+ We register the source with CE.SDK using `engine.asset.addSource(customSource)`, making it available throughout the application.
407
+
408
+ ## Implementing Search and Discovery
409
+
410
+ The `findAssets` callback is the core of our asset source integration. It receives query parameters from CE.SDK and returns formatted asset results.
411
+
412
+ ```typescript highlight-unsplash-findAssets
413
+ // Main asset query function for Unsplash
414
+ const findUnsplashAssets = async (
415
+ queryData: AssetQueryData
416
+ ): Promise<AssetsQueryResult<AssetResult>> => {
417
+ // Unsplash page indices are 1-based
418
+ const unsplashPage = queryData.page + 1;
419
+
420
+ if (queryData.query) {
421
+ // Search for images with a query string
422
+ const response = await unsplashApi.search.getPhotos({
423
+ query: queryData.query,
424
+ page: unsplashPage,
425
+ perPage: queryData.perPage
426
+ });
427
+
428
+ if (response.type === 'success') {
429
+ const { results, total, total_pages } = response.response;
430
+
431
+ return {
432
+ assets: await Promise.all(results.map(translateToAssetResult)),
433
+ total,
434
+ currentPage: queryData.page,
435
+ nextPage:
436
+ queryData.page + 1 < total_pages ? queryData.page + 1 : undefined
437
+ };
438
+ } else if (response.type === 'error') {
439
+ throw new Error(response.errors.join('. '));
440
+ } else {
441
+ return Promise.resolve(EMPTY_RESULT);
442
+ }
443
+ } else {
444
+ // List popular images when no query is provided
445
+ const response = await (unsplashApi.photos as any).list({
446
+ orderBy: 'popular',
447
+ page: unsplashPage,
448
+ perPage: queryData.perPage
449
+ });
450
+
451
+ if (response.type === 'success') {
452
+ const { results, total } = response.response;
453
+ const totalFetched = queryData.page * queryData.perPage + results.length;
454
+ const nextPage = totalFetched < total ? queryData.page + 1 : undefined;
455
+
456
+ return {
457
+ assets: await Promise.all(results.map(translateToAssetResult)),
458
+ total,
459
+ currentPage: queryData.page,
460
+ nextPage
461
+ };
462
+ } else if (response.type === 'error') {
463
+ throw new Error(response.errors.join('. '));
464
+ } else {
465
+ return Promise.resolve(EMPTY_RESULT);
466
+ }
467
+ }
468
+ };
469
+ ```
470
+
471
+ The `queryData` parameter contains:
472
+
473
+ - `query`: The search string from the asset library search bar (optional)
474
+ - `page`: The requested page number (0-indexed for CE.SDK, 1-indexed for Unsplash)
475
+ - `perPage`: Number of assets to return per page
476
+
477
+ ### Search with Query
478
+
479
+ When users enter a search term, we query Unsplash's search endpoint with the provided query string.
480
+
481
+ ```typescript highlight-unsplash-query
482
+ // Search for images with a query string
483
+ const response = await unsplashApi.search.getPhotos({
484
+ query: queryData.query,
485
+ page: unsplashPage,
486
+ perPage: queryData.perPage
487
+ });
488
+ ```
489
+
490
+ The search endpoint accepts the query string, page number, and results per page. We convert CE.SDK's 0-indexed pages to Unsplash's 1-indexed system.
491
+
492
+ ### Translating Search Results
493
+
494
+ After receiving the response, we map Unsplash's data structure to CE.SDK's expected format.
495
+
496
+ ```typescript highlight-unsplash-result-mapping
497
+ const { results, total, total_pages } = response.response;
498
+
499
+ return {
500
+ assets: await Promise.all(results.map(translateToAssetResult)),
501
+ total,
502
+ currentPage: queryData.page,
503
+ nextPage: queryData.page + 1 < total_pages ? queryData.page + 1 : undefined
504
+ };
505
+ ```
506
+
507
+ We return an object with:
508
+
509
+ - `assets`: Array of translated asset objects
510
+ - `total`: Total number of matching images
511
+ - `currentPage`: The requested page number
512
+ - `nextPage`: The next page to request, or `undefined` if no more pages exist
513
+
514
+ ### Popular Images
515
+
516
+ When no search query is provided, we display popular images using Unsplash's list endpoint.
517
+
518
+ ```typescript highlight-unsplash-list
519
+ // List popular images when no query is provided
520
+ const response = await (unsplashApi.photos as any).list({
521
+ orderBy: 'popular',
522
+ page: unsplashPage,
523
+ perPage: queryData.perPage
524
+ });
525
+
526
+ if (response.type === 'success') {
527
+ const { results, total } = response.response;
528
+ const totalFetched = queryData.page * queryData.perPage + results.length;
529
+ const nextPage = totalFetched < total ? queryData.page + 1 : undefined;
530
+
531
+ return {
532
+ assets: await Promise.all(results.map(translateToAssetResult)),
533
+ total,
534
+ currentPage: queryData.page,
535
+ nextPage
536
+ };
537
+ } else if (response.type === 'error') {
538
+ throw new Error(response.errors.join('. '));
539
+ } else {
540
+ return Promise.resolve(EMPTY_RESULT);
541
+ }
542
+ ```
543
+
544
+ The list endpoint returns curated popular images. We calculate pagination manually since the API response structure differs slightly from the search endpoint.
545
+
546
+ ### Error Handling
547
+
548
+ When the API returns an error, we throw an exception to notify CE.SDK that the query failed.
549
+
550
+ ```typescript highlight-unsplash-error
551
+ throw new Error(response.errors.join('. '));
552
+ ```
553
+
554
+ For cases where returning an empty result is more appropriate than throwing an error, we return an empty `AssetsQueryResult`.
555
+
556
+ ```typescript highlight-unsplash-empty-fallback
557
+ return Promise.resolve(EMPTY_RESULT);
558
+ ```
559
+
560
+ ## Translating Unsplash Data to CE.SDK Format
561
+
562
+ Each Unsplash photo must be converted to match CE.SDK's `AssetResult` interface. This translation ensures CE.SDK can properly display and apply the assets.
563
+
564
+ ```typescript highlight-translateToAssetResult
565
+ // Translate Unsplash image to CE.SDK asset format
566
+ async function translateToAssetResult(image: any): Promise<AssetResult> {
567
+ const artistName = image?.user?.name;
568
+ const artistUrl = image?.user?.links?.html;
569
+ const description =
570
+ image.description ?? image.alt_description ?? 'Unsplash Image';
571
+
572
+ return {
573
+ id: image.id,
574
+ locale: 'en',
575
+ label: description,
576
+ tags: image.tags ? image.tags.map((tag: any) => tag.title) : undefined,
577
+
578
+ meta: {
579
+ uri: await getUnsplashUrl(image),
580
+ thumbUri: image.urls.thumb,
581
+ blockType: '//ly.img.ubq/graphic',
582
+ fillType: '//ly.img.ubq/fill/image',
583
+ shapeType: '//ly.img.ubq/shape/rect',
584
+ kind: 'image',
585
+ width: image.width,
586
+ height: image.height
587
+ },
588
+
589
+ credits: artistName
590
+ ? {
591
+ name: artistName,
592
+ url: artistUrl
593
+ }
594
+ : undefined,
595
+
596
+ utm: {
597
+ source: 'CE.SDK Demo',
598
+ medium: 'referral'
599
+ }
600
+ };
601
+ }
602
+ ```
603
+
604
+ ### Asset Identifier
605
+
606
+ The `id` field uniquely identifies each asset within this source.
607
+
608
+ ```typescript highlight-result-id
609
+ id: image.id,
610
+ ```
611
+
612
+ ### Locale and Labels
613
+
614
+ The `locale` indicates the language of the asset's metadata. The `label` provides a human-readable description displayed in the asset library.
615
+
616
+ ```typescript highlight-result-locale
617
+ locale: 'en',
618
+ ```
619
+
620
+ ```typescript highlight-result-label
621
+ label: description,
622
+ ```
623
+
624
+ ### Tags
625
+
626
+ Tags help users discover assets through search and categorization.
627
+
628
+ ```typescript highlight-result-tags
629
+ tags: image.tags ? image.tags.map((tag: any) => tag.title) : undefined,
630
+ ```
631
+
632
+ ### Asset Metadata
633
+
634
+ The `meta` object contains technical properties CE.SDK needs to display and apply the asset.
635
+
636
+ ```typescript highlight-result-meta
637
+ meta: {
638
+ uri: await getUnsplashUrl(image),
639
+ thumbUri: image.urls.thumb,
640
+ blockType: '//ly.img.ubq/graphic',
641
+ fillType: '//ly.img.ubq/fill/image',
642
+ shapeType: '//ly.img.ubq/shape/rect',
643
+ kind: 'image',
644
+ width: image.width,
645
+ height: image.height
646
+ },
647
+ ```
648
+
649
+ Key metadata fields include:
650
+
651
+ **Image URI**: The downloadable image URL obtained through Unsplash's download tracking endpoint.
652
+
653
+ ```typescript highlight-result-uri
654
+ uri: await getUnsplashUrl(image),
655
+ ```
656
+
657
+ **Thumbnail URI**: A smaller preview image for the asset library grid.
658
+
659
+ ```typescript highlight-result-thumbUri
660
+ thumbUri: image.urls.thumb,
661
+ ```
662
+
663
+ **Block Type**: The design block type to create when applying this asset.
664
+
665
+ ```typescript highlight-result-blockType
666
+ blockType: '//ly.img.ubq/graphic',
667
+ ```
668
+
669
+ Specifying `//ly.img.ubq/graphic` upfront avoids delays from CE.SDK inferring the type.
670
+
671
+ **Fill Type**: The fill type to attach to the created block.
672
+
673
+ ```typescript highlight-result-fillType
674
+ fillType: '//ly.img.ubq/fill/image',
675
+ ```
676
+
677
+ We use `//ly.img.ubq/fill/image` to create an image fill.
678
+
679
+ **Shape Type**: The shape type for the block's geometry.
680
+
681
+ ```typescript highlight-result-shapeType
682
+ shapeType: '//ly.img.ubq/shape/rect',
683
+ ```
684
+
685
+ A rectangular shape (`//ly.img.ubq/shape/rect`) is standard for images.
686
+
687
+ **Kind**: An optional semantic identifier for the block.
688
+
689
+ ```typescript highlight-result-kind
690
+ kind: 'image',
691
+ ```
692
+
693
+ **Dimensions**: The original width and height of the image.
694
+
695
+ ```typescript highlight-result-size
696
+ width: image.width,
697
+ height: image.height
698
+ ```
699
+
700
+ These dimensions help CE.SDK maintain proper aspect ratios.
701
+
702
+ ## Handling Unsplash Attribution Requirements
703
+
704
+ Unsplash's licensing terms require proper attribution for photographers. We include credits with each asset and source-level attribution.
705
+
706
+ ```typescript highlight-result-credits
707
+ credits: artistName
708
+ ? {
709
+ name: artistName,
710
+ url: artistUrl
711
+ }
712
+ : undefined,
713
+ ```
714
+
715
+ The `credits` object contains the photographer's name and a link to their Unsplash profile.
716
+
717
+ ### UTM Parameters
718
+
719
+ Unsplash requires UTM parameters on all links for analytics tracking.
720
+
721
+ ```typescript highlight-result-utm
722
+ utm: {
723
+ source: 'CE.SDK Demo',
724
+ medium: 'referral'
725
+ }
726
+ ```
727
+
728
+ ### Source Credits and License
729
+
730
+ We add source-level credits and license information to the asset source definition.
731
+
732
+ ```typescript highlight-unsplash-credits-license
733
+ credits: {
734
+ name: 'Unsplash',
735
+ url: 'https://unsplash.com/'
736
+ },
737
+ license: {
738
+ name: 'Unsplash license (free)',
739
+ url: 'https://unsplash.com/license'
740
+ }
741
+ ```
742
+
743
+ This information appears in CE.SDK's asset library UI, ensuring proper attribution.
744
+
745
+ ## Adding Download Tracking
746
+
747
+ Before using an Unsplash image URL, we must call the download tracking endpoint. This requirement supports Unsplash's analytics and photographer compensation.
748
+
749
+ The `getUnsplashUrl` helper function handles tracking:
750
+
751
+ ```typescript
752
+ const getUnsplashUrl = async (unsplashResult: UnsplashPhoto) => {
753
+ const trackDownloadResponse = await unsplashApi.photos.trackDownload({
754
+ downloadLocation: unsplashResult.links.download_location
755
+ });
756
+
757
+ if (trackDownloadResponse.type === 'error') {
758
+ throw new Error(trackDownloadResponse.errors.join('. '));
759
+ }
760
+ return trackDownloadResponse.response?.url || unsplashResult.urls.regular;
761
+ };
762
+ ```
763
+
764
+ This tracking occurs automatically when we translate each asset in the `translateToAssetResult` function.
765
+
766
+ ## Configuring the Asset Library UI
767
+
768
+ After registering the Unsplash asset source, we can configure how it appears in CE.SDK's asset library panel.
769
+
770
+ ### Creating a Dedicated Unsplash Dock Entry
771
+
772
+ We add Unsplash to the editor's dock by creating an asset library entry and then adding a dock button component:
773
+
774
+ ```typescript
775
+ cesdk.ui.addAssetLibraryEntry({
776
+ id: 'unsplash-entry',
777
+ sourceIds: ['unsplash'],
778
+ previewLength: 6,
779
+ gridColumns: 3,
780
+ gridItemHeight: 'square'
781
+ });
782
+
783
+ // Add Unsplash to the existing Images asset library
784
+ cesdk.ui.updateAssetLibraryEntry('ly.img.image', {
785
+ sourceIds: ({ currentIds }) => [...currentIds, 'unsplash']
786
+ });
787
+
788
+ // Add Unsplash as the first button in the dock with a separator
789
+ cesdk.ui.setComponentOrder({ in: 'ly.img.dock' }, [
790
+ {
791
+ id: 'ly.img.assetLibrary.dock',
792
+ key: 'unsplash',
793
+ label: 'Unsplash',
794
+ entries: ['unsplash-entry']
795
+ },
796
+ { id: 'ly.img.separator' },
797
+ ...cesdk.ui.getComponentOrder({ in: 'ly.img.dock' })
798
+ ]);
799
+ ```
800
+
801
+ The `addAssetLibraryEntry()` call registers the Unsplash asset library panel with display settings. The `setComponentOrder()` call creates an explicit dock button component by prepending a new `AssetLibraryDockComponent` to the existing dock order.
802
+
803
+ The dock component structure includes:
804
+
805
+ - `id`: Fixed identifier for asset library dock buttons (`'ly.img.assetLibrary.dock'`)
806
+ - `key`: Unique identifier for this specific button (`'unsplash'`)
807
+ - `label`: Display text for the button label (`'Unsplash'`)
808
+ - `entries`: Array of asset library entry IDs to display when clicked (`['unsplash-entry']`)
809
+
810
+ Additionally, we add Unsplash to the existing Images asset library using `updateAssetLibraryEntry()`. This provides dual access: users can access Unsplash images both from the dedicated Unsplash panel and from the Images library panel. The functional update pattern `({ currentIds }) => [...currentIds, 'unsplash']` appends Unsplash to the existing sources without replacing them.
811
+
812
+ The separator component `{ id: 'ly.img.separator' }` adds a visual divider between the Unsplash button and the default dock buttons, improving UI organization and clarity.
813
+
814
+ ## Testing the Integration
815
+
816
+ To verify the integration works correctly, query the asset source and apply results to the scene:
817
+
818
+ ```typescript highlight-test
819
+ // Query for assets and display them (only if scene was created successfully)
820
+ const result = await engine.asset.findAssets(customSource.id, {
821
+ page: 0,
822
+ perPage: 4
823
+ });
824
+
825
+ // Add images from Unsplash to the scene in a grid layout
826
+ for (let i = 0; i < Math.min(result.assets.length, 4); i++) {
827
+ const asset = result.assets[i];
828
+ const position = layout.getPosition(i);
829
+
830
+ const block = await engine.asset.apply(customSource.id, asset);
831
+ engine.block.setPositionX(block, position.x);
832
+ engine.block.setPositionY(block, position.y);
833
+ engine.block.setWidth(block, layout.blockWidth);
834
+ engine.block.setHeight(block, layout.blockHeight);
835
+ }
836
+ ```
837
+
838
+ We query the Unsplash source, retrieve the first four results, and add them to the scene using `engine.asset.apply()`. Each image is positioned in a grid layout using the `calculateGridLayout` utility.
839
+
840
+ Test both search functionality and popular image browsing to ensure all features work as expected.
841
+
842
+ ## Troubleshooting
843
+
844
+ **API Rate Limiting**: Unsplash enforces rate limits on API requests. Implement caching and request throttling to stay within limits.
845
+
846
+ **Missing Access Key**: If you see authentication errors, verify your access key is correctly configured in the API client initialization.
847
+
848
+ **Attribution Not Displaying**: Ensure the `credits` object is properly populated in the asset translation function and that CE.SDK's UI is configured to show attribution.
849
+
850
+ **Image Loading Failures**: Check that the download tracking endpoint is called before using image URLs, and verify URLs are valid and accessible.
851
+
852
+ ## Local Asset Sources
853
+
854
+ CE.SDK also supports local asset sources for managing finite asset collections directly in the engine. These sources provide search and pagination without requiring custom query callbacks.
855
+
856
+ Create a local source using `addLocalSource`:
857
+
858
+ ```typescript highlight-add-local-source
859
+ // Create a local asset source for custom assets
860
+ const localSourceId = 'background-videos';
861
+ engine.asset.addLocalSource(localSourceId);
862
+ ```
863
+
864
+ Add assets to the local source with `addAssetToSource`:
865
+
866
+ ```typescript highlight-add-asset-to-source
867
+ // Add a custom video asset to the local source
868
+ engine.asset.addAssetToSource(localSourceId, {
869
+ id: 'ocean-waves-1',
870
+ label: {
871
+ en: 'relaxing ocean waves',
872
+ es: 'olas del mar relajantes'
873
+ },
874
+ tags: {
875
+ en: ['ocean', 'waves', 'soothing', 'slow'],
876
+ es: ['mar', 'olas', 'calmante', 'lento']
877
+ },
878
+ meta: {
879
+ uri: 'https://img.ly/static/ubq_video_samples/bbb.mp4',
880
+ thumbUri: 'https://img.ly/static/ubq_samples/sample_1.jpg',
881
+ mimeType: 'video/mp4',
882
+ width: 1920,
883
+ height: 1080
884
+ }
885
+ } as AssetDefinition);
886
+ ```
887
+
888
+ Local sources keep track of added assets and return matching items based on search queries. Assets appear in query results in insertion order.
889
+
890
+ ## API Reference
891
+
892
+ | Method | Category | Purpose |
893
+ | --------------------------------- | -------- | ------------------------------------------------- |
894
+ | `engine.asset.addSource()` | Asset | Register Unsplash as a custom asset source |
895
+ | `engine.asset.apply()` | Asset | Add Unsplash image to the scene as a design block |
896
+ | `engine.asset.addLocalSource()` | Asset | Create a local asset source managed by the engine |
897
+ | `engine.asset.addAssetToSource()` | Asset | Add an asset definition to a local asset source |
898
+
899
+ ## Next Steps
900
+
901
+ - [Customize Asset Library](./import-media/asset-panel/customize.md) — Configure asset panels and UI
902
+ - [Asset Library Basics](./import-media/asset-panel/basics.md) — Understand asset sources
903
+ - [Integrate Soundstripe Audio](./import-media/from-remote-source/soundstripe.md) — Add audio assets
904
+ - [IMG.LY Premium Assets](./import-media/from-remote-source/imgly-premium-assets.md) — Access premium stock content
905
+ - [Import Media Concepts](./import-media/concepts.md) — Learn core import concepts
906
+
907
+ ---
908
+
909
+ ## More Resources
910
+
911
+ - **[Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md)** - Browse all Vanilla JS/TS documentation
912
+ - **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
913
+ - **[Web Documentation](./js.md)** - Interactive documentation with examples
914
+ - **[Support](mailto:support@img.ly)** - Contact IMG.LY support