@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,453 +1,351 @@
|
|
|
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) > [Open the Editor](./open-the-editor.md) > [Import a Design](./open-the-editor/import-design.md) > [From InDesign](./open-the-editor/import-design/from-indesign.md)
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Import Adobe InDesign (IDML) files into CE.SDK, converting them into
|
|
7
|
+
Import Adobe InDesign (IDML) files into CE.SDK using Node.js, converting them into scene archives for distribution or further processing.
|
|
8
8
|
|
|
9
9
|
> **Reading time:** 10 minutes
|
|
10
10
|
>
|
|
11
11
|
> **Resources:**
|
|
12
12
|
>
|
|
13
13
|
> - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/tags/release-$UBQ_VERSION$.zip)
|
|
14
|
-
>
|
|
15
|
-
> - [
|
|
16
|
-
>
|
|
17
|
-
|
|
18
|
-

|
|
19
|
-
|
|
20
|
-
The `@imgly/idml-importer` package converts InDesign IDML files into CE.SDK scene format, preserving design structure for editing or export. This guide focuses on enabling end-users to upload their own IDML files directly in the browser and load them into the CE.SDK editor. For batch conversion of template libraries at build-time, see the [server guide](./open-the-editor/import-design/from-indesign.md).
|
|
14
|
+
>
|
|
15
|
+
> - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/release-$UBQ_VERSION$/guides-open-the-editor-import-design-from-indesign-server-js)
|
|
16
|
+
>
|
|
17
|
+
> - [Open in StackBlitz](https://stackblitz.com/github/imgly/cesdk-web-examples/tree/v$UBQ_VERSION$/guides-open-the-editor-import-design-from-indesign-server-js)
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
import type { EditorPlugin, EditorPluginContext } from '@cesdk/cesdk-js';
|
|
19
|
+
The `@imgly/idml-importer` package converts InDesign IDML files into CE.SDK scene format, preserving design structure for distribution or further processing. This guide focuses on batch converting IDML template files at build-time using Node.js—ideal for migrating existing template libraries or integrating with CI/CD pipelines. For enabling end-user uploads in the browser, see the [browser guide](./open-the-editor/import-design/from-indesign.md).
|
|
24
20
|
|
|
25
|
-
import
|
|
26
|
-
|
|
27
|
-
ColorPaletteAssetSource,
|
|
28
|
-
CropPresetsAssetSource,
|
|
29
|
-
DemoAssetSources,
|
|
30
|
-
EffectsAssetSource,
|
|
31
|
-
FiltersAssetSource,
|
|
32
|
-
PagePresetsAssetSource,
|
|
33
|
-
StickerAssetSource,
|
|
34
|
-
TextAssetSource,
|
|
35
|
-
TextComponentAssetSource,
|
|
36
|
-
TypefaceAssetSource,
|
|
37
|
-
UploadAssetSources,
|
|
38
|
-
VectorShapeAssetSource
|
|
39
|
-
} from '@cesdk/cesdk-js/plugins';
|
|
40
|
-
import { DesignEditorConfig } from './design-editor/plugin';
|
|
41
|
-
import type {
|
|
42
|
-
AssetQueryData,
|
|
43
|
-
AssetResult,
|
|
44
|
-
AssetsQueryResult
|
|
45
|
-
} from '@cesdk/engine';
|
|
21
|
+
```typescript file=@cesdk_web_examples/guides-open-the-editor-import-design-from-indesign-server-js/server-js.ts reference-only
|
|
22
|
+
import CreativeEngine from '@cesdk/node';
|
|
46
23
|
import type { TypefaceResolver } from '@imgly/idml-importer';
|
|
47
|
-
import {
|
|
48
|
-
|
|
24
|
+
import {
|
|
25
|
+
IDMLParser,
|
|
26
|
+
addGfontsAssetLibrary,
|
|
27
|
+
createPdfEmbeddedImporter
|
|
28
|
+
} from '@imgly/idml-importer';
|
|
29
|
+
import { PDFParser } from '@imgly/pdf-importer';
|
|
30
|
+
import { JSDOM } from 'jsdom';
|
|
31
|
+
import { config } from 'dotenv';
|
|
32
|
+
import { promises as fs } from 'fs';
|
|
33
|
+
import { join, basename } from 'path';
|
|
34
|
+
|
|
35
|
+
// Load environment variables
|
|
36
|
+
config();
|
|
37
|
+
|
|
38
|
+
// Optional: Create a custom font resolver for advanced font mapping
|
|
39
|
+
// Use this when you need to map InDesign fonts to specific alternatives,
|
|
40
|
+
// use enterprise fonts, or implement custom fallback logic
|
|
41
|
+
const customFontResolver: TypefaceResolver = async (fontParams, engine) => {
|
|
42
|
+
const { family, style, weight } = fontParams;
|
|
43
|
+
|
|
44
|
+
// Define font mappings from InDesign fonts to available alternatives
|
|
45
|
+
const fontMappings: Record<string, string> = {
|
|
46
|
+
Arial: 'Open Sans',
|
|
47
|
+
Helvetica: 'Inter',
|
|
48
|
+
'Helvetica Neue': 'Inter',
|
|
49
|
+
'Times New Roman': 'Lora',
|
|
50
|
+
Georgia: 'Merriweather'
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Use mapped font or original family name
|
|
54
|
+
const targetFamily = fontMappings[family] || family;
|
|
55
|
+
|
|
56
|
+
// Search for the font in available typefaces
|
|
57
|
+
const result = await engine.asset.findAssets('ly.img.typeface', {
|
|
58
|
+
query: targetFamily,
|
|
59
|
+
page: 0,
|
|
60
|
+
perPage: 10
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
if (result.assets.length === 0) {
|
|
64
|
+
console.warn(`Font "${family}" not found, using default fallback`);
|
|
65
|
+
return null; // Let the parser use its default fallback
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Get the typeface from the asset payload
|
|
69
|
+
const asset = result.assets[0];
|
|
70
|
+
const typeface = asset.payload?.typeface;
|
|
71
|
+
if (!typeface) return null;
|
|
72
|
+
|
|
73
|
+
// Find the best matching font variant (weight and style)
|
|
74
|
+
const matchingFont =
|
|
75
|
+
typeface.fonts.find(
|
|
76
|
+
(f: { weight?: string; style?: string }) =>
|
|
77
|
+
f.weight === weight && f.style === style
|
|
78
|
+
) ||
|
|
79
|
+
typeface.fonts.find((f: { weight?: string }) => f.weight === weight) ||
|
|
80
|
+
typeface.fonts[0];
|
|
81
|
+
|
|
82
|
+
return { typeface, font: matchingFont };
|
|
83
|
+
};
|
|
49
84
|
|
|
50
85
|
/**
|
|
51
|
-
* CE.SDK
|
|
52
|
-
*
|
|
53
|
-
* Demonstrates how to import Adobe InDesign IDML files into CE.SDK:
|
|
54
|
-
* - Creating a custom asset source for IDML templates
|
|
55
|
-
* - Adding a custom nav bar button to upload IDML files
|
|
56
|
-
* - Parsing IDML files with the IDML importer
|
|
57
|
-
* - Displaying import warnings to users
|
|
58
|
-
*
|
|
59
|
-
* Note: In-library file uploads for custom asset sources will be supported
|
|
60
|
-
* in a future CE.SDK release. This guide demonstrates using a custom nav bar
|
|
61
|
-
* button as an alternative approach for user file uploads.
|
|
86
|
+
* Convert a single IDML file to CE.SDK scene formats
|
|
87
|
+
* Outputs both an archive file and a scene string with stable URLs
|
|
62
88
|
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
width: 1240,
|
|
95
|
-
height: 1754
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
id: 'idml-postcard',
|
|
100
|
-
label: 'Postcard',
|
|
101
|
-
tags: ['sample', 'idml', 'postcard', 'print'],
|
|
102
|
-
meta: {
|
|
103
|
-
uri: `${IDML_BASE_URL}/postcard.idml`,
|
|
104
|
-
thumbUri: `${IDML_BASE_URL}/postcard-thumb@2x.png`,
|
|
105
|
-
mimeType: 'application/vnd.adobe.indesign-idml-package',
|
|
106
|
-
width: 1050,
|
|
107
|
-
height: 600
|
|
89
|
+
async function convertIdml(
|
|
90
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
91
|
+
idmlPath: string,
|
|
92
|
+
outputDir: string
|
|
93
|
+
): Promise<{
|
|
94
|
+
archivePath: string;
|
|
95
|
+
sceneStringPath: string;
|
|
96
|
+
pageCount: number;
|
|
97
|
+
}> {
|
|
98
|
+
// Read the IDML file
|
|
99
|
+
const idmlBuffer = await fs.readFile(idmlPath);
|
|
100
|
+
|
|
101
|
+
// Parse the IDML file using JSDOM for XML parsing.
|
|
102
|
+
// Server-side import requires JSDOM since DOMParser is browser-only.
|
|
103
|
+
// The addGfontsAssetLibrary() call enables automatic font matching.
|
|
104
|
+
// Register the PDF embedded-importer adapter explicitly so any
|
|
105
|
+
// <PDF>/.ai content inside the IDML imports as editable CE.SDK blocks
|
|
106
|
+
// via @imgly/pdf-importer (rather than a placeholder image).
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
+
const parser = await IDMLParser.fromFile(
|
|
109
|
+
engine as any,
|
|
110
|
+
idmlBuffer.buffer,
|
|
111
|
+
(content: string) =>
|
|
112
|
+
new JSDOM(content, {
|
|
113
|
+
contentType: 'text/xml',
|
|
114
|
+
storageQuota: 10000000,
|
|
115
|
+
url: 'http://localhost'
|
|
116
|
+
}).window.document,
|
|
117
|
+
{
|
|
118
|
+
fontResolver: customFontResolver,
|
|
119
|
+
embeddedImporters: [createPdfEmbeddedImporter(PDFParser)]
|
|
108
120
|
}
|
|
121
|
+
);
|
|
122
|
+
await parser.parse();
|
|
123
|
+
|
|
124
|
+
// Verify pages were imported successfully
|
|
125
|
+
const pages = engine.scene.getPages();
|
|
126
|
+
if (pages.length === 0) {
|
|
127
|
+
throw new Error(`No pages imported from IDML file: ${idmlPath}`);
|
|
128
|
+
}
|
|
129
|
+
console.log(` Imported ${pages.length} page(s)`);
|
|
130
|
+
|
|
131
|
+
// Generate output filename from input filename
|
|
132
|
+
const inputName = basename(idmlPath, '.idml');
|
|
133
|
+
const archivePath = join(outputDir, `${inputName}.cesdk`);
|
|
134
|
+
|
|
135
|
+
// Save as scene archive
|
|
136
|
+
const archive = await engine.scene.saveToArchive();
|
|
137
|
+
const archiveBuffer = Buffer.from(await archive.arrayBuffer());
|
|
138
|
+
await fs.writeFile(archivePath, archiveBuffer);
|
|
139
|
+
|
|
140
|
+
// Optional: Save scene as JSON string with stable URLs instead of archive
|
|
141
|
+
// This is useful when storing scenes in a database or referencing CDN-hosted assets
|
|
142
|
+
// By default, IDML images use transient buffer:// URLs that only work with saveToArchive()
|
|
143
|
+
// To use saveToString(), relocate transient resources to permanent URLs first:
|
|
144
|
+
|
|
145
|
+
// Mock upload function - replace with your actual backend upload logic
|
|
146
|
+
const uploadToBackend = async (data: Uint8Array): Promise<string> => {
|
|
147
|
+
// In production, upload the data to your CDN/storage and return the permanent URL
|
|
148
|
+
// For this example, we write to a temp file and return a file:// URL
|
|
149
|
+
const hash = data.reduce((acc, byte) => (acc + byte) % 1000000, 0);
|
|
150
|
+
const tempPath = join(outputDir, `asset-${hash}.png`);
|
|
151
|
+
await fs.writeFile(tempPath, data);
|
|
152
|
+
return `file://${tempPath}`;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const transientResources = engine.editor.findAllTransientResources();
|
|
156
|
+
for (const resource of transientResources) {
|
|
157
|
+
const { URL: bufferUri, size } = resource;
|
|
158
|
+
const data = engine.editor.getBufferData(bufferUri, 0, size);
|
|
159
|
+
const permanentUrl = await uploadToBackend(data);
|
|
160
|
+
engine.editor.relocateResource(bufferUri, permanentUrl);
|
|
109
161
|
}
|
|
110
|
-
];
|
|
111
162
|
|
|
112
|
-
|
|
113
|
-
|
|
163
|
+
// Now save as scene string - all URLs are permanent
|
|
164
|
+
const sceneString = await engine.scene.saveToString();
|
|
165
|
+
const sceneStringPath = join(outputDir, `${inputName}.scene`);
|
|
166
|
+
await fs.writeFile(sceneStringPath, sceneString);
|
|
114
167
|
|
|
115
|
-
|
|
168
|
+
return { archivePath, sceneStringPath, pageCount: pages.length };
|
|
169
|
+
}
|
|
116
170
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
171
|
+
/**
|
|
172
|
+
* Batch convert multiple IDML files to CE.SDK scene formats
|
|
173
|
+
* Processes files sequentially, continuing even if individual files fail
|
|
174
|
+
*/
|
|
175
|
+
async function batchConvertIdmls(
|
|
176
|
+
idmlPaths: string[],
|
|
177
|
+
outputDir: string
|
|
178
|
+
): Promise<void> {
|
|
179
|
+
console.log(`Starting batch conversion of ${idmlPaths.length} IDML files...`);
|
|
180
|
+
|
|
181
|
+
// Ensure output directory exists
|
|
182
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
183
|
+
|
|
184
|
+
// Initialize engine once for all conversions
|
|
185
|
+
const engine = await CreativeEngine.init({
|
|
186
|
+
baseURL: process.env.IMGLY_LOCAL_ASSETS_URL
|
|
187
|
+
// license: process.env.CESDK_LICENSE,
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
// Configure Google Fonts for text element support
|
|
192
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
193
|
+
await addGfontsAssetLibrary(engine as any);
|
|
194
|
+
|
|
195
|
+
let successCount = 0;
|
|
196
|
+
let failCount = 0;
|
|
197
|
+
|
|
198
|
+
// Process each IDML file
|
|
199
|
+
for (const idmlPath of idmlPaths) {
|
|
200
|
+
const fileName = basename(idmlPath);
|
|
201
|
+
console.log(`\nProcessing: ${fileName}`);
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
const { archivePath, sceneStringPath } = await convertIdml(
|
|
205
|
+
engine,
|
|
206
|
+
idmlPath,
|
|
207
|
+
outputDir
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
console.log(` Archive: ${archivePath}`);
|
|
211
|
+
console.log(` Scene: ${sceneStringPath}`);
|
|
212
|
+
successCount++;
|
|
213
|
+
} catch (error) {
|
|
214
|
+
console.error(` Failed: ${(error as Error).message}`);
|
|
215
|
+
failCount++;
|
|
216
|
+
}
|
|
120
217
|
}
|
|
121
218
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
await cesdk.addPlugin(new CropPresetsAssetSource());
|
|
131
|
-
await cesdk.addPlugin(
|
|
132
|
-
new UploadAssetSources({ include: ['ly.img.image.upload'] })
|
|
133
|
-
);
|
|
134
|
-
await cesdk.addPlugin(
|
|
135
|
-
new DemoAssetSources({
|
|
136
|
-
include: [
|
|
137
|
-
'ly.img.templates.blank.*',
|
|
138
|
-
'ly.img.templates.presentation.*',
|
|
139
|
-
'ly.img.templates.print.*',
|
|
140
|
-
'ly.img.templates.social.*',
|
|
141
|
-
'ly.img.image.*'
|
|
142
|
-
]
|
|
143
|
-
})
|
|
144
|
-
);
|
|
145
|
-
await cesdk.addPlugin(new EffectsAssetSource());
|
|
146
|
-
await cesdk.addPlugin(new FiltersAssetSource());
|
|
147
|
-
await cesdk.addPlugin(new PagePresetsAssetSource());
|
|
148
|
-
await cesdk.addPlugin(new StickerAssetSource());
|
|
149
|
-
await cesdk.addPlugin(new TextAssetSource());
|
|
150
|
-
await cesdk.addPlugin(new TextComponentAssetSource());
|
|
151
|
-
await cesdk.addPlugin(new TypefaceAssetSource());
|
|
152
|
-
await cesdk.addPlugin(new VectorShapeAssetSource());
|
|
153
|
-
|
|
154
|
-
// Register Google Fonts before parsing IDML files for best font matching
|
|
155
|
-
await addGfontsAssetLibrary(engine);
|
|
156
|
-
|
|
157
|
-
// Optional: Create a custom font resolver for advanced font mapping
|
|
158
|
-
// Use this when you need to map InDesign fonts to specific alternatives,
|
|
159
|
-
// use enterprise fonts, or implement custom fallback logic
|
|
160
|
-
const customFontResolver: TypefaceResolver = async (fontParams, eng) => {
|
|
161
|
-
const { family, style, weight } = fontParams;
|
|
162
|
-
|
|
163
|
-
// Define font mappings from InDesign fonts to available alternatives
|
|
164
|
-
const fontMappings: Record<string, string> = {
|
|
165
|
-
Arial: 'Open Sans',
|
|
166
|
-
Helvetica: 'Inter',
|
|
167
|
-
'Helvetica Neue': 'Inter',
|
|
168
|
-
'Times New Roman': 'Lora',
|
|
169
|
-
Georgia: 'Merriweather'
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
// Use mapped font or original family name
|
|
173
|
-
const targetFamily = fontMappings[family] || family;
|
|
174
|
-
|
|
175
|
-
// Search for the font in available typefaces
|
|
176
|
-
const result = await eng.asset.findAssets('ly.img.typeface', {
|
|
177
|
-
query: targetFamily,
|
|
178
|
-
page: 0,
|
|
179
|
-
perPage: 10
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
if (result.assets.length === 0) {
|
|
183
|
-
console.warn(`Font "${family}" not found, using default fallback`);
|
|
184
|
-
return null; // Let the parser use its default fallback
|
|
185
|
-
}
|
|
219
|
+
console.log(`\nBatch conversion complete:`);
|
|
220
|
+
console.log(` Success: ${successCount}/${idmlPaths.length}`);
|
|
221
|
+
console.log(` Failed: ${failCount}/${idmlPaths.length}`);
|
|
222
|
+
} finally {
|
|
223
|
+
// Always dispose engine to free resources
|
|
224
|
+
engine.dispose();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
186
227
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
228
|
+
/**
|
|
229
|
+
* Validate conversion results by loading the archive and checking scene structure
|
|
230
|
+
*/
|
|
231
|
+
export async function validateArchive(archivePath: string): Promise<{
|
|
232
|
+
valid: boolean;
|
|
233
|
+
pageCount: number;
|
|
234
|
+
blockCount: number;
|
|
235
|
+
}> {
|
|
236
|
+
const engine = await CreativeEngine.init({
|
|
237
|
+
// license: process.env.CESDK_LICENSE,
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
try {
|
|
241
|
+
// Load the archive
|
|
242
|
+
const archiveBuffer = await fs.readFile(archivePath);
|
|
243
|
+
const archiveBlob = new Blob([archiveBuffer]);
|
|
244
|
+
const archiveUrl = URL.createObjectURL(archiveBlob);
|
|
245
|
+
|
|
246
|
+
await engine.scene.loadFromArchiveURL(archiveUrl);
|
|
247
|
+
|
|
248
|
+
// Get scene information
|
|
249
|
+
const pages = engine.block.findByType('page');
|
|
250
|
+
const allBlocks = engine.block.findAll();
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
valid: pages.length > 0,
|
|
254
|
+
pageCount: pages.length,
|
|
255
|
+
blockCount: allBlocks.length
|
|
202
256
|
};
|
|
257
|
+
} finally {
|
|
258
|
+
engine.dispose();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
203
261
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
if (typeof source === 'string') {
|
|
222
|
-
const response = await fetch(source);
|
|
223
|
-
buffer = await response.arrayBuffer();
|
|
224
|
-
} else {
|
|
225
|
-
buffer = source;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Parse the IDML file using the IDML importer
|
|
229
|
-
// The addGfontsAssetLibrary() call above enables automatic font matching
|
|
230
|
-
// For custom font mapping, pass fontResolver as 4th parameter (see customFontResolver example)
|
|
231
|
-
const parser = await IDMLParser.fromFile(
|
|
232
|
-
engine,
|
|
233
|
-
buffer,
|
|
234
|
-
(content: string) =>
|
|
235
|
-
new DOMParser().parseFromString(content, 'text/xml'),
|
|
236
|
-
customFontResolver
|
|
237
|
-
);
|
|
238
|
-
await parser.parse();
|
|
239
|
-
|
|
240
|
-
// Verify pages were imported successfully
|
|
241
|
-
const pages = engine.scene.getPages();
|
|
242
|
-
if (pages.length === 0) {
|
|
243
|
-
console.error('No pages imported from IDML');
|
|
244
|
-
throw new Error('No pages could be imported from the IDML file');
|
|
245
|
-
}
|
|
246
|
-
console.log(`Successfully imported ${pages.length} page(s)`);
|
|
247
|
-
|
|
248
|
-
// Save the imported scene as an archive for editor loading
|
|
249
|
-
const sceneArchive = await engine.scene.saveToArchive();
|
|
250
|
-
const archiveUrl = URL.createObjectURL(sceneArchive);
|
|
251
|
-
|
|
252
|
-
// Optional: Save scene as JSON string with stable URLs instead of archive
|
|
253
|
-
// This is useful when storing scenes in a database or referencing CDN-hosted assets
|
|
254
|
-
// By default, IDML images use transient buffer:// URLs that only work with saveToArchive()
|
|
255
|
-
// To use saveToString(), relocate transient resources to permanent URLs first:
|
|
256
|
-
|
|
257
|
-
// Mock upload function - replace with your actual backend upload logic
|
|
258
|
-
const uploadToBackend = async (data: Uint8Array): Promise<string> => {
|
|
259
|
-
// In production, upload the data to your CDN/storage and return the permanent URL
|
|
260
|
-
// For this example, we create a blob URL to demonstrate the workflow
|
|
261
|
-
const blob = new Blob([new Uint8Array(data)], { type: 'image/png' });
|
|
262
|
-
return URL.createObjectURL(blob);
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
const transientResources = engine.editor.findAllTransientResources();
|
|
266
|
-
for (const resource of transientResources) {
|
|
267
|
-
const { URL: bufferUri, size } = resource;
|
|
268
|
-
const data = engine.editor.getBufferData(bufferUri, 0, size);
|
|
269
|
-
const permanentUrl = await uploadToBackend(data);
|
|
270
|
-
engine.editor.relocateResource(bufferUri, permanentUrl);
|
|
271
|
-
}
|
|
272
|
-
const sceneString = await engine.scene.saveToString();
|
|
273
|
-
console.log(
|
|
274
|
-
`Scene persisted with stable URLs (${sceneString.length} bytes)`
|
|
275
|
-
);
|
|
262
|
+
/**
|
|
263
|
+
* Find all IDML files in a directory and convert them
|
|
264
|
+
*/
|
|
265
|
+
export async function processDirectory(
|
|
266
|
+
inputDir: string,
|
|
267
|
+
outputDir: string
|
|
268
|
+
): Promise<void> {
|
|
269
|
+
// Find all IDML files in directory
|
|
270
|
+
const files = await fs.readdir(inputDir);
|
|
271
|
+
const idmlFiles = files
|
|
272
|
+
.filter((f) => f.toLowerCase().endsWith('.idml'))
|
|
273
|
+
.map((f) => join(inputDir, f));
|
|
274
|
+
|
|
275
|
+
if (idmlFiles.length === 0) {
|
|
276
|
+
console.log(`No IDML files found in ${inputDir}`);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
276
279
|
|
|
277
|
-
|
|
278
|
-
|
|
280
|
+
await batchConvertIdmls(idmlFiles, outputDir);
|
|
281
|
+
}
|
|
279
282
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
283
|
+
/**
|
|
284
|
+
* Main entry point - demonstrates batch IDML conversion workflow
|
|
285
|
+
*/
|
|
286
|
+
async function main(): Promise<void> {
|
|
287
|
+
console.log('IDML to CE.SDK Batch Converter');
|
|
288
|
+
console.log('==============================\n');
|
|
289
|
+
|
|
290
|
+
// Example: Convert a single IDML file
|
|
291
|
+
// In production, you would provide actual IDML files
|
|
292
|
+
const engine = await CreativeEngine.init({
|
|
293
|
+
// license: process.env.CESDK_LICENSE,
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
try {
|
|
297
|
+
// Configure Google Fonts for text element support
|
|
298
|
+
await addGfontsAssetLibrary(engine as any);
|
|
299
|
+
|
|
300
|
+
// Create a sample scene to demonstrate the export format
|
|
301
|
+
// In production, this would be replaced by actual IDML conversion
|
|
302
|
+
await engine.scene.create();
|
|
303
|
+
const page = engine.block.create('page');
|
|
304
|
+
engine.block.setWidth(page, 800);
|
|
305
|
+
engine.block.setHeight(page, 600);
|
|
306
|
+
engine.block.appendChild(engine.scene.get()!, page);
|
|
307
|
+
|
|
308
|
+
// Save as archive
|
|
309
|
+
await fs.mkdir('./output', { recursive: true });
|
|
310
|
+
const archive = await engine.scene.saveToArchive();
|
|
311
|
+
const archiveBuffer = Buffer.from(await archive.arrayBuffer());
|
|
312
|
+
await fs.writeFile('./output/sample.cesdk', archiveBuffer);
|
|
313
|
+
|
|
314
|
+
console.log('Sample archive created: ./output/sample.cesdk');
|
|
315
|
+
console.log('\nTo convert actual IDML files:');
|
|
316
|
+
console.log('1. Place IDML files in an input directory');
|
|
317
|
+
console.log('2. Call: await processDirectory("./input", "./output")');
|
|
318
|
+
} finally {
|
|
319
|
+
engine.dispose();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
285
322
|
|
|
286
|
-
|
|
287
|
-
|
|
323
|
+
// Run the example
|
|
324
|
+
main().catch(console.error);
|
|
325
|
+
```
|
|
288
326
|
|
|
289
|
-
|
|
290
|
-
URL.revokeObjectURL(archiveUrl);
|
|
291
|
-
};
|
|
327
|
+
This guide covers installation, setting up a conversion script, parsing IDML files, saving scene archives, batch processing multiple files, and understanding the current limitations.
|
|
292
328
|
|
|
293
|
-
|
|
294
|
-
engine.asset.addSource({
|
|
295
|
-
id: IDML_SOURCE_ID,
|
|
296
|
-
|
|
297
|
-
async findAssets(
|
|
298
|
-
queryData: AssetQueryData
|
|
299
|
-
): Promise<AssetsQueryResult<AssetResult>> {
|
|
300
|
-
let assets = SAMPLE_IDML_FILES;
|
|
301
|
-
|
|
302
|
-
// Filter by query if provided
|
|
303
|
-
if (queryData.query) {
|
|
304
|
-
const query = queryData.query.toLowerCase();
|
|
305
|
-
assets = assets.filter(
|
|
306
|
-
(a) =>
|
|
307
|
-
a.label?.toLowerCase().includes(query) ||
|
|
308
|
-
a.tags?.some((t) => t.toLowerCase().includes(query))
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
return {
|
|
313
|
-
assets,
|
|
314
|
-
total: assets.length,
|
|
315
|
-
currentPage: queryData.page,
|
|
316
|
-
nextPage: undefined
|
|
317
|
-
};
|
|
318
|
-
},
|
|
319
|
-
|
|
320
|
-
async applyAsset(asset: AssetResult): Promise<number | undefined> {
|
|
321
|
-
if (!asset.meta?.uri) {
|
|
322
|
-
console.error('Asset has no URI');
|
|
323
|
-
return undefined;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
await importIdml(asset.meta.uri as string, asset.label || asset.id);
|
|
327
|
-
return undefined; // Scene replaced, no new block created
|
|
328
|
-
}
|
|
329
|
-
});
|
|
329
|
+
## Installation
|
|
330
330
|
|
|
331
|
-
|
|
332
|
-
cesdk.i18n.setTranslations({
|
|
333
|
-
en: {
|
|
334
|
-
[`libraries.${IDML_SOURCE_ID}.label`]: 'IDML Files',
|
|
335
|
-
'libraries.idml-library-entry.label': 'InDesign Templates'
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
// Configure the asset library UI to show the IDML source
|
|
340
|
-
cesdk.ui.addAssetLibraryEntry({
|
|
341
|
-
id: 'idml-library-entry',
|
|
342
|
-
sourceIds: [IDML_SOURCE_ID],
|
|
343
|
-
previewLength: 3,
|
|
344
|
-
previewBackgroundType: 'contain',
|
|
345
|
-
gridBackgroundType: 'contain',
|
|
346
|
-
gridColumns: 2
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
// Add IDML library to the dock and remove the default Templates entry
|
|
350
|
-
const existingDockOrder = cesdk.ui.getComponentOrder({ in: 'ly.img.dock' });
|
|
351
|
-
const filteredDockOrder = existingDockOrder.filter(
|
|
352
|
-
(entry) => entry.key !== 'ly.img.templates'
|
|
353
|
-
);
|
|
354
|
-
cesdk.ui.setComponentOrder({ in: 'ly.img.dock' }, [
|
|
355
|
-
{
|
|
356
|
-
id: 'ly.img.assetLibrary.dock',
|
|
357
|
-
key: 'idml-library-dock',
|
|
358
|
-
label: 'InDesign Templates',
|
|
359
|
-
icon: '@imgly/Template',
|
|
360
|
-
entries: ['idml-library-entry']
|
|
361
|
-
},
|
|
362
|
-
...filteredDockOrder
|
|
363
|
-
]);
|
|
364
|
-
|
|
365
|
-
// Add a custom nav bar button for uploading and importing IDML files
|
|
366
|
-
// Uses cesdk.utils.loadFile() to open the browser's file picker
|
|
367
|
-
cesdk.ui.registerComponent('idml.uploadButton', ({ builder }) => {
|
|
368
|
-
builder.Button('idml.uploadButton', {
|
|
369
|
-
label: 'Load IDML File',
|
|
370
|
-
icon: '@imgly/Upload',
|
|
371
|
-
variant: 'regular',
|
|
372
|
-
color: 'accent',
|
|
373
|
-
onClick: async () => {
|
|
374
|
-
const buffer = await cesdk.utils.loadFile({
|
|
375
|
-
accept: '.idml,application/vnd.adobe.indesign-idml-package',
|
|
376
|
-
returnType: 'arrayBuffer'
|
|
377
|
-
});
|
|
378
|
-
await importIdml(buffer, 'uploaded.idml');
|
|
379
|
-
}
|
|
380
|
-
});
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
// Add the upload button to the right side of the navigation bar
|
|
384
|
-
cesdk.ui.setComponentOrder({ in: 'ly.img.navigation.bar' }, [
|
|
385
|
-
...cesdk.ui.getComponentOrder({ in: 'ly.img.navigation.bar' }),
|
|
386
|
-
'idml.uploadButton'
|
|
387
|
-
]);
|
|
388
|
-
|
|
389
|
-
// Open the IDML Templates library by default
|
|
390
|
-
cesdk.ui.openPanel('//ly.img.panel/assetLibrary', {
|
|
391
|
-
payload: {
|
|
392
|
-
entries: ['idml-library-entry'],
|
|
393
|
-
title: 'InDesign Templates'
|
|
394
|
-
}
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
// Override the importScene action to support IDML files alongside standard formats
|
|
398
|
-
// This integrates IDML import with the default import workflow
|
|
399
|
-
cesdk.actions.register(
|
|
400
|
-
'importScene',
|
|
401
|
-
async ({
|
|
402
|
-
format = 'scene'
|
|
403
|
-
}: {
|
|
404
|
-
format?: 'scene' | 'archive' | 'idml';
|
|
405
|
-
}) => {
|
|
406
|
-
if (format === 'idml') {
|
|
407
|
-
// Handle IDML import using cesdk.utils.loadFile
|
|
408
|
-
const buffer = await cesdk.utils.loadFile({
|
|
409
|
-
accept: '.idml,application/vnd.adobe.indesign-idml-package',
|
|
410
|
-
returnType: 'arrayBuffer'
|
|
411
|
-
});
|
|
412
|
-
await importIdml(buffer, 'imported.idml');
|
|
413
|
-
} else if (format === 'scene') {
|
|
414
|
-
// Handle standard .scene files
|
|
415
|
-
const scene = await cesdk.utils.loadFile({
|
|
416
|
-
accept: '.scene',
|
|
417
|
-
returnType: 'text'
|
|
418
|
-
});
|
|
419
|
-
await cesdk.engine.scene.loadFromString(scene);
|
|
420
|
-
await cesdk.actions.run('zoom.toPage', { page: 'first' });
|
|
421
|
-
} else {
|
|
422
|
-
// Handle archive files (.zip)
|
|
423
|
-
const blobURL = await cesdk.utils.loadFile({
|
|
424
|
-
accept: '.zip',
|
|
425
|
-
returnType: 'objectURL'
|
|
426
|
-
});
|
|
427
|
-
try {
|
|
428
|
-
await cesdk.engine.scene.loadFromArchiveURL(blobURL);
|
|
429
|
-
} finally {
|
|
430
|
-
URL.revokeObjectURL(blobURL);
|
|
431
|
-
}
|
|
432
|
-
await cesdk.actions.run('zoom.toPage', { page: 'first' });
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
331
|
+
Install the `@imgly/idml-importer` package alongside the Node.js SDK. Server-side conversion requires `jsdom` for XML parsing:
|
|
438
332
|
|
|
439
|
-
|
|
333
|
+
```bash
|
|
334
|
+
npm install @imgly/idml-importer @cesdk/node@$UBQ_VERSION$ jsdom
|
|
335
|
+
npm install --save-dev @types/jsdom
|
|
440
336
|
```
|
|
441
337
|
|
|
442
|
-
|
|
338
|
+
The `jsdom` package provides the XML parsing functionality that `DOMParser` provides in browsers.
|
|
443
339
|
|
|
444
|
-
|
|
340
|
+
### Optional: Embedded PDF / Adobe Illustrator support
|
|
341
|
+
|
|
342
|
+
IDML files exported from InDesign can carry embedded PDF or Adobe Illustrator (`.ai`) content. To import these as editable CE.SDK blocks rather than placeholder images, also install `@imgly/pdf-importer` and register its adapter via the `embeddedImporters` option on `IDMLParser.fromFile`:
|
|
445
343
|
|
|
446
344
|
```bash
|
|
447
|
-
npm install @imgly/
|
|
345
|
+
npm install @imgly/pdf-importer
|
|
448
346
|
```
|
|
449
347
|
|
|
450
|
-
The
|
|
348
|
+
The IDML importer does not import `@imgly/pdf-importer` itself — registering the adapter is opt-in, so consumers who don't need embedded-PDF support pay no install cost.
|
|
451
349
|
|
|
452
350
|
## Supported Elements
|
|
453
351
|
|
|
@@ -463,72 +361,62 @@ The IDML importer preserves the following InDesign elements:
|
|
|
463
361
|
|
|
464
362
|
## Setting Up Font Matching
|
|
465
363
|
|
|
466
|
-
Text elements in IDML files reference fonts that may not be available in CE.SDK. Use `addGfontsAssetLibrary()` to register Google Fonts as a font source before parsing:
|
|
364
|
+
Text elements in IDML files reference fonts that may not be available in CE.SDK. Use `addGfontsAssetLibrary()` from the `@imgly/idml-importer` package to register Google Fonts as a font source before parsing:
|
|
467
365
|
|
|
468
366
|
```typescript highlight=highlight-setup
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
'ly.img.templates.print.*',
|
|
485
|
-
'ly.img.templates.social.*',
|
|
486
|
-
'ly.img.image.*'
|
|
487
|
-
]
|
|
488
|
-
})
|
|
489
|
-
);
|
|
490
|
-
await cesdk.addPlugin(new EffectsAssetSource());
|
|
491
|
-
await cesdk.addPlugin(new FiltersAssetSource());
|
|
492
|
-
await cesdk.addPlugin(new PagePresetsAssetSource());
|
|
493
|
-
await cesdk.addPlugin(new StickerAssetSource());
|
|
494
|
-
await cesdk.addPlugin(new TextAssetSource());
|
|
495
|
-
await cesdk.addPlugin(new TextComponentAssetSource());
|
|
496
|
-
await cesdk.addPlugin(new TypefaceAssetSource());
|
|
497
|
-
await cesdk.addPlugin(new VectorShapeAssetSource());
|
|
498
|
-
|
|
499
|
-
// Register Google Fonts before parsing IDML files for best font matching
|
|
500
|
-
await addGfontsAssetLibrary(engine);
|
|
367
|
+
import CreativeEngine from '@cesdk/node';
|
|
368
|
+
import type { TypefaceResolver } from '@imgly/idml-importer';
|
|
369
|
+
import {
|
|
370
|
+
IDMLParser,
|
|
371
|
+
addGfontsAssetLibrary,
|
|
372
|
+
createPdfEmbeddedImporter
|
|
373
|
+
} from '@imgly/idml-importer';
|
|
374
|
+
import { PDFParser } from '@imgly/pdf-importer';
|
|
375
|
+
import { JSDOM } from 'jsdom';
|
|
376
|
+
import { config } from 'dotenv';
|
|
377
|
+
import { promises as fs } from 'fs';
|
|
378
|
+
import { join, basename } from 'path';
|
|
379
|
+
|
|
380
|
+
// Load environment variables
|
|
381
|
+
config();
|
|
501
382
|
```
|
|
502
383
|
|
|
503
384
|
Call this function on the engine before parsing IDML files. The importer attempts to match fonts from the IDML with available Google Fonts. For fonts not found, the importer uses a fallback font.
|
|
504
385
|
|
|
505
386
|
## Parsing the IDML File
|
|
506
387
|
|
|
507
|
-
Use `IDMLParser.fromFile()` with
|
|
388
|
+
Use `IDMLParser.fromFile()` with `jsdom` for XML parsing. Unlike the browser's native `DOMParser`, server-side parsing requires explicit JSDOM configuration:
|
|
508
389
|
|
|
509
390
|
```typescript highlight=highlight-parse-idml
|
|
510
|
-
//
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
// Parse the IDML file using the IDML importer
|
|
520
|
-
// The addGfontsAssetLibrary() call above enables automatic font matching
|
|
521
|
-
// For custom font mapping, pass fontResolver as 4th parameter (see customFontResolver example)
|
|
391
|
+
// Parse the IDML file using JSDOM for XML parsing.
|
|
392
|
+
// Server-side import requires JSDOM since DOMParser is browser-only.
|
|
393
|
+
// The addGfontsAssetLibrary() call enables automatic font matching.
|
|
394
|
+
// Register the PDF embedded-importer adapter explicitly so any
|
|
395
|
+
// <PDF>/.ai content inside the IDML imports as editable CE.SDK blocks
|
|
396
|
+
// via @imgly/pdf-importer (rather than a placeholder image).
|
|
397
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
522
398
|
const parser = await IDMLParser.fromFile(
|
|
523
|
-
engine,
|
|
524
|
-
buffer,
|
|
525
|
-
(content: string) =>
|
|
526
|
-
|
|
399
|
+
engine as any,
|
|
400
|
+
idmlBuffer.buffer,
|
|
401
|
+
(content: string) =>
|
|
402
|
+
new JSDOM(content, {
|
|
403
|
+
contentType: 'text/xml',
|
|
404
|
+
storageQuota: 10000000,
|
|
405
|
+
url: 'http://localhost'
|
|
406
|
+
}).window.document,
|
|
407
|
+
{
|
|
408
|
+
fontResolver: customFontResolver,
|
|
409
|
+
embeddedImporters: [createPdfEmbeddedImporter(PDFParser)]
|
|
410
|
+
}
|
|
527
411
|
);
|
|
528
412
|
await parser.parse();
|
|
529
413
|
```
|
|
530
414
|
|
|
531
|
-
The
|
|
415
|
+
The JSDOM options ensure proper XML handling:
|
|
416
|
+
|
|
417
|
+
- `contentType: 'text/xml'` - Parses as XML rather than HTML
|
|
418
|
+
- `storageQuota` - Prevents quota errors with larger documents
|
|
419
|
+
- `url` - Required by JSDOM for relative resource resolution
|
|
532
420
|
|
|
533
421
|
## Checking Import Results
|
|
534
422
|
|
|
@@ -538,25 +426,125 @@ Verify the import succeeded by checking the page count. If no pages were importe
|
|
|
538
426
|
// Verify pages were imported successfully
|
|
539
427
|
const pages = engine.scene.getPages();
|
|
540
428
|
if (pages.length === 0) {
|
|
541
|
-
|
|
542
|
-
throw new Error('No pages could be imported from the IDML file');
|
|
429
|
+
throw new Error(`No pages imported from IDML file: ${idmlPath}`);
|
|
543
430
|
}
|
|
544
|
-
console.log(`
|
|
431
|
+
console.log(` Imported ${pages.length} page(s)`);
|
|
545
432
|
```
|
|
546
433
|
|
|
547
|
-
Log
|
|
434
|
+
Log any warnings to identify IDML features that didn't convert correctly.
|
|
435
|
+
|
|
436
|
+
## Converting a Single IDML File
|
|
437
|
+
|
|
438
|
+
Read an IDML file, parse it using the IDML importer, and save the resulting scene as an archive:
|
|
439
|
+
|
|
440
|
+
```typescript highlight=highlight-convert-single
|
|
441
|
+
/**
|
|
442
|
+
* Convert a single IDML file to CE.SDK scene formats
|
|
443
|
+
* Outputs both an archive file and a scene string with stable URLs
|
|
444
|
+
*/
|
|
445
|
+
async function convertIdml(
|
|
446
|
+
engine: InstanceType<typeof CreativeEngine>,
|
|
447
|
+
idmlPath: string,
|
|
448
|
+
outputDir: string
|
|
449
|
+
): Promise<{
|
|
450
|
+
archivePath: string;
|
|
451
|
+
sceneStringPath: string;
|
|
452
|
+
pageCount: number;
|
|
453
|
+
}> {
|
|
454
|
+
// Read the IDML file
|
|
455
|
+
const idmlBuffer = await fs.readFile(idmlPath);
|
|
456
|
+
|
|
457
|
+
// Parse the IDML file using JSDOM for XML parsing.
|
|
458
|
+
// Server-side import requires JSDOM since DOMParser is browser-only.
|
|
459
|
+
// The addGfontsAssetLibrary() call enables automatic font matching.
|
|
460
|
+
// Register the PDF embedded-importer adapter explicitly so any
|
|
461
|
+
// <PDF>/.ai content inside the IDML imports as editable CE.SDK blocks
|
|
462
|
+
// via @imgly/pdf-importer (rather than a placeholder image).
|
|
463
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
464
|
+
const parser = await IDMLParser.fromFile(
|
|
465
|
+
engine as any,
|
|
466
|
+
idmlBuffer.buffer,
|
|
467
|
+
(content: string) =>
|
|
468
|
+
new JSDOM(content, {
|
|
469
|
+
contentType: 'text/xml',
|
|
470
|
+
storageQuota: 10000000,
|
|
471
|
+
url: 'http://localhost'
|
|
472
|
+
}).window.document,
|
|
473
|
+
{
|
|
474
|
+
fontResolver: customFontResolver,
|
|
475
|
+
embeddedImporters: [createPdfEmbeddedImporter(PDFParser)]
|
|
476
|
+
}
|
|
477
|
+
);
|
|
478
|
+
await parser.parse();
|
|
479
|
+
|
|
480
|
+
// Verify pages were imported successfully
|
|
481
|
+
const pages = engine.scene.getPages();
|
|
482
|
+
if (pages.length === 0) {
|
|
483
|
+
throw new Error(`No pages imported from IDML file: ${idmlPath}`);
|
|
484
|
+
}
|
|
485
|
+
console.log(` Imported ${pages.length} page(s)`);
|
|
486
|
+
|
|
487
|
+
// Generate output filename from input filename
|
|
488
|
+
const inputName = basename(idmlPath, '.idml');
|
|
489
|
+
const archivePath = join(outputDir, `${inputName}.cesdk`);
|
|
490
|
+
|
|
491
|
+
// Save as scene archive
|
|
492
|
+
const archive = await engine.scene.saveToArchive();
|
|
493
|
+
const archiveBuffer = Buffer.from(await archive.arrayBuffer());
|
|
494
|
+
await fs.writeFile(archivePath, archiveBuffer);
|
|
495
|
+
|
|
496
|
+
// Optional: Save scene as JSON string with stable URLs instead of archive
|
|
497
|
+
// This is useful when storing scenes in a database or referencing CDN-hosted assets
|
|
498
|
+
// By default, IDML images use transient buffer:// URLs that only work with saveToArchive()
|
|
499
|
+
// To use saveToString(), relocate transient resources to permanent URLs first:
|
|
500
|
+
|
|
501
|
+
// Mock upload function - replace with your actual backend upload logic
|
|
502
|
+
const uploadToBackend = async (data: Uint8Array): Promise<string> => {
|
|
503
|
+
// In production, upload the data to your CDN/storage and return the permanent URL
|
|
504
|
+
// For this example, we write to a temp file and return a file:// URL
|
|
505
|
+
const hash = data.reduce((acc, byte) => (acc + byte) % 1000000, 0);
|
|
506
|
+
const tempPath = join(outputDir, `asset-${hash}.png`);
|
|
507
|
+
await fs.writeFile(tempPath, data);
|
|
508
|
+
return `file://${tempPath}`;
|
|
509
|
+
};
|
|
510
|
+
|
|
511
|
+
const transientResources = engine.editor.findAllTransientResources();
|
|
512
|
+
for (const resource of transientResources) {
|
|
513
|
+
const { URL: bufferUri, size } = resource;
|
|
514
|
+
const data = engine.editor.getBufferData(bufferUri, 0, size);
|
|
515
|
+
const permanentUrl = await uploadToBackend(data);
|
|
516
|
+
engine.editor.relocateResource(bufferUri, permanentUrl);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// Now save as scene string - all URLs are permanent
|
|
520
|
+
const sceneString = await engine.scene.saveToString();
|
|
521
|
+
const sceneStringPath = join(outputDir, `${inputName}.scene`);
|
|
522
|
+
await fs.writeFile(sceneStringPath, sceneString);
|
|
523
|
+
|
|
524
|
+
return { archivePath, sceneStringPath, pageCount: pages.length };
|
|
525
|
+
}
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
The `convertIdmlToArchive` function:
|
|
529
|
+
|
|
530
|
+
1. Reads the IDML buffer
|
|
531
|
+
2. Creates a parser instance with JSDOM for XML parsing
|
|
532
|
+
3. Parses the IDML, creating a scene in the engine
|
|
533
|
+
4. Verifies pages were imported successfully
|
|
534
|
+
5. Saves the scene as a `.cesdk` archive file
|
|
548
535
|
|
|
549
536
|
## Saving as Archive
|
|
550
537
|
|
|
551
|
-
After parsing, save the imported scene as an archive.
|
|
538
|
+
After parsing, save the imported scene as an archive. Archives bundle the scene with all referenced assets, creating a portable file that can be distributed or loaded later:
|
|
552
539
|
|
|
553
540
|
```typescript highlight=highlight-save-archive
|
|
554
|
-
// Save
|
|
555
|
-
const
|
|
556
|
-
const
|
|
541
|
+
// Save as scene archive
|
|
542
|
+
const archive = await engine.scene.saveToArchive();
|
|
543
|
+
const archiveBuffer = Buffer.from(await archive.arrayBuffer());
|
|
544
|
+
await fs.writeFile(archivePath, archiveBuffer);
|
|
557
545
|
```
|
|
558
546
|
|
|
559
|
-
|
|
547
|
+
Write the archive to the filesystem as a `.cesdk` file for later use with `loadFromArchiveURL()`.
|
|
560
548
|
|
|
561
549
|
## Saving Scenes with Stable URLs
|
|
562
550
|
|
|
@@ -574,35 +562,40 @@ However, if you want to save scenes as JSON strings (`engine.scene.saveToString(
|
|
|
574
562
|
After parsing the IDML file, use CE.SDK's native APIs to find and relocate all transient resources:
|
|
575
563
|
|
|
576
564
|
```typescript highlight=highlight-stable-urls
|
|
577
|
-
// Optional: Save scene as JSON string with stable URLs instead of archive
|
|
578
|
-
// This is useful when storing scenes in a database or referencing CDN-hosted assets
|
|
579
|
-
// By default, IDML images use transient buffer:// URLs that only work with saveToArchive()
|
|
580
|
-
// To use saveToString(), relocate transient resources to permanent URLs first:
|
|
581
|
-
|
|
582
|
-
// Mock upload function - replace with your actual backend upload logic
|
|
583
|
-
const uploadToBackend = async (data: Uint8Array): Promise<string> => {
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
565
|
+
// Optional: Save scene as JSON string with stable URLs instead of archive
|
|
566
|
+
// This is useful when storing scenes in a database or referencing CDN-hosted assets
|
|
567
|
+
// By default, IDML images use transient buffer:// URLs that only work with saveToArchive()
|
|
568
|
+
// To use saveToString(), relocate transient resources to permanent URLs first:
|
|
569
|
+
|
|
570
|
+
// Mock upload function - replace with your actual backend upload logic
|
|
571
|
+
const uploadToBackend = async (data: Uint8Array): Promise<string> => {
|
|
572
|
+
// In production, upload the data to your CDN/storage and return the permanent URL
|
|
573
|
+
// For this example, we write to a temp file and return a file:// URL
|
|
574
|
+
const hash = data.reduce((acc, byte) => (acc + byte) % 1000000, 0);
|
|
575
|
+
const tempPath = join(outputDir, `asset-${hash}.png`);
|
|
576
|
+
await fs.writeFile(tempPath, data);
|
|
577
|
+
return `file://${tempPath}`;
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
const transientResources = engine.editor.findAllTransientResources();
|
|
581
|
+
for (const resource of transientResources) {
|
|
582
|
+
const { URL: bufferUri, size } = resource;
|
|
583
|
+
const data = engine.editor.getBufferData(bufferUri, 0, size);
|
|
584
|
+
const permanentUrl = await uploadToBackend(data);
|
|
585
|
+
engine.editor.relocateResource(bufferUri, permanentUrl);
|
|
586
|
+
}
|
|
589
587
|
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
const
|
|
593
|
-
|
|
594
|
-
const permanentUrl = await uploadToBackend(data);
|
|
595
|
-
engine.editor.relocateResource(bufferUri, permanentUrl);
|
|
596
|
-
}
|
|
597
|
-
const sceneString = await engine.scene.saveToString();
|
|
598
|
-
console.log(`Scene persisted with stable URLs (${sceneString.length} bytes)`);
|
|
588
|
+
// Now save as scene string - all URLs are permanent
|
|
589
|
+
const sceneString = await engine.scene.saveToString();
|
|
590
|
+
const sceneStringPath = join(outputDir, `${inputName}.scene`);
|
|
591
|
+
await fs.writeFile(sceneStringPath, sceneString);
|
|
599
592
|
```
|
|
600
593
|
|
|
601
594
|
The relocation workflow:
|
|
602
595
|
|
|
603
596
|
1. Find all transient resources using `engine.editor.findAllTransientResources()`
|
|
604
597
|
2. Extract binary data for each resource using `engine.editor.getBufferData()`
|
|
605
|
-
3. Upload the data to your
|
|
598
|
+
3. Upload the data to your storage service (S3, GCS, CDN, etc.)
|
|
606
599
|
4. Relocate the resource URL using `engine.editor.relocateResource()`
|
|
607
600
|
5. Save to string with `engine.scene.saveToString()` - all URLs will now be permanent
|
|
608
601
|
|
|
@@ -610,33 +603,242 @@ The relocation workflow:
|
|
|
610
603
|
|
|
611
604
|
When using the default font resolver with Google Fonts, the resulting scene string will contain Google CDN URLs for fonts. If you need fonts hosted on your own infrastructure, configure a custom font resolver instead of using the default Google Fonts integration.
|
|
612
605
|
|
|
613
|
-
##
|
|
606
|
+
## Batch Converting Multiple IDML Files
|
|
607
|
+
|
|
608
|
+
Process multiple IDML files sequentially, continuing even if individual files fail:
|
|
609
|
+
|
|
610
|
+
```typescript highlight=highlight-batch-convert
|
|
611
|
+
/**
|
|
612
|
+
* Batch convert multiple IDML files to CE.SDK scene formats
|
|
613
|
+
* Processes files sequentially, continuing even if individual files fail
|
|
614
|
+
*/
|
|
615
|
+
async function batchConvertIdmls(
|
|
616
|
+
idmlPaths: string[],
|
|
617
|
+
outputDir: string
|
|
618
|
+
): Promise<void> {
|
|
619
|
+
console.log(`Starting batch conversion of ${idmlPaths.length} IDML files...`);
|
|
620
|
+
|
|
621
|
+
// Ensure output directory exists
|
|
622
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
623
|
+
|
|
624
|
+
// Initialize engine once for all conversions
|
|
625
|
+
const engine = await CreativeEngine.init({
|
|
626
|
+
baseURL: process.env.IMGLY_LOCAL_ASSETS_URL
|
|
627
|
+
// license: process.env.CESDK_LICENSE,
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
try {
|
|
631
|
+
// Configure Google Fonts for text element support
|
|
632
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
633
|
+
await addGfontsAssetLibrary(engine as any);
|
|
634
|
+
|
|
635
|
+
let successCount = 0;
|
|
636
|
+
let failCount = 0;
|
|
637
|
+
|
|
638
|
+
// Process each IDML file
|
|
639
|
+
for (const idmlPath of idmlPaths) {
|
|
640
|
+
const fileName = basename(idmlPath);
|
|
641
|
+
console.log(`\nProcessing: ${fileName}`);
|
|
642
|
+
|
|
643
|
+
try {
|
|
644
|
+
const { archivePath, sceneStringPath } = await convertIdml(
|
|
645
|
+
engine,
|
|
646
|
+
idmlPath,
|
|
647
|
+
outputDir
|
|
648
|
+
);
|
|
649
|
+
|
|
650
|
+
console.log(` Archive: ${archivePath}`);
|
|
651
|
+
console.log(` Scene: ${sceneStringPath}`);
|
|
652
|
+
successCount++;
|
|
653
|
+
} catch (error) {
|
|
654
|
+
console.error(` Failed: ${(error as Error).message}`);
|
|
655
|
+
failCount++;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
console.log(`\nBatch conversion complete:`);
|
|
660
|
+
console.log(` Success: ${successCount}/${idmlPaths.length}`);
|
|
661
|
+
console.log(` Failed: ${failCount}/${idmlPaths.length}`);
|
|
662
|
+
} finally {
|
|
663
|
+
// Always dispose engine to free resources
|
|
664
|
+
engine.dispose();
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
```
|
|
614
668
|
|
|
615
|
-
|
|
669
|
+
Key aspects of batch conversion:
|
|
616
670
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
671
|
+
- **Single engine instance** - Initialize once and reuse for all conversions to improve performance
|
|
672
|
+
- **Error isolation** - Each file is processed in a try-catch block so one failure doesn't stop the batch
|
|
673
|
+
- **Progress logging** - Track success and failure counts for reporting
|
|
674
|
+
- **Resource cleanup** - Always dispose the engine in a finally block
|
|
620
675
|
|
|
621
|
-
|
|
622
|
-
const loadedPages = engine.scene.getPages();
|
|
623
|
-
console.log(`IDML imported successfully with ${loadedPages.length} page(s)`);
|
|
676
|
+
## Processing a Directory
|
|
624
677
|
|
|
625
|
-
|
|
626
|
-
|
|
678
|
+
Scan a directory for IDML files and convert all of them:
|
|
679
|
+
|
|
680
|
+
```typescript highlight=highlight-process-directory
|
|
681
|
+
/**
|
|
682
|
+
* Find all IDML files in a directory and convert them
|
|
683
|
+
*/
|
|
684
|
+
export async function processDirectory(
|
|
685
|
+
inputDir: string,
|
|
686
|
+
outputDir: string
|
|
687
|
+
): Promise<void> {
|
|
688
|
+
// Find all IDML files in directory
|
|
689
|
+
const files = await fs.readdir(inputDir);
|
|
690
|
+
const idmlFiles = files
|
|
691
|
+
.filter((f) => f.toLowerCase().endsWith('.idml'))
|
|
692
|
+
.map((f) => join(inputDir, f));
|
|
693
|
+
|
|
694
|
+
if (idmlFiles.length === 0) {
|
|
695
|
+
console.log(`No IDML files found in ${inputDir}`);
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
await batchConvertIdmls(idmlFiles, outputDir);
|
|
700
|
+
}
|
|
627
701
|
```
|
|
628
702
|
|
|
629
|
-
|
|
703
|
+
This function finds all `.idml` files in the input directory and processes them as a batch.
|
|
704
|
+
|
|
705
|
+
## Validating Conversion Results
|
|
706
|
+
|
|
707
|
+
Load a converted archive and verify its structure:
|
|
708
|
+
|
|
709
|
+
```typescript highlight=highlight-validate-results
|
|
710
|
+
/**
|
|
711
|
+
* Validate conversion results by loading the archive and checking scene structure
|
|
712
|
+
*/
|
|
713
|
+
export async function validateArchive(archivePath: string): Promise<{
|
|
714
|
+
valid: boolean;
|
|
715
|
+
pageCount: number;
|
|
716
|
+
blockCount: number;
|
|
717
|
+
}> {
|
|
718
|
+
const engine = await CreativeEngine.init({
|
|
719
|
+
// license: process.env.CESDK_LICENSE,
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
try {
|
|
723
|
+
// Load the archive
|
|
724
|
+
const archiveBuffer = await fs.readFile(archivePath);
|
|
725
|
+
const archiveBlob = new Blob([archiveBuffer]);
|
|
726
|
+
const archiveUrl = URL.createObjectURL(archiveBlob);
|
|
727
|
+
|
|
728
|
+
await engine.scene.loadFromArchiveURL(archiveUrl);
|
|
729
|
+
|
|
730
|
+
// Get scene information
|
|
731
|
+
const pages = engine.block.findByType('page');
|
|
732
|
+
const allBlocks = engine.block.findAll();
|
|
733
|
+
|
|
734
|
+
return {
|
|
735
|
+
valid: pages.length > 0,
|
|
736
|
+
pageCount: pages.length,
|
|
737
|
+
blockCount: allBlocks.length
|
|
738
|
+
};
|
|
739
|
+
} finally {
|
|
740
|
+
engine.dispose();
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
Validation checks:
|
|
746
|
+
|
|
747
|
+
- The archive can be loaded without errors
|
|
748
|
+
- At least one page exists in the scene
|
|
749
|
+
- Block count indicates content was imported
|
|
750
|
+
|
|
751
|
+
## Running the Conversion
|
|
752
|
+
|
|
753
|
+
The main entry point demonstrates the complete batch conversion workflow:
|
|
754
|
+
|
|
755
|
+
```typescript highlight=highlight-main
|
|
756
|
+
/**
|
|
757
|
+
* Main entry point - demonstrates batch IDML conversion workflow
|
|
758
|
+
*/
|
|
759
|
+
async function main(): Promise<void> {
|
|
760
|
+
console.log('IDML to CE.SDK Batch Converter');
|
|
761
|
+
console.log('==============================\n');
|
|
762
|
+
|
|
763
|
+
// Example: Convert a single IDML file
|
|
764
|
+
// In production, you would provide actual IDML files
|
|
765
|
+
const engine = await CreativeEngine.init({
|
|
766
|
+
// license: process.env.CESDK_LICENSE,
|
|
767
|
+
});
|
|
768
|
+
|
|
769
|
+
try {
|
|
770
|
+
// Configure Google Fonts for text element support
|
|
771
|
+
await addGfontsAssetLibrary(engine as any);
|
|
772
|
+
|
|
773
|
+
// Create a sample scene to demonstrate the export format
|
|
774
|
+
// In production, this would be replaced by actual IDML conversion
|
|
775
|
+
await engine.scene.create();
|
|
776
|
+
const page = engine.block.create('page');
|
|
777
|
+
engine.block.setWidth(page, 800);
|
|
778
|
+
engine.block.setHeight(page, 600);
|
|
779
|
+
engine.block.appendChild(engine.scene.get()!, page);
|
|
780
|
+
|
|
781
|
+
// Save as archive
|
|
782
|
+
await fs.mkdir('./output', { recursive: true });
|
|
783
|
+
const archive = await engine.scene.saveToArchive();
|
|
784
|
+
const archiveBuffer = Buffer.from(await archive.arrayBuffer());
|
|
785
|
+
await fs.writeFile('./output/sample.cesdk', archiveBuffer);
|
|
786
|
+
|
|
787
|
+
console.log('Sample archive created: ./output/sample.cesdk');
|
|
788
|
+
console.log('\nTo convert actual IDML files:');
|
|
789
|
+
console.log('1. Place IDML files in an input directory');
|
|
790
|
+
console.log('2. Call: await processDirectory("./input", "./output")');
|
|
791
|
+
} finally {
|
|
792
|
+
engine.dispose();
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
Run the script with `vite-node` or `tsx`:
|
|
798
|
+
|
|
799
|
+
```bash
|
|
800
|
+
npx vite-node server-js.ts
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
For production use, modify the script to accept input/output directories as arguments.
|
|
804
|
+
|
|
805
|
+
## Saving and Loading Archives
|
|
806
|
+
|
|
807
|
+
Scene archives (`.cesdk` files) contain the complete scene with all embedded assets:
|
|
808
|
+
|
|
809
|
+
```typescript
|
|
810
|
+
// Save scene as archive
|
|
811
|
+
const archive = await engine.scene.saveToArchive();
|
|
812
|
+
const archiveBuffer = Buffer.from(await archive.arrayBuffer());
|
|
813
|
+
await fs.writeFile('output.cesdk', archiveBuffer);
|
|
814
|
+
|
|
815
|
+
// Load archive in browser or server
|
|
816
|
+
await engine.scene.loadFromArchiveURL(archiveUrl);
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
Archives are portable - convert on server, load in browser or another server instance.
|
|
820
|
+
|
|
821
|
+
## Engine Cleanup
|
|
822
|
+
|
|
823
|
+
Always dispose of the engine when processing is complete to free system resources:
|
|
824
|
+
|
|
825
|
+
```typescript highlight=highlight-cleanup
|
|
826
|
+
// Always dispose engine to free resources
|
|
827
|
+
engine.dispose();
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
Using a `try/finally` block ensures cleanup happens even if an error occurs during processing.
|
|
630
831
|
|
|
631
832
|
## API Reference
|
|
632
833
|
|
|
633
834
|
The `@imgly/idml-importer` package exports the following key APIs:
|
|
634
835
|
|
|
635
|
-
| API
|
|
636
|
-
|
|
637
|
-
| `IDMLParser.fromFile(engine, buffer, xmlParser)` | Creates a parser instance from an IDML file buffer. The `xmlParser` function converts XML strings to DOM documents. |
|
|
638
|
-
| `parser.parse()`
|
|
639
|
-
| `addGfontsAssetLibrary(engine)`
|
|
836
|
+
| API | Description |
|
|
837
|
+
|-----|-------------|
|
|
838
|
+
| `IDMLParser.fromFile(engine, buffer, xmlParser, options?)` | Creates a parser instance from an IDML file buffer. The `xmlParser` function converts XML strings to DOM documents. `options` accepts `fontResolver` and `embeddedImporters`. |
|
|
839
|
+
| `parser.parse()` | Parses the IDML file and creates a CE.SDK scene. Returns when parsing is complete. |
|
|
840
|
+
| `addGfontsAssetLibrary(engine)` | Registers Google Fonts as a font source for text element matching. Call before parsing. |
|
|
841
|
+
| `createPdfEmbeddedImporter(PDFParser)` | Adapter for the `embeddedImporters` array. Imports embedded PDF / `.ai` content as editable CE.SDK blocks via `@imgly/pdf-importer`. Requires the package to be installed; pass its `PDFParser` class as the only argument. |
|
|
640
842
|
|
|
641
843
|
## Limitations
|
|
642
844
|
|
|
@@ -645,8 +847,7 @@ The IDML importer has the following limitations:
|
|
|
645
847
|
- **Linked images** - Only embedded images are supported. Linked images become placeholders. Embed all images in InDesign before exporting to IDML.
|
|
646
848
|
- **Text flow** - Text that flows between multiple text frames is not supported and may appear duplicated.
|
|
647
849
|
- **Image fitting** - Images shrunk inside their frames may not render as expected.
|
|
648
|
-
- **PDF
|
|
649
|
-
- **Page sizes** - Different page sizes within the same document are not supported. All pages use the first page's dimensions.
|
|
850
|
+
- **Embedded PDF / `.ai`** - Imports as editable blocks when `@imgly/pdf-importer` is installed and `createPdfEmbeddedImporter(PDFParser)` is registered in `embeddedImporters`. Without the adapter, embeds fall through to a placeholder image. Non-rectangular frame clipping and per-embed PDF crop attributes are not yet applied.
|
|
650
851
|
- **Advanced text** - Complex text formatting beyond bold/italic may not be preserved.
|
|
651
852
|
|
|
652
853
|
## Pre-Import Checklist
|
|
@@ -668,13 +869,15 @@ Before exporting from InDesign:
|
|
|
668
869
|
|
|
669
870
|
**Text is duplicated:** This can happen when text flows between multiple frames. The IDML importer doesn't support linked text frames.
|
|
670
871
|
|
|
671
|
-
**
|
|
872
|
+
**Embedded PDFs show as placeholders:** Install `@imgly/pdf-importer` and pass `createPdfEmbeddedImporter(PDFParser)` in the `embeddedImporters` option to `IDMLParser.fromFile`. Without the adapter, `<PDF>` and `.ai` embeds fall through to a placeholder image.
|
|
873
|
+
|
|
874
|
+
|
|
672
875
|
|
|
673
876
|
---
|
|
674
877
|
|
|
675
878
|
## More Resources
|
|
676
879
|
|
|
677
|
-
- **[
|
|
880
|
+
- **[Node.js Documentation Index](https://img.ly/docs/cesdk/node.md)** - Browse all Node.js documentation
|
|
678
881
|
- **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
|
|
679
|
-
- **[Web Documentation](./
|
|
680
|
-
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|
|
882
|
+
- **[Web Documentation](./node.md)** - Interactive documentation with examples
|
|
883
|
+
- **[Support](mailto:support@img.ly)** - Contact IMG.LY support
|