@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,761 @@
|
|
|
1
|
+
> This is one page of the CE.SDK Vanilla JS/TS documentation. For a complete overview, see the [Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md). For all docs in one file, see [llms-full.txt](./llms-full.txt.md).
|
|
2
|
+
|
|
3
|
+
**Navigation:** [Guides](./guides.md) > [Rules](./rules.md) > [Moderate Content](./rules/moderate-content.md)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use CE.SDK's engine APIs to extract images and text from designs, then integrate with third-party moderation services to detect inappropriate content.
|
|
8
|
+
|
|
9
|
+
> **Reading time:** 8 minutes
|
|
10
|
+
>
|
|
11
|
+
> **Resources:**
|
|
12
|
+
>
|
|
13
|
+
> - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
|
|
14
|
+
> - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-rules-moderate-content-browser)
|
|
15
|
+
> - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-rules-moderate-content-browser)
|
|
16
|
+
> - [Live demo](https://img.ly/docs/cesdk/examples/guides-rules-moderate-content-browser/)
|
|
17
|
+
|
|
18
|
+

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