@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,698 @@
|
|
|
1
|
+
> This is one page of the CE.SDK Vanilla JS/TS documentation. For a complete overview, see the [Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md). For all docs in one file, see [llms-full.txt](./llms-full.txt.md).
|
|
2
|
+
|
|
3
|
+
**Navigation:** [Guides](./guides.md) > [Export Media Assets](./export-save-publish/export.md) > [Pre-Export Validation](./export-save-publish/pre-export-validation.md)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Validate your design before export by detecting elements outside the page,
|
|
8
|
+
protruding content, obscured text, and other issues that could affect the
|
|
9
|
+
final output quality.
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
> **Reading time:** 10 minutes
|
|
14
|
+
>
|
|
15
|
+
> **Resources:**
|
|
16
|
+
>
|
|
17
|
+
> - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
|
|
18
|
+
> - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-export-save-publish-export-pre-export-validation-browser)
|
|
19
|
+
> - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-export-save-publish-export-pre-export-validation-browser)
|
|
20
|
+
> - [Live demo](https://img.ly/docs/cesdk/examples/guides-export-save-publish-export-pre-export-validation-browser/)
|
|
21
|
+
|
|
22
|
+
Pre-export validation catches layout and quality issues before export, preventing problems like cropped content, hidden text, and elements missing from the final output. Production-quality designs require elements to be properly positioned within the page boundaries.
|
|
23
|
+
|
|
24
|
+
```typescript file=@cesdk_web_examples/guides-export-save-publish-export-pre-export-validation-browser/browser.ts reference-only
|
|
25
|
+
import type {
|
|
26
|
+
CreativeEngine,
|
|
27
|
+
EditorPlugin,
|
|
28
|
+
EditorPluginContext
|
|
29
|
+
} from '@cesdk/cesdk-js';
|
|
30
|
+
import type CreativeEditorSDK from '@cesdk/cesdk-js';
|
|
31
|
+
|
|
32
|
+
import {
|
|
33
|
+
BlurAssetSource,
|
|
34
|
+
ColorPaletteAssetSource,
|
|
35
|
+
CropPresetsAssetSource,
|
|
36
|
+
DemoAssetSources,
|
|
37
|
+
EffectsAssetSource,
|
|
38
|
+
FiltersAssetSource,
|
|
39
|
+
PagePresetsAssetSource,
|
|
40
|
+
StickerAssetSource,
|
|
41
|
+
TextAssetSource,
|
|
42
|
+
TextComponentAssetSource,
|
|
43
|
+
TypefaceAssetSource,
|
|
44
|
+
UploadAssetSources,
|
|
45
|
+
VectorShapeAssetSource
|
|
46
|
+
} from '@cesdk/cesdk-js/plugins';
|
|
47
|
+
import { DesignEditorConfig } from './design-editor/plugin';
|
|
48
|
+
import packageJson from './package.json';
|
|
49
|
+
|
|
50
|
+
type ValidationSeverity = 'error' | 'warning';
|
|
51
|
+
|
|
52
|
+
interface ValidationIssue {
|
|
53
|
+
type:
|
|
54
|
+
| 'outside_page'
|
|
55
|
+
| 'protruding'
|
|
56
|
+
| 'text_obscured'
|
|
57
|
+
| 'unfilled_placeholder';
|
|
58
|
+
severity: ValidationSeverity;
|
|
59
|
+
blockId: number;
|
|
60
|
+
blockName: string;
|
|
61
|
+
message: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface ValidationResult {
|
|
65
|
+
errors: ValidationIssue[];
|
|
66
|
+
warnings: ValidationIssue[];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
class Example implements EditorPlugin {
|
|
70
|
+
name = packageJson.name;
|
|
71
|
+
version = packageJson.version;
|
|
72
|
+
|
|
73
|
+
async initialize({ cesdk }: EditorPluginContext): Promise<void> {
|
|
74
|
+
if (!cesdk) {
|
|
75
|
+
throw new Error('CE.SDK instance is required for this plugin');
|
|
76
|
+
}
|
|
77
|
+
await cesdk.addPlugin(new DesignEditorConfig());
|
|
78
|
+
|
|
79
|
+
// Add asset source plugins
|
|
80
|
+
await cesdk.addPlugin(new BlurAssetSource());
|
|
81
|
+
await cesdk.addPlugin(new ColorPaletteAssetSource());
|
|
82
|
+
await cesdk.addPlugin(new CropPresetsAssetSource());
|
|
83
|
+
await cesdk.addPlugin(
|
|
84
|
+
new UploadAssetSources({ include: ['ly.img.image.upload'] })
|
|
85
|
+
);
|
|
86
|
+
await cesdk.addPlugin(
|
|
87
|
+
new DemoAssetSources({
|
|
88
|
+
include: [
|
|
89
|
+
'ly.img.templates.blank.*',
|
|
90
|
+
'ly.img.templates.presentation.*',
|
|
91
|
+
'ly.img.templates.print.*',
|
|
92
|
+
'ly.img.templates.social.*',
|
|
93
|
+
'ly.img.image.*'
|
|
94
|
+
]
|
|
95
|
+
})
|
|
96
|
+
);
|
|
97
|
+
await cesdk.addPlugin(new EffectsAssetSource());
|
|
98
|
+
await cesdk.addPlugin(new FiltersAssetSource());
|
|
99
|
+
await cesdk.addPlugin(new PagePresetsAssetSource());
|
|
100
|
+
await cesdk.addPlugin(new StickerAssetSource());
|
|
101
|
+
await cesdk.addPlugin(new TextAssetSource());
|
|
102
|
+
await cesdk.addPlugin(new TextComponentAssetSource());
|
|
103
|
+
await cesdk.addPlugin(new TypefaceAssetSource());
|
|
104
|
+
await cesdk.addPlugin(new VectorShapeAssetSource());
|
|
105
|
+
|
|
106
|
+
await cesdk.actions.run('scene.create', {
|
|
107
|
+
page: { width: 800, height: 600, unit: 'Pixel' }
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const engine = cesdk.engine;
|
|
111
|
+
|
|
112
|
+
// Set role to adopter so placeholders can be replaced
|
|
113
|
+
engine.editor.setRole('Adopter');
|
|
114
|
+
|
|
115
|
+
const page = engine.block.findByType('page')[0];
|
|
116
|
+
|
|
117
|
+
await this.createDemoScene(engine, page);
|
|
118
|
+
this.overrideExportAction(cesdk, engine);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private async createDemoScene(
|
|
122
|
+
engine: CreativeEngine,
|
|
123
|
+
page: number
|
|
124
|
+
): Promise<void> {
|
|
125
|
+
const pageWidth = engine.block.getWidth(page);
|
|
126
|
+
const pageHeight = engine.block.getHeight(page);
|
|
127
|
+
const centerY = pageHeight / 2;
|
|
128
|
+
|
|
129
|
+
// Row 1: Main validation examples (horizontally aligned)
|
|
130
|
+
const row1Y = centerY - 120;
|
|
131
|
+
const elementWidth = 150;
|
|
132
|
+
const elementHeight = 100;
|
|
133
|
+
const spacing = 20;
|
|
134
|
+
|
|
135
|
+
// Calculate positions for 4 elements in a row
|
|
136
|
+
const totalRowWidth = elementWidth * 4 + spacing * 3;
|
|
137
|
+
const startX = (pageWidth - totalRowWidth) / 2;
|
|
138
|
+
|
|
139
|
+
// Create an image that's outside the page (will trigger error)
|
|
140
|
+
// Positioned to the left of the page - completely outside
|
|
141
|
+
const outsideImage = engine.block.create('graphic');
|
|
142
|
+
engine.block.setName(outsideImage, 'Outside Image');
|
|
143
|
+
engine.block.setShape(outsideImage, engine.block.createShape('rect'));
|
|
144
|
+
const outsideFill = engine.block.createFill('image');
|
|
145
|
+
engine.block.setString(
|
|
146
|
+
outsideFill,
|
|
147
|
+
'fill/image/imageFileURI',
|
|
148
|
+
'https://img.ly/static/ubq_samples/sample_1.jpg'
|
|
149
|
+
);
|
|
150
|
+
engine.block.setFill(outsideImage, outsideFill);
|
|
151
|
+
engine.block.setWidth(outsideImage, elementWidth);
|
|
152
|
+
engine.block.setHeight(outsideImage, elementHeight);
|
|
153
|
+
engine.block.setPositionX(outsideImage, -elementWidth - 10); // Left of the page
|
|
154
|
+
engine.block.setPositionY(outsideImage, row1Y);
|
|
155
|
+
engine.block.appendChild(page, outsideImage);
|
|
156
|
+
|
|
157
|
+
// Create a properly placed image for reference (first in row)
|
|
158
|
+
const validImage = engine.block.create('graphic');
|
|
159
|
+
engine.block.setName(validImage, 'Valid Image');
|
|
160
|
+
engine.block.setShape(validImage, engine.block.createShape('rect'));
|
|
161
|
+
const validFill = engine.block.createFill('image');
|
|
162
|
+
engine.block.setString(
|
|
163
|
+
validFill,
|
|
164
|
+
'fill/image/imageFileURI',
|
|
165
|
+
'https://img.ly/static/ubq_samples/sample_3.jpg'
|
|
166
|
+
);
|
|
167
|
+
engine.block.setFill(validImage, validFill);
|
|
168
|
+
engine.block.setWidth(validImage, elementWidth);
|
|
169
|
+
engine.block.setHeight(validImage, elementHeight);
|
|
170
|
+
engine.block.setPositionX(validImage, startX);
|
|
171
|
+
engine.block.setPositionY(validImage, row1Y);
|
|
172
|
+
engine.block.appendChild(page, validImage);
|
|
173
|
+
|
|
174
|
+
// Create unfilled placeholder (second in row - triggers error)
|
|
175
|
+
const placeholder = engine.block.create('graphic');
|
|
176
|
+
engine.block.setName(placeholder, 'Unfilled Placeholder');
|
|
177
|
+
engine.block.setShape(placeholder, engine.block.createShape('rect'));
|
|
178
|
+
const placeholderFill = engine.block.createFill('image');
|
|
179
|
+
engine.block.setFill(placeholder, placeholderFill);
|
|
180
|
+
engine.block.setWidth(placeholder, elementWidth);
|
|
181
|
+
engine.block.setHeight(placeholder, elementHeight);
|
|
182
|
+
engine.block.setPositionX(placeholder, startX + elementWidth + spacing);
|
|
183
|
+
engine.block.setPositionY(placeholder, row1Y);
|
|
184
|
+
engine.block.appendChild(page, placeholder);
|
|
185
|
+
engine.block.setScopeEnabled(placeholder, 'fill/change', true);
|
|
186
|
+
engine.block.setPlaceholderBehaviorEnabled(placeholderFill, true);
|
|
187
|
+
engine.block.setPlaceholderEnabled(placeholder, true);
|
|
188
|
+
engine.block.setPlaceholderControlsOverlayEnabled(placeholder, true);
|
|
189
|
+
engine.block.setPlaceholderControlsButtonEnabled(placeholder, true);
|
|
190
|
+
|
|
191
|
+
// Create text that will be partially obscured (third in row)
|
|
192
|
+
const obscuredText = engine.block.create('text');
|
|
193
|
+
engine.block.setName(obscuredText, 'Obscured Text');
|
|
194
|
+
engine.block.setPositionX(
|
|
195
|
+
obscuredText,
|
|
196
|
+
startX + (elementWidth + spacing) * 2
|
|
197
|
+
);
|
|
198
|
+
engine.block.setPositionY(obscuredText, row1Y);
|
|
199
|
+
engine.block.setWidth(obscuredText, elementWidth);
|
|
200
|
+
engine.block.setHeight(obscuredText, elementHeight);
|
|
201
|
+
engine.block.replaceText(obscuredText, 'Hidden');
|
|
202
|
+
engine.block.setFloat(obscuredText, 'text/fontSize', 48);
|
|
203
|
+
engine.block.appendChild(page, obscuredText);
|
|
204
|
+
|
|
205
|
+
// Create a shape that overlaps the text (added after text = on top)
|
|
206
|
+
const overlappingShape = engine.block.create('graphic');
|
|
207
|
+
engine.block.setName(overlappingShape, 'Overlapping Shape');
|
|
208
|
+
engine.block.setShape(overlappingShape, engine.block.createShape('rect'));
|
|
209
|
+
const shapeFill = engine.block.createFill('color');
|
|
210
|
+
engine.block.setColor(shapeFill, 'fill/color/value', {
|
|
211
|
+
r: 0.2,
|
|
212
|
+
g: 0.4,
|
|
213
|
+
b: 0.8,
|
|
214
|
+
a: 0.8
|
|
215
|
+
});
|
|
216
|
+
engine.block.setFill(overlappingShape, shapeFill);
|
|
217
|
+
engine.block.setWidth(overlappingShape, elementWidth);
|
|
218
|
+
engine.block.setHeight(overlappingShape, elementHeight);
|
|
219
|
+
engine.block.setPositionX(
|
|
220
|
+
overlappingShape,
|
|
221
|
+
startX + (elementWidth + spacing) * 2
|
|
222
|
+
);
|
|
223
|
+
engine.block.setPositionY(overlappingShape, row1Y);
|
|
224
|
+
engine.block.appendChild(page, overlappingShape);
|
|
225
|
+
|
|
226
|
+
// Create an image that protrudes from the page (fourth in row - will trigger warning)
|
|
227
|
+
// Extends past right page boundary
|
|
228
|
+
const protrudingImage = engine.block.create('graphic');
|
|
229
|
+
engine.block.setName(protrudingImage, 'Protruding Image');
|
|
230
|
+
engine.block.setShape(protrudingImage, engine.block.createShape('rect'));
|
|
231
|
+
const protrudingFill = engine.block.createFill('image');
|
|
232
|
+
engine.block.setString(
|
|
233
|
+
protrudingFill,
|
|
234
|
+
'fill/image/imageFileURI',
|
|
235
|
+
'https://img.ly/static/ubq_samples/sample_2.jpg'
|
|
236
|
+
);
|
|
237
|
+
engine.block.setFill(protrudingImage, protrudingFill);
|
|
238
|
+
engine.block.setWidth(protrudingImage, elementWidth);
|
|
239
|
+
engine.block.setHeight(protrudingImage, elementHeight);
|
|
240
|
+
engine.block.setPositionX(protrudingImage, pageWidth - elementWidth / 2); // Extends 75px past right
|
|
241
|
+
engine.block.setPositionY(protrudingImage, row1Y);
|
|
242
|
+
engine.block.appendChild(page, protrudingImage);
|
|
243
|
+
|
|
244
|
+
// Add explanatory text below the row
|
|
245
|
+
const explanationText = engine.block.create('text');
|
|
246
|
+
engine.block.setPositionX(explanationText, 50);
|
|
247
|
+
engine.block.setPositionY(explanationText, row1Y + elementHeight + 40);
|
|
248
|
+
engine.block.setWidth(explanationText, pageWidth - 100);
|
|
249
|
+
engine.block.setHeightMode(explanationText, 'Auto');
|
|
250
|
+
engine.block.replaceText(
|
|
251
|
+
explanationText,
|
|
252
|
+
'Click Export to run validation. Move elements to fix issues.'
|
|
253
|
+
);
|
|
254
|
+
engine.block.setFloat(explanationText, 'text/fontSize', 48);
|
|
255
|
+
engine.block.setEnum(explanationText, 'text/horizontalAlignment', 'Center');
|
|
256
|
+
engine.block.appendChild(page, explanationText);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private getBoundingBox(
|
|
260
|
+
engine: CreativeEngine,
|
|
261
|
+
blockId: number
|
|
262
|
+
): [number, number, number, number] {
|
|
263
|
+
const x = engine.block.getGlobalBoundingBoxX(blockId);
|
|
264
|
+
const y = engine.block.getGlobalBoundingBoxY(blockId);
|
|
265
|
+
const width = engine.block.getGlobalBoundingBoxWidth(blockId);
|
|
266
|
+
const height = engine.block.getGlobalBoundingBoxHeight(blockId);
|
|
267
|
+
return [x, y, x + width, y + height];
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
private calculateOverlap(
|
|
271
|
+
box1: [number, number, number, number],
|
|
272
|
+
box2: [number, number, number, number]
|
|
273
|
+
): number {
|
|
274
|
+
const [ax1, ay1, ax2, ay2] = box1;
|
|
275
|
+
const [bx1, by1, bx2, by2] = box2;
|
|
276
|
+
|
|
277
|
+
const overlapWidth = Math.max(0, Math.min(ax2, bx2) - Math.max(ax1, bx1));
|
|
278
|
+
const overlapHeight = Math.max(0, Math.min(ay2, by2) - Math.max(ay1, by1));
|
|
279
|
+
const overlapArea = overlapWidth * overlapHeight;
|
|
280
|
+
|
|
281
|
+
const box1Area = (ax2 - ax1) * (ay2 - ay1);
|
|
282
|
+
if (box1Area === 0) return 0;
|
|
283
|
+
|
|
284
|
+
return overlapArea / box1Area;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
private getBlockName(engine: CreativeEngine, blockId: number): string {
|
|
288
|
+
const name = engine.block.getName(blockId);
|
|
289
|
+
if (name) return name;
|
|
290
|
+
const kind = engine.block.getKind(blockId);
|
|
291
|
+
return kind.charAt(0).toUpperCase() + kind.slice(1);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
private getRelevantBlocks(engine: CreativeEngine): number[] {
|
|
295
|
+
return [
|
|
296
|
+
...engine.block.findByType('text'),
|
|
297
|
+
...engine.block.findByType('graphic')
|
|
298
|
+
];
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
private findOutsideBlocks(
|
|
302
|
+
engine: CreativeEngine,
|
|
303
|
+
page: number
|
|
304
|
+
): ValidationIssue[] {
|
|
305
|
+
const issues: ValidationIssue[] = [];
|
|
306
|
+
const pageBounds = this.getBoundingBox(engine, page);
|
|
307
|
+
|
|
308
|
+
for (const blockId of this.getRelevantBlocks(engine)) {
|
|
309
|
+
if (!engine.block.isValid(blockId)) continue;
|
|
310
|
+
|
|
311
|
+
const blockBounds = this.getBoundingBox(engine, blockId);
|
|
312
|
+
const overlap = this.calculateOverlap(blockBounds, pageBounds);
|
|
313
|
+
|
|
314
|
+
if (overlap === 0) {
|
|
315
|
+
// Element is completely outside the page
|
|
316
|
+
issues.push({
|
|
317
|
+
type: 'outside_page',
|
|
318
|
+
severity: 'error',
|
|
319
|
+
blockId,
|
|
320
|
+
blockName: this.getBlockName(engine, blockId),
|
|
321
|
+
message: 'Element is completely outside the visible page area'
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return issues;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
private findProtrudingBlocks(
|
|
330
|
+
engine: CreativeEngine,
|
|
331
|
+
page: number
|
|
332
|
+
): ValidationIssue[] {
|
|
333
|
+
const issues: ValidationIssue[] = [];
|
|
334
|
+
const pageBounds = this.getBoundingBox(engine, page);
|
|
335
|
+
|
|
336
|
+
for (const blockId of this.getRelevantBlocks(engine)) {
|
|
337
|
+
if (!engine.block.isValid(blockId)) continue;
|
|
338
|
+
|
|
339
|
+
// Compare element bounds against page bounds
|
|
340
|
+
const blockBounds = this.getBoundingBox(engine, blockId);
|
|
341
|
+
const overlap = this.calculateOverlap(blockBounds, pageBounds);
|
|
342
|
+
|
|
343
|
+
// Protruding: partially inside (overlap > 0) but not fully inside (overlap < 1)
|
|
344
|
+
if (overlap > 0 && overlap < 0.99) {
|
|
345
|
+
issues.push({
|
|
346
|
+
type: 'protruding',
|
|
347
|
+
severity: 'warning',
|
|
348
|
+
blockId,
|
|
349
|
+
blockName: this.getBlockName(engine, blockId),
|
|
350
|
+
message: 'Element extends beyond page boundaries'
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return issues;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
private findObscuredText(
|
|
359
|
+
engine: CreativeEngine,
|
|
360
|
+
page: number
|
|
361
|
+
): ValidationIssue[] {
|
|
362
|
+
const issues: ValidationIssue[] = [];
|
|
363
|
+
const children = engine.block.getChildren(page);
|
|
364
|
+
const textBlocks = engine.block.findByType('text');
|
|
365
|
+
|
|
366
|
+
for (const textId of textBlocks) {
|
|
367
|
+
if (!engine.block.isValid(textId)) continue;
|
|
368
|
+
|
|
369
|
+
const textIndex = children.indexOf(textId);
|
|
370
|
+
if (textIndex === -1) continue;
|
|
371
|
+
|
|
372
|
+
// Elements later in children array are rendered on top
|
|
373
|
+
const blocksAbove = children.slice(textIndex + 1);
|
|
374
|
+
|
|
375
|
+
for (const aboveId of blocksAbove) {
|
|
376
|
+
// Skip text blocks - they don't typically obscure other text
|
|
377
|
+
if (engine.block.getType(aboveId) === '//ly.img.ubq/text') continue;
|
|
378
|
+
|
|
379
|
+
const overlap = this.calculateOverlap(
|
|
380
|
+
this.getBoundingBox(engine, textId),
|
|
381
|
+
this.getBoundingBox(engine, aboveId)
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
if (overlap > 0) {
|
|
385
|
+
// Text is obscured by element above it
|
|
386
|
+
issues.push({
|
|
387
|
+
type: 'text_obscured',
|
|
388
|
+
severity: 'warning',
|
|
389
|
+
blockId: textId,
|
|
390
|
+
blockName: this.getBlockName(engine, textId),
|
|
391
|
+
message: 'Text may be partially hidden by overlapping elements'
|
|
392
|
+
});
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return issues;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
private findUnfilledPlaceholders(engine: CreativeEngine): ValidationIssue[] {
|
|
402
|
+
const issues: ValidationIssue[] = [];
|
|
403
|
+
const placeholders = engine.block.findAllPlaceholders();
|
|
404
|
+
|
|
405
|
+
for (const blockId of placeholders) {
|
|
406
|
+
if (!engine.block.isValid(blockId)) continue;
|
|
407
|
+
|
|
408
|
+
if (!this.isPlaceholderFilled(engine, blockId)) {
|
|
409
|
+
issues.push({
|
|
410
|
+
type: 'unfilled_placeholder',
|
|
411
|
+
severity: 'error',
|
|
412
|
+
blockId,
|
|
413
|
+
blockName: this.getBlockName(engine, blockId),
|
|
414
|
+
message: 'Placeholder has not been filled with content'
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return issues;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
private isPlaceholderFilled(
|
|
423
|
+
engine: CreativeEngine,
|
|
424
|
+
blockId: number
|
|
425
|
+
): boolean {
|
|
426
|
+
const fillId = engine.block.getFill(blockId);
|
|
427
|
+
if (!fillId || !engine.block.isValid(fillId)) return false;
|
|
428
|
+
|
|
429
|
+
const fillType = engine.block.getType(fillId);
|
|
430
|
+
|
|
431
|
+
// Check image fill - empty URI means unfilled placeholder
|
|
432
|
+
if (fillType === '//ly.img.ubq/fill/image') {
|
|
433
|
+
const imageUri = engine.block.getString(
|
|
434
|
+
fillId,
|
|
435
|
+
'fill/image/imageFileURI'
|
|
436
|
+
);
|
|
437
|
+
return imageUri !== '' && imageUri !== undefined;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Other fill types are considered filled
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
private validateDesign(engine: CreativeEngine): ValidationResult {
|
|
445
|
+
const page = engine.block.findByType('page')[0];
|
|
446
|
+
|
|
447
|
+
const outsideIssues = this.findOutsideBlocks(engine, page);
|
|
448
|
+
const protrudingIssues = this.findProtrudingBlocks(engine, page);
|
|
449
|
+
const obscuredIssues = this.findObscuredText(engine, page);
|
|
450
|
+
const placeholderIssues = this.findUnfilledPlaceholders(engine);
|
|
451
|
+
|
|
452
|
+
const allIssues = [
|
|
453
|
+
...outsideIssues,
|
|
454
|
+
...protrudingIssues,
|
|
455
|
+
...obscuredIssues,
|
|
456
|
+
...placeholderIssues
|
|
457
|
+
];
|
|
458
|
+
|
|
459
|
+
return {
|
|
460
|
+
errors: allIssues.filter((i) => i.severity === 'error'),
|
|
461
|
+
warnings: allIssues.filter((i) => i.severity === 'warning')
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
private overrideExportAction(
|
|
466
|
+
cesdk: CreativeEditorSDK,
|
|
467
|
+
engine: CreativeEngine
|
|
468
|
+
): void {
|
|
469
|
+
cesdk.ui.insertOrderComponent(
|
|
470
|
+
{ in: 'ly.img.navigation.bar', position: 'end' },
|
|
471
|
+
{
|
|
472
|
+
id: 'ly.img.actions.navigationBar',
|
|
473
|
+
children: ['ly.img.exportImage.navigationBar']
|
|
474
|
+
}
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
const exportDesign = cesdk.actions.get('exportDesign');
|
|
478
|
+
|
|
479
|
+
cesdk.actions.register('exportDesign', async () => {
|
|
480
|
+
const result = this.validateDesign(engine);
|
|
481
|
+
const hasErrors = result.errors.length > 0;
|
|
482
|
+
const hasWarnings = result.warnings.length > 0;
|
|
483
|
+
|
|
484
|
+
// Log all issues to console for debugging
|
|
485
|
+
if (hasErrors || hasWarnings) {
|
|
486
|
+
console.log('Validation Results:', result);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Block export for errors
|
|
490
|
+
if (hasErrors) {
|
|
491
|
+
cesdk.ui.showNotification({
|
|
492
|
+
message: `${result.errors.length} error(s) found - export blocked`,
|
|
493
|
+
type: 'error',
|
|
494
|
+
duration: 'long'
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
// Select first problematic block
|
|
498
|
+
const firstError = result.errors[0];
|
|
499
|
+
if (engine.block.isValid(firstError.blockId)) {
|
|
500
|
+
engine.block.select(firstError.blockId);
|
|
501
|
+
}
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// Show warning but allow export
|
|
506
|
+
if (hasWarnings) {
|
|
507
|
+
cesdk.ui.showNotification({
|
|
508
|
+
message: `${result.warnings.length} warning(s) found - proceeding with export`,
|
|
509
|
+
type: 'warning',
|
|
510
|
+
duration: 'medium'
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Proceed with export
|
|
515
|
+
exportDesign();
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
export default Example;
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
This guide demonstrates how to detect elements outside the page, find protruding content, identify obscured text, and integrate validation into the export workflow.
|
|
524
|
+
|
|
525
|
+
## Getting Element Bounds
|
|
526
|
+
|
|
527
|
+
To detect spatial issues, we need to get the bounding box of elements in global coordinates. The `getGlobalBoundingBox*` methods return positions that account for all transformations:
|
|
528
|
+
|
|
529
|
+
```typescript highlight-get-bounding-box
|
|
530
|
+
const x = engine.block.getGlobalBoundingBoxX(blockId);
|
|
531
|
+
const y = engine.block.getGlobalBoundingBoxY(blockId);
|
|
532
|
+
const width = engine.block.getGlobalBoundingBoxWidth(blockId);
|
|
533
|
+
const height = engine.block.getGlobalBoundingBoxHeight(blockId);
|
|
534
|
+
return [x, y, x + width, y + height];
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
This returns coordinates as `[x1, y1, x2, y2]` representing the top-left and bottom-right corners of the element. The overlap between element and page bounds is calculated as the intersection area divided by the element's total area. An overlap of 0 means completely outside, while 1 (100%) means fully inside.
|
|
538
|
+
|
|
539
|
+
## Detecting Elements Outside the Page
|
|
540
|
+
|
|
541
|
+
Elements completely outside the page won't appear in the exported output. We find these by checking for blocks with zero overlap with the page bounds:
|
|
542
|
+
|
|
543
|
+
```typescript highlight-find-outside-blocks
|
|
544
|
+
const blockBounds = this.getBoundingBox(engine, blockId);
|
|
545
|
+
const overlap = this.calculateOverlap(blockBounds, pageBounds);
|
|
546
|
+
|
|
547
|
+
if (overlap === 0) {
|
|
548
|
+
// Element is completely outside the page
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
These issues are categorized as errors because the content is completely missing from the export.
|
|
552
|
+
|
|
553
|
+
## Detecting Protruding Elements
|
|
554
|
+
|
|
555
|
+
Elements that extend beyond the page boundaries will be partially cropped in the export. For each block, compare its bounds against the page bounds and calculate the overlap ratio:
|
|
556
|
+
|
|
557
|
+
```typescript highlight-find-protruding-blocks
|
|
558
|
+
// Compare element bounds against page bounds
|
|
559
|
+
const blockBounds = this.getBoundingBox(engine, blockId);
|
|
560
|
+
const overlap = this.calculateOverlap(blockBounds, pageBounds);
|
|
561
|
+
|
|
562
|
+
// Protruding: partially inside (overlap > 0) but not fully inside (overlap < 1)
|
|
563
|
+
if (overlap > 0 && overlap < 0.99) {
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
An overlap between 0% and 100% indicates the element is partially inside the page. These issues are warnings because the content is partially visible but may not appear as intended.
|
|
567
|
+
|
|
568
|
+
## Finding Obscured Text
|
|
569
|
+
|
|
570
|
+
Text hidden behind other elements may be unreadable in the final export. First, get the stacking order and all text blocks:
|
|
571
|
+
|
|
572
|
+
```typescript highlight-find-obscured-text
|
|
573
|
+
const children = engine.block.getChildren(page);
|
|
574
|
+
const textBlocks = engine.block.findByType('text');
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
The `getChildren()` method returns blocks in stacking order - elements later in the array are rendered on top. For each text block, check if any non-text element above it overlaps with its bounds:
|
|
578
|
+
|
|
579
|
+
```typescript highlight-check-text-obscured
|
|
580
|
+
// Elements later in children array are rendered on top
|
|
581
|
+
const blocksAbove = children.slice(textIndex + 1);
|
|
582
|
+
|
|
583
|
+
for (const aboveId of blocksAbove) {
|
|
584
|
+
// Skip text blocks - they don't typically obscure other text
|
|
585
|
+
if (engine.block.getType(aboveId) === '//ly.img.ubq/text') continue;
|
|
586
|
+
|
|
587
|
+
const overlap = this.calculateOverlap(
|
|
588
|
+
this.getBoundingBox(engine, textId),
|
|
589
|
+
this.getBoundingBox(engine, aboveId)
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
if (overlap > 0) {
|
|
593
|
+
// Text is obscured by element above it
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
We skip text-on-text comparisons since transparent text backgrounds don't typically obscure other text. When overlap is detected, we flag the text as potentially obscured.
|
|
597
|
+
|
|
598
|
+
## Checking Placeholder Content
|
|
599
|
+
|
|
600
|
+
Placeholders mark areas where users must add content before export. First, find all placeholder blocks in the design:
|
|
601
|
+
|
|
602
|
+
```typescript highlight-find-placeholders
|
|
603
|
+
const placeholders = engine.block.findAllPlaceholders();
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
Then inspect each placeholder's fill to determine if content has been added. Get the fill block and check its type to determine the validation logic:
|
|
607
|
+
|
|
608
|
+
```typescript highlight-check-placeholder-filled
|
|
609
|
+
const fillId = engine.block.getFill(blockId);
|
|
610
|
+
if (!fillId || !engine.block.isValid(fillId)) return false;
|
|
611
|
+
|
|
612
|
+
const fillType = engine.block.getType(fillId);
|
|
613
|
+
|
|
614
|
+
// Check image fill - empty URI means unfilled placeholder
|
|
615
|
+
if (fillType === '//ly.img.ubq/fill/image') {
|
|
616
|
+
const imageUri = engine.block.getString(fillId, 'fill/image/imageFileURI');
|
|
617
|
+
return imageUri !== '' && imageUri !== undefined;
|
|
618
|
+
}
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
For image placeholders, check if the `fill/image/imageFileURI` property has a value. An empty or undefined URI indicates the placeholder hasn't been filled. Unfilled placeholders are treated as errors that block export, ensuring users complete all required content before exporting.
|
|
622
|
+
|
|
623
|
+
## Overriding the Export Action
|
|
624
|
+
|
|
625
|
+
Intercept the navigation bar export action using `cesdk.actions.get()` and `cesdk.actions.register()`. The action ID `'exportDesign'` controls the export button in the CE.SDK interface:
|
|
626
|
+
|
|
627
|
+
```typescript highlight-override-export-action
|
|
628
|
+
cesdk.actions.register('exportDesign', async () => {
|
|
629
|
+
const result = this.validateDesign(engine);
|
|
630
|
+
const hasErrors = result.errors.length > 0;
|
|
631
|
+
const hasWarnings = result.warnings.length > 0;
|
|
632
|
+
|
|
633
|
+
// Log all issues to console for debugging
|
|
634
|
+
if (hasErrors || hasWarnings) {
|
|
635
|
+
console.log('Validation Results:', result);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
// Block export for errors
|
|
639
|
+
if (hasErrors) {
|
|
640
|
+
cesdk.ui.showNotification({
|
|
641
|
+
message: `${result.errors.length} error(s) found - export blocked`,
|
|
642
|
+
type: 'error',
|
|
643
|
+
duration: 'long'
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
// Select first problematic block
|
|
647
|
+
const firstError = result.errors[0];
|
|
648
|
+
if (engine.block.isValid(firstError.blockId)) {
|
|
649
|
+
engine.block.select(firstError.blockId);
|
|
650
|
+
}
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// Show warning but allow export
|
|
655
|
+
if (hasWarnings) {
|
|
656
|
+
cesdk.ui.showNotification({
|
|
657
|
+
message: `${result.warnings.length} warning(s) found - proceeding with export`,
|
|
658
|
+
type: 'warning',
|
|
659
|
+
duration: 'medium'
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// Proceed with export
|
|
664
|
+
exportDesign();
|
|
665
|
+
});
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
This override runs validation before export, shows notifications for errors or warnings, and selects the first problematic block to help users locate issues. Export proceeds only when validation passes.
|
|
669
|
+
|
|
670
|
+
## API Reference
|
|
671
|
+
|
|
672
|
+
| Method | Purpose |
|
|
673
|
+
| --------------------------------------------- | ---------------------------------- |
|
|
674
|
+
| `engine.block.getGlobalBoundingBoxX(id)` | Get element's global X position |
|
|
675
|
+
| `engine.block.getGlobalBoundingBoxY(id)` | Get element's global Y position |
|
|
676
|
+
| `engine.block.getGlobalBoundingBoxWidth(id)` | Get element's global width |
|
|
677
|
+
| `engine.block.getGlobalBoundingBoxHeight(id)` | Get element's global height |
|
|
678
|
+
| `engine.block.findByType(type)` | Find all blocks of a specific type |
|
|
679
|
+
| `engine.block.getChildren(id)` | Get child blocks in stacking order |
|
|
680
|
+
| `engine.block.getType(id)` | Get the block's type string |
|
|
681
|
+
| `engine.block.getName(id)` | Get the block's display name |
|
|
682
|
+
| `engine.block.isValid(id)` | Check if block exists |
|
|
683
|
+
| `engine.block.select(id)` | Select a block in the editor |
|
|
684
|
+
| `engine.block.findAllPlaceholders()` | Find all placeholder blocks |
|
|
685
|
+
| `engine.block.getFill(id)` | Get the fill block |
|
|
686
|
+
| `engine.block.getString(id, property)` | Get a string property value |
|
|
687
|
+
| `cesdk.actions.get(actionId)` | Get an action function (browser) |
|
|
688
|
+
| `cesdk.actions.register(actionId, fn)` | Register an action (browser) |
|
|
689
|
+
| `cesdk.ui.showNotification(options)` | Display notification (browser) |
|
|
690
|
+
|
|
691
|
+
---
|
|
692
|
+
|
|
693
|
+
## More Resources
|
|
694
|
+
|
|
695
|
+
- **[Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md)** - Browse all Vanilla JS/TS documentation
|
|
696
|
+
- **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
|
|
697
|
+
- **[Web Documentation](./js.md)** - Interactive documentation with examples
|
|
698
|
+
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|