@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,743 @@
|
|
|
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) > [Create and Edit Shapes](./shapes.md) > [Combine](./stickers-and-shapes/combine.md)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Combine multiple shapes using boolean operations to create custom compound designs programmatically.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
> **Reading time:** 8 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/tree/release-$UBQ_VERSION$/guides-stickers-and-shapes-combine-browser)
|
|
17
|
+
> - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-stickers-and-shapes-combine-browser)
|
|
18
|
+
> - [Live demo](https://img.ly/docs/cesdk/examples/guides-stickers-and-shapes-combine-browser/)
|
|
19
|
+
|
|
20
|
+
CE.SDK provides four boolean operations for combining shapes: _Union_, _Difference_, _Intersection_, and _XOR_. These operations work with graphic blocks and text blocks, allowing you to build complex designs from simple primitives.
|
|
21
|
+
|
|
22
|
+
```typescript file=@cesdk_web_examples/guides-stickers-and-shapes-combine-browser/browser.ts reference-only
|
|
23
|
+
import type { EditorPlugin, EditorPluginContext } from '@cesdk/cesdk-js';
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
BlurAssetSource,
|
|
27
|
+
ColorPaletteAssetSource,
|
|
28
|
+
CropPresetsAssetSource,
|
|
29
|
+
DemoAssetSources,
|
|
30
|
+
EffectsAssetSource,
|
|
31
|
+
FiltersAssetSource,
|
|
32
|
+
PagePresetsAssetSource,
|
|
33
|
+
StickerAssetSource,
|
|
34
|
+
TextAssetSource,
|
|
35
|
+
TextComponentAssetSource,
|
|
36
|
+
TypefaceAssetSource,
|
|
37
|
+
UploadAssetSources,
|
|
38
|
+
VectorShapeAssetSource
|
|
39
|
+
} from '@cesdk/cesdk-js/plugins';
|
|
40
|
+
import { DesignEditorConfig } from './design-editor/plugin';
|
|
41
|
+
import { calculateGridLayout } from './utils';
|
|
42
|
+
import packageJson from './package.json';
|
|
43
|
+
|
|
44
|
+
class Example implements EditorPlugin {
|
|
45
|
+
name = packageJson.name;
|
|
46
|
+
version = packageJson.version;
|
|
47
|
+
|
|
48
|
+
async initialize({ cesdk }: EditorPluginContext): Promise<void> {
|
|
49
|
+
if (!cesdk) {
|
|
50
|
+
throw new Error('CE.SDK instance is required for this plugin');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
await cesdk.addPlugin(new DesignEditorConfig());
|
|
54
|
+
|
|
55
|
+
// Add asset source plugins
|
|
56
|
+
await cesdk.addPlugin(new BlurAssetSource());
|
|
57
|
+
await cesdk.addPlugin(new ColorPaletteAssetSource());
|
|
58
|
+
await cesdk.addPlugin(new CropPresetsAssetSource());
|
|
59
|
+
await cesdk.addPlugin(
|
|
60
|
+
new UploadAssetSources({ include: ['ly.img.image.upload'] })
|
|
61
|
+
);
|
|
62
|
+
await cesdk.addPlugin(
|
|
63
|
+
new DemoAssetSources({
|
|
64
|
+
include: [
|
|
65
|
+
'ly.img.templates.blank.*',
|
|
66
|
+
'ly.img.templates.presentation.*',
|
|
67
|
+
'ly.img.templates.print.*',
|
|
68
|
+
'ly.img.templates.social.*',
|
|
69
|
+
'ly.img.image.*'
|
|
70
|
+
]
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
await cesdk.addPlugin(new EffectsAssetSource());
|
|
74
|
+
await cesdk.addPlugin(new FiltersAssetSource());
|
|
75
|
+
await cesdk.addPlugin(new PagePresetsAssetSource());
|
|
76
|
+
await cesdk.addPlugin(new StickerAssetSource());
|
|
77
|
+
await cesdk.addPlugin(new TextAssetSource());
|
|
78
|
+
await cesdk.addPlugin(new TextComponentAssetSource());
|
|
79
|
+
await cesdk.addPlugin(new TypefaceAssetSource());
|
|
80
|
+
await cesdk.addPlugin(new VectorShapeAssetSource());
|
|
81
|
+
|
|
82
|
+
await cesdk.actions.run('scene.create', {
|
|
83
|
+
page: { width: 800, height: 600, unit: 'Pixel' }
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const engine = cesdk.engine;
|
|
87
|
+
const page = engine.block.findByType('page')[0];
|
|
88
|
+
|
|
89
|
+
// Calculate responsive grid layout for demonstrations
|
|
90
|
+
const pageWidth = engine.block.getWidth(page);
|
|
91
|
+
const pageHeight = engine.block.getHeight(page);
|
|
92
|
+
const layout = calculateGridLayout(pageWidth, pageHeight, {
|
|
93
|
+
cols: 2,
|
|
94
|
+
rows: 2,
|
|
95
|
+
spacing: 20,
|
|
96
|
+
margin: 20
|
|
97
|
+
});
|
|
98
|
+
const { blockWidth, blockHeight, getPosition } = layout;
|
|
99
|
+
|
|
100
|
+
// ===== Demonstration 1: Union Operation =====
|
|
101
|
+
// Create three equal circles for union demonstration
|
|
102
|
+
const circleSize = 120;
|
|
103
|
+
const unionCircle1 = engine.block.create('graphic');
|
|
104
|
+
engine.block.setShape(
|
|
105
|
+
unionCircle1,
|
|
106
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
107
|
+
);
|
|
108
|
+
const unionFill1 = engine.block.createFill('color');
|
|
109
|
+
engine.block.setColor(unionFill1, 'fill/color/value', {
|
|
110
|
+
r: 1.0,
|
|
111
|
+
g: 0.4,
|
|
112
|
+
b: 0.4,
|
|
113
|
+
a: 1.0
|
|
114
|
+
});
|
|
115
|
+
engine.block.setFill(unionCircle1, unionFill1);
|
|
116
|
+
engine.block.setWidth(unionCircle1, circleSize);
|
|
117
|
+
engine.block.setHeight(unionCircle1, circleSize);
|
|
118
|
+
engine.block.appendChild(page, unionCircle1);
|
|
119
|
+
|
|
120
|
+
const unionCircle2 = engine.block.create('graphic');
|
|
121
|
+
engine.block.setShape(
|
|
122
|
+
unionCircle2,
|
|
123
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
124
|
+
);
|
|
125
|
+
const unionFill2 = engine.block.createFill('color');
|
|
126
|
+
engine.block.setColor(unionFill2, 'fill/color/value', {
|
|
127
|
+
r: 0.4,
|
|
128
|
+
g: 1.0,
|
|
129
|
+
b: 0.4,
|
|
130
|
+
a: 1.0
|
|
131
|
+
});
|
|
132
|
+
engine.block.setFill(unionCircle2, unionFill2);
|
|
133
|
+
engine.block.setWidth(unionCircle2, circleSize);
|
|
134
|
+
engine.block.setHeight(unionCircle2, circleSize);
|
|
135
|
+
engine.block.appendChild(page, unionCircle2);
|
|
136
|
+
|
|
137
|
+
const unionCircle3 = engine.block.create('graphic');
|
|
138
|
+
engine.block.setShape(
|
|
139
|
+
unionCircle3,
|
|
140
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
141
|
+
);
|
|
142
|
+
const unionFill3 = engine.block.createFill('color');
|
|
143
|
+
engine.block.setColor(unionFill3, 'fill/color/value', {
|
|
144
|
+
r: 0.4,
|
|
145
|
+
g: 0.4,
|
|
146
|
+
b: 1.0,
|
|
147
|
+
a: 1.0
|
|
148
|
+
});
|
|
149
|
+
engine.block.setFill(unionCircle3, unionFill3);
|
|
150
|
+
engine.block.setWidth(unionCircle3, circleSize);
|
|
151
|
+
engine.block.setHeight(unionCircle3, circleSize);
|
|
152
|
+
engine.block.appendChild(page, unionCircle3);
|
|
153
|
+
|
|
154
|
+
// ===== Demonstration 2: Difference Operation =====
|
|
155
|
+
// Create image block for punch-out effect
|
|
156
|
+
const imageBlock = engine.block.create('graphic');
|
|
157
|
+
engine.block.setShape(
|
|
158
|
+
imageBlock,
|
|
159
|
+
engine.block.createShape('//ly.img.ubq/shape/rect')
|
|
160
|
+
);
|
|
161
|
+
const imageFill = engine.block.createFill('image');
|
|
162
|
+
engine.block.setString(
|
|
163
|
+
imageFill,
|
|
164
|
+
'fill/image/imageFileURI',
|
|
165
|
+
'https://img.ly/static/ubq_samples/sample_1.jpg'
|
|
166
|
+
);
|
|
167
|
+
engine.block.setFill(imageBlock, imageFill);
|
|
168
|
+
engine.block.setWidth(imageBlock, blockWidth * 0.9);
|
|
169
|
+
engine.block.setHeight(imageBlock, blockHeight * 0.9);
|
|
170
|
+
engine.block.appendChild(page, imageBlock);
|
|
171
|
+
|
|
172
|
+
// Create text block for punch-out
|
|
173
|
+
const textBlock = engine.block.create('text');
|
|
174
|
+
engine.block.replaceText(textBlock, 'CUTOUT');
|
|
175
|
+
engine.block.setFloat(textBlock, 'text/fontSize', 120);
|
|
176
|
+
engine.block.setWidth(textBlock, blockWidth * 0.9);
|
|
177
|
+
engine.block.appendChild(page, textBlock);
|
|
178
|
+
|
|
179
|
+
// ===== Demonstration 3: Intersection Operation =====
|
|
180
|
+
// Create two overlapping circles for intersection (20% larger)
|
|
181
|
+
const intersectCircleSize = circleSize * 1.2;
|
|
182
|
+
const intersectCircle1 = engine.block.create('graphic');
|
|
183
|
+
engine.block.setShape(
|
|
184
|
+
intersectCircle1,
|
|
185
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
186
|
+
);
|
|
187
|
+
const intersectFill1 = engine.block.createFill('color');
|
|
188
|
+
engine.block.setColor(intersectFill1, 'fill/color/value', {
|
|
189
|
+
r: 1.0,
|
|
190
|
+
g: 0.6,
|
|
191
|
+
b: 0.2,
|
|
192
|
+
a: 1.0
|
|
193
|
+
});
|
|
194
|
+
engine.block.setFill(intersectCircle1, intersectFill1);
|
|
195
|
+
engine.block.setWidth(intersectCircle1, intersectCircleSize);
|
|
196
|
+
engine.block.setHeight(intersectCircle1, intersectCircleSize);
|
|
197
|
+
engine.block.appendChild(page, intersectCircle1);
|
|
198
|
+
|
|
199
|
+
const intersectCircle2 = engine.block.create('graphic');
|
|
200
|
+
engine.block.setShape(
|
|
201
|
+
intersectCircle2,
|
|
202
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
203
|
+
);
|
|
204
|
+
const intersectFill2 = engine.block.createFill('color');
|
|
205
|
+
engine.block.setColor(intersectFill2, 'fill/color/value', {
|
|
206
|
+
r: 1.0,
|
|
207
|
+
g: 0.6,
|
|
208
|
+
b: 0.2,
|
|
209
|
+
a: 1.0
|
|
210
|
+
});
|
|
211
|
+
engine.block.setFill(intersectCircle2, intersectFill2);
|
|
212
|
+
engine.block.setWidth(intersectCircle2, intersectCircleSize);
|
|
213
|
+
engine.block.setHeight(intersectCircle2, intersectCircleSize);
|
|
214
|
+
engine.block.appendChild(page, intersectCircle2);
|
|
215
|
+
|
|
216
|
+
// ===== Demonstration 4: XOR Operation =====
|
|
217
|
+
// Create two overlapping circles for XOR
|
|
218
|
+
const xorCircle1 = engine.block.create('graphic');
|
|
219
|
+
engine.block.setShape(
|
|
220
|
+
xorCircle1,
|
|
221
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
222
|
+
);
|
|
223
|
+
const xorFill1 = engine.block.createFill('color');
|
|
224
|
+
engine.block.setColor(xorFill1, 'fill/color/value', {
|
|
225
|
+
r: 1.0,
|
|
226
|
+
g: 0.8,
|
|
227
|
+
b: 0.2,
|
|
228
|
+
a: 1.0
|
|
229
|
+
});
|
|
230
|
+
engine.block.setFill(xorCircle1, xorFill1);
|
|
231
|
+
engine.block.setWidth(xorCircle1, 140);
|
|
232
|
+
engine.block.setHeight(xorCircle1, 140);
|
|
233
|
+
engine.block.appendChild(page, xorCircle1);
|
|
234
|
+
|
|
235
|
+
const xorCircle2 = engine.block.create('graphic');
|
|
236
|
+
engine.block.setShape(
|
|
237
|
+
xorCircle2,
|
|
238
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
239
|
+
);
|
|
240
|
+
const xorFill2 = engine.block.createFill('color');
|
|
241
|
+
engine.block.setColor(xorFill2, 'fill/color/value', {
|
|
242
|
+
r: 0.2,
|
|
243
|
+
g: 0.8,
|
|
244
|
+
b: 1.0,
|
|
245
|
+
a: 1.0
|
|
246
|
+
});
|
|
247
|
+
engine.block.setFill(xorCircle2, xorFill2);
|
|
248
|
+
engine.block.setWidth(xorCircle2, 140);
|
|
249
|
+
engine.block.setHeight(xorCircle2, 140);
|
|
250
|
+
engine.block.appendChild(page, xorCircle2);
|
|
251
|
+
|
|
252
|
+
// Position all blocks in grid layout before combining
|
|
253
|
+
// Position union circles at vertices of equilateral triangle in top-left quadrant
|
|
254
|
+
const unionPos = getPosition(0);
|
|
255
|
+
const unionCenterX = unionPos.x + blockWidth / 2;
|
|
256
|
+
const unionCenterY = unionPos.y + blockHeight / 2;
|
|
257
|
+
const triangleRadius = 55; // Distance from center to each vertex
|
|
258
|
+
const halfCircle = circleSize / 2;
|
|
259
|
+
// Top vertex
|
|
260
|
+
engine.block.setPositionX(unionCircle1, unionCenterX - halfCircle);
|
|
261
|
+
engine.block.setPositionY(
|
|
262
|
+
unionCircle1,
|
|
263
|
+
unionCenterY - triangleRadius - halfCircle
|
|
264
|
+
);
|
|
265
|
+
// Bottom-right vertex (angle -30°)
|
|
266
|
+
engine.block.setPositionX(
|
|
267
|
+
unionCircle2,
|
|
268
|
+
unionCenterX + triangleRadius * 0.866 - halfCircle
|
|
269
|
+
);
|
|
270
|
+
engine.block.setPositionY(
|
|
271
|
+
unionCircle2,
|
|
272
|
+
unionCenterY + triangleRadius * 0.5 - halfCircle
|
|
273
|
+
);
|
|
274
|
+
// Bottom-left vertex (angle 210°)
|
|
275
|
+
engine.block.setPositionX(
|
|
276
|
+
unionCircle3,
|
|
277
|
+
unionCenterX - triangleRadius * 0.866 - halfCircle
|
|
278
|
+
);
|
|
279
|
+
engine.block.setPositionY(
|
|
280
|
+
unionCircle3,
|
|
281
|
+
unionCenterY + triangleRadius * 0.5 - halfCircle
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
// Center image in top-right quadrant, then center text on image
|
|
285
|
+
const diffPos = getPosition(1);
|
|
286
|
+
const imageX =
|
|
287
|
+
diffPos.x + (blockWidth - engine.block.getWidth(imageBlock)) / 2;
|
|
288
|
+
const imageY =
|
|
289
|
+
diffPos.y + (blockHeight - engine.block.getHeight(imageBlock)) / 2;
|
|
290
|
+
engine.block.setPositionX(imageBlock, imageX);
|
|
291
|
+
engine.block.setPositionY(imageBlock, imageY);
|
|
292
|
+
|
|
293
|
+
// Center text on the image block (not the quadrant)
|
|
294
|
+
const textX =
|
|
295
|
+
imageX +
|
|
296
|
+
(engine.block.getWidth(imageBlock) - engine.block.getWidth(textBlock)) /
|
|
297
|
+
2;
|
|
298
|
+
const textY =
|
|
299
|
+
imageY +
|
|
300
|
+
(engine.block.getHeight(imageBlock) - engine.block.getHeight(textBlock)) /
|
|
301
|
+
2;
|
|
302
|
+
engine.block.setPositionX(textBlock, textX);
|
|
303
|
+
engine.block.setPositionY(textBlock, textY);
|
|
304
|
+
|
|
305
|
+
// Center intersection circles in bottom-left quadrant with vertical overlap
|
|
306
|
+
const intersectPos = getPosition(2);
|
|
307
|
+
const intersectCenterX = intersectPos.x + blockWidth / 2;
|
|
308
|
+
const intersectCenterY = intersectPos.y + blockHeight / 2;
|
|
309
|
+
const halfIntersectCircle = intersectCircleSize / 2;
|
|
310
|
+
// Position circles to overlap vertically by about 50% (72px offset for 144px circles)
|
|
311
|
+
engine.block.setPositionX(
|
|
312
|
+
intersectCircle1,
|
|
313
|
+
intersectCenterX - halfIntersectCircle
|
|
314
|
+
);
|
|
315
|
+
engine.block.setPositionY(
|
|
316
|
+
intersectCircle1,
|
|
317
|
+
intersectCenterY - halfIntersectCircle - 36
|
|
318
|
+
);
|
|
319
|
+
engine.block.setPositionX(
|
|
320
|
+
intersectCircle2,
|
|
321
|
+
intersectCenterX - halfIntersectCircle
|
|
322
|
+
);
|
|
323
|
+
engine.block.setPositionY(
|
|
324
|
+
intersectCircle2,
|
|
325
|
+
intersectCenterY - halfIntersectCircle + 36
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
// Center XOR circles in bottom-right quadrant
|
|
329
|
+
const xorPos = getPosition(3);
|
|
330
|
+
const xorCenterX = xorPos.x + blockWidth / 2;
|
|
331
|
+
const xorCenterY = xorPos.y + blockHeight / 2;
|
|
332
|
+
engine.block.setPositionX(xorCircle1, xorCenterX - 70);
|
|
333
|
+
engine.block.setPositionY(xorCircle1, xorCenterY - 70);
|
|
334
|
+
engine.block.setPositionX(xorCircle2, xorCenterX - 14);
|
|
335
|
+
engine.block.setPositionY(xorCircle2, xorCenterY - 42);
|
|
336
|
+
|
|
337
|
+
// Perform boolean operations
|
|
338
|
+
// Check if blocks can be combined before attempting operations
|
|
339
|
+
const canCombineUnion = engine.block.isCombinable([
|
|
340
|
+
unionCircle1,
|
|
341
|
+
unionCircle2,
|
|
342
|
+
unionCircle3
|
|
343
|
+
]);
|
|
344
|
+
const canCombineDiff = engine.block.isCombinable([imageBlock, textBlock]);
|
|
345
|
+
const canCombineIntersect = engine.block.isCombinable([
|
|
346
|
+
intersectCircle1,
|
|
347
|
+
intersectCircle2
|
|
348
|
+
]);
|
|
349
|
+
const canCombineXor = engine.block.isCombinable([xorCircle1, xorCircle2]);
|
|
350
|
+
|
|
351
|
+
// Combine three circles using Union operation
|
|
352
|
+
if (canCombineUnion) {
|
|
353
|
+
engine.block.combine([unionCircle1, unionCircle2, unionCircle3], 'Union');
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// Create punch-out effect using Difference operation
|
|
357
|
+
// Ensure image is at the bottom (will be the base block)
|
|
358
|
+
if (canCombineDiff) {
|
|
359
|
+
engine.block.sendToBack(imageBlock);
|
|
360
|
+
engine.block.combine([imageBlock, textBlock], 'Difference');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Extract overlapping area using Intersection operation
|
|
364
|
+
if (canCombineIntersect) {
|
|
365
|
+
engine.block.combine(
|
|
366
|
+
[intersectCircle1, intersectCircle2],
|
|
367
|
+
'Intersection'
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Create exclusion pattern using XOR operation
|
|
372
|
+
if (canCombineXor) {
|
|
373
|
+
engine.block.combine([xorCircle1, xorCircle2], 'XOR');
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Zoom to fit all demonstrations
|
|
377
|
+
await engine.scene.zoomToBlock(page, { padding: 40 });
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
export default Example;
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
This guide covers checking combinability, applying the four boolean operations, understanding fill inheritance, and troubleshooting common combination issues.
|
|
385
|
+
|
|
386
|
+
## Understanding Boolean Operations
|
|
387
|
+
|
|
388
|
+
CE.SDK offers four boolean operations for combining blocks into new shapes. Each operation applies geometric transformations to create unique compound designs.
|
|
389
|
+
|
|
390
|
+
**Union** merges all blocks into a single shape, adding their areas together. **Difference** subtracts overlapping areas from a base block, creating cutouts. **Intersection** keeps only the overlapping regions. **XOR** removes overlaps while preserving non-overlapping parts.
|
|
391
|
+
|
|
392
|
+
The operations use `engine.block.combine(ids, operation)` where `ids` is an array of blocks and `operation` is one of: `'Union'`, `'Difference'`, `'Intersection'`, or `'XOR'`.
|
|
393
|
+
|
|
394
|
+
Combining blocks with the `'Union'`, `'Intersection'`, or `'XOR'` operation results in a new block whose fill is that of the top-most block. The operation is applied pair-wise from the top-most block to the bottom-most block.
|
|
395
|
+
|
|
396
|
+
Combining blocks with the `'Difference'` operation results in a new block whose fill is that of the bottom-most block. The operation is applied pair-wise from the bottom-most block to the top-most block.
|
|
397
|
+
|
|
398
|
+
The combined blocks will be destroyed if the `'lifecycle/destroy'` scope is enabled.
|
|
399
|
+
|
|
400
|
+
> **Note:** **Only the following blocks can be combined\*** A graphics block
|
|
401
|
+
>
|
|
402
|
+
> - A text block
|
|
403
|
+
|
|
404
|
+
## Checking Combinability
|
|
405
|
+
|
|
406
|
+
Before combining blocks, verify they can be combined using `engine.block.isCombinable(ids)`. Only graphic blocks and text blocks with the `'lifecycle/duplicate'` scope enabled can be combined.
|
|
407
|
+
|
|
408
|
+
```typescript highlight-check-combinability
|
|
409
|
+
// Check if blocks can be combined before attempting operations
|
|
410
|
+
const canCombineUnion = engine.block.isCombinable([
|
|
411
|
+
unionCircle1,
|
|
412
|
+
unionCircle2,
|
|
413
|
+
unionCircle3
|
|
414
|
+
]);
|
|
415
|
+
const canCombineDiff = engine.block.isCombinable([imageBlock, textBlock]);
|
|
416
|
+
const canCombineIntersect = engine.block.isCombinable([
|
|
417
|
+
intersectCircle1,
|
|
418
|
+
intersectCircle2
|
|
419
|
+
]);
|
|
420
|
+
const canCombineXor = engine.block.isCombinable([xorCircle1, xorCircle2]);
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
The check returns `true` if all blocks meet the requirements. Attempting to combine incompatible blocks will fail.
|
|
424
|
+
|
|
425
|
+
## Combining with Union
|
|
426
|
+
|
|
427
|
+
Union merges multiple shapes into one compound outline. The result inherits the fill from the top-most block in the z-order.
|
|
428
|
+
|
|
429
|
+
```typescript highlight-combine-union
|
|
430
|
+
// Combine three circles using Union operation
|
|
431
|
+
if (canCombineUnion) {
|
|
432
|
+
engine.block.combine([unionCircle1, unionCircle2, unionCircle3], 'Union');
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
We create three circles with different colors. Union combines them into a single block with the blue fill (from the top-most circle).
|
|
437
|
+
|
|
438
|
+
Use Union for merging logos, creating compound icons, and building complex shapes from simple primitives.
|
|
439
|
+
|
|
440
|
+
## Combining with Difference
|
|
441
|
+
|
|
442
|
+
Difference subtracts overlapping shapes from a base block, creating cutout effects. The result inherits the fill from the bottom-most block.
|
|
443
|
+
|
|
444
|
+
```typescript highlight-combine-difference
|
|
445
|
+
// Create punch-out effect using Difference operation
|
|
446
|
+
// Ensure image is at the bottom (will be the base block)
|
|
447
|
+
if (canCombineDiff) {
|
|
448
|
+
engine.block.sendToBack(imageBlock);
|
|
449
|
+
engine.block.combine([imageBlock, textBlock], 'Difference');
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
We position an image as the bottom block and text above it. Difference removes the text shape from the image, creating a punch-out effect where the text was.
|
|
454
|
+
|
|
455
|
+
Use Difference for text punch-outs, logo cutouts, and mask effects. Ensure the base block is at the bottom using `engine.block.sendToBack()`.
|
|
456
|
+
|
|
457
|
+
## Combining with Intersection
|
|
458
|
+
|
|
459
|
+
Intersection keeps only the overlapping areas of all blocks. The result inherits the fill from the bottom-most block.
|
|
460
|
+
|
|
461
|
+
```typescript highlight-combine-intersection
|
|
462
|
+
// Extract overlapping area using Intersection operation
|
|
463
|
+
if (canCombineIntersect) {
|
|
464
|
+
engine.block.combine([intersectCircle1, intersectCircle2], 'Intersection');
|
|
465
|
+
}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
We create two overlapping circles. Intersection extracts only the area where they overlap, discarding the rest.
|
|
469
|
+
|
|
470
|
+
Use Intersection for lens effects, overlapping patterns, and extracting geometric intersections.
|
|
471
|
+
|
|
472
|
+
## Combining with XOR
|
|
473
|
+
|
|
474
|
+
XOR (exclusive OR) keeps non-overlapping parts while removing intersections, creating an exclusion or donut effect. The result inherits the fill from the top-most block.
|
|
475
|
+
|
|
476
|
+
```typescript highlight-combine-xor
|
|
477
|
+
// Create exclusion pattern using XOR operation
|
|
478
|
+
if (canCombineXor) {
|
|
479
|
+
engine.block.combine([xorCircle1, xorCircle2], 'XOR');
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
We create two overlapping circles. XOR removes the overlapping area while preserving the non-overlapping parts.
|
|
484
|
+
|
|
485
|
+
Use XOR for donut shapes, exclusion patterns, and inverted overlaps.
|
|
486
|
+
|
|
487
|
+
## Understanding Fill Inheritance
|
|
488
|
+
|
|
489
|
+
Combined blocks inherit properties from a prioritized block based on the operation.
|
|
490
|
+
|
|
491
|
+
**Union, Intersection, XOR**: The new block inherits the fill from the top-most block. Operations are applied pair-wise from highest to lowest sort order.
|
|
492
|
+
|
|
493
|
+
**Difference**: The new block inherits the fill from the bottom-most block. Operations are applied pair-wise from lowest to highest sort order.
|
|
494
|
+
|
|
495
|
+
Original blocks are destroyed after combination if the `'lifecycle/destroy'` scope is enabled. Control which fill is inherited by reordering blocks with `engine.block.bringToFront()` and `engine.block.sendToBack()`.
|
|
496
|
+
|
|
497
|
+
## Scope Requirements
|
|
498
|
+
|
|
499
|
+
Combining blocks requires specific scopes:
|
|
500
|
+
|
|
501
|
+
**`'lifecycle/duplicate'`**: Required on all blocks. Checked by `engine.block.isCombinable()`. If missing, combination fails.
|
|
502
|
+
|
|
503
|
+
**`'lifecycle/destroy'`**: Required for destroying original blocks. If disabled, original blocks remain after combination.
|
|
504
|
+
|
|
505
|
+
Check scopes with `engine.block.isScopeEnabled(id, scope)` and enable with `engine.block.setScopeEnabled(id, scope, true)`.
|
|
506
|
+
|
|
507
|
+
## Troubleshooting
|
|
508
|
+
|
|
509
|
+
### Combination Fails Silently
|
|
510
|
+
|
|
511
|
+
Verify blocks are combinable using `engine.block.isCombinable(ids)` before attempting operations. Only graphic blocks and text blocks can be combined. Check that the `'lifecycle/duplicate'` scope is enabled on all blocks.
|
|
512
|
+
|
|
513
|
+
### Original Blocks Not Destroyed
|
|
514
|
+
|
|
515
|
+
Ensure the `'lifecycle/destroy'` scope is enabled on input blocks. If disabled, blocks remain after combination. Check with `engine.block.isScopeEnabled(id, 'lifecycle/destroy')`.
|
|
516
|
+
|
|
517
|
+
### Wrong Fill on Result
|
|
518
|
+
|
|
519
|
+
For Union/Intersection/XOR, the top-most block's fill is inherited. For Difference, the bottom-most block's fill is inherited. Reorder blocks before combining using `engine.block.bringToFront()` or `engine.block.sendToBack()`.
|
|
520
|
+
|
|
521
|
+
### Unexpected Shape Result
|
|
522
|
+
|
|
523
|
+
Boolean operations are applied pair-wise in specific order. Union/Intersection/XOR start with the highest sort order (top-most). Difference starts with the lowest sort order (bottom-most). Control order with z-order methods.
|
|
524
|
+
|
|
525
|
+
## Full Code
|
|
526
|
+
|
|
527
|
+
Here's the complete implementation showing all four boolean operations:
|
|
528
|
+
|
|
529
|
+
```typescript
|
|
530
|
+
import CreativeEditorSDK from '@cesdk/cesdk-js';
|
|
531
|
+
import {
|
|
532
|
+
BlurAssetSource,
|
|
533
|
+
ColorPaletteAssetSource,
|
|
534
|
+
CropPresetsAssetSource,
|
|
535
|
+
DemoAssetSources,
|
|
536
|
+
EffectsAssetSource,
|
|
537
|
+
FiltersAssetSource,
|
|
538
|
+
PagePresetsAssetSource,
|
|
539
|
+
StickerAssetSource,
|
|
540
|
+
TextAssetSource,
|
|
541
|
+
TextComponentAssetSource,
|
|
542
|
+
TypefaceAssetSource,
|
|
543
|
+
UploadAssetSources,
|
|
544
|
+
VectorShapeAssetSource
|
|
545
|
+
} from '@cesdk/cesdk-js/plugins';
|
|
546
|
+
|
|
547
|
+
const config = {
|
|
548
|
+
license: 'YOUR_CESDK_LICENSE_KEY',
|
|
549
|
+
callbacks: {
|
|
550
|
+
onUpload: 'local'
|
|
551
|
+
}
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
const cesdk = await CreativeEditorSDK.create('#cesdk_container', config);
|
|
555
|
+
|
|
556
|
+
// Add default asset source plugins
|
|
557
|
+
await cesdk.addPlugin(new BlurAssetSource());
|
|
558
|
+
await cesdk.addPlugin(new ColorPaletteAssetSource());
|
|
559
|
+
await cesdk.addPlugin(new CropPresetsAssetSource());
|
|
560
|
+
await cesdk.addPlugin(new EffectsAssetSource());
|
|
561
|
+
await cesdk.addPlugin(new FiltersAssetSource());
|
|
562
|
+
await cesdk.addPlugin(new PagePresetsAssetSource());
|
|
563
|
+
await cesdk.addPlugin(new StickerAssetSource());
|
|
564
|
+
await cesdk.addPlugin(new TextAssetSource());
|
|
565
|
+
await cesdk.addPlugin(new TextComponentAssetSource());
|
|
566
|
+
await cesdk.addPlugin(new TypefaceAssetSource());
|
|
567
|
+
await cesdk.addPlugin(new VectorShapeAssetSource());
|
|
568
|
+
|
|
569
|
+
// Add demo and upload sources
|
|
570
|
+
await cesdk.addPlugin(
|
|
571
|
+
new UploadAssetSources({ include: ['ly.img.image.upload'] })
|
|
572
|
+
);
|
|
573
|
+
await cesdk.addPlugin(
|
|
574
|
+
new DemoAssetSources({
|
|
575
|
+
include: [
|
|
576
|
+
'ly.img.templates.blank.*',
|
|
577
|
+
'ly.img.templates.presentation.*',
|
|
578
|
+
'ly.img.templates.print.*',
|
|
579
|
+
'ly.img.templates.social.*',
|
|
580
|
+
'ly.img.image.*'
|
|
581
|
+
]
|
|
582
|
+
})
|
|
583
|
+
);
|
|
584
|
+
await cesdk.actions.run('scene.create');
|
|
585
|
+
|
|
586
|
+
const engine = cesdk.engine;
|
|
587
|
+
const page = engine.block.findByType('page')[0];
|
|
588
|
+
|
|
589
|
+
engine.block.setWidth(page, 800);
|
|
590
|
+
engine.block.setHeight(page, 600);
|
|
591
|
+
|
|
592
|
+
const pageWidth = engine.block.getWidth(page);
|
|
593
|
+
const pageHeight = engine.block.getHeight(page);
|
|
594
|
+
const quadrantWidth = pageWidth / 2;
|
|
595
|
+
const quadrantHeight = pageHeight / 2;
|
|
596
|
+
|
|
597
|
+
// Union: Combine three circles in top-left quadrant (20% larger, centered)
|
|
598
|
+
const circle1 = engine.block.create('graphic');
|
|
599
|
+
engine.block.setShape(
|
|
600
|
+
circle1,
|
|
601
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
602
|
+
);
|
|
603
|
+
const fill1 = engine.block.createFill('color');
|
|
604
|
+
engine.block.setColor(fill1, 'fill/color/value', {
|
|
605
|
+
r: 1.0,
|
|
606
|
+
g: 0.4,
|
|
607
|
+
b: 0.4,
|
|
608
|
+
a: 1.0
|
|
609
|
+
});
|
|
610
|
+
engine.block.setFill(circle1, fill1);
|
|
611
|
+
engine.block.setWidth(circle1, 96); // 80 * 1.2 = 96
|
|
612
|
+
engine.block.setHeight(circle1, 96);
|
|
613
|
+
engine.block.setPositionX(circle1, quadrantWidth / 2 - 48);
|
|
614
|
+
engine.block.setPositionY(circle1, quadrantHeight / 2 - 48);
|
|
615
|
+
engine.block.appendChild(page, circle1);
|
|
616
|
+
|
|
617
|
+
const circle2 = engine.block.create('graphic');
|
|
618
|
+
engine.block.setShape(
|
|
619
|
+
circle2,
|
|
620
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
621
|
+
);
|
|
622
|
+
const fill2 = engine.block.createFill('color');
|
|
623
|
+
engine.block.setColor(fill2, 'fill/color/value', {
|
|
624
|
+
r: 0.4,
|
|
625
|
+
g: 1.0,
|
|
626
|
+
b: 0.4,
|
|
627
|
+
a: 1.0
|
|
628
|
+
});
|
|
629
|
+
engine.block.setFill(circle2, fill2);
|
|
630
|
+
engine.block.setWidth(circle2, 96); // 80 * 1.2 = 96
|
|
631
|
+
engine.block.setHeight(circle2, 96);
|
|
632
|
+
engine.block.setPositionX(circle2, quadrantWidth / 2 + 24);
|
|
633
|
+
engine.block.setPositionY(circle2, quadrantHeight / 2 - 48);
|
|
634
|
+
engine.block.appendChild(page, circle2);
|
|
635
|
+
|
|
636
|
+
const circle3 = engine.block.create('graphic');
|
|
637
|
+
engine.block.setShape(
|
|
638
|
+
circle3,
|
|
639
|
+
engine.block.createShape('//ly.img.ubq/shape/ellipse')
|
|
640
|
+
);
|
|
641
|
+
const fill3 = engine.block.createFill('color');
|
|
642
|
+
engine.block.setColor(fill3, 'fill/color/value', {
|
|
643
|
+
r: 0.4,
|
|
644
|
+
g: 0.4,
|
|
645
|
+
b: 1.0,
|
|
646
|
+
a: 1.0
|
|
647
|
+
});
|
|
648
|
+
engine.block.setFill(circle3, fill3);
|
|
649
|
+
engine.block.setWidth(circle3, 120); // 100 * 1.2 = 120
|
|
650
|
+
engine.block.setHeight(circle3, 120);
|
|
651
|
+
engine.block.setPositionX(circle3, quadrantWidth / 2 - 12);
|
|
652
|
+
engine.block.setPositionY(circle3, quadrantHeight / 2 - 12);
|
|
653
|
+
engine.block.appendChild(page, circle3);
|
|
654
|
+
|
|
655
|
+
// Check combinability and perform Union
|
|
656
|
+
if (engine.block.isCombinable([circle1, circle2, circle3])) {
|
|
657
|
+
const unionResult = engine.block.combine(
|
|
658
|
+
[circle1, circle2, circle3],
|
|
659
|
+
'Union'
|
|
660
|
+
);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// Difference: Create punch-out text effect in top-right quadrant
|
|
664
|
+
const imageWidth = 360; // 300 * 1.2 = 360
|
|
665
|
+
const imageHeight = 240; // 200 * 1.2 = 240
|
|
666
|
+
const imageBlock = engine.block.create('graphic');
|
|
667
|
+
engine.block.setShape(
|
|
668
|
+
imageBlock,
|
|
669
|
+
engine.block.createShape('//ly.img.ubq/shape/rect')
|
|
670
|
+
);
|
|
671
|
+
const imageFill = engine.block.createFill('image');
|
|
672
|
+
engine.block.setString(
|
|
673
|
+
imageFill,
|
|
674
|
+
'fill/image/imageFileURI',
|
|
675
|
+
'https://img.ly/static/ubq_samples/sample_1.jpg'
|
|
676
|
+
);
|
|
677
|
+
engine.block.setFill(imageBlock, imageFill);
|
|
678
|
+
engine.block.setWidth(imageBlock, imageWidth);
|
|
679
|
+
engine.block.setHeight(imageBlock, imageHeight);
|
|
680
|
+
engine.block.setPositionX(
|
|
681
|
+
imageBlock,
|
|
682
|
+
quadrantWidth + (quadrantWidth - imageWidth) / 2
|
|
683
|
+
);
|
|
684
|
+
engine.block.setPositionY(imageBlock, (quadrantHeight - imageHeight) / 2);
|
|
685
|
+
engine.block.appendChild(page, imageBlock);
|
|
686
|
+
|
|
687
|
+
const textBlock = engine.block.create('text');
|
|
688
|
+
engine.block.replaceText(textBlock, 'CUTOUT');
|
|
689
|
+
engine.block.setFloat(textBlock, 'text/fontSize', 170);
|
|
690
|
+
const textWidth = 300;
|
|
691
|
+
const textHeight = 120;
|
|
692
|
+
engine.block.setWidth(textBlock, textWidth);
|
|
693
|
+
engine.block.setHeight(textBlock, textHeight);
|
|
694
|
+
// Center text on the image
|
|
695
|
+
engine.block.setPositionX(
|
|
696
|
+
textBlock,
|
|
697
|
+
quadrantWidth + (quadrantWidth - textWidth) / 2
|
|
698
|
+
);
|
|
699
|
+
engine.block.setPositionY(textBlock, (quadrantHeight - textHeight) / 2);
|
|
700
|
+
engine.block.appendChild(page, textBlock);
|
|
701
|
+
|
|
702
|
+
// Ensure image is at bottom for Difference operation
|
|
703
|
+
engine.block.sendToBack(imageBlock);
|
|
704
|
+
|
|
705
|
+
if (engine.block.isCombinable([imageBlock, textBlock])) {
|
|
706
|
+
const differenceResult = engine.block.combine(
|
|
707
|
+
[imageBlock, textBlock],
|
|
708
|
+
'Difference'
|
|
709
|
+
);
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// Zoom to see all results
|
|
713
|
+
await engine.scene.zoomToBlock(page, { padding: 40 });
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
## API Reference
|
|
717
|
+
|
|
718
|
+
| Method | Category | Purpose |
|
|
719
|
+
| -------------------------------------------------- | ----------- | ----------------------------------- |
|
|
720
|
+
| `engine.block.isCombinable(ids)` | Validation | Check if blocks can be combined |
|
|
721
|
+
| `engine.block.combine(ids, op)` | Combination | Perform boolean operation on blocks |
|
|
722
|
+
| `engine.block.create('graphic')` | Creation | Create graphic block for shapes |
|
|
723
|
+
| `engine.block.create('text')` | Creation | Create text block |
|
|
724
|
+
| `engine.block.createShape(type)` | Shapes | Create shape (ellipse, rect, etc.) |
|
|
725
|
+
| `engine.block.setShape(id, shape)` | Shapes | Apply shape to graphic block |
|
|
726
|
+
| `engine.block.createFill(type)` | Fills | Create fill (color, image, etc.) |
|
|
727
|
+
| `engine.block.setFill(id, fill)` | Fills | Apply fill to block |
|
|
728
|
+
| `engine.block.setPositionX/Y(id, val)` | Transform | Position blocks before combining |
|
|
729
|
+
| `engine.block.setWidth/Height(id, val)` | Transform | Size blocks before combining |
|
|
730
|
+
| `engine.block.appendChild(parent, child)` | Hierarchy | Add blocks to scene |
|
|
731
|
+
| `engine.block.isScopeEnabled(id, scope)` | Scope | Check if scope is enabled |
|
|
732
|
+
| `engine.block.setScopeEnabled(id, scope, enabled)` | Scope | Enable/disable scope |
|
|
733
|
+
| `engine.block.bringToFront(id)` | Order | Control stacking order |
|
|
734
|
+
| `engine.block.sendToBack(id)` | Order | Control stacking order |
|
|
735
|
+
|
|
736
|
+
---
|
|
737
|
+
|
|
738
|
+
## More Resources
|
|
739
|
+
|
|
740
|
+
- **[Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md)** - Browse all Vanilla JS/TS documentation
|
|
741
|
+
- **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
|
|
742
|
+
- **[Web Documentation](./js.md)** - Interactive documentation with examples
|
|
743
|
+
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|