@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.
- package/LICENSE.md +16 -0
- package/README.md +158 -0
- package/assets/docs/api/SKILL.md +49 -0
- package/assets/docs/api/index.d.ts +10518 -0
- package/assets/docs/guide/SKILL.md +142 -0
- package/assets/docs/guide/actions.md +1038 -0
- package/assets/docs/guide/animation/create/base.md +467 -0
- package/assets/docs/guide/animation/create/text.md +453 -0
- package/assets/docs/guide/animation/create.md +558 -0
- package/assets/docs/guide/animation/edit.md +501 -0
- package/assets/docs/guide/animation/overview.md +22 -0
- package/assets/docs/guide/animation/types.md +430 -0
- package/assets/docs/guide/animation.md +23 -0
- package/assets/docs/guide/api/AssetAPI.md +602 -0
- package/assets/docs/guide/api/BlockAPI.md +6152 -0
- package/assets/docs/guide/api/CreativeEngine.md +180 -0
- package/assets/docs/guide/api/EditorAPI.md +1261 -0
- package/assets/docs/guide/api/EventAPI.md +25 -0
- package/assets/docs/guide/api/SceneAPI.md +729 -0
- package/assets/docs/guide/api/VariableAPI.md +59 -0
- package/assets/docs/guide/api/types.md +71 -0
- package/assets/docs/guide/api-reference/overview.md +20 -0
- package/assets/docs/guide/automation/auto-resize.md +412 -0
- package/assets/docs/guide/automation/batch-processing.md +474 -0
- package/assets/docs/guide/automation/data-merge.md +406 -0
- package/assets/docs/guide/automation/design-generation.md +107 -0
- package/assets/docs/guide/automation/overview.md +16 -0
- package/assets/docs/guide/automation.md +24 -0
- package/assets/docs/guide/browser-support.md +38 -0
- package/assets/docs/guide/capabilities.md +18 -0
- package/assets/docs/guide/colors/adjust.md +551 -0
- package/assets/docs/guide/colors/apply.md +349 -0
- package/assets/docs/guide/colors/basics.md +440 -0
- package/assets/docs/guide/colors/conversion.md +504 -0
- package/assets/docs/guide/colors/create-color-palette.md +426 -0
- package/assets/docs/guide/colors/for-print/cmyk.md +577 -0
- package/assets/docs/guide/colors/for-print/spot.md +751 -0
- package/assets/docs/guide/colors/for-print.md +21 -0
- package/assets/docs/guide/colors/for-screen/p3.md +60 -0
- package/assets/docs/guide/colors/for-screen/srgb.md +463 -0
- package/assets/docs/guide/colors/for-screen.md +21 -0
- package/assets/docs/guide/colors/overview.md +20 -0
- package/assets/docs/guide/colors/replace.md +535 -0
- package/assets/docs/guide/colors.md +28 -0
- package/assets/docs/guide/compatibility.md +27 -0
- package/assets/docs/guide/concepts/architecture.md +99 -0
- package/assets/docs/guide/concepts/assets.md +360 -0
- package/assets/docs/guide/concepts/blocks.md +750 -0
- package/assets/docs/guide/concepts/buffers.md +546 -0
- package/assets/docs/guide/concepts/design-units.md +333 -0
- package/assets/docs/guide/concepts/edit-modes.md +431 -0
- package/assets/docs/guide/concepts/editing-workflow.md +303 -0
- package/assets/docs/guide/concepts/events.md +466 -0
- package/assets/docs/guide/concepts/headless-mode/browser.md +291 -0
- package/assets/docs/guide/concepts/pages.md +396 -0
- package/assets/docs/guide/concepts/resources.md +496 -0
- package/assets/docs/guide/concepts/scenes.md +443 -0
- package/assets/docs/guide/concepts/templating.md +194 -0
- package/assets/docs/guide/concepts/terminology.md +296 -0
- package/assets/docs/guide/concepts/undo-and-history.md +461 -0
- package/assets/docs/guide/concepts.md +38 -0
- package/assets/docs/guide/configuration.md +469 -0
- package/assets/docs/guide/conversion/overview.md +22 -0
- package/assets/docs/guide/conversion/to-base64.md +234 -0
- package/assets/docs/guide/conversion/to-pdf.md +616 -0
- package/assets/docs/guide/conversion/to-png.md +290 -0
- package/assets/docs/guide/conversion.md +23 -0
- package/assets/docs/guide/create-audio/audio/add-music.md +430 -0
- package/assets/docs/guide/create-audio/audio/add-sound-effects.md +664 -0
- package/assets/docs/guide/create-audio/audio/loop.md +370 -0
- package/assets/docs/guide/create-audio/audio.md +336 -0
- package/assets/docs/guide/create-composition/add-background.md +395 -0
- package/assets/docs/guide/create-composition/blend-modes.md +372 -0
- package/assets/docs/guide/create-composition/collage.md +432 -0
- package/assets/docs/guide/create-composition/group-and-ungroup.md +388 -0
- package/assets/docs/guide/create-composition/layer-management.md +503 -0
- package/assets/docs/guide/create-composition/layout.md +396 -0
- package/assets/docs/guide/create-composition/lock-design.md +362 -0
- package/assets/docs/guide/create-composition/multi-page.md +204 -0
- package/assets/docs/guide/create-composition/overview.md +18 -0
- package/assets/docs/guide/create-composition/programmatic.md +593 -0
- package/assets/docs/guide/create-composition.md +30 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +688 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +600 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +647 -0
- package/assets/docs/guide/create-templates/add-dynamic-content.md +307 -0
- package/assets/docs/guide/create-templates/add-to-template-library.md +297 -0
- package/assets/docs/guide/create-templates/edit-or-remove.md +441 -0
- package/assets/docs/guide/create-templates/from-scratch.md +558 -0
- package/assets/docs/guide/create-templates/import/from-scene-file.md +440 -0
- package/assets/docs/guide/create-templates/import.md +244 -0
- package/assets/docs/guide/create-templates/lock.md +325 -0
- package/assets/docs/guide/create-templates/overview.md +16 -0
- package/assets/docs/guide/create-templates.md +32 -0
- package/assets/docs/guide/create-video/audio/adjust-speed.md +302 -0
- package/assets/docs/guide/create-video/audio/adjust-volume.md +346 -0
- package/assets/docs/guide/create-video/control.md +285 -0
- package/assets/docs/guide/create-video/limitations.md +396 -0
- package/assets/docs/guide/create-video/overview.md +224 -0
- package/assets/docs/guide/create-video/timeline-editor.md +622 -0
- package/assets/docs/guide/create-video/update-caption-presets.md +676 -0
- package/assets/docs/guide/create-video.md +32 -0
- package/assets/docs/guide/edit-image/add-watermark.md +497 -0
- package/assets/docs/guide/edit-image/overview.md +22 -0
- package/assets/docs/guide/edit-image/remove-bg.md +420 -0
- package/assets/docs/guide/edit-image/replace-colors.md +680 -0
- package/assets/docs/guide/edit-image/transform/crop.md +523 -0
- package/assets/docs/guide/edit-image/transform/move.md +279 -0
- package/assets/docs/guide/edit-image/transform/resize.md +301 -0
- package/assets/docs/guide/edit-image/transform/rotate.md +408 -0
- package/assets/docs/guide/edit-image/transform/scale.md +278 -0
- package/assets/docs/guide/edit-image/transform.md +24 -0
- package/assets/docs/guide/edit-image/vectorize.md +204 -0
- package/assets/docs/guide/edit-image.md +25 -0
- package/assets/docs/guide/edit-video/add-captions.md +589 -0
- package/assets/docs/guide/edit-video/add-watermark.md +429 -0
- package/assets/docs/guide/edit-video/join-and-arrange.md +540 -0
- package/assets/docs/guide/edit-video/redaction.md +544 -0
- package/assets/docs/guide/edit-video/split.md +634 -0
- package/assets/docs/guide/edit-video/transform/crop.md +380 -0
- package/assets/docs/guide/edit-video/transform/flip.md +182 -0
- package/assets/docs/guide/edit-video/transform/move.md +413 -0
- package/assets/docs/guide/edit-video/transform/resize.md +534 -0
- package/assets/docs/guide/edit-video/transform/rotate.md +312 -0
- package/assets/docs/guide/edit-video/transform/scale.md +603 -0
- package/assets/docs/guide/edit-video/transform.md +25 -0
- package/assets/docs/guide/edit-video/trim.md +773 -0
- package/assets/docs/guide/engine-interface.md +108 -0
- package/assets/docs/guide/export-save-publish/create-thumbnail.md +292 -0
- package/assets/docs/guide/export-save-publish/export/compress.md +639 -0
- package/assets/docs/guide/export-save-publish/export/overview.md +576 -0
- package/assets/docs/guide/export-save-publish/export/partial-export.md +694 -0
- package/assets/docs/guide/export-save-publish/export/size-limits.md +401 -0
- package/assets/docs/guide/export-save-publish/export/to-html5.md +474 -0
- package/assets/docs/guide/export-save-publish/export/to-jpeg.md +312 -0
- package/assets/docs/guide/export-save-publish/export/to-mp4.md +364 -0
- package/assets/docs/guide/export-save-publish/export/to-pdf.md +389 -0
- package/assets/docs/guide/export-save-publish/export/to-png.md +255 -0
- package/assets/docs/guide/export-save-publish/export/to-raw-data.md +303 -0
- package/assets/docs/guide/export-save-publish/export/to-webp.md +261 -0
- package/assets/docs/guide/export-save-publish/export/with-color-mask.md +278 -0
- package/assets/docs/guide/export-save-publish/export.md +36 -0
- package/assets/docs/guide/export-save-publish/for-printing.md +423 -0
- package/assets/docs/guide/export-save-publish/for-social-media.md +318 -0
- package/assets/docs/guide/export-save-publish/pre-export-validation.md +698 -0
- package/assets/docs/guide/export-save-publish/save.md +340 -0
- package/assets/docs/guide/export-save-publish/store-custom-metadata.md +367 -0
- package/assets/docs/guide/file-format-support.md +34 -0
- package/assets/docs/guide/fills/color.md +678 -0
- package/assets/docs/guide/fills/image.md +539 -0
- package/assets/docs/guide/fills/overview.md +144 -0
- package/assets/docs/guide/fills/video.md +641 -0
- package/assets/docs/guide/fills.md +24 -0
- package/assets/docs/guide/filters-and-effects/apply.md +1019 -0
- package/assets/docs/guide/filters-and-effects/blur.md +382 -0
- package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +445 -0
- package/assets/docs/guide/filters-and-effects/create-custom-filters.md +614 -0
- package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +426 -0
- package/assets/docs/guide/filters-and-effects/distortion.md +527 -0
- package/assets/docs/guide/filters-and-effects/duotone.md +602 -0
- package/assets/docs/guide/filters-and-effects/gradients.md +1311 -0
- package/assets/docs/guide/filters-and-effects/overview.md +22 -0
- package/assets/docs/guide/filters-and-effects/support.md +623 -0
- package/assets/docs/guide/filters-and-effects.md +28 -0
- package/assets/docs/guide/get-started/agent-skills.md +119 -0
- package/assets/docs/guide/get-started/build-with-ai.md +45 -0
- package/assets/docs/guide/get-started/mcp-server.md +119 -0
- package/assets/docs/guide/get-started/overview.md +28 -0
- package/assets/docs/guide/get-started/vanilla-js/quickstart.md +175 -0
- package/assets/docs/guide/grid-and-rulers.md +222 -0
- package/assets/docs/guide/guides/export-save-publish/export/audio.md +224 -0
- package/assets/docs/guide/guides/text/rendering-internals.md +796 -0
- package/assets/docs/guide/guides.md +49 -0
- package/assets/docs/guide/import-media/asset-library.md +23 -0
- package/assets/docs/guide/import-media/asset-panel/basics.md +324 -0
- package/assets/docs/guide/import-media/asset-panel/customize.md +478 -0
- package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +415 -0
- package/assets/docs/guide/import-media/asset-panel/thumbnails.md +633 -0
- package/assets/docs/guide/import-media/capture-from-camera/record-video.md +137 -0
- package/assets/docs/guide/import-media/capture-from-camera.md +20 -0
- package/assets/docs/guide/import-media/concepts.md +173 -0
- package/assets/docs/guide/import-media/content-json-schema.md +615 -0
- package/assets/docs/guide/import-media/default-assets.md +381 -0
- package/assets/docs/guide/import-media/edit-or-remove-assets.md +489 -0
- package/assets/docs/guide/import-media/file-format-support.md +178 -0
- package/assets/docs/guide/import-media/from-local-source/user-upload.md +438 -0
- package/assets/docs/guide/import-media/from-local-source.md +20 -0
- package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +390 -0
- package/assets/docs/guide/import-media/from-remote-source/getty-images.md +627 -0
- package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +625 -0
- package/assets/docs/guide/import-media/from-remote-source/pexels.md +692 -0
- package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +473 -0
- package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +497 -0
- package/assets/docs/guide/import-media/from-remote-source/third-party.md +51 -0
- package/assets/docs/guide/import-media/from-remote-source/unsplash.md +914 -0
- package/assets/docs/guide/import-media/from-remote-source/your-server.md +764 -0
- package/assets/docs/guide/import-media/from-remote-source.md +28 -0
- package/assets/docs/guide/import-media/overview.md +32 -0
- package/assets/docs/guide/import-media/retrieve-mimetype.md +274 -0
- package/assets/docs/guide/import-media/size-limits.md +20 -0
- package/assets/docs/guide/import-media/source-sets.md +476 -0
- package/assets/docs/guide/import-media.md +32 -0
- package/assets/docs/guide/insert-media/audio.md +291 -0
- package/assets/docs/guide/insert-media/images.md +380 -0
- package/assets/docs/guide/insert-media/position-and-align.md +734 -0
- package/assets/docs/guide/insert-media/shapes-or-stickers.md +799 -0
- package/assets/docs/guide/insert-media/videos.md +308 -0
- package/assets/docs/guide/insert-media.md +24 -0
- package/assets/docs/guide/key-capabilities.md +24 -0
- package/assets/docs/guide/key-concepts.md +83 -0
- package/assets/docs/guide/licensing.md +45 -0
- package/assets/docs/guide/llms-txt.md +53 -0
- package/assets/docs/guide/open-the-editor/blank-canvas.md +124 -0
- package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +228 -0
- package/assets/docs/guide/open-the-editor/from-image.md +205 -0
- package/assets/docs/guide/open-the-editor/from-template.md +189 -0
- package/assets/docs/guide/open-the-editor/from-video.md +274 -0
- package/assets/docs/guide/open-the-editor/import-design/from-archive.md +504 -0
- package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +680 -0
- package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +865 -0
- package/assets/docs/guide/open-the-editor/import-design.md +481 -0
- package/assets/docs/guide/open-the-editor/load-scene.md +178 -0
- package/assets/docs/guide/open-the-editor/overview.md +20 -0
- package/assets/docs/guide/open-the-editor/set-zoom-level.md +303 -0
- package/assets/docs/guide/open-the-editor/uri-resolver.md +347 -0
- package/assets/docs/guide/open-the-editor.md +29 -0
- package/assets/docs/guide/outlines/overview.md +14 -0
- package/assets/docs/guide/outlines/shadows-and-glows.md +515 -0
- package/assets/docs/guide/outlines/strokes.md +292 -0
- package/assets/docs/guide/outlines.md +22 -0
- package/assets/docs/guide/overview.md +22 -0
- package/assets/docs/guide/performance.md +217 -0
- package/assets/docs/guide/plugins/asset-sources.md +553 -0
- package/assets/docs/guide/plugins/print-ready-pdf.md +549 -0
- package/assets/docs/guide/plugins.md +36 -0
- package/assets/docs/guide/rules/asset-handling.md +180 -0
- package/assets/docs/guide/rules/common-pitfalls.md +272 -0
- package/assets/docs/guide/rules/content-fill-mode.md +29 -0
- package/assets/docs/guide/rules/enforce-brand-guidelines.md +672 -0
- package/assets/docs/guide/rules/lock-content.md +478 -0
- package/assets/docs/guide/rules/moderate-content.md +761 -0
- package/assets/docs/guide/rules/overview.md +514 -0
- package/assets/docs/guide/rules/silent-init-errors.md +137 -0
- package/assets/docs/guide/rules/verify-properties-before-use.md +78 -0
- package/assets/docs/guide/rules.md +23 -0
- package/assets/docs/guide/security.md +199 -0
- package/assets/docs/guide/serve-assets.md +332 -0
- package/assets/docs/guide/settings.md +199 -0
- package/assets/docs/guide/shapes.md +23 -0
- package/assets/docs/guide/starterkits/3d-mockup-editor.md +748 -0
- package/assets/docs/guide/starterkits/advanced-editor.md +698 -0
- package/assets/docs/guide/starterkits/advanced-video-editor.md +696 -0
- package/assets/docs/guide/starterkits/ai-editor.md +749 -0
- package/assets/docs/guide/starterkits/airtable-image-editor.md +672 -0
- package/assets/docs/guide/starterkits/apparel-ui.md +188 -0
- package/assets/docs/guide/starterkits/assets.md +27 -0
- package/assets/docs/guide/starterkits/auto-resize.md +586 -0
- package/assets/docs/guide/starterkits/automated-video-generation.md +692 -0
- package/assets/docs/guide/starterkits/background-removal-editor.md +480 -0
- package/assets/docs/guide/starterkits/content-moderation.md +863 -0
- package/assets/docs/guide/starterkits/creative-automation.md +28 -0
- package/assets/docs/guide/starterkits/custom-built-uis.md +26 -0
- package/assets/docs/guide/starterkits/customization.md +29 -0
- package/assets/docs/guide/starterkits/cutout-lines-editor.md +470 -0
- package/assets/docs/guide/starterkits/data-merge.md +850 -0
- package/assets/docs/guide/starterkits/design-editor.md +698 -0
- package/assets/docs/guide/starterkits/design-generation.md +719 -0
- package/assets/docs/guide/starterkits/design-validation.md +808 -0
- package/assets/docs/guide/starterkits/editor-ui-configurations.md +14 -0
- package/assets/docs/guide/starterkits/export-options.md +724 -0
- package/assets/docs/guide/starterkits/export-using-renderer.md +708 -0
- package/assets/docs/guide/starterkits/extensibility.md +28 -0
- package/assets/docs/guide/starterkits/force-crop-editor.md +675 -0
- package/assets/docs/guide/starterkits/form-based-template-adoption.md +522 -0
- package/assets/docs/guide/starterkits/getty-images-editor.md +700 -0
- package/assets/docs/guide/starterkits/html5-ads-exporter.md +719 -0
- package/assets/docs/guide/starterkits/indesign-template-import.md +580 -0
- package/assets/docs/guide/starterkits/layouts-editor.md +724 -0
- package/assets/docs/guide/starterkits/mobile-ui.md +185 -0
- package/assets/docs/guide/starterkits/mockup-editor.md +745 -0
- package/assets/docs/guide/starterkits/multi-image-generation.md +542 -0
- package/assets/docs/guide/starterkits/page-sizes-editor.md +657 -0
- package/assets/docs/guide/starterkits/pexels-image-editor.md +665 -0
- package/assets/docs/guide/starterkits/photo-editor.md +755 -0
- package/assets/docs/guide/starterkits/photo-ui.md +186 -0
- package/assets/docs/guide/starterkits/photobook-ui.md +188 -0
- package/assets/docs/guide/starterkits/placeholders.md +678 -0
- package/assets/docs/guide/starterkits/player.md +405 -0
- package/assets/docs/guide/starterkits/plugins.md +25 -0
- package/assets/docs/guide/starterkits/postcard-editor.md +202 -0
- package/assets/docs/guide/starterkits/pptx-template-import.md +581 -0
- package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +746 -0
- package/assets/docs/guide/starterkits/product-editor.md +773 -0
- package/assets/docs/guide/starterkits/psd-template-import.md +580 -0
- package/assets/docs/guide/starterkits/qr-code-editor.md +470 -0
- package/assets/docs/guide/starterkits/single-page-editor.md +661 -0
- package/assets/docs/guide/starterkits/start-with-image.md +684 -0
- package/assets/docs/guide/starterkits/start-with-video.md +651 -0
- package/assets/docs/guide/starterkits/t-shirt-designer.md +742 -0
- package/assets/docs/guide/starterkits/templating.md +23 -0
- package/assets/docs/guide/starterkits/theming.md +662 -0
- package/assets/docs/guide/starterkits/translation-internationalization.md +662 -0
- package/assets/docs/guide/starterkits/unsplash-editor.md +839 -0
- package/assets/docs/guide/starterkits/vectorizer-editor.md +466 -0
- package/assets/docs/guide/starterkits/version-history.md +745 -0
- package/assets/docs/guide/starterkits/video-animations.md +853 -0
- package/assets/docs/guide/starterkits/video-captions.md +884 -0
- package/assets/docs/guide/starterkits/video-editing.md +25 -0
- package/assets/docs/guide/starterkits/video-editor.md +696 -0
- package/assets/docs/guide/starterkits/video-export-options.md +676 -0
- package/assets/docs/guide/starterkits/viewer.md +400 -0
- package/assets/docs/guide/starterkits.md +41 -0
- package/assets/docs/guide/stickers-and-shapes/combine.md +743 -0
- package/assets/docs/guide/stickers-and-shapes/create-cutout.md +425 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +794 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +290 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +211 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +362 -0
- package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +208 -0
- package/assets/docs/guide/stickers.md +21 -0
- package/assets/docs/guide/text/add.md +641 -0
- package/assets/docs/guide/text/adjust-spacing.md +288 -0
- package/assets/docs/guide/text/auto-size.md +404 -0
- package/assets/docs/guide/text/custom-fonts.md +401 -0
- package/assets/docs/guide/text/decorations.md +330 -0
- package/assets/docs/guide/text/edit.md +458 -0
- package/assets/docs/guide/text/effects.md +244 -0
- package/assets/docs/guide/text/emojis.md +310 -0
- package/assets/docs/guide/text/enumerations.md +258 -0
- package/assets/docs/guide/text/language-support.md +604 -0
- package/assets/docs/guide/text/overview.md +14 -0
- package/assets/docs/guide/text/styling.md +390 -0
- package/assets/docs/guide/text/text-designs.md +834 -0
- package/assets/docs/guide/text.md +33 -0
- package/assets/docs/guide/to-v1-10.md +131 -0
- package/assets/docs/guide/to-v1-13.md +165 -0
- package/assets/docs/guide/to-v1-19.md +315 -0
- package/assets/docs/guide/to-v1-32.md +110 -0
- package/assets/docs/guide/to-v1-69.md +468 -0
- package/assets/docs/guide/to-v1-72.md +193 -0
- package/assets/docs/guide/upgrade.md +25 -0
- package/assets/docs/guide/use-templates/apply-template.md +279 -0
- package/assets/docs/guide/use-templates/generate.md +405 -0
- package/assets/docs/guide/use-templates/library.md +450 -0
- package/assets/docs/guide/use-templates/overview.md +20 -0
- package/assets/docs/guide/use-templates/programmatic.md +482 -0
- package/assets/docs/guide/use-templates/replace-content.md +399 -0
- package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +428 -0
- package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +337 -0
- package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +853 -0
- package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +1045 -0
- package/assets/docs/guide/user-interface/ai-integration/image-generation.md +641 -0
- package/assets/docs/guide/user-interface/ai-integration/integrate.md +966 -0
- package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +99 -0
- package/assets/docs/guide/user-interface/ai-integration/text-generation.md +498 -0
- package/assets/docs/guide/user-interface/ai-integration/video-generation.md +493 -0
- package/assets/docs/guide/user-interface/ai-integration.md +30 -0
- package/assets/docs/guide/user-interface/appearance/change-ui-font.md +316 -0
- package/assets/docs/guide/user-interface/appearance/custom-labels.md +509 -0
- package/assets/docs/guide/user-interface/appearance/icons.md +373 -0
- package/assets/docs/guide/user-interface/appearance/theming.md +665 -0
- package/assets/docs/guide/user-interface/appearance.md +23 -0
- package/assets/docs/guide/user-interface/build-your-own-ui.md +620 -0
- package/assets/docs/guide/user-interface/customization/canvas-menu.md +412 -0
- package/assets/docs/guide/user-interface/customization/canvas.md +281 -0
- package/assets/docs/guide/user-interface/customization/color-palette.md +413 -0
- package/assets/docs/guide/user-interface/customization/crop-presets.md +384 -0
- package/assets/docs/guide/user-interface/customization/disable-or-enable.md +676 -0
- package/assets/docs/guide/user-interface/customization/dock.md +399 -0
- package/assets/docs/guide/user-interface/customization/force-crop.md +289 -0
- package/assets/docs/guide/user-interface/customization/inspector-bar.md +371 -0
- package/assets/docs/guide/user-interface/customization/navigation-bar.md +516 -0
- package/assets/docs/guide/user-interface/customization/page-format.md +436 -0
- package/assets/docs/guide/user-interface/customization/panel.md +605 -0
- package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +531 -0
- package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +358 -0
- package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +374 -0
- package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +323 -0
- package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +294 -0
- package/assets/docs/guide/user-interface/customization/quick-start.md +12 -0
- package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +519 -0
- package/assets/docs/guide/user-interface/customization/reference/component-reference.md +333 -0
- package/assets/docs/guide/user-interface/customization/reference.md +12 -0
- package/assets/docs/guide/user-interface/customization.md +39 -0
- package/assets/docs/guide/user-interface/localization.md +633 -0
- package/assets/docs/guide/user-interface/overview.md +167 -0
- package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +411 -0
- package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +721 -0
- package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +331 -0
- package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +553 -0
- package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +672 -0
- package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +415 -0
- package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +521 -0
- package/assets/docs/guide/user-interface/ui-extensions.md +26 -0
- package/assets/docs/guide/user-interface.md +25 -0
- package/assets/docs/guide/what-is-cesdk.md +319 -0
- package/assets/docs/handbook/SKILL.md +521 -0
- package/assets/prompts/evals-assetGenerate.md +12 -0
- package/assets/prompts/evals-brutalistCore.md +34 -0
- package/assets/prompts/evals-danskCatalogue.md +31 -0
- package/assets/prompts/evals-exportRoundTrip.md +12 -0
- package/assets/prompts/evals-inspectPriorCode.md +16 -0
- package/assets/prompts/evals-listProjectFiles.md +6 -0
- package/assets/prompts/evals-readAndExplainScript.md +6 -0
- package/assets/prompts/evals-resumeAcrossRestart.md +15 -0
- package/assets/prompts/evals-rewindRecovery.md +10 -0
- package/assets/prompts/evals-searchAcrossFiles.md +6 -0
- package/assets/prompts/evals-weddingCard.md +20 -0
- package/assets/prompts/explain.md +6 -0
- package/assets/prompts/review.md +6 -0
- package/dist/assets/inline.generated.d.ts +2 -0
- package/dist/assets/inline.generated.d.ts.map +1 -0
- package/dist/assets/inline.generated.js +413 -0
- package/dist/assets/inline.generated.js.map +1 -0
- package/dist/assets/load-browser.d.ts +8 -0
- package/dist/assets/load-browser.d.ts.map +1 -0
- package/dist/assets/load-browser.js +11 -0
- package/dist/assets/load-browser.js.map +1 -0
- package/dist/assets/load-node.d.ts +8 -0
- package/dist/assets/load-node.d.ts.map +1 -0
- package/dist/assets/load-node.js +11 -0
- package/dist/assets/load-node.js.map +1 -0
- package/dist/cli/http.d.ts +2 -0
- package/dist/cli/http.d.ts.map +1 -0
- package/dist/cli/http.js +231 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/redirect-console.d.ts +10 -0
- package/dist/cli/redirect-console.d.ts.map +1 -0
- package/dist/cli/redirect-console.js +18 -0
- package/dist/cli/redirect-console.js.map +1 -0
- package/dist/cli/resolve-license.d.ts +2 -0
- package/dist/cli/resolve-license.d.ts.map +1 -0
- package/dist/cli/resolve-license.js +13 -0
- package/dist/cli/resolve-license.js.map +1 -0
- package/dist/cli/stdio.d.ts +2 -0
- package/dist/cli/stdio.d.ts.map +1 -0
- package/dist/cli/stdio.js +124 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/trial-license.generated.d.ts +2 -0
- package/dist/cli/trial-license.generated.d.ts.map +1 -0
- package/dist/cli/trial-license.generated.js +4 -0
- package/dist/cli/trial-license.generated.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/cross-ref.d.ts +2 -0
- package/dist/cross-ref.d.ts.map +1 -0
- package/dist/cross-ref.js +31 -0
- package/dist/cross-ref.js.map +1 -0
- package/dist/dashboard/router.d.ts +3 -0
- package/dist/dashboard/router.d.ts.map +1 -0
- package/dist/dashboard/router.js +19 -0
- package/dist/dashboard/router.js.map +1 -0
- package/dist/dashboard/spa-assets.generated.d.ts +2 -0
- package/dist/dashboard/spa-assets.generated.d.ts.map +1 -0
- package/dist/dashboard/spa-assets.generated.js +220 -0
- package/dist/dashboard/spa-assets.generated.js.map +1 -0
- package/dist/engine/asset-sources.d.ts +17 -0
- package/dist/engine/asset-sources.d.ts.map +1 -0
- package/dist/engine/asset-sources.js +75 -0
- package/dist/engine/asset-sources.js.map +1 -0
- package/dist/engine/cesdk-adapter.d.ts +10 -0
- package/dist/engine/cesdk-adapter.d.ts.map +1 -0
- package/dist/engine/cesdk-adapter.js +19 -0
- package/dist/engine/cesdk-adapter.js.map +1 -0
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +3 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/mutex.d.ts +5 -0
- package/dist/engine/mutex.d.ts.map +1 -0
- package/dist/engine/mutex.js +42 -0
- package/dist/engine/mutex.js.map +1 -0
- package/dist/engine/session.d.ts +50 -0
- package/dist/engine/session.d.ts.map +1 -0
- package/dist/engine/session.js +95 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/engine/uri-resolver.d.ts +14 -0
- package/dist/engine/uri-resolver.d.ts.map +1 -0
- package/dist/engine/uri-resolver.js +12 -0
- package/dist/engine/uri-resolver.js.map +1 -0
- package/dist/frontmatter.d.ts +15 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +46 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gateway/hosted-stub.d.ts +6 -0
- package/dist/gateway/hosted-stub.d.ts.map +1 -0
- package/dist/gateway/hosted-stub.js +11 -0
- package/dist/gateway/hosted-stub.js.map +1 -0
- package/dist/gateway/index.d.ts +4 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +4 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/local.d.ts +14 -0
- package/dist/gateway/local.d.ts.map +1 -0
- package/dist/gateway/local.js +41 -0
- package/dist/gateway/local.js.map +1 -0
- package/dist/gateway/types.d.ts +24 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +7 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/http/server.d.ts +80 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +183 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/session-manager.d.ts +42 -0
- package/dist/http/session-manager.d.ts.map +1 -0
- package/dist/http/session-manager.js +82 -0
- package/dist/http/session-manager.js.map +1 -0
- package/dist/http/workspace-auth.d.ts +9 -0
- package/dist/http/workspace-auth.d.ts.map +1 -0
- package/dist/http/workspace-auth.js +29 -0
- package/dist/http/workspace-auth.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/mount.d.ts +11 -0
- package/dist/metrics/mount.d.ts.map +1 -0
- package/dist/metrics/mount.js +13 -0
- package/dist/metrics/mount.js.map +1 -0
- package/dist/metrics/recorder.d.ts +55 -0
- package/dist/metrics/recorder.d.ts.map +1 -0
- package/dist/metrics/recorder.js +97 -0
- package/dist/metrics/recorder.js.map +1 -0
- package/dist/revisions/hash.d.ts +7 -0
- package/dist/revisions/hash.d.ts.map +1 -0
- package/dist/revisions/hash.js +24 -0
- package/dist/revisions/hash.js.map +1 -0
- package/dist/revisions/index.d.ts +4 -0
- package/dist/revisions/index.d.ts.map +1 -0
- package/dist/revisions/index.js +4 -0
- package/dist/revisions/index.js.map +1 -0
- package/dist/revisions/store.d.ts +69 -0
- package/dist/revisions/store.d.ts.map +1 -0
- package/dist/revisions/store.js +196 -0
- package/dist/revisions/store.js.map +1 -0
- package/dist/revisions/types.d.ts +39 -0
- package/dist/revisions/types.d.ts.map +1 -0
- package/dist/revisions/types.js +2 -0
- package/dist/revisions/types.js.map +1 -0
- package/dist/server.d.ts +51 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +175 -0
- package/dist/server.js.map +1 -0
- package/dist/skill-tools.d.ts +3 -0
- package/dist/skill-tools.d.ts.map +1 -0
- package/dist/skill-tools.js +105 -0
- package/dist/skill-tools.js.map +1 -0
- package/dist/test/test/cli/dispatcher.test.d.ts +2 -0
- package/dist/test/test/cli/dispatcher.test.d.ts.map +1 -0
- package/dist/test/test/cli/dispatcher.test.js +47 -0
- package/dist/test/test/cli/dispatcher.test.js.map +1 -0
- package/dist/test/test/cross-ref.test.d.ts +2 -0
- package/dist/test/test/cross-ref.test.d.ts.map +1 -0
- package/dist/test/test/cross-ref.test.js +39 -0
- package/dist/test/test/cross-ref.test.js.map +1 -0
- package/dist/test/test/engine/session.test.d.ts +2 -0
- package/dist/test/test/engine/session.test.d.ts.map +1 -0
- package/dist/test/test/engine/session.test.js +144 -0
- package/dist/test/test/engine/session.test.js.map +1 -0
- package/dist/test/test/engine/uri-resolver.test.d.ts +2 -0
- package/dist/test/test/engine/uri-resolver.test.d.ts.map +1 -0
- package/dist/test/test/engine/uri-resolver.test.js +38 -0
- package/dist/test/test/engine/uri-resolver.test.js.map +1 -0
- package/dist/test/test/frontmatter.test.d.ts +2 -0
- package/dist/test/test/frontmatter.test.d.ts.map +1 -0
- package/dist/test/test/frontmatter.test.js +55 -0
- package/dist/test/test/frontmatter.test.js.map +1 -0
- package/dist/test/test/gateway/hosted-stub.test.d.ts +2 -0
- package/dist/test/test/gateway/hosted-stub.test.d.ts.map +1 -0
- package/dist/test/test/gateway/hosted-stub.test.js +11 -0
- package/dist/test/test/gateway/hosted-stub.test.js.map +1 -0
- package/dist/test/test/gateway/local.test.d.ts +2 -0
- package/dist/test/test/gateway/local.test.d.ts.map +1 -0
- package/dist/test/test/gateway/local.test.js +29 -0
- package/dist/test/test/gateway/local.test.js.map +1 -0
- package/dist/test/test/handbook-contract.test.d.ts +2 -0
- package/dist/test/test/handbook-contract.test.d.ts.map +1 -0
- package/dist/test/test/handbook-contract.test.js +71 -0
- package/dist/test/test/handbook-contract.test.js.map +1 -0
- package/dist/test/test/http/server.test.d.ts +2 -0
- package/dist/test/test/http/server.test.d.ts.map +1 -0
- package/dist/test/test/http/server.test.js +245 -0
- package/dist/test/test/http/server.test.js.map +1 -0
- package/dist/test/test/http/session-manager.test.d.ts +2 -0
- package/dist/test/test/http/session-manager.test.d.ts.map +1 -0
- package/dist/test/test/http/session-manager.test.js +83 -0
- package/dist/test/test/http/session-manager.test.js.map +1 -0
- package/dist/test/test/revisions/hash.test.d.ts +2 -0
- package/dist/test/test/revisions/hash.test.d.ts.map +1 -0
- package/dist/test/test/revisions/hash.test.js +33 -0
- package/dist/test/test/revisions/hash.test.js.map +1 -0
- package/dist/test/test/revisions/store.test.d.ts +2 -0
- package/dist/test/test/revisions/store.test.d.ts.map +1 -0
- package/dist/test/test/revisions/store.test.js +245 -0
- package/dist/test/test/revisions/store.test.js.map +1 -0
- package/dist/test/test/server.test.d.ts +2 -0
- package/dist/test/test/server.test.d.ts.map +1 -0
- package/dist/test/test/server.test.js +157 -0
- package/dist/test/test/server.test.js.map +1 -0
- package/dist/test/test/skill-tools.test.d.ts +2 -0
- package/dist/test/test/skill-tools.test.d.ts.map +1 -0
- package/dist/test/test/skill-tools.test.js +84 -0
- package/dist/test/test/skill-tools.test.js.map +1 -0
- package/dist/test/test/smoke.test.d.ts +2 -0
- package/dist/test/test/smoke.test.d.ts.map +1 -0
- package/dist/test/test/smoke.test.js +8 -0
- package/dist/test/test/smoke.test.js.map +1 -0
- package/dist/test/test/tools/asset-generate.test.d.ts +2 -0
- package/dist/test/test/tools/asset-generate.test.d.ts.map +1 -0
- package/dist/test/test/tools/asset-generate.test.js +66 -0
- package/dist/test/test/tools/asset-generate.test.js.map +1 -0
- package/dist/test/test/tools/edit.test.d.ts +2 -0
- package/dist/test/test/tools/edit.test.d.ts.map +1 -0
- package/dist/test/test/tools/edit.test.js +205 -0
- package/dist/test/test/tools/edit.test.js.map +1 -0
- package/dist/test/test/tools/export.test.d.ts +2 -0
- package/dist/test/test/tools/export.test.d.ts.map +1 -0
- package/dist/test/test/tools/export.test.js +144 -0
- package/dist/test/test/tools/export.test.js.map +1 -0
- package/dist/test/test/tools/history.test.d.ts +2 -0
- package/dist/test/test/tools/history.test.d.ts.map +1 -0
- package/dist/test/test/tools/history.test.js +29 -0
- package/dist/test/test/tools/history.test.js.map +1 -0
- package/dist/test/test/tools/inspect.test.d.ts +2 -0
- package/dist/test/test/tools/inspect.test.d.ts.map +1 -0
- package/dist/test/test/tools/inspect.test.js +62 -0
- package/dist/test/test/tools/inspect.test.js.map +1 -0
- package/dist/test/test/tools/list.test.d.ts +2 -0
- package/dist/test/test/tools/list.test.d.ts.map +1 -0
- package/dist/test/test/tools/list.test.js +23 -0
- package/dist/test/test/tools/list.test.js.map +1 -0
- package/dist/test/test/tools/open-editor.test.d.ts +2 -0
- package/dist/test/test/tools/open-editor.test.d.ts.map +1 -0
- package/dist/test/test/tools/open-editor.test.js +53 -0
- package/dist/test/test/tools/open-editor.test.js.map +1 -0
- package/dist/test/test/tools/preview.test.d.ts +2 -0
- package/dist/test/test/tools/preview.test.d.ts.map +1 -0
- package/dist/test/test/tools/preview.test.js +73 -0
- package/dist/test/test/tools/preview.test.js.map +1 -0
- package/dist/test/test/tools/rename.test.d.ts +2 -0
- package/dist/test/test/tools/rename.test.d.ts.map +1 -0
- package/dist/test/test/tools/rename.test.js +17 -0
- package/dist/test/test/tools/rename.test.js.map +1 -0
- package/dist/test/test/viewer/broadcaster.test.d.ts +2 -0
- package/dist/test/test/viewer/broadcaster.test.d.ts.map +1 -0
- package/dist/test/test/viewer/broadcaster.test.js +53 -0
- package/dist/test/test/viewer/broadcaster.test.js.map +1 -0
- package/dist/test/test/viewer/resource-route.test.d.ts +2 -0
- package/dist/test/test/viewer/resource-route.test.d.ts.map +1 -0
- package/dist/test/test/viewer/resource-route.test.js +70 -0
- package/dist/test/test/viewer/resource-route.test.js.map +1 -0
- package/dist/test/test/viewer/router.test.d.ts +2 -0
- package/dist/test/test/viewer/router.test.d.ts.map +1 -0
- package/dist/test/test/viewer/router.test.js +171 -0
- package/dist/test/test/viewer/router.test.js.map +1 -0
- package/dist/test/test/viewer/url-builder.test.d.ts +2 -0
- package/dist/test/test/viewer/url-builder.test.d.ts.map +1 -0
- package/dist/test/test/viewer/url-builder.test.js +31 -0
- package/dist/test/test/viewer/url-builder.test.js.map +1 -0
- package/dist/test/test/workspace/hosted-stub.test.d.ts +2 -0
- package/dist/test/test/workspace/hosted-stub.test.d.ts.map +1 -0
- package/dist/test/test/workspace/hosted-stub.test.js +30 -0
- package/dist/test/test/workspace/hosted-stub.test.js.map +1 -0
- package/dist/test/test/workspace/in-memory.test.d.ts +2 -0
- package/dist/test/test/workspace/in-memory.test.d.ts.map +1 -0
- package/dist/test/test/workspace/in-memory.test.js +4 -0
- package/dist/test/test/workspace/in-memory.test.js.map +1 -0
- package/dist/test/test/workspace/node-fs.test.d.ts +2 -0
- package/dist/test/test/workspace/node-fs.test.d.ts.map +1 -0
- package/dist/test/test/workspace/node-fs.test.js +20 -0
- package/dist/test/test/workspace/node-fs.test.js.map +1 -0
- package/dist/test/test/workspace/shared-contract.d.ts +3 -0
- package/dist/test/test/workspace/shared-contract.d.ts.map +1 -0
- package/dist/test/test/workspace/shared-contract.js +92 -0
- package/dist/test/test/workspace/shared-contract.js.map +1 -0
- package/dist/test/tsconfig.test.tsbuildinfo +1 -0
- package/dist/test/vitest.config.d.ts +3 -0
- package/dist/test/vitest.config.d.ts.map +1 -0
- package/dist/test/vitest.config.js +8 -0
- package/dist/test/vitest.config.js.map +1 -0
- package/dist/tools/asset-generate.d.ts +12 -0
- package/dist/tools/asset-generate.d.ts.map +1 -0
- package/dist/tools/asset-generate.js +112 -0
- package/dist/tools/asset-generate.js.map +1 -0
- package/dist/tools/asset-search.d.ts +10 -0
- package/dist/tools/asset-search.d.ts.map +1 -0
- package/dist/tools/asset-search.js +120 -0
- package/dist/tools/asset-search.js.map +1 -0
- package/dist/tools/content-types.d.ts +11 -0
- package/dist/tools/content-types.d.ts.map +1 -0
- package/dist/tools/content-types.js +2 -0
- package/dist/tools/content-types.js.map +1 -0
- package/dist/tools/edit.d.ts +29 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +165 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/engine.d.ts +31 -0
- package/dist/tools/engine.d.ts.map +1 -0
- package/dist/tools/engine.js +59 -0
- package/dist/tools/engine.js.map +1 -0
- package/dist/tools/export.d.ts +19 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +179 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/history.d.ts +7 -0
- package/dist/tools/history.d.ts.map +1 -0
- package/dist/tools/history.js +54 -0
- package/dist/tools/history.js.map +1 -0
- package/dist/tools/index.d.ts +35 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +72 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inspect.d.ts +7 -0
- package/dist/tools/inspect.d.ts.map +1 -0
- package/dist/tools/inspect.js +80 -0
- package/dist/tools/inspect.js.map +1 -0
- package/dist/tools/list.d.ts +7 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +18 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/metrics.d.ts +11 -0
- package/dist/tools/metrics.d.ts.map +1 -0
- package/dist/tools/metrics.js +28 -0
- package/dist/tools/metrics.js.map +1 -0
- package/dist/tools/open-editor.d.ts +10 -0
- package/dist/tools/open-editor.d.ts.map +1 -0
- package/dist/tools/open-editor.js +62 -0
- package/dist/tools/open-editor.js.map +1 -0
- package/dist/tools/preview.d.ts +12 -0
- package/dist/tools/preview.d.ts.map +1 -0
- package/dist/tools/preview.js +104 -0
- package/dist/tools/preview.js.map +1 -0
- package/dist/tools/rename.d.ts +7 -0
- package/dist/tools/rename.d.ts.map +1 -0
- package/dist/tools/rename.js +39 -0
- package/dist/tools/rename.js.map +1 -0
- package/dist/tools/result.d.ts +12 -0
- package/dist/tools/result.d.ts.map +1 -0
- package/dist/tools/result.js +55 -0
- package/dist/tools/result.js.map +1 -0
- package/dist/tools/save.d.ts +19 -0
- package/dist/tools/save.d.ts.map +1 -0
- package/dist/tools/save.js +117 -0
- package/dist/tools/save.js.map +1 -0
- package/dist/viewer/broadcaster.d.ts +13 -0
- package/dist/viewer/broadcaster.d.ts.map +1 -0
- package/dist/viewer/broadcaster.js +44 -0
- package/dist/viewer/broadcaster.js.map +1 -0
- package/dist/viewer/index.d.ts +7 -0
- package/dist/viewer/index.d.ts.map +1 -0
- package/dist/viewer/index.js +7 -0
- package/dist/viewer/index.js.map +1 -0
- package/dist/viewer/listener.d.ts +16 -0
- package/dist/viewer/listener.d.ts.map +1 -0
- package/dist/viewer/listener.js +30 -0
- package/dist/viewer/listener.js.map +1 -0
- package/dist/viewer/presigned-r2-url-builder.d.ts +30 -0
- package/dist/viewer/presigned-r2-url-builder.d.ts.map +1 -0
- package/dist/viewer/presigned-r2-url-builder.js +40 -0
- package/dist/viewer/presigned-r2-url-builder.js.map +1 -0
- package/dist/viewer/resource-route.d.ts +9 -0
- package/dist/viewer/resource-route.d.ts.map +1 -0
- package/dist/viewer/resource-route.js +59 -0
- package/dist/viewer/resource-route.js.map +1 -0
- package/dist/viewer/router.d.ts +20 -0
- package/dist/viewer/router.d.ts.map +1 -0
- package/dist/viewer/router.js +142 -0
- package/dist/viewer/router.js.map +1 -0
- package/dist/viewer/session-mount.d.ts +10 -0
- package/dist/viewer/session-mount.d.ts.map +1 -0
- package/dist/viewer/session-mount.js +24 -0
- package/dist/viewer/session-mount.js.map +1 -0
- package/dist/viewer/spa-assets.generated.d.ts +2 -0
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -0
- package/dist/viewer/spa-assets.generated.js +989 -0
- package/dist/viewer/spa-assets.generated.js.map +1 -0
- package/dist/viewer/url-builder.d.ts +48 -0
- package/dist/viewer/url-builder.d.ts.map +1 -0
- package/dist/viewer/url-builder.js +38 -0
- package/dist/viewer/url-builder.js.map +1 -0
- package/dist/workspace/hosted-stub.d.ts +28 -0
- package/dist/workspace/hosted-stub.d.ts.map +1 -0
- package/dist/workspace/hosted-stub.js +44 -0
- package/dist/workspace/hosted-stub.js.map +1 -0
- package/dist/workspace/in-memory.d.ts +23 -0
- package/dist/workspace/in-memory.d.ts.map +1 -0
- package/dist/workspace/in-memory.js +161 -0
- package/dist/workspace/in-memory.js.map +1 -0
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +6 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/node-fs.d.ts +23 -0
- package/dist/workspace/node-fs.d.ts.map +1 -0
- package/dist/workspace/node-fs.js +90 -0
- package/dist/workspace/node-fs.js.map +1 -0
- package/dist/workspace/s3.d.ts +32 -0
- package/dist/workspace/s3.d.ts.map +1 -0
- package/dist/workspace/s3.js +191 -0
- package/dist/workspace/s3.js.map +1 -0
- package/dist/workspace/scoped.d.ts +32 -0
- package/dist/workspace/scoped.d.ts.map +1 -0
- package/dist/workspace/scoped.js +76 -0
- package/dist/workspace/scoped.js.map +1 -0
- package/dist/workspace/types.d.ts +75 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +18 -0
- package/dist/workspace/types.js.map +1 -0
- 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
|
+

|
|
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
|