@imgly/codesign-mcp 0.1.5 → 0.1.6
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/README.md +51 -1
- package/assets/docs/guide/SKILL.md +45 -53
- package/assets/docs/guide/animation/create/base.md +234 -243
- package/assets/docs/guide/animation/create/text.md +250 -231
- package/assets/docs/guide/animation/create.md +197 -231
- package/assets/docs/guide/animation/edit.md +196 -271
- package/assets/docs/guide/animation/types.md +182 -185
- package/assets/docs/guide/animation.md +9 -6
- package/assets/docs/guide/api/AssetAPI.md +7 -53
- package/assets/docs/guide/api/BlockAPI.md +725 -648
- package/assets/docs/guide/api/CreativeEngine.md +7 -16
- package/assets/docs/guide/api/EditorAPI.md +32 -93
- package/assets/docs/guide/api/EventAPI.md +1 -2
- package/assets/docs/guide/api/SceneAPI.md +47 -98
- package/assets/docs/guide/api/VariableAPI.md +1 -4
- package/assets/docs/guide/api/node/classes/assetapi.md +1090 -0
- package/assets/docs/guide/api/node/classes/blockapi.md +12965 -0
- package/assets/docs/guide/api/node/classes/creativeengine.md +319 -0
- package/assets/docs/guide/api/node/classes/editorapi.md +3417 -0
- package/assets/docs/guide/api/node/classes/engineactions.md +319 -0
- package/assets/docs/guide/api/node/classes/eventapi.md +56 -0
- package/assets/docs/guide/api/node/classes/sceneapi.md +1370 -0
- package/assets/docs/guide/api/node/classes/variableapi.md +143 -0
- package/assets/docs/guide/api/node/enumerations/compressionformat.md +23 -0
- package/assets/docs/guide/api/node/enumerations/compressionlevel.md +24 -0
- package/assets/docs/guide/api/node/functions/iscmykcolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isrgbacolor.md +30 -0
- package/assets/docs/guide/api/node/functions/isspotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/addvideooptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/applyassetoptions.md +31 -0
- package/assets/docs/guide/api/node/interfaces/asset.md +30 -0
- package/assets/docs/guide/api/node/interfaces/assetbooleanproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcmykcolor.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetcolorproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetcontentaspectratio.md +23 -0
- package/assets/docs/guide/api/node/interfaces/assetdefinition.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetenumproperty.md +26 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedaspectratio.md +24 -0
- package/assets/docs/guide/api/node/interfaces/assetfixedsize.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetfreeaspectratio.md +22 -0
- package/assets/docs/guide/api/node/interfaces/assetnumberproperty.md +28 -0
- package/assets/docs/guide/api/node/interfaces/assetpayload.md +27 -0
- package/assets/docs/guide/api/node/interfaces/assetquerydata.md +32 -0
- package/assets/docs/guide/api/node/interfaces/assetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/assetrgbcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsource.md +111 -0
- package/assets/docs/guide/api/node/interfaces/assetspotcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetsqueryresult.md +31 -0
- package/assets/docs/guide/api/node/interfaces/assetstringproperty.md +25 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepreset.md +39 -0
- package/assets/docs/guide/api/node/interfaces/assetstylepresetanimation.md +23 -0
- package/assets/docs/guide/api/node/interfaces/audiotrackinfo.md +32 -0
- package/assets/docs/guide/api/node/interfaces/blockevent.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateerror.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstatepending.md +26 -0
- package/assets/docs/guide/api/node/interfaces/blockstateready.md +25 -0
- package/assets/docs/guide/api/node/interfaces/buffer.md +26 -0
- package/assets/docs/guide/api/node/interfaces/characterinkbox.md +29 -0
- package/assets/docs/guide/api/node/interfaces/cmykcolor.md +34 -0
- package/assets/docs/guide/api/node/interfaces/completeassetresult.md +46 -0
- package/assets/docs/guide/api/node/interfaces/configuration.md +38 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolor.md +25 -0
- package/assets/docs/guide/api/node/interfaces/dominantcolorsoptions.md +23 -0
- package/assets/docs/guide/api/node/interfaces/engineactioninfo.md +24 -0
- package/assets/docs/guide/api/node/interfaces/engineactionsregistry.md +18 -0
- package/assets/docs/guide/api/node/interfaces/engineplugin.md +30 -0
- package/assets/docs/guide/api/node/interfaces/font.md +27 -0
- package/assets/docs/guide/api/node/interfaces/fontmetrics.md +32 -0
- package/assets/docs/guide/api/node/interfaces/gradientcolorstop.md +28 -0
- package/assets/docs/guide/api/node/interfaces/logger.md +39 -0
- package/assets/docs/guide/api/node/interfaces/pageduration.md +23 -0
- package/assets/docs/guide/api/node/interfaces/range.md +23 -0
- package/assets/docs/guide/api/node/interfaces/rgbacolor.md +32 -0
- package/assets/docs/guide/api/node/interfaces/rgbcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/settings.md +126 -0
- package/assets/docs/guide/api/node/interfaces/size2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/source.md +24 -0
- package/assets/docs/guide/api/node/interfaces/spotcolor.md +30 -0
- package/assets/docs/guide/api/node/interfaces/textdecorationconfig.md +31 -0
- package/assets/docs/guide/api/node/interfaces/textfontsizeoptions.md +24 -0
- package/assets/docs/guide/api/node/interfaces/textruninfo.md +33 -0
- package/assets/docs/guide/api/node/interfaces/transientresource.md +26 -0
- package/assets/docs/guide/api/node/interfaces/typeface.md +23 -0
- package/assets/docs/guide/api/node/interfaces/vec2.md +21 -0
- package/assets/docs/guide/api/node/interfaces/vec3.md +22 -0
- package/assets/docs/guide/api/node/type-aliases/addimageoptions.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/animationbaselinedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationblockswipetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationeasing.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationentry.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationgrowdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationjumploopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationkenburnsdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationmergetextdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/animationspindirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationspinloopdirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationtypewritertextwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/animationwipedirection.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/applicationmimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/assetcolor.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/assetfilter.md +47 -0
- package/assets/docs/guide/api/node/type-aliases/assetgroups.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetmetadata.md +42 -0
- package/assets/docs/guide/api/node/type-aliases/assetproperty.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertyfilter.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/assetpropertypath.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetanimationproperties.md +34 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetproperties.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetpropertyvalue.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/assetstylepresetscalableproperty.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/assettransformpreset.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/asyncuriresolver.md +36 -0
- package/assets/docs/guide/api/node/type-aliases/audioexportoptions.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/audiofromvideooptions.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/audiomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/blendmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/blockenumtype.md +63 -0
- package/assets/docs/guide/api/node/type-aliases/blockstate.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/blurtype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/blurtypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/booleanoperation.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/boolpropertyname.md +79 -0
- package/assets/docs/guide/api/node/type-aliases/cameraclampingovershootmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionhorizontalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/captionverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/cmyk.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/color.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/colorpickercolormode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/colorpropertyname.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/colorspace.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/contentfillmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmomovehandlevisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoresizehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmorotatehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/controlgizmoscalehandlesvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/createsceneoptions.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/cutoutoperation.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/cutouttype.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/defaultassetsourceid.md +37 -0
- package/assets/docs/guide/api/node/type-aliases/demoassetsourceid.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/designblockid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/designblocktypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/designunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doubleclickselectionmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/doublepropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/dropshadowoptions.md +32 -0
- package/assets/docs/guide/api/node/type-aliases/editmode.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/effecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/effecttypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/engineactionid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/enginecustomactionfunction.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/engineplugincontext.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/enumpropertyname.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/enumvalues.md +59 -0
- package/assets/docs/guide/api/node/type-aliases/exportoptions.md +57 -0
- package/assets/docs/guide/api/node/type-aliases/fillpixelstreamorientation.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/filltype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/filltypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/filltypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/floatpropertyname.md +184 -0
- package/assets/docs/guide/api/node/type-aliases/fontsizeunit.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/fontstyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/fontweight.md +30 -0
- package/assets/docs/guide/api/node/type-aliases/gradientstoprgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/heightmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/hexcolorstring.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyid.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/historyupdate.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/horizontaltextalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/imagemimetype.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/intpropertyname.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/liststyle.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/locale.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/loglevel.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/mimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/objecttype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypelonghand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/objecttypeshorthand.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/optionalprefix.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/pageguidessource.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/palettecolor.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/positionmode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/positionxmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/positionymode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/propertytype.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/rgba.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/rolestring.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/scenefontsizeunit.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenelayout.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scenemode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/scope.md +50 -0
- package/assets/docs/guide/api/node/type-aliases/settingboolpropertyname.md +62 -0
- package/assets/docs/guide/api/node/type-aliases/settingcolorpropertyname.md +38 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumpropertyname.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumtype.md +33 -0
- package/assets/docs/guide/api/node/type-aliases/settingenumvalues.md +29 -0
- package/assets/docs/guide/api/node/type-aliases/settingfloatpropertyname.md +25 -0
- package/assets/docs/guide/api/node/type-aliases/settingintpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingkey.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingsbool.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolor.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingscolorrgba.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/settingsenum.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsfloat.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsint.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingsstring.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/settingstringpropertyname.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/settingtype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/settingvaluetype.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/shapetype.md +24 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypelonghand.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/shapetypeshorthand.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/shapevectorpathfillrule.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/sizemode.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/sortingorder.md +21 -0
- package/assets/docs/guide/api/node/type-aliases/sourcesetpropertyname.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/splitoptions.md +28 -0
- package/assets/docs/guide/api/node/type-aliases/stringpropertyname.md +43 -0
- package/assets/docs/guide/api/node/type-aliases/strokecap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokecornergeometry.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokedashstartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeendcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokeposition.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestartcap.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/strokestyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/syncuriresolver.md +31 -0
- package/assets/docs/guide/api/node/type-aliases/textanimationwritingstyle.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/textcase.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationline.md +27 -0
- package/assets/docs/guide/api/node/type-aliases/textdecorationstyle.md +26 -0
- package/assets/docs/guide/api/node/type-aliases/textverticalalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/timelinetrackvisibility.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchpinchaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/touchrotateaction.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/typefacedefinition.md +41 -0
- package/assets/docs/guide/api/node/type-aliases/verticalblockalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/verticalcontentfillalignment.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/videoexportoptions.md +54 -0
- package/assets/docs/guide/api/node/type-aliases/videomimetype.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/widthmode.md +18 -0
- package/assets/docs/guide/api/node/type-aliases/xywh.md +23 -0
- package/assets/docs/guide/api/node/type-aliases/zoomautofitaxis.md +20 -0
- package/assets/docs/guide/api/node/type-aliases/zoomoptions.md +27 -0
- package/assets/docs/guide/api/node/variables/animation_types.md +21 -0
- package/assets/docs/guide/api/node/variables/animationbaselinedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationblockswipetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationeasingvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationgrowdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationjumploopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationkenburnsdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationmergetextdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspindirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationspinloopdirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationtypewritertextwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/animationwipedirectionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blendmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/blur_types.md +21 -0
- package/assets/docs/guide/api/node/variables/cameraclampingovershootmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionhorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/captionverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/colorpickercolormodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/contentfillmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmomovehandlevisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoresizehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmorotatehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/controlgizmoscalehandlesvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/cutouttypevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/design_block_types.md +21 -0
- package/assets/docs/guide/api/node/variables/doubleclickselectionmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/effect_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fill_types.md +21 -0
- package/assets/docs/guide/api/node/variables/fillpixelstreamorientationvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/heightmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/horizontalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/loglevel.md +37 -0
- package/assets/docs/guide/api/node/variables/mimetype.md +41 -0
- package/assets/docs/guide/api/node/variables/pageguidessourcevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionxmodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/positionymodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenedesignunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenefontsizeunitvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenelayoutvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/scenemodevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/shape_types.md +21 -0
- package/assets/docs/guide/api/node/variables/shapevectorpathfillrulevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokecornergeometryvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokedashstartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokeendcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokepositionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestartcapvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/strokestylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textanimationwritingstylevalues.md +18 -0
- package/assets/docs/guide/api/node/variables/texthorizontalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/textverticalalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/timelinetrackvisibilityvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchpinchactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/touchrotateactionvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/verticalcontentfillalignmentvalues.md +18 -0
- package/assets/docs/guide/api/node/variables/widthmodevalues.md +18 -0
- package/assets/docs/guide/api/types.md +5 -9
- package/assets/docs/guide/api-reference/overview.md +7 -7
- package/assets/docs/guide/automation/auto-resize.md +263 -300
- package/assets/docs/guide/automation/data-merge.md +246 -275
- package/assets/docs/guide/automation/design-generation.md +102 -31
- package/assets/docs/guide/automation/multi-image-generation.md +758 -0
- package/assets/docs/guide/automation/overview.md +21 -4
- package/assets/docs/guide/automation.md +10 -5
- package/assets/docs/guide/capabilities.md +6 -4
- package/assets/docs/guide/colors/adjust.md +247 -249
- package/assets/docs/guide/colors/apply.md +127 -138
- package/assets/docs/guide/colors/basics.md +126 -150
- package/assets/docs/guide/colors/conversion.md +171 -177
- package/assets/docs/guide/colors/create-color-palette.md +244 -245
- package/assets/docs/guide/colors/extract-colors.md +144 -0
- package/assets/docs/guide/colors/for-print/cmyk.md +292 -352
- package/assets/docs/guide/colors/for-print/spot.md +521 -578
- package/assets/docs/guide/colors/for-print.md +9 -4
- package/assets/docs/guide/colors/for-screen/p3.md +12 -10
- package/assets/docs/guide/colors/for-screen/srgb.md +107 -133
- package/assets/docs/guide/colors/for-screen.md +9 -4
- package/assets/docs/guide/colors/overview.md +6 -4
- package/assets/docs/guide/colors/replace.md +381 -419
- package/assets/docs/guide/colors.md +9 -4
- package/assets/docs/guide/compatibility.md +7 -5
- package/assets/docs/guide/concepts/architecture.md +17 -15
- package/assets/docs/guide/concepts/assets.md +152 -140
- package/assets/docs/guide/concepts/blocks.md +227 -323
- package/assets/docs/guide/concepts/buffers.md +147 -276
- package/assets/docs/guide/concepts/design-units.md +95 -145
- package/assets/docs/guide/concepts/editing-workflow.md +69 -183
- package/assets/docs/guide/concepts/events.md +80 -122
- package/assets/docs/guide/concepts/headless-mode.md +237 -0
- package/assets/docs/guide/concepts/pages.md +137 -127
- package/assets/docs/guide/concepts/resources.md +156 -217
- package/assets/docs/guide/concepts/scenes.md +191 -210
- package/assets/docs/guide/concepts/templating.md +118 -74
- package/assets/docs/guide/concepts/terminology.md +49 -47
- package/assets/docs/guide/concepts/undo-and-history.md +229 -303
- package/assets/docs/guide/concepts.md +9 -7
- package/assets/docs/guide/configuration.md +252 -380
- package/assets/docs/guide/conversion/overview.md +33 -4
- package/assets/docs/guide/conversion/to-base64.md +127 -167
- package/assets/docs/guide/conversion/to-pdf.md +24 -474
- package/assets/docs/guide/conversion/to-png.md +168 -211
- package/assets/docs/guide/conversion.md +9 -4
- package/assets/docs/guide/create-audio/audio/add-music.md +301 -327
- package/assets/docs/guide/create-audio/audio/add-sound-effects.md +475 -359
- package/assets/docs/guide/create-audio/audio/loop.md +232 -272
- package/assets/docs/guide/create-composition/add-background.md +237 -239
- package/assets/docs/guide/create-composition/blend-modes.md +118 -209
- package/assets/docs/guide/create-composition/collage.md +538 -320
- package/assets/docs/guide/create-composition/group-and-ungroup.md +216 -261
- package/assets/docs/guide/create-composition/layer-management.md +219 -257
- package/assets/docs/guide/create-composition/layout.md +513 -315
- package/assets/docs/guide/create-composition/lock-design.md +90 -109
- package/assets/docs/guide/create-composition/multi-page.md +133 -113
- package/assets/docs/guide/create-composition/overview.md +16 -4
- package/assets/docs/guide/create-composition/programmatic.md +288 -344
- package/assets/docs/guide/create-composition.md +10 -5
- package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +443 -569
- package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +567 -470
- package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +179 -516
- package/assets/docs/guide/create-templates/add-dynamic-content.md +226 -224
- package/assets/docs/guide/create-templates/add-to-template-library.md +183 -193
- package/assets/docs/guide/create-templates/edit-or-remove.md +297 -303
- package/assets/docs/guide/create-templates/from-scratch.md +207 -268
- package/assets/docs/guide/create-templates/import/from-scene-file.md +158 -236
- package/assets/docs/guide/create-templates/import.md +145 -161
- package/assets/docs/guide/create-templates/lock.md +42 -295
- package/assets/docs/guide/create-templates/overview.md +33 -4
- package/assets/docs/guide/create-templates.md +9 -5
- package/assets/docs/guide/create-video/audio/adjust-speed.md +157 -207
- package/assets/docs/guide/create-video/audio/adjust-volume.md +116 -227
- package/assets/docs/guide/create-video/control.md +352 -193
- package/assets/docs/guide/create-video/limitations.md +175 -280
- package/assets/docs/guide/create-video.md +11 -10
- package/assets/docs/guide/edit-image/add-watermark.md +283 -330
- package/assets/docs/guide/edit-image/overview.md +29 -4
- package/assets/docs/guide/edit-image/remove-bg.md +283 -337
- package/assets/docs/guide/edit-image/replace-colors.md +424 -502
- package/assets/docs/guide/edit-image/transform/crop.md +463 -402
- package/assets/docs/guide/edit-image/transform/flip.md +353 -0
- package/assets/docs/guide/edit-image/transform/move.md +143 -100
- package/assets/docs/guide/edit-image/transform/resize.md +118 -88
- package/assets/docs/guide/edit-image/transform/rotate.md +132 -165
- package/assets/docs/guide/edit-image/transform/scale.md +230 -228
- package/assets/docs/guide/edit-image/transform.md +10 -5
- package/assets/docs/guide/edit-image.md +11 -7
- package/assets/docs/guide/edit-video/add-captions.md +344 -421
- package/assets/docs/guide/edit-video/add-watermark.md +312 -258
- package/assets/docs/guide/edit-video/join-and-arrange.md +237 -371
- package/assets/docs/guide/edit-video/redaction.md +419 -385
- package/assets/docs/guide/edit-video/split.md +243 -493
- package/assets/docs/guide/edit-video/transform/crop.md +21 -352
- package/assets/docs/guide/edit-video/transform/flip.md +102 -76
- package/assets/docs/guide/edit-video/transform/move.md +258 -310
- package/assets/docs/guide/edit-video/transform/resize.md +264 -428
- package/assets/docs/guide/edit-video/transform/rotate.md +265 -228
- package/assets/docs/guide/edit-video/transform/scale.md +320 -417
- package/assets/docs/guide/edit-video/transform.md +10 -6
- package/assets/docs/guide/edit-video/trim.md +448 -494
- package/assets/docs/guide/engine-interface.md +51 -62
- package/assets/docs/guide/export-save-publish/create-thumbnail.md +148 -184
- package/assets/docs/guide/export-save-publish/export/compress.md +161 -559
- package/assets/docs/guide/export-save-publish/export/overview.md +224 -373
- package/assets/docs/guide/export-save-publish/export/partial-export.md +386 -577
- package/assets/docs/guide/export-save-publish/export/size-limits.md +215 -310
- package/assets/docs/guide/export-save-publish/export/to-jpeg.md +132 -213
- package/assets/docs/guide/export-save-publish/export/to-pdf.md +139 -267
- package/assets/docs/guide/export-save-publish/export/to-png.md +121 -165
- package/assets/docs/guide/export-save-publish/export/to-raw-data.md +187 -234
- package/assets/docs/guide/export-save-publish/export/to-webp.md +160 -190
- package/assets/docs/guide/export-save-publish/export/with-color-mask.md +359 -203
- package/assets/docs/guide/export-save-publish/export.md +14 -11
- package/assets/docs/guide/export-save-publish/for-printing.md +141 -237
- package/assets/docs/guide/export-save-publish/for-social-media.md +124 -261
- package/assets/docs/guide/export-save-publish/pre-export-validation.md +436 -522
- package/assets/docs/guide/export-save-publish/save.md +167 -226
- package/assets/docs/guide/export-save-publish/store-custom-metadata.md +97 -162
- package/assets/docs/guide/file-format-support.md +9 -9
- package/assets/docs/guide/fills/color.md +370 -347
- package/assets/docs/guide/fills/image.md +167 -196
- package/assets/docs/guide/fills/overview.md +6 -4
- package/assets/docs/guide/fills/video.md +286 -438
- package/assets/docs/guide/fills.md +12 -8
- package/assets/docs/guide/filters-and-effects/apply.md +598 -664
- package/assets/docs/guide/filters-and-effects/blur.md +261 -159
- package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +194 -293
- package/assets/docs/guide/filters-and-effects/create-custom-filters.md +548 -466
- package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +176 -244
- package/assets/docs/guide/filters-and-effects/distortion.md +317 -384
- package/assets/docs/guide/filters-and-effects/duotone.md +221 -217
- package/assets/docs/guide/filters-and-effects/gradients.md +670 -813
- package/assets/docs/guide/filters-and-effects/overview.md +7 -7
- package/assets/docs/guide/filters-and-effects/support.md +97 -132
- package/assets/docs/guide/filters-and-effects.md +11 -6
- package/assets/docs/guide/get-started/agent-skills.md +20 -18
- package/assets/docs/guide/get-started/build-with-ai.md +7 -4
- package/assets/docs/guide/get-started/bun.md +219 -0
- package/assets/docs/guide/get-started/deno.md +161 -0
- package/assets/docs/guide/get-started/mcp-server.md +6 -4
- package/assets/docs/guide/get-started/overview.md +11 -6
- package/assets/docs/guide/get-started/vanilla-aws-lambda.md +506 -0
- package/assets/docs/guide/get-started/vanilla-clone-github-project.md +124 -0
- package/assets/docs/guide/get-started/vanilla.md +235 -0
- package/assets/docs/guide/guides/export-save-publish/export/audio.md +80 -66
- package/assets/docs/guide/guides.md +10 -9
- package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +259 -288
- package/assets/docs/guide/import-media/concepts.md +20 -38
- package/assets/docs/guide/import-media/content-json-schema.md +145 -125
- package/assets/docs/guide/import-media/default-assets.md +113 -161
- package/assets/docs/guide/import-media/edit-or-remove-assets.md +391 -395
- package/assets/docs/guide/import-media/file-format-support.md +78 -61
- package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +273 -244
- package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +152 -222
- package/assets/docs/guide/import-media/from-remote-source.md +9 -11
- package/assets/docs/guide/import-media/overview.md +5 -5
- package/assets/docs/guide/import-media/retrieve-mimetype.md +216 -108
- package/assets/docs/guide/import-media/size-limits.md +6 -4
- package/assets/docs/guide/import-media/source-sets.md +190 -251
- package/assets/docs/guide/import-media.md +10 -8
- package/assets/docs/guide/insert-media/audio.md +202 -195
- package/assets/docs/guide/insert-media/images.md +190 -188
- package/assets/docs/guide/insert-media/position-and-align.md +284 -551
- package/assets/docs/guide/insert-media/shapes-or-stickers.md +402 -418
- package/assets/docs/guide/insert-media/videos.md +236 -203
- package/assets/docs/guide/insert-media.md +10 -5
- package/assets/docs/guide/key-capabilities.md +36 -4
- package/assets/docs/guide/key-concepts.md +6 -4
- package/assets/docs/guide/licensing.md +6 -4
- package/assets/docs/guide/llms-txt.md +11 -7
- package/assets/docs/guide/open-the-editor/blank-canvas.md +102 -63
- package/assets/docs/guide/open-the-editor/from-image.md +157 -127
- package/assets/docs/guide/open-the-editor/from-template.md +131 -92
- package/assets/docs/guide/open-the-editor/from-video.md +204 -212
- package/assets/docs/guide/open-the-editor/import-design/from-archive.md +310 -360
- package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +716 -513
- package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +667 -695
- package/assets/docs/guide/open-the-editor/import-design.md +228 -266
- package/assets/docs/guide/open-the-editor/load-scene.md +72 -68
- package/assets/docs/guide/open-the-editor/overview.md +6 -4
- package/assets/docs/guide/open-the-editor/uri-resolver.md +160 -251
- package/assets/docs/guide/open-the-editor.md +11 -9
- package/assets/docs/guide/outlines/overview.md +12 -4
- package/assets/docs/guide/outlines/shadows-and-glows.md +105 -410
- package/assets/docs/guide/outlines/strokes.md +218 -166
- package/assets/docs/guide/outlines.md +9 -4
- package/assets/docs/guide/overview.md +14 -6
- package/assets/docs/guide/performance.md +220 -113
- package/assets/docs/guide/plugins/print-ready-pdf.md +273 -368
- package/assets/docs/guide/plugins.md +10 -16
- package/assets/docs/guide/rules/asset-handling.md +7 -18
- package/assets/docs/guide/rules/common-pitfalls.md +25 -42
- package/assets/docs/guide/rules/content-fill-mode.md +4 -4
- package/assets/docs/guide/rules/enforce-brand-guidelines.md +398 -567
- package/assets/docs/guide/rules/lock-content.md +188 -231
- package/assets/docs/guide/rules/moderate-content.md +580 -571
- package/assets/docs/guide/rules/overview.md +345 -380
- package/assets/docs/guide/rules/silent-init-errors.md +4 -1
- package/assets/docs/guide/rules/verify-properties-before-use.md +2 -11
- package/assets/docs/guide/rules.md +10 -5
- package/assets/docs/guide/security.md +7 -5
- package/assets/docs/guide/serve-assets.md +57 -284
- package/assets/docs/guide/settings.md +96 -74
- package/assets/docs/guide/shapes.md +10 -5
- package/assets/docs/guide/stickers-and-shapes/combine.md +397 -583
- package/assets/docs/guide/stickers-and-shapes/create-cutout.md +181 -268
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +418 -431
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +147 -226
- package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +138 -123
- package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +151 -149
- package/assets/docs/guide/stickers.md +9 -4
- package/assets/docs/guide/text/add.md +470 -482
- package/assets/docs/guide/text/adjust-spacing.md +179 -214
- package/assets/docs/guide/text/auto-size.md +210 -271
- package/assets/docs/guide/text/edit.md +294 -309
- package/assets/docs/guide/text/effects.md +154 -190
- package/assets/docs/guide/text/emojis.md +199 -232
- package/assets/docs/guide/text/language-support.md +369 -382
- package/assets/docs/guide/text/overview.md +41 -4
- package/assets/docs/guide/text/styling.md +239 -273
- package/assets/docs/guide/text/text-designs.md +405 -544
- package/assets/docs/guide/text.md +10 -9
- package/assets/docs/guide/to-v1-19.md +12 -10
- package/assets/docs/guide/upgrade.md +8 -9
- package/assets/docs/guide/use-templates/apply-template.md +174 -163
- package/assets/docs/guide/use-templates/generate.md +171 -152
- package/assets/docs/guide/use-templates/overview.md +32 -4
- package/assets/docs/guide/use-templates/programmatic.md +266 -301
- package/assets/docs/guide/use-templates/replace-content.md +181 -171
- package/assets/docs/guide/what-is-cesdk.md +71 -282
- package/assets/docs/handbook/SKILL.md +24 -0
- package/dist/assets/inline.generated.d.ts.map +1 -1
- package/dist/assets/inline.generated.js +544 -406
- package/dist/assets/inline.generated.js.map +1 -1
- package/dist/assets/load-browser.d.ts +1 -1
- package/dist/assets/load-browser.js +1 -1
- package/dist/assets/load-browser.js.map +1 -1
- package/dist/assets/load-node.d.ts +1 -1
- package/dist/assets/load-node.js +1 -1
- package/dist/assets/load-node.js.map +1 -1
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +4 -28
- package/dist/cli/http.js.map +1 -1
- package/dist/cli/redirect-console.d.ts +1 -1
- package/dist/cli/redirect-console.d.ts.map +1 -1
- package/dist/cli/redirect-console.js +12 -3
- package/dist/cli/redirect-console.js.map +1 -1
- package/dist/cli/resolve-license.d.ts.map +1 -1
- package/dist/cli/resolve-license.js +8 -6
- package/dist/cli/resolve-license.js.map +1 -1
- package/dist/cli/stdio.d.ts +9 -0
- package/dist/cli/stdio.d.ts.map +1 -1
- package/dist/cli/stdio.js +48 -4
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -1
- package/dist/config.js.map +1 -1
- package/dist/diagnostics/bundle.d.ts +10 -0
- package/dist/diagnostics/bundle.d.ts.map +1 -0
- package/dist/diagnostics/bundle.js +148 -0
- package/dist/diagnostics/bundle.js.map +1 -0
- package/dist/diagnostics/compose.d.ts +3 -0
- package/dist/diagnostics/compose.d.ts.map +1 -0
- package/dist/diagnostics/compose.js +15 -0
- package/dist/diagnostics/compose.js.map +1 -0
- package/dist/diagnostics/events.d.ts +34 -0
- package/dist/diagnostics/events.d.ts.map +1 -0
- package/dist/diagnostics/events.js +3 -0
- package/dist/diagnostics/events.js.map +1 -0
- package/dist/diagnostics/file-sink.d.ts +38 -0
- package/dist/diagnostics/file-sink.d.ts.map +1 -0
- package/dist/diagnostics/file-sink.js +157 -0
- package/dist/diagnostics/file-sink.js.map +1 -0
- package/dist/diagnostics/redact.d.ts +7 -0
- package/dist/diagnostics/redact.d.ts.map +1 -0
- package/dist/diagnostics/redact.js +43 -0
- package/dist/diagnostics/redact.js.map +1 -0
- package/dist/diagnostics/tool-call-adapter.d.ts +4 -0
- package/dist/diagnostics/tool-call-adapter.d.ts.map +1 -0
- package/dist/diagnostics/tool-call-adapter.js +21 -0
- package/dist/diagnostics/tool-call-adapter.js.map +1 -0
- package/dist/engine/cesdk-adapter.d.ts +5 -1
- package/dist/engine/cesdk-adapter.d.ts.map +1 -1
- package/dist/engine/cesdk-adapter.js +9 -2
- package/dist/engine/cesdk-adapter.js.map +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +4 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/scene-resource-schemes.d.ts +2 -0
- package/dist/engine/scene-resource-schemes.d.ts.map +1 -0
- package/dist/engine/scene-resource-schemes.js +20 -0
- package/dist/engine/scene-resource-schemes.js.map +1 -0
- package/dist/http/server.d.ts +0 -6
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +1 -2
- package/dist/http/server.js.map +1 -1
- package/dist/server.d.ts +0 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -60
- package/dist/server.js.map +1 -1
- package/dist/test/scripts/changelog-add.d.ts +8 -0
- package/dist/test/scripts/changelog-add.d.ts.map +1 -0
- package/dist/test/scripts/changelog-add.js +50 -0
- package/dist/test/scripts/changelog-add.js.map +1 -0
- package/dist/test/scripts/changelog-collate.d.ts +38 -0
- package/dist/test/scripts/changelog-collate.d.ts.map +1 -0
- package/dist/test/scripts/changelog-collate.js +171 -0
- package/dist/test/scripts/changelog-collate.js.map +1 -0
- package/dist/test/test/changelog.test.d.ts +2 -0
- package/dist/test/test/changelog.test.d.ts.map +1 -0
- package/dist/test/test/changelog.test.js +293 -0
- package/dist/test/test/changelog.test.js.map +1 -0
- package/dist/test/test/cli/dispatcher.test.js +10 -3
- package/dist/test/test/cli/dispatcher.test.js.map +1 -1
- package/dist/test/test/cli/redirect-console.test.js +31 -0
- package/dist/test/test/cli/redirect-console.test.js.map +1 -1
- package/dist/test/test/cli/resolve-license.test.js +10 -1
- package/dist/test/test/cli/resolve-license.test.js.map +1 -1
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts +2 -0
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts.map +1 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js +31 -0
- package/dist/test/test/cli/stdio-diagnostics.test.js.map +1 -0
- package/dist/test/test/config.test.js +17 -13
- package/dist/test/test/config.test.js.map +1 -1
- package/dist/test/test/diagnostics/bundle.test.d.ts +2 -0
- package/dist/test/test/diagnostics/bundle.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/bundle.test.js +53 -0
- package/dist/test/test/diagnostics/bundle.test.js.map +1 -0
- package/dist/test/test/diagnostics/compose.test.d.ts +2 -0
- package/dist/test/test/diagnostics/compose.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/compose.test.js +31 -0
- package/dist/test/test/diagnostics/compose.test.js.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts +2 -0
- package/dist/test/test/diagnostics/file-sink.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/file-sink.test.js +113 -0
- package/dist/test/test/diagnostics/file-sink.test.js.map +1 -0
- package/dist/test/test/diagnostics/redact.test.d.ts +2 -0
- package/dist/test/test/diagnostics/redact.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/redact.test.js +59 -0
- package/dist/test/test/diagnostics/redact.test.js.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts +2 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts.map +1 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js +34 -0
- package/dist/test/test/diagnostics/tool-call-adapter.test.js.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts +2 -0
- package/dist/test/test/engine/cesdk-adapter.test.d.ts.map +1 -0
- package/dist/test/test/engine/cesdk-adapter.test.js +32 -0
- package/dist/test/test/engine/cesdk-adapter.test.js.map +1 -0
- package/dist/test/test/handbook-contract.test.js +6 -2
- package/dist/test/test/handbook-contract.test.js.map +1 -1
- package/dist/test/test/http/server.test.js +0 -36
- package/dist/test/test/http/server.test.js.map +1 -1
- package/dist/test/test/http/workspace-auth.test.js +0 -1
- package/dist/test/test/http/workspace-auth.test.js.map +1 -1
- package/dist/test/test/server.test.js +0 -40
- package/dist/test/test/server.test.js.map +1 -1
- package/dist/test/test/tools/edit-harness.d.ts +14 -0
- package/dist/test/test/tools/edit-harness.d.ts.map +1 -0
- package/dist/test/test/tools/edit-harness.js +30 -0
- package/dist/test/test/tools/edit-harness.js.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/edit.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/edit.telemetry.test.js +46 -0
- package/dist/test/test/tools/edit.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/export-harness.d.ts +13 -0
- package/dist/test/test/tools/export-harness.d.ts.map +1 -0
- package/dist/test/test/tools/export-harness.js +27 -0
- package/dist/test/test/tools/export-harness.js.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/export.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/export.telemetry.test.js +65 -0
- package/dist/test/test/tools/export.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/import.test.d.ts +2 -0
- package/dist/test/test/tools/import.test.d.ts.map +1 -0
- package/dist/test/test/tools/import.test.js +122 -0
- package/dist/test/test/tools/import.test.js.map +1 -0
- package/dist/test/test/tools/index.test.js +78 -16
- package/dist/test/test/tools/index.test.js.map +1 -1
- package/dist/test/test/tools/load.integration.test.d.ts +2 -0
- package/dist/test/test/tools/load.integration.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.integration.test.js +165 -0
- package/dist/test/test/tools/load.integration.test.js.map +1 -0
- package/dist/test/test/tools/load.test.d.ts +2 -0
- package/dist/test/test/tools/load.test.d.ts.map +1 -0
- package/dist/test/test/tools/load.test.js +387 -0
- package/dist/test/test/tools/load.test.js.map +1 -0
- package/dist/test/test/tools/preview-harness.d.ts +9 -0
- package/dist/test/test/tools/preview-harness.d.ts.map +1 -0
- package/dist/test/test/tools/preview-harness.js +23 -0
- package/dist/test/test/tools/preview-harness.js.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts +2 -0
- package/dist/test/test/tools/preview.telemetry.test.d.ts.map +1 -0
- package/dist/test/test/tools/preview.telemetry.test.js +36 -0
- package/dist/test/test/tools/preview.telemetry.test.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.d.ts +13 -0
- package/dist/test/test/tools/schema-best-practices.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.js +169 -0
- package/dist/test/test/tools/schema-best-practices.js.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts +3 -0
- package/dist/test/test/tools/schema-best-practices.test.d.ts.map +1 -0
- package/dist/test/test/tools/schema-best-practices.test.js +194 -0
- package/dist/test/test/tools/schema-best-practices.test.js.map +1 -0
- package/dist/test/test/tools/spans.test.d.ts +2 -0
- package/dist/test/test/tools/spans.test.d.ts.map +1 -0
- package/dist/test/test/tools/spans.test.js +84 -0
- package/dist/test/test/tools/spans.test.js.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts +2 -0
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts.map +1 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js +19 -0
- package/dist/test/test/viewer/cesdk-cdn.test.js.map +1 -0
- package/dist/test/test/viewer/config-route.test.d.ts +2 -0
- package/dist/test/test/viewer/config-route.test.d.ts.map +1 -0
- package/dist/test/test/viewer/config-route.test.js +28 -0
- package/dist/test/test/viewer/config-route.test.js.map +1 -0
- package/dist/test/test/viewer/spa-version.test.d.ts +2 -0
- package/dist/test/test/viewer/spa-version.test.d.ts.map +1 -0
- package/dist/test/test/viewer/spa-version.test.js +14 -0
- package/dist/test/test/viewer/spa-version.test.js.map +1 -0
- package/dist/test/test/workspace/content-hash.test.d.ts +2 -0
- package/dist/test/test/workspace/content-hash.test.d.ts.map +1 -0
- package/dist/test/test/workspace/content-hash.test.js +17 -0
- package/dist/test/test/workspace/content-hash.test.js.map +1 -0
- package/dist/test/tsconfig.test.tsbuildinfo +1 -1
- package/dist/test/vitest.config.js +1 -1
- package/dist/test/vitest.config.js.map +1 -1
- package/dist/tools/asset-generate.d.ts.map +1 -1
- package/dist/tools/asset-generate.js +1 -8
- package/dist/tools/asset-generate.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +145 -96
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/export.d.ts +3 -0
- package/dist/tools/export.d.ts.map +1 -1
- package/dist/tools/export.js +146 -108
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/import.d.ts +12 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +144 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +44 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/load.d.ts +26 -0
- package/dist/tools/load.d.ts.map +1 -0
- package/dist/tools/load.js +400 -0
- package/dist/tools/load.js.map +1 -0
- package/dist/tools/preview.d.ts +3 -0
- package/dist/tools/preview.d.ts.map +1 -1
- package/dist/tools/preview.js +79 -44
- package/dist/tools/preview.js.map +1 -1
- package/dist/tools/result.d.ts +1 -1
- package/dist/tools/result.js +2 -2
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/spans.d.ts +45 -0
- package/dist/tools/spans.d.ts.map +1 -0
- package/dist/tools/spans.js +77 -0
- package/dist/tools/spans.js.map +1 -0
- package/dist/tools/telemetry-wrapper.d.ts +4 -0
- package/dist/tools/telemetry-wrapper.d.ts.map +1 -0
- package/dist/tools/telemetry-wrapper.js +43 -0
- package/dist/tools/telemetry-wrapper.js.map +1 -0
- package/dist/viewer/cesdk-cdn.d.ts +16 -0
- package/dist/viewer/cesdk-cdn.d.ts.map +1 -0
- package/dist/viewer/cesdk-cdn.js +30 -0
- package/dist/viewer/cesdk-cdn.js.map +1 -0
- package/dist/viewer/router.d.ts +6 -0
- package/dist/viewer/router.d.ts.map +1 -1
- package/dist/viewer/router.js +4 -1
- package/dist/viewer/router.js.map +1 -1
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -1
- package/dist/viewer/spa-assets.generated.js +2 -3
- package/dist/viewer/spa-assets.generated.js.map +1 -1
- package/dist/workspace/content-hash.d.ts +2 -0
- package/dist/workspace/content-hash.d.ts.map +1 -0
- package/dist/workspace/content-hash.js +15 -0
- package/dist/workspace/content-hash.js.map +1 -0
- package/package.json +18 -9
- package/assets/docs/guide/actions.md +0 -1038
- package/assets/docs/guide/animation/overview.md +0 -22
- package/assets/docs/guide/automation/batch-processing.md +0 -474
- package/assets/docs/guide/browser-support.md +0 -38
- package/assets/docs/guide/concepts/edit-modes.md +0 -431
- package/assets/docs/guide/concepts/headless-mode/browser.md +0 -291
- package/assets/docs/guide/create-audio/audio.md +0 -336
- package/assets/docs/guide/create-video/overview.md +0 -224
- package/assets/docs/guide/create-video/timeline-editor.md +0 -622
- package/assets/docs/guide/create-video/update-caption-presets.md +0 -676
- package/assets/docs/guide/edit-image/vectorize.md +0 -204
- package/assets/docs/guide/export-save-publish/export/to-html5.md +0 -474
- package/assets/docs/guide/export-save-publish/export/to-mp4.md +0 -364
- package/assets/docs/guide/get-started/vanilla-js/quickstart.md +0 -175
- package/assets/docs/guide/grid-and-rulers.md +0 -222
- package/assets/docs/guide/guides/text/rendering-internals.md +0 -796
- package/assets/docs/guide/import-media/asset-library.md +0 -23
- package/assets/docs/guide/import-media/asset-panel/basics.md +0 -324
- package/assets/docs/guide/import-media/asset-panel/customize.md +0 -478
- package/assets/docs/guide/import-media/asset-panel/thumbnails.md +0 -633
- package/assets/docs/guide/import-media/capture-from-camera/record-video.md +0 -137
- package/assets/docs/guide/import-media/capture-from-camera.md +0 -20
- package/assets/docs/guide/import-media/from-local-source/user-upload.md +0 -438
- package/assets/docs/guide/import-media/from-local-source.md +0 -20
- package/assets/docs/guide/import-media/from-remote-source/getty-images.md +0 -627
- package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +0 -625
- package/assets/docs/guide/import-media/from-remote-source/pexels.md +0 -692
- package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +0 -497
- package/assets/docs/guide/import-media/from-remote-source/third-party.md +0 -51
- package/assets/docs/guide/import-media/from-remote-source/unsplash.md +0 -914
- package/assets/docs/guide/import-media/from-remote-source/your-server.md +0 -764
- package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +0 -228
- package/assets/docs/guide/open-the-editor/set-zoom-level.md +0 -303
- package/assets/docs/guide/plugins/asset-sources.md +0 -553
- package/assets/docs/guide/starterkits/3d-mockup-editor.md +0 -748
- package/assets/docs/guide/starterkits/advanced-editor.md +0 -698
- package/assets/docs/guide/starterkits/advanced-video-editor.md +0 -696
- package/assets/docs/guide/starterkits/ai-editor.md +0 -749
- package/assets/docs/guide/starterkits/airtable-image-editor.md +0 -672
- package/assets/docs/guide/starterkits/apparel-ui.md +0 -188
- package/assets/docs/guide/starterkits/assets.md +0 -27
- package/assets/docs/guide/starterkits/auto-resize.md +0 -586
- package/assets/docs/guide/starterkits/automated-video-generation.md +0 -692
- package/assets/docs/guide/starterkits/background-removal-editor.md +0 -480
- package/assets/docs/guide/starterkits/content-moderation.md +0 -863
- package/assets/docs/guide/starterkits/creative-automation.md +0 -28
- package/assets/docs/guide/starterkits/custom-built-uis.md +0 -26
- package/assets/docs/guide/starterkits/customization.md +0 -29
- package/assets/docs/guide/starterkits/cutout-lines-editor.md +0 -470
- package/assets/docs/guide/starterkits/data-merge.md +0 -850
- package/assets/docs/guide/starterkits/design-editor.md +0 -698
- package/assets/docs/guide/starterkits/design-generation.md +0 -719
- package/assets/docs/guide/starterkits/design-validation.md +0 -808
- package/assets/docs/guide/starterkits/editor-ui-configurations.md +0 -14
- package/assets/docs/guide/starterkits/export-options.md +0 -724
- package/assets/docs/guide/starterkits/export-using-renderer.md +0 -708
- package/assets/docs/guide/starterkits/extensibility.md +0 -28
- package/assets/docs/guide/starterkits/force-crop-editor.md +0 -675
- package/assets/docs/guide/starterkits/form-based-template-adoption.md +0 -522
- package/assets/docs/guide/starterkits/getty-images-editor.md +0 -700
- package/assets/docs/guide/starterkits/html5-ads-exporter.md +0 -719
- package/assets/docs/guide/starterkits/indesign-template-import.md +0 -580
- package/assets/docs/guide/starterkits/layouts-editor.md +0 -724
- package/assets/docs/guide/starterkits/mobile-ui.md +0 -185
- package/assets/docs/guide/starterkits/mockup-editor.md +0 -745
- package/assets/docs/guide/starterkits/multi-image-generation.md +0 -542
- package/assets/docs/guide/starterkits/page-sizes-editor.md +0 -657
- package/assets/docs/guide/starterkits/pexels-image-editor.md +0 -665
- package/assets/docs/guide/starterkits/photo-editor.md +0 -755
- package/assets/docs/guide/starterkits/photo-ui.md +0 -186
- package/assets/docs/guide/starterkits/photobook-ui.md +0 -188
- package/assets/docs/guide/starterkits/placeholders.md +0 -678
- package/assets/docs/guide/starterkits/player.md +0 -405
- package/assets/docs/guide/starterkits/plugins.md +0 -25
- package/assets/docs/guide/starterkits/postcard-editor.md +0 -202
- package/assets/docs/guide/starterkits/pptx-template-import.md +0 -581
- package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +0 -746
- package/assets/docs/guide/starterkits/product-editor.md +0 -773
- package/assets/docs/guide/starterkits/psd-template-import.md +0 -580
- package/assets/docs/guide/starterkits/qr-code-editor.md +0 -470
- package/assets/docs/guide/starterkits/single-page-editor.md +0 -661
- package/assets/docs/guide/starterkits/start-with-image.md +0 -684
- package/assets/docs/guide/starterkits/start-with-video.md +0 -651
- package/assets/docs/guide/starterkits/t-shirt-designer.md +0 -742
- package/assets/docs/guide/starterkits/templating.md +0 -23
- package/assets/docs/guide/starterkits/theming.md +0 -662
- package/assets/docs/guide/starterkits/translation-internationalization.md +0 -662
- package/assets/docs/guide/starterkits/unsplash-editor.md +0 -839
- package/assets/docs/guide/starterkits/vectorizer-editor.md +0 -466
- package/assets/docs/guide/starterkits/version-history.md +0 -745
- package/assets/docs/guide/starterkits/video-animations.md +0 -853
- package/assets/docs/guide/starterkits/video-captions.md +0 -884
- package/assets/docs/guide/starterkits/video-editing.md +0 -25
- package/assets/docs/guide/starterkits/video-editor.md +0 -696
- package/assets/docs/guide/starterkits/video-export-options.md +0 -676
- package/assets/docs/guide/starterkits/viewer.md +0 -400
- package/assets/docs/guide/starterkits.md +0 -41
- package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +0 -362
- package/assets/docs/guide/text/custom-fonts.md +0 -401
- package/assets/docs/guide/text/decorations.md +0 -330
- package/assets/docs/guide/text/enumerations.md +0 -258
- package/assets/docs/guide/to-v1-10.md +0 -131
- package/assets/docs/guide/to-v1-13.md +0 -165
- package/assets/docs/guide/to-v1-32.md +0 -110
- package/assets/docs/guide/to-v1-69.md +0 -468
- package/assets/docs/guide/to-v1-72.md +0 -193
- package/assets/docs/guide/use-templates/library.md +0 -450
- package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +0 -428
- package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +0 -337
- package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +0 -853
- package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +0 -1045
- package/assets/docs/guide/user-interface/ai-integration/image-generation.md +0 -641
- package/assets/docs/guide/user-interface/ai-integration/integrate.md +0 -966
- package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +0 -99
- package/assets/docs/guide/user-interface/ai-integration/text-generation.md +0 -498
- package/assets/docs/guide/user-interface/ai-integration/video-generation.md +0 -493
- package/assets/docs/guide/user-interface/ai-integration.md +0 -30
- package/assets/docs/guide/user-interface/appearance/change-ui-font.md +0 -316
- package/assets/docs/guide/user-interface/appearance/custom-labels.md +0 -509
- package/assets/docs/guide/user-interface/appearance/icons.md +0 -373
- package/assets/docs/guide/user-interface/appearance/theming.md +0 -665
- package/assets/docs/guide/user-interface/appearance.md +0 -23
- package/assets/docs/guide/user-interface/build-your-own-ui.md +0 -620
- package/assets/docs/guide/user-interface/customization/canvas-menu.md +0 -412
- package/assets/docs/guide/user-interface/customization/canvas.md +0 -281
- package/assets/docs/guide/user-interface/customization/color-palette.md +0 -413
- package/assets/docs/guide/user-interface/customization/crop-presets.md +0 -384
- package/assets/docs/guide/user-interface/customization/disable-or-enable.md +0 -676
- package/assets/docs/guide/user-interface/customization/dock.md +0 -399
- package/assets/docs/guide/user-interface/customization/force-crop.md +0 -289
- package/assets/docs/guide/user-interface/customization/inspector-bar.md +0 -371
- package/assets/docs/guide/user-interface/customization/navigation-bar.md +0 -516
- package/assets/docs/guide/user-interface/customization/page-format.md +0 -436
- package/assets/docs/guide/user-interface/customization/panel.md +0 -605
- package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +0 -531
- package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +0 -358
- package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +0 -374
- package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +0 -323
- package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +0 -294
- package/assets/docs/guide/user-interface/customization/quick-start.md +0 -12
- package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +0 -519
- package/assets/docs/guide/user-interface/customization/reference/component-reference.md +0 -333
- package/assets/docs/guide/user-interface/customization/reference.md +0 -12
- package/assets/docs/guide/user-interface/customization.md +0 -39
- package/assets/docs/guide/user-interface/localization.md +0 -633
- package/assets/docs/guide/user-interface/overview.md +0 -167
- package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +0 -411
- package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +0 -721
- package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +0 -331
- package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +0 -553
- package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +0 -672
- package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +0 -415
- package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +0 -521
- package/assets/docs/guide/user-interface/ui-extensions.md +0 -26
- package/assets/docs/guide/user-interface.md +0 -25
- package/assets/prompts/evals-assetGenerate.md +0 -12
- package/assets/prompts/evals-brutalistCore.md +0 -34
- package/assets/prompts/evals-danskCatalogue.md +0 -31
- package/assets/prompts/evals-exportRoundTrip.md +0 -12
- package/assets/prompts/evals-inspectPriorCode.md +0 -16
- package/assets/prompts/evals-listProjectFiles.md +0 -6
- package/assets/prompts/evals-readAndExplainScript.md +0 -6
- package/assets/prompts/evals-resumeAcrossRestart.md +0 -15
- package/assets/prompts/evals-rewindRecovery.md +0 -10
- package/assets/prompts/evals-searchAcrossFiles.md +0 -6
- package/assets/prompts/evals-weddingCard.md +0 -20
- package/assets/prompts/explain.md +0 -6
- package/assets/prompts/review.md +0 -6
- package/dist/frontmatter.d.ts +0 -15
- package/dist/frontmatter.d.ts.map +0 -1
- package/dist/frontmatter.js +0 -46
- package/dist/frontmatter.js.map +0 -1
- package/dist/test/test/frontmatter.test.d.ts +0 -2
- package/dist/test/test/frontmatter.test.d.ts.map +0 -1
- package/dist/test/test/frontmatter.test.js +0 -55
- package/dist/test/test/frontmatter.test.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
> This is one page of the CE.SDK
|
|
1
|
+
> This is one page of the CE.SDK Node.js documentation. For a complete overview, see the [Node.js Documentation Index](https://img.ly/docs/cesdk/node.md). For all docs in one file, see [llms-full.txt](./llms-full.txt.md).
|
|
2
2
|
|
|
3
3
|
**Navigation:** [Guides](./guides.md) > [Export Media Assets](./export-save-publish/export.md) > [Pre-Export Validation](./export-save-publish/pre-export-validation.md)
|
|
4
4
|
|
|
@@ -6,46 +6,26 @@
|
|
|
6
6
|
|
|
7
7
|
Validate your design before export by detecting elements outside the page,
|
|
8
8
|
protruding content, obscured text, and other issues that could affect the
|
|
9
|
-
final output quality.
|
|
10
|
-
|
|
11
|
-

|
|
9
|
+
final output quality in headless environments.
|
|
12
10
|
|
|
13
11
|
> **Reading time:** 10 minutes
|
|
14
12
|
>
|
|
15
13
|
> **Resources:**
|
|
16
14
|
>
|
|
17
15
|
> - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
|
|
18
|
-
>
|
|
19
|
-
> - [
|
|
20
|
-
>
|
|
16
|
+
>
|
|
17
|
+
> - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-export-save-publish-export-pre-export-validation-server-js)
|
|
18
|
+
>
|
|
19
|
+
> - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-export-save-publish-export-pre-export-validation-server-js)
|
|
21
20
|
|
|
22
21
|
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
22
|
|
|
24
|
-
```typescript file=@cesdk_web_examples/guides-export-save-publish-export-pre-export-validation-
|
|
25
|
-
import
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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';
|
|
23
|
+
```typescript file=@cesdk_web_examples/guides-export-save-publish-export-pre-export-validation-server-js/server-js.ts reference-only
|
|
24
|
+
import CreativeEngine from '@cesdk/node';
|
|
25
|
+
import { config } from 'dotenv';
|
|
26
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
27
|
+
|
|
28
|
+
config();
|
|
49
29
|
|
|
50
30
|
type ValidationSeverity = 'error' | 'warning';
|
|
51
31
|
|
|
@@ -66,461 +46,394 @@ interface ValidationResult {
|
|
|
66
46
|
warnings: ValidationIssue[];
|
|
67
47
|
}
|
|
68
48
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
49
|
+
const engine = await CreativeEngine.init({
|
|
50
|
+
baseURL: process.env.IMGLY_LOCAL_ASSETS_URL,
|
|
51
|
+
license: process.env.CESDK_LICENSE
|
|
52
|
+
});
|
|
72
53
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
54
|
+
try {
|
|
55
|
+
// Create a scene with test elements that demonstrate validation issues
|
|
56
|
+
engine.scene.create('VerticalStack', {
|
|
57
|
+
page: { size: { width: 800, height: 600 } }
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const page = engine.block.findByType('page')[0];
|
|
61
|
+
const pageWidth = engine.block.getWidth(page);
|
|
62
|
+
const pageHeight = engine.block.getHeight(page);
|
|
63
|
+
const centerY = pageHeight / 2;
|
|
64
|
+
|
|
65
|
+
// Row layout: Main validation examples (horizontally aligned)
|
|
66
|
+
const row1Y = centerY - 50;
|
|
67
|
+
const elementWidth = 150;
|
|
68
|
+
const elementHeight = 100;
|
|
69
|
+
const spacing = 20;
|
|
70
|
+
|
|
71
|
+
// Calculate positions for 4 elements in a row
|
|
72
|
+
const totalRowWidth = elementWidth * 4 + spacing * 3;
|
|
73
|
+
const startX = (pageWidth - totalRowWidth) / 2;
|
|
74
|
+
|
|
75
|
+
// Create an image that's outside the page (will trigger error)
|
|
76
|
+
// Positioned to the left of the page - completely outside
|
|
77
|
+
const outsideImage = engine.block.create('graphic');
|
|
78
|
+
engine.block.setName(outsideImage, 'Outside Image');
|
|
79
|
+
engine.block.setShape(outsideImage, engine.block.createShape('rect'));
|
|
80
|
+
const outsideFill = engine.block.createFill('image');
|
|
81
|
+
engine.block.setString(
|
|
82
|
+
outsideFill,
|
|
83
|
+
'fill/image/imageFileURI',
|
|
84
|
+
'https://img.ly/static/ubq_samples/sample_1.jpg'
|
|
85
|
+
);
|
|
86
|
+
engine.block.setFill(outsideImage, outsideFill);
|
|
87
|
+
engine.block.setWidth(outsideImage, elementWidth);
|
|
88
|
+
engine.block.setHeight(outsideImage, elementHeight);
|
|
89
|
+
engine.block.setPositionX(outsideImage, -elementWidth - 10); // Left of the page
|
|
90
|
+
engine.block.setPositionY(outsideImage, row1Y);
|
|
91
|
+
engine.block.appendChild(page, outsideImage);
|
|
92
|
+
|
|
93
|
+
// Create a properly placed image for reference (first in row)
|
|
94
|
+
const validImage = engine.block.create('graphic');
|
|
95
|
+
engine.block.setName(validImage, 'Valid Image');
|
|
96
|
+
engine.block.setShape(validImage, engine.block.createShape('rect'));
|
|
97
|
+
const validFill = engine.block.createFill('image');
|
|
98
|
+
engine.block.setString(
|
|
99
|
+
validFill,
|
|
100
|
+
'fill/image/imageFileURI',
|
|
101
|
+
'https://img.ly/static/ubq_samples/sample_3.jpg'
|
|
102
|
+
);
|
|
103
|
+
engine.block.setFill(validImage, validFill);
|
|
104
|
+
engine.block.setWidth(validImage, elementWidth);
|
|
105
|
+
engine.block.setHeight(validImage, elementHeight);
|
|
106
|
+
engine.block.setPositionX(validImage, startX);
|
|
107
|
+
engine.block.setPositionY(validImage, row1Y);
|
|
108
|
+
engine.block.appendChild(page, validImage);
|
|
109
|
+
|
|
110
|
+
// Create unfilled placeholder (second in row - triggers error)
|
|
111
|
+
const placeholder = engine.block.create('graphic');
|
|
112
|
+
engine.block.setName(placeholder, 'Unfilled Placeholder');
|
|
113
|
+
engine.block.setShape(placeholder, engine.block.createShape('rect'));
|
|
114
|
+
const placeholderFill = engine.block.createFill('image');
|
|
115
|
+
engine.block.setFill(placeholder, placeholderFill);
|
|
116
|
+
engine.block.setWidth(placeholder, elementWidth);
|
|
117
|
+
engine.block.setHeight(placeholder, elementHeight);
|
|
118
|
+
engine.block.setPositionX(placeholder, startX + elementWidth + spacing);
|
|
119
|
+
engine.block.setPositionY(placeholder, row1Y);
|
|
120
|
+
engine.block.appendChild(page, placeholder);
|
|
121
|
+
engine.block.setScopeEnabled(placeholder, 'fill/change', true);
|
|
122
|
+
engine.block.setPlaceholderBehaviorEnabled(placeholderFill, true);
|
|
123
|
+
engine.block.setPlaceholderEnabled(placeholder, true);
|
|
124
|
+
|
|
125
|
+
// Create text that will be partially obscured (third in row)
|
|
126
|
+
const obscuredText = engine.block.create('text');
|
|
127
|
+
engine.block.setName(obscuredText, 'Obscured Text');
|
|
128
|
+
engine.block.setPositionX(
|
|
129
|
+
obscuredText,
|
|
130
|
+
startX + (elementWidth + spacing) * 2
|
|
131
|
+
);
|
|
132
|
+
engine.block.setPositionY(obscuredText, row1Y);
|
|
133
|
+
engine.block.setWidth(obscuredText, elementWidth);
|
|
134
|
+
engine.block.setHeight(obscuredText, elementHeight);
|
|
135
|
+
engine.block.replaceText(obscuredText, 'Hidden');
|
|
136
|
+
engine.block.setFloat(obscuredText, 'text/fontSize', 48);
|
|
137
|
+
engine.block.appendChild(page, obscuredText);
|
|
138
|
+
|
|
139
|
+
// Create a shape that overlaps the text (added after text = on top)
|
|
140
|
+
const overlappingShape = engine.block.create('graphic');
|
|
141
|
+
engine.block.setName(overlappingShape, 'Overlapping Shape');
|
|
142
|
+
engine.block.setShape(overlappingShape, engine.block.createShape('rect'));
|
|
143
|
+
const shapeFill = engine.block.createFill('color');
|
|
144
|
+
engine.block.setColor(shapeFill, 'fill/color/value', {
|
|
145
|
+
r: 0.2,
|
|
146
|
+
g: 0.4,
|
|
147
|
+
b: 0.8,
|
|
148
|
+
a: 0.8
|
|
149
|
+
});
|
|
150
|
+
engine.block.setFill(overlappingShape, shapeFill);
|
|
151
|
+
engine.block.setWidth(overlappingShape, elementWidth);
|
|
152
|
+
engine.block.setHeight(overlappingShape, elementHeight);
|
|
153
|
+
engine.block.setPositionX(
|
|
154
|
+
overlappingShape,
|
|
155
|
+
startX + (elementWidth + spacing) * 2
|
|
156
|
+
);
|
|
157
|
+
engine.block.setPositionY(overlappingShape, row1Y);
|
|
158
|
+
engine.block.appendChild(page, overlappingShape);
|
|
159
|
+
|
|
160
|
+
// Create an image that protrudes from the page (fourth in row - will trigger warning)
|
|
161
|
+
// Extends past right page boundary
|
|
162
|
+
const protrudingImage = engine.block.create('graphic');
|
|
163
|
+
engine.block.setName(protrudingImage, 'Protruding Image');
|
|
164
|
+
engine.block.setShape(protrudingImage, engine.block.createShape('rect'));
|
|
165
|
+
const protrudingFill = engine.block.createFill('image');
|
|
166
|
+
engine.block.setString(
|
|
167
|
+
protrudingFill,
|
|
168
|
+
'fill/image/imageFileURI',
|
|
169
|
+
'https://img.ly/static/ubq_samples/sample_2.jpg'
|
|
170
|
+
);
|
|
171
|
+
engine.block.setFill(protrudingImage, protrudingFill);
|
|
172
|
+
engine.block.setWidth(protrudingImage, elementWidth);
|
|
173
|
+
engine.block.setHeight(protrudingImage, elementHeight);
|
|
174
|
+
engine.block.setPositionX(protrudingImage, pageWidth - elementWidth / 2); // Extends past right
|
|
175
|
+
engine.block.setPositionY(protrudingImage, row1Y);
|
|
176
|
+
engine.block.appendChild(page, protrudingImage);
|
|
177
|
+
|
|
178
|
+
// Validate design before export
|
|
179
|
+
const result = validateDesign(engine);
|
|
180
|
+
|
|
181
|
+
console.log('=== Pre-Export Validation ===');
|
|
182
|
+
|
|
183
|
+
// Log all issues for debugging
|
|
184
|
+
if (result.errors.length > 0) {
|
|
185
|
+
console.error(`Found ${result.errors.length} error(s):`);
|
|
186
|
+
result.errors.forEach((err) =>
|
|
187
|
+
console.error(` - ${err.blockName}: ${err.message}`)
|
|
85
188
|
);
|
|
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
189
|
}
|
|
120
190
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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'
|
|
191
|
+
if (result.warnings.length > 0) {
|
|
192
|
+
console.warn(`Found ${result.warnings.length} warning(s):`);
|
|
193
|
+
result.warnings.forEach((warn) =>
|
|
194
|
+
console.warn(` - ${warn.blockName}: ${warn.message}`)
|
|
236
195
|
);
|
|
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
196
|
}
|
|
258
197
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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];
|
|
198
|
+
// Block export for errors
|
|
199
|
+
if (result.errors.length > 0) {
|
|
200
|
+
console.error('\nExport blocked: Fix errors before exporting');
|
|
201
|
+
process.exit(1);
|
|
268
202
|
}
|
|
269
203
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
204
|
+
// Allow export with warnings
|
|
205
|
+
if (result.warnings.length > 0) {
|
|
206
|
+
console.log('\nProceeding with export despite warnings...');
|
|
207
|
+
} else {
|
|
208
|
+
console.log('\nValidation passed - no issues found');
|
|
209
|
+
}
|
|
276
210
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
211
|
+
// Export the design
|
|
212
|
+
const outputDir = './output';
|
|
213
|
+
if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });
|
|
280
214
|
|
|
281
|
-
|
|
282
|
-
|
|
215
|
+
const blob = await engine.block.export(page, { mimeType: 'image/png' });
|
|
216
|
+
const buffer = Buffer.from(await blob.arrayBuffer());
|
|
217
|
+
writeFileSync(`${outputDir}/validated-design.png`, buffer);
|
|
218
|
+
console.log('Export successful: output/validated-design.png');
|
|
219
|
+
} finally {
|
|
220
|
+
engine.dispose();
|
|
221
|
+
}
|
|
283
222
|
|
|
284
|
-
|
|
285
|
-
|
|
223
|
+
function getBoundingBox(
|
|
224
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
225
|
+
blockId: number
|
|
226
|
+
): [number, number, number, number] {
|
|
227
|
+
const x = engine.block.getGlobalBoundingBoxX(blockId);
|
|
228
|
+
const y = engine.block.getGlobalBoundingBoxY(blockId);
|
|
229
|
+
const width = engine.block.getGlobalBoundingBoxWidth(blockId);
|
|
230
|
+
const height = engine.block.getGlobalBoundingBoxHeight(blockId);
|
|
231
|
+
return [x, y, x + width, y + height];
|
|
232
|
+
}
|
|
286
233
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
234
|
+
function calculateOverlap(
|
|
235
|
+
box1: [number, number, number, number],
|
|
236
|
+
box2: [number, number, number, number]
|
|
237
|
+
): number {
|
|
238
|
+
const [ax1, ay1, ax2, ay2] = box1;
|
|
239
|
+
const [bx1, by1, bx2, by2] = box2;
|
|
293
240
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
...engine.block.findByType('graphic')
|
|
298
|
-
];
|
|
299
|
-
}
|
|
241
|
+
const overlapWidth = Math.max(0, Math.min(ax2, bx2) - Math.max(ax1, bx1));
|
|
242
|
+
const overlapHeight = Math.max(0, Math.min(ay2, by2) - Math.max(ay1, by1));
|
|
243
|
+
const overlapArea = overlapWidth * overlapHeight;
|
|
300
244
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
page: number
|
|
304
|
-
): ValidationIssue[] {
|
|
305
|
-
const issues: ValidationIssue[] = [];
|
|
306
|
-
const pageBounds = this.getBoundingBox(engine, page);
|
|
245
|
+
const box1Area = (ax2 - ax1) * (ay2 - ay1);
|
|
246
|
+
if (box1Area === 0) return 0;
|
|
307
247
|
|
|
308
|
-
|
|
309
|
-
|
|
248
|
+
return overlapArea / box1Area;
|
|
249
|
+
}
|
|
310
250
|
|
|
311
|
-
|
|
312
|
-
|
|
251
|
+
function getBlockName(
|
|
252
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
253
|
+
blockId: number
|
|
254
|
+
): string {
|
|
255
|
+
const name = engine.block.getName(blockId);
|
|
256
|
+
if (name) return name;
|
|
257
|
+
const kind = engine.block.getKind(blockId);
|
|
258
|
+
return kind.charAt(0).toUpperCase() + kind.slice(1);
|
|
259
|
+
}
|
|
313
260
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
}
|
|
261
|
+
function getRelevantBlocks(
|
|
262
|
+
engine: InstanceType<typeof CreativeEngine>
|
|
263
|
+
): number[] {
|
|
264
|
+
return [
|
|
265
|
+
...engine.block.findByType('text'),
|
|
266
|
+
...engine.block.findByType('graphic')
|
|
267
|
+
];
|
|
268
|
+
}
|
|
325
269
|
|
|
326
|
-
|
|
270
|
+
function findOutsideBlocks(
|
|
271
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
272
|
+
page: number
|
|
273
|
+
): ValidationIssue[] {
|
|
274
|
+
const issues: ValidationIssue[] = [];
|
|
275
|
+
const pageBounds = getBoundingBox(engine, page);
|
|
276
|
+
|
|
277
|
+
for (const blockId of getRelevantBlocks(engine)) {
|
|
278
|
+
if (!engine.block.isValid(blockId)) continue;
|
|
279
|
+
|
|
280
|
+
const blockBounds = getBoundingBox(engine, blockId);
|
|
281
|
+
const overlap = calculateOverlap(blockBounds, pageBounds);
|
|
282
|
+
|
|
283
|
+
if (overlap === 0) {
|
|
284
|
+
// Element is completely outside the page
|
|
285
|
+
issues.push({
|
|
286
|
+
type: 'outside_page',
|
|
287
|
+
severity: 'error',
|
|
288
|
+
blockId,
|
|
289
|
+
blockName: getBlockName(engine, blockId),
|
|
290
|
+
message: 'Element is completely outside the visible page area'
|
|
291
|
+
});
|
|
292
|
+
}
|
|
327
293
|
}
|
|
328
294
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
page: number
|
|
332
|
-
): ValidationIssue[] {
|
|
333
|
-
const issues: ValidationIssue[] = [];
|
|
334
|
-
const pageBounds = this.getBoundingBox(engine, page);
|
|
295
|
+
return issues;
|
|
296
|
+
}
|
|
335
297
|
|
|
336
|
-
|
|
337
|
-
|
|
298
|
+
function findProtrudingBlocks(
|
|
299
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
300
|
+
page: number
|
|
301
|
+
): ValidationIssue[] {
|
|
302
|
+
const issues: ValidationIssue[] = [];
|
|
303
|
+
const pageBounds = getBoundingBox(engine, page);
|
|
304
|
+
|
|
305
|
+
for (const blockId of getRelevantBlocks(engine)) {
|
|
306
|
+
if (!engine.block.isValid(blockId)) continue;
|
|
307
|
+
|
|
308
|
+
// Compare element bounds against page bounds
|
|
309
|
+
const blockBounds = getBoundingBox(engine, blockId);
|
|
310
|
+
const overlap = calculateOverlap(blockBounds, pageBounds);
|
|
311
|
+
|
|
312
|
+
// Protruding: partially inside (overlap > 0) but not fully inside (overlap < 1)
|
|
313
|
+
if (overlap > 0 && overlap < 0.99) {
|
|
314
|
+
issues.push({
|
|
315
|
+
type: 'protruding',
|
|
316
|
+
severity: 'warning',
|
|
317
|
+
blockId,
|
|
318
|
+
blockName: getBlockName(engine, blockId),
|
|
319
|
+
message: 'Element extends beyond page boundaries'
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
338
323
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
const overlap = this.calculateOverlap(blockBounds, pageBounds);
|
|
324
|
+
return issues;
|
|
325
|
+
}
|
|
342
326
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
message: 'Element extends beyond page boundaries'
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
}
|
|
327
|
+
function findObscuredText(
|
|
328
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
329
|
+
page: number
|
|
330
|
+
): ValidationIssue[] {
|
|
331
|
+
const issues: ValidationIssue[] = [];
|
|
332
|
+
const children = engine.block.getChildren(page);
|
|
333
|
+
const textBlocks = engine.block.findByType('text');
|
|
354
334
|
|
|
355
|
-
|
|
356
|
-
|
|
335
|
+
for (const textId of textBlocks) {
|
|
336
|
+
if (!engine.block.isValid(textId)) continue;
|
|
357
337
|
|
|
358
|
-
|
|
359
|
-
|
|
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
|
-
}
|
|
338
|
+
const textIndex = children.indexOf(textId);
|
|
339
|
+
if (textIndex === -1) continue;
|
|
397
340
|
|
|
398
|
-
|
|
399
|
-
|
|
341
|
+
// Elements later in children array are rendered on top
|
|
342
|
+
const blocksAbove = children.slice(textIndex + 1);
|
|
400
343
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
344
|
+
for (const aboveId of blocksAbove) {
|
|
345
|
+
// Skip text blocks - they don't typically obscure other text
|
|
346
|
+
if (engine.block.getType(aboveId) === '//ly.img.ubq/text') continue;
|
|
404
347
|
|
|
405
|
-
|
|
406
|
-
|
|
348
|
+
const overlap = calculateOverlap(
|
|
349
|
+
getBoundingBox(engine, textId),
|
|
350
|
+
getBoundingBox(engine, aboveId)
|
|
351
|
+
);
|
|
407
352
|
|
|
408
|
-
if (
|
|
353
|
+
if (overlap > 0) {
|
|
354
|
+
// Text is obscured by element above it
|
|
409
355
|
issues.push({
|
|
410
|
-
type: '
|
|
411
|
-
severity: '
|
|
412
|
-
blockId,
|
|
413
|
-
blockName:
|
|
414
|
-
message: '
|
|
356
|
+
type: 'text_obscured',
|
|
357
|
+
severity: 'warning',
|
|
358
|
+
blockId: textId,
|
|
359
|
+
blockName: getBlockName(engine, textId),
|
|
360
|
+
message: 'Text may be partially hidden by overlapping elements'
|
|
415
361
|
});
|
|
362
|
+
break;
|
|
416
363
|
}
|
|
417
364
|
}
|
|
418
|
-
|
|
419
|
-
return issues;
|
|
420
365
|
}
|
|
421
366
|
|
|
422
|
-
|
|
423
|
-
|
|
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);
|
|
367
|
+
return issues;
|
|
368
|
+
}
|
|
430
369
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
370
|
+
function findUnfilledPlaceholders(
|
|
371
|
+
engine: InstanceType<typeof CreativeEngine>
|
|
372
|
+
): ValidationIssue[] {
|
|
373
|
+
const issues: ValidationIssue[] = [];
|
|
374
|
+
const placeholders = engine.block.findAllPlaceholders();
|
|
375
|
+
|
|
376
|
+
for (const blockId of placeholders) {
|
|
377
|
+
if (!engine.block.isValid(blockId)) continue;
|
|
378
|
+
|
|
379
|
+
if (!isPlaceholderFilled(engine, blockId)) {
|
|
380
|
+
issues.push({
|
|
381
|
+
type: 'unfilled_placeholder',
|
|
382
|
+
severity: 'error',
|
|
383
|
+
blockId,
|
|
384
|
+
blockName: getBlockName(engine, blockId),
|
|
385
|
+
message: 'Placeholder has not been filled with content'
|
|
386
|
+
});
|
|
438
387
|
}
|
|
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
388
|
}
|
|
464
389
|
|
|
465
|
-
|
|
466
|
-
|
|
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
|
-
});
|
|
390
|
+
return issues;
|
|
391
|
+
}
|
|
496
392
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
}
|
|
393
|
+
function isPlaceholderFilled(
|
|
394
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
395
|
+
blockId: number
|
|
396
|
+
): boolean {
|
|
397
|
+
const fillId = engine.block.getFill(blockId);
|
|
398
|
+
if (!fillId || !engine.block.isValid(fillId)) return false;
|
|
504
399
|
|
|
505
|
-
|
|
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
|
-
}
|
|
400
|
+
const fillType = engine.block.getType(fillId);
|
|
513
401
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
402
|
+
// Check image fill - empty URI means unfilled placeholder
|
|
403
|
+
if (fillType === '//ly.img.ubq/fill/image') {
|
|
404
|
+
const imageUri = engine.block.getString(fillId, 'fill/image/imageFileURI');
|
|
405
|
+
return imageUri !== '' && imageUri !== undefined;
|
|
517
406
|
}
|
|
407
|
+
|
|
408
|
+
// Other fill types are considered filled
|
|
409
|
+
return true;
|
|
518
410
|
}
|
|
519
411
|
|
|
520
|
-
|
|
412
|
+
function validateDesign(
|
|
413
|
+
engine: InstanceType<typeof CreativeEngine>
|
|
414
|
+
): ValidationResult {
|
|
415
|
+
const page = engine.block.findByType('page')[0];
|
|
416
|
+
|
|
417
|
+
const outsideIssues = findOutsideBlocks(engine, page);
|
|
418
|
+
const protrudingIssues = findProtrudingBlocks(engine, page);
|
|
419
|
+
const obscuredIssues = findObscuredText(engine, page);
|
|
420
|
+
const placeholderIssues = findUnfilledPlaceholders(engine);
|
|
421
|
+
|
|
422
|
+
const allIssues = [
|
|
423
|
+
...outsideIssues,
|
|
424
|
+
...protrudingIssues,
|
|
425
|
+
...obscuredIssues,
|
|
426
|
+
...placeholderIssues
|
|
427
|
+
];
|
|
428
|
+
|
|
429
|
+
return {
|
|
430
|
+
errors: allIssues.filter((i) => i.severity === 'error'),
|
|
431
|
+
warnings: allIssues.filter((i) => i.severity === 'warning')
|
|
432
|
+
};
|
|
433
|
+
}
|
|
521
434
|
```
|
|
522
435
|
|
|
523
|
-
This guide demonstrates how to detect elements outside the page, find protruding content, identify obscured text, and integrate validation into the export workflow.
|
|
436
|
+
This guide demonstrates how to detect elements outside the page, find protruding content, identify obscured text, and integrate validation into the export workflow in headless Node.js environments.
|
|
524
437
|
|
|
525
438
|
## Getting Element Bounds
|
|
526
439
|
|
|
@@ -541,11 +454,11 @@ This returns coordinates as `[x1, y1, x2, y2]` representing the top-left and bot
|
|
|
541
454
|
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
455
|
|
|
543
456
|
```typescript highlight-find-outside-blocks
|
|
544
|
-
|
|
545
|
-
|
|
457
|
+
const blockBounds = getBoundingBox(engine, blockId);
|
|
458
|
+
const overlap = calculateOverlap(blockBounds, pageBounds);
|
|
546
459
|
|
|
547
|
-
|
|
548
|
-
|
|
460
|
+
if (overlap === 0) {
|
|
461
|
+
// Element is completely outside the page
|
|
549
462
|
```
|
|
550
463
|
|
|
551
464
|
These issues are categorized as errors because the content is completely missing from the export.
|
|
@@ -555,12 +468,12 @@ These issues are categorized as errors because the content is completely missing
|
|
|
555
468
|
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
469
|
|
|
557
470
|
```typescript highlight-find-protruding-blocks
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
471
|
+
// Compare element bounds against page bounds
|
|
472
|
+
const blockBounds = getBoundingBox(engine, blockId);
|
|
473
|
+
const overlap = calculateOverlap(blockBounds, pageBounds);
|
|
561
474
|
|
|
562
|
-
|
|
563
|
-
|
|
475
|
+
// Protruding: partially inside (overlap > 0) but not fully inside (overlap < 1)
|
|
476
|
+
if (overlap > 0 && overlap < 0.99) {
|
|
564
477
|
```
|
|
565
478
|
|
|
566
479
|
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.
|
|
@@ -577,20 +490,20 @@ const textBlocks = engine.block.findByType('text');
|
|
|
577
490
|
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
491
|
|
|
579
492
|
```typescript highlight-check-text-obscured
|
|
580
|
-
|
|
581
|
-
|
|
493
|
+
// Elements later in children array are rendered on top
|
|
494
|
+
const blocksAbove = children.slice(textIndex + 1);
|
|
582
495
|
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
496
|
+
for (const aboveId of blocksAbove) {
|
|
497
|
+
// Skip text blocks - they don't typically obscure other text
|
|
498
|
+
if (engine.block.getType(aboveId) === '//ly.img.ubq/text') continue;
|
|
586
499
|
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
500
|
+
const overlap = calculateOverlap(
|
|
501
|
+
getBoundingBox(engine, textId),
|
|
502
|
+
getBoundingBox(engine, aboveId)
|
|
503
|
+
);
|
|
591
504
|
|
|
592
|
-
|
|
593
|
-
|
|
505
|
+
if (overlap > 0) {
|
|
506
|
+
// Text is obscured by element above it
|
|
594
507
|
```
|
|
595
508
|
|
|
596
509
|
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.
|
|
@@ -606,93 +519,94 @@ const placeholders = engine.block.findAllPlaceholders();
|
|
|
606
519
|
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
520
|
|
|
608
521
|
```typescript highlight-check-placeholder-filled
|
|
609
|
-
const fillId = engine.block.getFill(blockId);
|
|
610
|
-
if (!fillId || !engine.block.isValid(fillId)) return false;
|
|
522
|
+
const fillId = engine.block.getFill(blockId);
|
|
523
|
+
if (!fillId || !engine.block.isValid(fillId)) return false;
|
|
611
524
|
|
|
612
|
-
const fillType = engine.block.getType(fillId);
|
|
525
|
+
const fillType = engine.block.getType(fillId);
|
|
613
526
|
|
|
614
|
-
// Check image fill - empty URI means unfilled placeholder
|
|
615
|
-
if (fillType === '//ly.img.ubq/fill/image') {
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
}
|
|
527
|
+
// Check image fill - empty URI means unfilled placeholder
|
|
528
|
+
if (fillType === '//ly.img.ubq/fill/image') {
|
|
529
|
+
const imageUri = engine.block.getString(fillId, 'fill/image/imageFileURI');
|
|
530
|
+
return imageUri !== '' && imageUri !== undefined;
|
|
531
|
+
}
|
|
619
532
|
```
|
|
620
533
|
|
|
621
534
|
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
535
|
|
|
623
|
-
##
|
|
536
|
+
## Integrating with Export
|
|
624
537
|
|
|
625
|
-
|
|
538
|
+
In headless environments, run validation before export and handle results programmatically. Errors block the export entirely, while warnings can be logged but allow the export to proceed:
|
|
626
539
|
|
|
627
|
-
```typescript highlight-
|
|
628
|
-
|
|
629
|
-
const result =
|
|
630
|
-
const hasErrors = result.errors.length > 0;
|
|
631
|
-
const hasWarnings = result.warnings.length > 0;
|
|
540
|
+
```typescript highlight-export-with-validation
|
|
541
|
+
// Validate design before export
|
|
542
|
+
const result = validateDesign(engine);
|
|
632
543
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
544
|
+
console.log('=== Pre-Export Validation ===');
|
|
545
|
+
|
|
546
|
+
// Log all issues for debugging
|
|
547
|
+
if (result.errors.length > 0) {
|
|
548
|
+
console.error(`Found ${result.errors.length} error(s):`);
|
|
549
|
+
result.errors.forEach((err) =>
|
|
550
|
+
console.error(` - ${err.blockName}: ${err.message}`)
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
if (result.warnings.length > 0) {
|
|
555
|
+
console.warn(`Found ${result.warnings.length} warning(s):`);
|
|
556
|
+
result.warnings.forEach((warn) =>
|
|
557
|
+
console.warn(` - ${warn.blockName}: ${warn.message}`)
|
|
558
|
+
);
|
|
636
559
|
}
|
|
637
560
|
|
|
638
561
|
// Block export for errors
|
|
639
|
-
if (
|
|
640
|
-
|
|
641
|
-
|
|
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;
|
|
562
|
+
if (result.errors.length > 0) {
|
|
563
|
+
console.error('\nExport blocked: Fix errors before exporting');
|
|
564
|
+
process.exit(1);
|
|
652
565
|
}
|
|
653
566
|
|
|
654
|
-
//
|
|
655
|
-
if (
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
duration: 'medium'
|
|
660
|
-
});
|
|
567
|
+
// Allow export with warnings
|
|
568
|
+
if (result.warnings.length > 0) {
|
|
569
|
+
console.log('\nProceeding with export despite warnings...');
|
|
570
|
+
} else {
|
|
571
|
+
console.log('\nValidation passed - no issues found');
|
|
661
572
|
}
|
|
662
573
|
|
|
663
|
-
//
|
|
664
|
-
|
|
665
|
-
});
|
|
574
|
+
// Export the design
|
|
575
|
+
const outputDir = './output';
|
|
576
|
+
if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });
|
|
577
|
+
|
|
578
|
+
const blob = await engine.block.export(page, { mimeType: 'image/png' });
|
|
579
|
+
const buffer = Buffer.from(await blob.arrayBuffer());
|
|
580
|
+
writeFileSync(`${outputDir}/validated-design.png`, buffer);
|
|
581
|
+
console.log('Export successful: output/validated-design.png');
|
|
666
582
|
```
|
|
667
583
|
|
|
668
|
-
|
|
584
|
+
When validation fails, log the issues and exit with an error code so calling systems know the export was blocked.
|
|
669
585
|
|
|
670
586
|
## API Reference
|
|
671
587
|
|
|
672
|
-
| Method
|
|
673
|
-
|
|
674
|
-
| `engine.block.getGlobalBoundingBoxX(id)`
|
|
675
|
-
| `engine.block.getGlobalBoundingBoxY(id)`
|
|
676
|
-
| `engine.block.getGlobalBoundingBoxWidth(id)`
|
|
677
|
-
| `engine.block.getGlobalBoundingBoxHeight(id)` | Get element's global height
|
|
678
|
-
| `engine.block.findByType(type)`
|
|
679
|
-
| `engine.block.getChildren(id)`
|
|
680
|
-
| `engine.block.getType(id)`
|
|
681
|
-
| `engine.block.getName(id)`
|
|
682
|
-
| `engine.block.isValid(id)`
|
|
683
|
-
| `engine.block.
|
|
684
|
-
| `engine.block.
|
|
685
|
-
| `engine.block.
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
| `cesdk.actions.register(actionId, fn)` | Register an action (browser) |
|
|
689
|
-
| `cesdk.ui.showNotification(options)` | Display notification (browser) |
|
|
588
|
+
| Method | Purpose |
|
|
589
|
+
|--------|---------|
|
|
590
|
+
| `engine.block.getGlobalBoundingBoxX(id)` | Get element's global X position |
|
|
591
|
+
| `engine.block.getGlobalBoundingBoxY(id)` | Get element's global Y position |
|
|
592
|
+
| `engine.block.getGlobalBoundingBoxWidth(id)` | Get element's global width |
|
|
593
|
+
| `engine.block.getGlobalBoundingBoxHeight(id)` | Get element's global height |
|
|
594
|
+
| `engine.block.findByType(type)` | Find all blocks of a specific type |
|
|
595
|
+
| `engine.block.getChildren(id)` | Get child blocks in stacking order |
|
|
596
|
+
| `engine.block.getType(id)` | Get the block's type string |
|
|
597
|
+
| `engine.block.getName(id)` | Get the block's display name |
|
|
598
|
+
| `engine.block.isValid(id)` | Check if block exists |
|
|
599
|
+
| `engine.block.findAllPlaceholders()` | Find all placeholder blocks |
|
|
600
|
+
| `engine.block.getFill(id)` | Get the fill block |
|
|
601
|
+
| `engine.block.getString(id, property)` | Get a string property value |
|
|
602
|
+
|
|
603
|
+
|
|
690
604
|
|
|
691
605
|
---
|
|
692
606
|
|
|
693
607
|
## More Resources
|
|
694
608
|
|
|
695
|
-
- **[
|
|
609
|
+
- **[Node.js Documentation Index](https://img.ly/docs/cesdk/node.md)** - Browse all Node.js documentation
|
|
696
610
|
- **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
|
|
697
|
-
- **[Web Documentation](./
|
|
698
|
-
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|
|
611
|
+
- **[Web Documentation](./node.md)** - Interactive documentation with examples
|
|
612
|
+
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|