@imgly/codesign-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (816) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +158 -0
  3. package/assets/docs/api/SKILL.md +49 -0
  4. package/assets/docs/api/index.d.ts +10518 -0
  5. package/assets/docs/guide/SKILL.md +142 -0
  6. package/assets/docs/guide/actions.md +1038 -0
  7. package/assets/docs/guide/animation/create/base.md +467 -0
  8. package/assets/docs/guide/animation/create/text.md +453 -0
  9. package/assets/docs/guide/animation/create.md +558 -0
  10. package/assets/docs/guide/animation/edit.md +501 -0
  11. package/assets/docs/guide/animation/overview.md +22 -0
  12. package/assets/docs/guide/animation/types.md +430 -0
  13. package/assets/docs/guide/animation.md +23 -0
  14. package/assets/docs/guide/api/AssetAPI.md +602 -0
  15. package/assets/docs/guide/api/BlockAPI.md +6152 -0
  16. package/assets/docs/guide/api/CreativeEngine.md +180 -0
  17. package/assets/docs/guide/api/EditorAPI.md +1261 -0
  18. package/assets/docs/guide/api/EventAPI.md +25 -0
  19. package/assets/docs/guide/api/SceneAPI.md +729 -0
  20. package/assets/docs/guide/api/VariableAPI.md +59 -0
  21. package/assets/docs/guide/api/types.md +71 -0
  22. package/assets/docs/guide/api-reference/overview.md +20 -0
  23. package/assets/docs/guide/automation/auto-resize.md +412 -0
  24. package/assets/docs/guide/automation/batch-processing.md +474 -0
  25. package/assets/docs/guide/automation/data-merge.md +406 -0
  26. package/assets/docs/guide/automation/design-generation.md +107 -0
  27. package/assets/docs/guide/automation/overview.md +16 -0
  28. package/assets/docs/guide/automation.md +24 -0
  29. package/assets/docs/guide/browser-support.md +38 -0
  30. package/assets/docs/guide/capabilities.md +18 -0
  31. package/assets/docs/guide/colors/adjust.md +551 -0
  32. package/assets/docs/guide/colors/apply.md +349 -0
  33. package/assets/docs/guide/colors/basics.md +440 -0
  34. package/assets/docs/guide/colors/conversion.md +504 -0
  35. package/assets/docs/guide/colors/create-color-palette.md +426 -0
  36. package/assets/docs/guide/colors/for-print/cmyk.md +577 -0
  37. package/assets/docs/guide/colors/for-print/spot.md +751 -0
  38. package/assets/docs/guide/colors/for-print.md +21 -0
  39. package/assets/docs/guide/colors/for-screen/p3.md +60 -0
  40. package/assets/docs/guide/colors/for-screen/srgb.md +463 -0
  41. package/assets/docs/guide/colors/for-screen.md +21 -0
  42. package/assets/docs/guide/colors/overview.md +20 -0
  43. package/assets/docs/guide/colors/replace.md +535 -0
  44. package/assets/docs/guide/colors.md +28 -0
  45. package/assets/docs/guide/compatibility.md +27 -0
  46. package/assets/docs/guide/concepts/architecture.md +99 -0
  47. package/assets/docs/guide/concepts/assets.md +360 -0
  48. package/assets/docs/guide/concepts/blocks.md +750 -0
  49. package/assets/docs/guide/concepts/buffers.md +546 -0
  50. package/assets/docs/guide/concepts/design-units.md +333 -0
  51. package/assets/docs/guide/concepts/edit-modes.md +431 -0
  52. package/assets/docs/guide/concepts/editing-workflow.md +303 -0
  53. package/assets/docs/guide/concepts/events.md +466 -0
  54. package/assets/docs/guide/concepts/headless-mode/browser.md +291 -0
  55. package/assets/docs/guide/concepts/pages.md +396 -0
  56. package/assets/docs/guide/concepts/resources.md +496 -0
  57. package/assets/docs/guide/concepts/scenes.md +443 -0
  58. package/assets/docs/guide/concepts/templating.md +194 -0
  59. package/assets/docs/guide/concepts/terminology.md +296 -0
  60. package/assets/docs/guide/concepts/undo-and-history.md +461 -0
  61. package/assets/docs/guide/concepts.md +38 -0
  62. package/assets/docs/guide/configuration.md +469 -0
  63. package/assets/docs/guide/conversion/overview.md +22 -0
  64. package/assets/docs/guide/conversion/to-base64.md +234 -0
  65. package/assets/docs/guide/conversion/to-pdf.md +616 -0
  66. package/assets/docs/guide/conversion/to-png.md +290 -0
  67. package/assets/docs/guide/conversion.md +23 -0
  68. package/assets/docs/guide/create-audio/audio/add-music.md +430 -0
  69. package/assets/docs/guide/create-audio/audio/add-sound-effects.md +664 -0
  70. package/assets/docs/guide/create-audio/audio/loop.md +370 -0
  71. package/assets/docs/guide/create-audio/audio.md +336 -0
  72. package/assets/docs/guide/create-composition/add-background.md +395 -0
  73. package/assets/docs/guide/create-composition/blend-modes.md +372 -0
  74. package/assets/docs/guide/create-composition/collage.md +432 -0
  75. package/assets/docs/guide/create-composition/group-and-ungroup.md +388 -0
  76. package/assets/docs/guide/create-composition/layer-management.md +503 -0
  77. package/assets/docs/guide/create-composition/layout.md +396 -0
  78. package/assets/docs/guide/create-composition/lock-design.md +362 -0
  79. package/assets/docs/guide/create-composition/multi-page.md +204 -0
  80. package/assets/docs/guide/create-composition/overview.md +18 -0
  81. package/assets/docs/guide/create-composition/programmatic.md +593 -0
  82. package/assets/docs/guide/create-composition.md +30 -0
  83. package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +688 -0
  84. package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +600 -0
  85. package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +647 -0
  86. package/assets/docs/guide/create-templates/add-dynamic-content.md +307 -0
  87. package/assets/docs/guide/create-templates/add-to-template-library.md +297 -0
  88. package/assets/docs/guide/create-templates/edit-or-remove.md +441 -0
  89. package/assets/docs/guide/create-templates/from-scratch.md +558 -0
  90. package/assets/docs/guide/create-templates/import/from-scene-file.md +440 -0
  91. package/assets/docs/guide/create-templates/import.md +244 -0
  92. package/assets/docs/guide/create-templates/lock.md +325 -0
  93. package/assets/docs/guide/create-templates/overview.md +16 -0
  94. package/assets/docs/guide/create-templates.md +32 -0
  95. package/assets/docs/guide/create-video/audio/adjust-speed.md +302 -0
  96. package/assets/docs/guide/create-video/audio/adjust-volume.md +346 -0
  97. package/assets/docs/guide/create-video/control.md +285 -0
  98. package/assets/docs/guide/create-video/limitations.md +396 -0
  99. package/assets/docs/guide/create-video/overview.md +224 -0
  100. package/assets/docs/guide/create-video/timeline-editor.md +622 -0
  101. package/assets/docs/guide/create-video/update-caption-presets.md +676 -0
  102. package/assets/docs/guide/create-video.md +32 -0
  103. package/assets/docs/guide/edit-image/add-watermark.md +497 -0
  104. package/assets/docs/guide/edit-image/overview.md +22 -0
  105. package/assets/docs/guide/edit-image/remove-bg.md +420 -0
  106. package/assets/docs/guide/edit-image/replace-colors.md +680 -0
  107. package/assets/docs/guide/edit-image/transform/crop.md +523 -0
  108. package/assets/docs/guide/edit-image/transform/move.md +279 -0
  109. package/assets/docs/guide/edit-image/transform/resize.md +301 -0
  110. package/assets/docs/guide/edit-image/transform/rotate.md +408 -0
  111. package/assets/docs/guide/edit-image/transform/scale.md +278 -0
  112. package/assets/docs/guide/edit-image/transform.md +24 -0
  113. package/assets/docs/guide/edit-image/vectorize.md +204 -0
  114. package/assets/docs/guide/edit-image.md +25 -0
  115. package/assets/docs/guide/edit-video/add-captions.md +589 -0
  116. package/assets/docs/guide/edit-video/add-watermark.md +429 -0
  117. package/assets/docs/guide/edit-video/join-and-arrange.md +540 -0
  118. package/assets/docs/guide/edit-video/redaction.md +544 -0
  119. package/assets/docs/guide/edit-video/split.md +634 -0
  120. package/assets/docs/guide/edit-video/transform/crop.md +380 -0
  121. package/assets/docs/guide/edit-video/transform/flip.md +182 -0
  122. package/assets/docs/guide/edit-video/transform/move.md +413 -0
  123. package/assets/docs/guide/edit-video/transform/resize.md +534 -0
  124. package/assets/docs/guide/edit-video/transform/rotate.md +312 -0
  125. package/assets/docs/guide/edit-video/transform/scale.md +603 -0
  126. package/assets/docs/guide/edit-video/transform.md +25 -0
  127. package/assets/docs/guide/edit-video/trim.md +773 -0
  128. package/assets/docs/guide/engine-interface.md +108 -0
  129. package/assets/docs/guide/export-save-publish/create-thumbnail.md +292 -0
  130. package/assets/docs/guide/export-save-publish/export/compress.md +639 -0
  131. package/assets/docs/guide/export-save-publish/export/overview.md +576 -0
  132. package/assets/docs/guide/export-save-publish/export/partial-export.md +694 -0
  133. package/assets/docs/guide/export-save-publish/export/size-limits.md +401 -0
  134. package/assets/docs/guide/export-save-publish/export/to-html5.md +474 -0
  135. package/assets/docs/guide/export-save-publish/export/to-jpeg.md +312 -0
  136. package/assets/docs/guide/export-save-publish/export/to-mp4.md +364 -0
  137. package/assets/docs/guide/export-save-publish/export/to-pdf.md +389 -0
  138. package/assets/docs/guide/export-save-publish/export/to-png.md +255 -0
  139. package/assets/docs/guide/export-save-publish/export/to-raw-data.md +303 -0
  140. package/assets/docs/guide/export-save-publish/export/to-webp.md +261 -0
  141. package/assets/docs/guide/export-save-publish/export/with-color-mask.md +278 -0
  142. package/assets/docs/guide/export-save-publish/export.md +36 -0
  143. package/assets/docs/guide/export-save-publish/for-printing.md +423 -0
  144. package/assets/docs/guide/export-save-publish/for-social-media.md +318 -0
  145. package/assets/docs/guide/export-save-publish/pre-export-validation.md +698 -0
  146. package/assets/docs/guide/export-save-publish/save.md +340 -0
  147. package/assets/docs/guide/export-save-publish/store-custom-metadata.md +367 -0
  148. package/assets/docs/guide/file-format-support.md +34 -0
  149. package/assets/docs/guide/fills/color.md +678 -0
  150. package/assets/docs/guide/fills/image.md +539 -0
  151. package/assets/docs/guide/fills/overview.md +144 -0
  152. package/assets/docs/guide/fills/video.md +641 -0
  153. package/assets/docs/guide/fills.md +24 -0
  154. package/assets/docs/guide/filters-and-effects/apply.md +1019 -0
  155. package/assets/docs/guide/filters-and-effects/blur.md +382 -0
  156. package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +445 -0
  157. package/assets/docs/guide/filters-and-effects/create-custom-filters.md +614 -0
  158. package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +426 -0
  159. package/assets/docs/guide/filters-and-effects/distortion.md +527 -0
  160. package/assets/docs/guide/filters-and-effects/duotone.md +602 -0
  161. package/assets/docs/guide/filters-and-effects/gradients.md +1311 -0
  162. package/assets/docs/guide/filters-and-effects/overview.md +22 -0
  163. package/assets/docs/guide/filters-and-effects/support.md +623 -0
  164. package/assets/docs/guide/filters-and-effects.md +28 -0
  165. package/assets/docs/guide/get-started/agent-skills.md +119 -0
  166. package/assets/docs/guide/get-started/build-with-ai.md +45 -0
  167. package/assets/docs/guide/get-started/mcp-server.md +119 -0
  168. package/assets/docs/guide/get-started/overview.md +28 -0
  169. package/assets/docs/guide/get-started/vanilla-js/quickstart.md +175 -0
  170. package/assets/docs/guide/grid-and-rulers.md +222 -0
  171. package/assets/docs/guide/guides/export-save-publish/export/audio.md +224 -0
  172. package/assets/docs/guide/guides/text/rendering-internals.md +796 -0
  173. package/assets/docs/guide/guides.md +49 -0
  174. package/assets/docs/guide/import-media/asset-library.md +23 -0
  175. package/assets/docs/guide/import-media/asset-panel/basics.md +324 -0
  176. package/assets/docs/guide/import-media/asset-panel/customize.md +478 -0
  177. package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +415 -0
  178. package/assets/docs/guide/import-media/asset-panel/thumbnails.md +633 -0
  179. package/assets/docs/guide/import-media/capture-from-camera/record-video.md +137 -0
  180. package/assets/docs/guide/import-media/capture-from-camera.md +20 -0
  181. package/assets/docs/guide/import-media/concepts.md +173 -0
  182. package/assets/docs/guide/import-media/content-json-schema.md +615 -0
  183. package/assets/docs/guide/import-media/default-assets.md +381 -0
  184. package/assets/docs/guide/import-media/edit-or-remove-assets.md +489 -0
  185. package/assets/docs/guide/import-media/file-format-support.md +178 -0
  186. package/assets/docs/guide/import-media/from-local-source/user-upload.md +438 -0
  187. package/assets/docs/guide/import-media/from-local-source.md +20 -0
  188. package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +390 -0
  189. package/assets/docs/guide/import-media/from-remote-source/getty-images.md +627 -0
  190. package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +625 -0
  191. package/assets/docs/guide/import-media/from-remote-source/pexels.md +692 -0
  192. package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +473 -0
  193. package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +497 -0
  194. package/assets/docs/guide/import-media/from-remote-source/third-party.md +51 -0
  195. package/assets/docs/guide/import-media/from-remote-source/unsplash.md +914 -0
  196. package/assets/docs/guide/import-media/from-remote-source/your-server.md +764 -0
  197. package/assets/docs/guide/import-media/from-remote-source.md +28 -0
  198. package/assets/docs/guide/import-media/overview.md +32 -0
  199. package/assets/docs/guide/import-media/retrieve-mimetype.md +274 -0
  200. package/assets/docs/guide/import-media/size-limits.md +20 -0
  201. package/assets/docs/guide/import-media/source-sets.md +476 -0
  202. package/assets/docs/guide/import-media.md +32 -0
  203. package/assets/docs/guide/insert-media/audio.md +291 -0
  204. package/assets/docs/guide/insert-media/images.md +380 -0
  205. package/assets/docs/guide/insert-media/position-and-align.md +734 -0
  206. package/assets/docs/guide/insert-media/shapes-or-stickers.md +799 -0
  207. package/assets/docs/guide/insert-media/videos.md +308 -0
  208. package/assets/docs/guide/insert-media.md +24 -0
  209. package/assets/docs/guide/key-capabilities.md +24 -0
  210. package/assets/docs/guide/key-concepts.md +83 -0
  211. package/assets/docs/guide/licensing.md +45 -0
  212. package/assets/docs/guide/llms-txt.md +53 -0
  213. package/assets/docs/guide/open-the-editor/blank-canvas.md +124 -0
  214. package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +228 -0
  215. package/assets/docs/guide/open-the-editor/from-image.md +205 -0
  216. package/assets/docs/guide/open-the-editor/from-template.md +189 -0
  217. package/assets/docs/guide/open-the-editor/from-video.md +274 -0
  218. package/assets/docs/guide/open-the-editor/import-design/from-archive.md +504 -0
  219. package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +680 -0
  220. package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +865 -0
  221. package/assets/docs/guide/open-the-editor/import-design.md +481 -0
  222. package/assets/docs/guide/open-the-editor/load-scene.md +178 -0
  223. package/assets/docs/guide/open-the-editor/overview.md +20 -0
  224. package/assets/docs/guide/open-the-editor/set-zoom-level.md +303 -0
  225. package/assets/docs/guide/open-the-editor/uri-resolver.md +347 -0
  226. package/assets/docs/guide/open-the-editor.md +29 -0
  227. package/assets/docs/guide/outlines/overview.md +14 -0
  228. package/assets/docs/guide/outlines/shadows-and-glows.md +515 -0
  229. package/assets/docs/guide/outlines/strokes.md +292 -0
  230. package/assets/docs/guide/outlines.md +22 -0
  231. package/assets/docs/guide/overview.md +22 -0
  232. package/assets/docs/guide/performance.md +217 -0
  233. package/assets/docs/guide/plugins/asset-sources.md +553 -0
  234. package/assets/docs/guide/plugins/print-ready-pdf.md +549 -0
  235. package/assets/docs/guide/plugins.md +36 -0
  236. package/assets/docs/guide/rules/asset-handling.md +180 -0
  237. package/assets/docs/guide/rules/common-pitfalls.md +272 -0
  238. package/assets/docs/guide/rules/content-fill-mode.md +29 -0
  239. package/assets/docs/guide/rules/enforce-brand-guidelines.md +672 -0
  240. package/assets/docs/guide/rules/lock-content.md +478 -0
  241. package/assets/docs/guide/rules/moderate-content.md +761 -0
  242. package/assets/docs/guide/rules/overview.md +514 -0
  243. package/assets/docs/guide/rules/silent-init-errors.md +137 -0
  244. package/assets/docs/guide/rules/verify-properties-before-use.md +78 -0
  245. package/assets/docs/guide/rules.md +23 -0
  246. package/assets/docs/guide/security.md +199 -0
  247. package/assets/docs/guide/serve-assets.md +332 -0
  248. package/assets/docs/guide/settings.md +199 -0
  249. package/assets/docs/guide/shapes.md +23 -0
  250. package/assets/docs/guide/starterkits/3d-mockup-editor.md +748 -0
  251. package/assets/docs/guide/starterkits/advanced-editor.md +698 -0
  252. package/assets/docs/guide/starterkits/advanced-video-editor.md +696 -0
  253. package/assets/docs/guide/starterkits/ai-editor.md +749 -0
  254. package/assets/docs/guide/starterkits/airtable-image-editor.md +672 -0
  255. package/assets/docs/guide/starterkits/apparel-ui.md +188 -0
  256. package/assets/docs/guide/starterkits/assets.md +27 -0
  257. package/assets/docs/guide/starterkits/auto-resize.md +586 -0
  258. package/assets/docs/guide/starterkits/automated-video-generation.md +692 -0
  259. package/assets/docs/guide/starterkits/background-removal-editor.md +480 -0
  260. package/assets/docs/guide/starterkits/content-moderation.md +863 -0
  261. package/assets/docs/guide/starterkits/creative-automation.md +28 -0
  262. package/assets/docs/guide/starterkits/custom-built-uis.md +26 -0
  263. package/assets/docs/guide/starterkits/customization.md +29 -0
  264. package/assets/docs/guide/starterkits/cutout-lines-editor.md +470 -0
  265. package/assets/docs/guide/starterkits/data-merge.md +850 -0
  266. package/assets/docs/guide/starterkits/design-editor.md +698 -0
  267. package/assets/docs/guide/starterkits/design-generation.md +719 -0
  268. package/assets/docs/guide/starterkits/design-validation.md +808 -0
  269. package/assets/docs/guide/starterkits/editor-ui-configurations.md +14 -0
  270. package/assets/docs/guide/starterkits/export-options.md +724 -0
  271. package/assets/docs/guide/starterkits/export-using-renderer.md +708 -0
  272. package/assets/docs/guide/starterkits/extensibility.md +28 -0
  273. package/assets/docs/guide/starterkits/force-crop-editor.md +675 -0
  274. package/assets/docs/guide/starterkits/form-based-template-adoption.md +522 -0
  275. package/assets/docs/guide/starterkits/getty-images-editor.md +700 -0
  276. package/assets/docs/guide/starterkits/html5-ads-exporter.md +719 -0
  277. package/assets/docs/guide/starterkits/indesign-template-import.md +580 -0
  278. package/assets/docs/guide/starterkits/layouts-editor.md +724 -0
  279. package/assets/docs/guide/starterkits/mobile-ui.md +185 -0
  280. package/assets/docs/guide/starterkits/mockup-editor.md +745 -0
  281. package/assets/docs/guide/starterkits/multi-image-generation.md +542 -0
  282. package/assets/docs/guide/starterkits/page-sizes-editor.md +657 -0
  283. package/assets/docs/guide/starterkits/pexels-image-editor.md +665 -0
  284. package/assets/docs/guide/starterkits/photo-editor.md +755 -0
  285. package/assets/docs/guide/starterkits/photo-ui.md +186 -0
  286. package/assets/docs/guide/starterkits/photobook-ui.md +188 -0
  287. package/assets/docs/guide/starterkits/placeholders.md +678 -0
  288. package/assets/docs/guide/starterkits/player.md +405 -0
  289. package/assets/docs/guide/starterkits/plugins.md +25 -0
  290. package/assets/docs/guide/starterkits/postcard-editor.md +202 -0
  291. package/assets/docs/guide/starterkits/pptx-template-import.md +581 -0
  292. package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +746 -0
  293. package/assets/docs/guide/starterkits/product-editor.md +773 -0
  294. package/assets/docs/guide/starterkits/psd-template-import.md +580 -0
  295. package/assets/docs/guide/starterkits/qr-code-editor.md +470 -0
  296. package/assets/docs/guide/starterkits/single-page-editor.md +661 -0
  297. package/assets/docs/guide/starterkits/start-with-image.md +684 -0
  298. package/assets/docs/guide/starterkits/start-with-video.md +651 -0
  299. package/assets/docs/guide/starterkits/t-shirt-designer.md +742 -0
  300. package/assets/docs/guide/starterkits/templating.md +23 -0
  301. package/assets/docs/guide/starterkits/theming.md +662 -0
  302. package/assets/docs/guide/starterkits/translation-internationalization.md +662 -0
  303. package/assets/docs/guide/starterkits/unsplash-editor.md +839 -0
  304. package/assets/docs/guide/starterkits/vectorizer-editor.md +466 -0
  305. package/assets/docs/guide/starterkits/version-history.md +745 -0
  306. package/assets/docs/guide/starterkits/video-animations.md +853 -0
  307. package/assets/docs/guide/starterkits/video-captions.md +884 -0
  308. package/assets/docs/guide/starterkits/video-editing.md +25 -0
  309. package/assets/docs/guide/starterkits/video-editor.md +696 -0
  310. package/assets/docs/guide/starterkits/video-export-options.md +676 -0
  311. package/assets/docs/guide/starterkits/viewer.md +400 -0
  312. package/assets/docs/guide/starterkits.md +41 -0
  313. package/assets/docs/guide/stickers-and-shapes/combine.md +743 -0
  314. package/assets/docs/guide/stickers-and-shapes/create-cutout.md +425 -0
  315. package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +794 -0
  316. package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +290 -0
  317. package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +211 -0
  318. package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +362 -0
  319. package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +208 -0
  320. package/assets/docs/guide/stickers.md +21 -0
  321. package/assets/docs/guide/text/add.md +641 -0
  322. package/assets/docs/guide/text/adjust-spacing.md +288 -0
  323. package/assets/docs/guide/text/auto-size.md +404 -0
  324. package/assets/docs/guide/text/custom-fonts.md +401 -0
  325. package/assets/docs/guide/text/decorations.md +330 -0
  326. package/assets/docs/guide/text/edit.md +458 -0
  327. package/assets/docs/guide/text/effects.md +244 -0
  328. package/assets/docs/guide/text/emojis.md +310 -0
  329. package/assets/docs/guide/text/enumerations.md +258 -0
  330. package/assets/docs/guide/text/language-support.md +604 -0
  331. package/assets/docs/guide/text/overview.md +14 -0
  332. package/assets/docs/guide/text/styling.md +390 -0
  333. package/assets/docs/guide/text/text-designs.md +834 -0
  334. package/assets/docs/guide/text.md +33 -0
  335. package/assets/docs/guide/to-v1-10.md +131 -0
  336. package/assets/docs/guide/to-v1-13.md +165 -0
  337. package/assets/docs/guide/to-v1-19.md +315 -0
  338. package/assets/docs/guide/to-v1-32.md +110 -0
  339. package/assets/docs/guide/to-v1-69.md +468 -0
  340. package/assets/docs/guide/to-v1-72.md +193 -0
  341. package/assets/docs/guide/upgrade.md +25 -0
  342. package/assets/docs/guide/use-templates/apply-template.md +279 -0
  343. package/assets/docs/guide/use-templates/generate.md +405 -0
  344. package/assets/docs/guide/use-templates/library.md +450 -0
  345. package/assets/docs/guide/use-templates/overview.md +20 -0
  346. package/assets/docs/guide/use-templates/programmatic.md +482 -0
  347. package/assets/docs/guide/use-templates/replace-content.md +399 -0
  348. package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +428 -0
  349. package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +337 -0
  350. package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +853 -0
  351. package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +1045 -0
  352. package/assets/docs/guide/user-interface/ai-integration/image-generation.md +641 -0
  353. package/assets/docs/guide/user-interface/ai-integration/integrate.md +966 -0
  354. package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +99 -0
  355. package/assets/docs/guide/user-interface/ai-integration/text-generation.md +498 -0
  356. package/assets/docs/guide/user-interface/ai-integration/video-generation.md +493 -0
  357. package/assets/docs/guide/user-interface/ai-integration.md +30 -0
  358. package/assets/docs/guide/user-interface/appearance/change-ui-font.md +316 -0
  359. package/assets/docs/guide/user-interface/appearance/custom-labels.md +509 -0
  360. package/assets/docs/guide/user-interface/appearance/icons.md +373 -0
  361. package/assets/docs/guide/user-interface/appearance/theming.md +665 -0
  362. package/assets/docs/guide/user-interface/appearance.md +23 -0
  363. package/assets/docs/guide/user-interface/build-your-own-ui.md +620 -0
  364. package/assets/docs/guide/user-interface/customization/canvas-menu.md +412 -0
  365. package/assets/docs/guide/user-interface/customization/canvas.md +281 -0
  366. package/assets/docs/guide/user-interface/customization/color-palette.md +413 -0
  367. package/assets/docs/guide/user-interface/customization/crop-presets.md +384 -0
  368. package/assets/docs/guide/user-interface/customization/disable-or-enable.md +676 -0
  369. package/assets/docs/guide/user-interface/customization/dock.md +399 -0
  370. package/assets/docs/guide/user-interface/customization/force-crop.md +289 -0
  371. package/assets/docs/guide/user-interface/customization/inspector-bar.md +371 -0
  372. package/assets/docs/guide/user-interface/customization/navigation-bar.md +516 -0
  373. package/assets/docs/guide/user-interface/customization/page-format.md +436 -0
  374. package/assets/docs/guide/user-interface/customization/panel.md +605 -0
  375. package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +531 -0
  376. package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +358 -0
  377. package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +374 -0
  378. package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +323 -0
  379. package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +294 -0
  380. package/assets/docs/guide/user-interface/customization/quick-start.md +12 -0
  381. package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +519 -0
  382. package/assets/docs/guide/user-interface/customization/reference/component-reference.md +333 -0
  383. package/assets/docs/guide/user-interface/customization/reference.md +12 -0
  384. package/assets/docs/guide/user-interface/customization.md +39 -0
  385. package/assets/docs/guide/user-interface/localization.md +633 -0
  386. package/assets/docs/guide/user-interface/overview.md +167 -0
  387. package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +411 -0
  388. package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +721 -0
  389. package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +331 -0
  390. package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +553 -0
  391. package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +672 -0
  392. package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +415 -0
  393. package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +521 -0
  394. package/assets/docs/guide/user-interface/ui-extensions.md +26 -0
  395. package/assets/docs/guide/user-interface.md +25 -0
  396. package/assets/docs/guide/what-is-cesdk.md +319 -0
  397. package/assets/docs/handbook/SKILL.md +521 -0
  398. package/assets/prompts/evals-assetGenerate.md +12 -0
  399. package/assets/prompts/evals-brutalistCore.md +34 -0
  400. package/assets/prompts/evals-danskCatalogue.md +31 -0
  401. package/assets/prompts/evals-exportRoundTrip.md +12 -0
  402. package/assets/prompts/evals-inspectPriorCode.md +16 -0
  403. package/assets/prompts/evals-listProjectFiles.md +6 -0
  404. package/assets/prompts/evals-readAndExplainScript.md +6 -0
  405. package/assets/prompts/evals-resumeAcrossRestart.md +15 -0
  406. package/assets/prompts/evals-rewindRecovery.md +10 -0
  407. package/assets/prompts/evals-searchAcrossFiles.md +6 -0
  408. package/assets/prompts/evals-weddingCard.md +20 -0
  409. package/assets/prompts/explain.md +6 -0
  410. package/assets/prompts/review.md +6 -0
  411. package/dist/assets/inline.generated.d.ts +2 -0
  412. package/dist/assets/inline.generated.d.ts.map +1 -0
  413. package/dist/assets/inline.generated.js +413 -0
  414. package/dist/assets/inline.generated.js.map +1 -0
  415. package/dist/assets/load-browser.d.ts +8 -0
  416. package/dist/assets/load-browser.d.ts.map +1 -0
  417. package/dist/assets/load-browser.js +11 -0
  418. package/dist/assets/load-browser.js.map +1 -0
  419. package/dist/assets/load-node.d.ts +8 -0
  420. package/dist/assets/load-node.d.ts.map +1 -0
  421. package/dist/assets/load-node.js +11 -0
  422. package/dist/assets/load-node.js.map +1 -0
  423. package/dist/cli/http.d.ts +2 -0
  424. package/dist/cli/http.d.ts.map +1 -0
  425. package/dist/cli/http.js +231 -0
  426. package/dist/cli/http.js.map +1 -0
  427. package/dist/cli/redirect-console.d.ts +10 -0
  428. package/dist/cli/redirect-console.d.ts.map +1 -0
  429. package/dist/cli/redirect-console.js +18 -0
  430. package/dist/cli/redirect-console.js.map +1 -0
  431. package/dist/cli/resolve-license.d.ts +2 -0
  432. package/dist/cli/resolve-license.d.ts.map +1 -0
  433. package/dist/cli/resolve-license.js +13 -0
  434. package/dist/cli/resolve-license.js.map +1 -0
  435. package/dist/cli/stdio.d.ts +2 -0
  436. package/dist/cli/stdio.d.ts.map +1 -0
  437. package/dist/cli/stdio.js +124 -0
  438. package/dist/cli/stdio.js.map +1 -0
  439. package/dist/cli/trial-license.generated.d.ts +2 -0
  440. package/dist/cli/trial-license.generated.d.ts.map +1 -0
  441. package/dist/cli/trial-license.generated.js +4 -0
  442. package/dist/cli/trial-license.generated.js.map +1 -0
  443. package/dist/cli.d.ts +3 -0
  444. package/dist/cli.d.ts.map +1 -0
  445. package/dist/cli.js +64 -0
  446. package/dist/cli.js.map +1 -0
  447. package/dist/config.d.ts +61 -0
  448. package/dist/config.d.ts.map +1 -0
  449. package/dist/config.js +102 -0
  450. package/dist/config.js.map +1 -0
  451. package/dist/cross-ref.d.ts +2 -0
  452. package/dist/cross-ref.d.ts.map +1 -0
  453. package/dist/cross-ref.js +31 -0
  454. package/dist/cross-ref.js.map +1 -0
  455. package/dist/dashboard/router.d.ts +3 -0
  456. package/dist/dashboard/router.d.ts.map +1 -0
  457. package/dist/dashboard/router.js +19 -0
  458. package/dist/dashboard/router.js.map +1 -0
  459. package/dist/dashboard/spa-assets.generated.d.ts +2 -0
  460. package/dist/dashboard/spa-assets.generated.d.ts.map +1 -0
  461. package/dist/dashboard/spa-assets.generated.js +220 -0
  462. package/dist/dashboard/spa-assets.generated.js.map +1 -0
  463. package/dist/engine/asset-sources.d.ts +17 -0
  464. package/dist/engine/asset-sources.d.ts.map +1 -0
  465. package/dist/engine/asset-sources.js +75 -0
  466. package/dist/engine/asset-sources.js.map +1 -0
  467. package/dist/engine/cesdk-adapter.d.ts +10 -0
  468. package/dist/engine/cesdk-adapter.d.ts.map +1 -0
  469. package/dist/engine/cesdk-adapter.js +19 -0
  470. package/dist/engine/cesdk-adapter.js.map +1 -0
  471. package/dist/engine/index.d.ts +3 -0
  472. package/dist/engine/index.d.ts.map +1 -0
  473. package/dist/engine/index.js +3 -0
  474. package/dist/engine/index.js.map +1 -0
  475. package/dist/engine/mutex.d.ts +5 -0
  476. package/dist/engine/mutex.d.ts.map +1 -0
  477. package/dist/engine/mutex.js +42 -0
  478. package/dist/engine/mutex.js.map +1 -0
  479. package/dist/engine/session.d.ts +50 -0
  480. package/dist/engine/session.d.ts.map +1 -0
  481. package/dist/engine/session.js +95 -0
  482. package/dist/engine/session.js.map +1 -0
  483. package/dist/engine/uri-resolver.d.ts +14 -0
  484. package/dist/engine/uri-resolver.d.ts.map +1 -0
  485. package/dist/engine/uri-resolver.js +12 -0
  486. package/dist/engine/uri-resolver.js.map +1 -0
  487. package/dist/frontmatter.d.ts +15 -0
  488. package/dist/frontmatter.d.ts.map +1 -0
  489. package/dist/frontmatter.js +46 -0
  490. package/dist/frontmatter.js.map +1 -0
  491. package/dist/gateway/hosted-stub.d.ts +6 -0
  492. package/dist/gateway/hosted-stub.d.ts.map +1 -0
  493. package/dist/gateway/hosted-stub.js +11 -0
  494. package/dist/gateway/hosted-stub.js.map +1 -0
  495. package/dist/gateway/index.d.ts +4 -0
  496. package/dist/gateway/index.d.ts.map +1 -0
  497. package/dist/gateway/index.js +4 -0
  498. package/dist/gateway/index.js.map +1 -0
  499. package/dist/gateway/local.d.ts +14 -0
  500. package/dist/gateway/local.d.ts.map +1 -0
  501. package/dist/gateway/local.js +41 -0
  502. package/dist/gateway/local.js.map +1 -0
  503. package/dist/gateway/types.d.ts +24 -0
  504. package/dist/gateway/types.d.ts.map +1 -0
  505. package/dist/gateway/types.js +7 -0
  506. package/dist/gateway/types.js.map +1 -0
  507. package/dist/http/server.d.ts +80 -0
  508. package/dist/http/server.d.ts.map +1 -0
  509. package/dist/http/server.js +183 -0
  510. package/dist/http/server.js.map +1 -0
  511. package/dist/http/session-manager.d.ts +42 -0
  512. package/dist/http/session-manager.d.ts.map +1 -0
  513. package/dist/http/session-manager.js +82 -0
  514. package/dist/http/session-manager.js.map +1 -0
  515. package/dist/http/workspace-auth.d.ts +9 -0
  516. package/dist/http/workspace-auth.d.ts.map +1 -0
  517. package/dist/http/workspace-auth.js +29 -0
  518. package/dist/http/workspace-auth.js.map +1 -0
  519. package/dist/index.d.ts +10 -0
  520. package/dist/index.d.ts.map +1 -0
  521. package/dist/index.js +10 -0
  522. package/dist/index.js.map +1 -0
  523. package/dist/metrics/mount.d.ts +11 -0
  524. package/dist/metrics/mount.d.ts.map +1 -0
  525. package/dist/metrics/mount.js +13 -0
  526. package/dist/metrics/mount.js.map +1 -0
  527. package/dist/metrics/recorder.d.ts +55 -0
  528. package/dist/metrics/recorder.d.ts.map +1 -0
  529. package/dist/metrics/recorder.js +97 -0
  530. package/dist/metrics/recorder.js.map +1 -0
  531. package/dist/revisions/hash.d.ts +7 -0
  532. package/dist/revisions/hash.d.ts.map +1 -0
  533. package/dist/revisions/hash.js +24 -0
  534. package/dist/revisions/hash.js.map +1 -0
  535. package/dist/revisions/index.d.ts +4 -0
  536. package/dist/revisions/index.d.ts.map +1 -0
  537. package/dist/revisions/index.js +4 -0
  538. package/dist/revisions/index.js.map +1 -0
  539. package/dist/revisions/store.d.ts +69 -0
  540. package/dist/revisions/store.d.ts.map +1 -0
  541. package/dist/revisions/store.js +196 -0
  542. package/dist/revisions/store.js.map +1 -0
  543. package/dist/revisions/types.d.ts +39 -0
  544. package/dist/revisions/types.d.ts.map +1 -0
  545. package/dist/revisions/types.js +2 -0
  546. package/dist/revisions/types.js.map +1 -0
  547. package/dist/server.d.ts +51 -0
  548. package/dist/server.d.ts.map +1 -0
  549. package/dist/server.js +175 -0
  550. package/dist/server.js.map +1 -0
  551. package/dist/skill-tools.d.ts +3 -0
  552. package/dist/skill-tools.d.ts.map +1 -0
  553. package/dist/skill-tools.js +105 -0
  554. package/dist/skill-tools.js.map +1 -0
  555. package/dist/test/test/cli/dispatcher.test.d.ts +2 -0
  556. package/dist/test/test/cli/dispatcher.test.d.ts.map +1 -0
  557. package/dist/test/test/cli/dispatcher.test.js +47 -0
  558. package/dist/test/test/cli/dispatcher.test.js.map +1 -0
  559. package/dist/test/test/cross-ref.test.d.ts +2 -0
  560. package/dist/test/test/cross-ref.test.d.ts.map +1 -0
  561. package/dist/test/test/cross-ref.test.js +39 -0
  562. package/dist/test/test/cross-ref.test.js.map +1 -0
  563. package/dist/test/test/engine/session.test.d.ts +2 -0
  564. package/dist/test/test/engine/session.test.d.ts.map +1 -0
  565. package/dist/test/test/engine/session.test.js +144 -0
  566. package/dist/test/test/engine/session.test.js.map +1 -0
  567. package/dist/test/test/engine/uri-resolver.test.d.ts +2 -0
  568. package/dist/test/test/engine/uri-resolver.test.d.ts.map +1 -0
  569. package/dist/test/test/engine/uri-resolver.test.js +38 -0
  570. package/dist/test/test/engine/uri-resolver.test.js.map +1 -0
  571. package/dist/test/test/frontmatter.test.d.ts +2 -0
  572. package/dist/test/test/frontmatter.test.d.ts.map +1 -0
  573. package/dist/test/test/frontmatter.test.js +55 -0
  574. package/dist/test/test/frontmatter.test.js.map +1 -0
  575. package/dist/test/test/gateway/hosted-stub.test.d.ts +2 -0
  576. package/dist/test/test/gateway/hosted-stub.test.d.ts.map +1 -0
  577. package/dist/test/test/gateway/hosted-stub.test.js +11 -0
  578. package/dist/test/test/gateway/hosted-stub.test.js.map +1 -0
  579. package/dist/test/test/gateway/local.test.d.ts +2 -0
  580. package/dist/test/test/gateway/local.test.d.ts.map +1 -0
  581. package/dist/test/test/gateway/local.test.js +29 -0
  582. package/dist/test/test/gateway/local.test.js.map +1 -0
  583. package/dist/test/test/handbook-contract.test.d.ts +2 -0
  584. package/dist/test/test/handbook-contract.test.d.ts.map +1 -0
  585. package/dist/test/test/handbook-contract.test.js +71 -0
  586. package/dist/test/test/handbook-contract.test.js.map +1 -0
  587. package/dist/test/test/http/server.test.d.ts +2 -0
  588. package/dist/test/test/http/server.test.d.ts.map +1 -0
  589. package/dist/test/test/http/server.test.js +245 -0
  590. package/dist/test/test/http/server.test.js.map +1 -0
  591. package/dist/test/test/http/session-manager.test.d.ts +2 -0
  592. package/dist/test/test/http/session-manager.test.d.ts.map +1 -0
  593. package/dist/test/test/http/session-manager.test.js +83 -0
  594. package/dist/test/test/http/session-manager.test.js.map +1 -0
  595. package/dist/test/test/revisions/hash.test.d.ts +2 -0
  596. package/dist/test/test/revisions/hash.test.d.ts.map +1 -0
  597. package/dist/test/test/revisions/hash.test.js +33 -0
  598. package/dist/test/test/revisions/hash.test.js.map +1 -0
  599. package/dist/test/test/revisions/store.test.d.ts +2 -0
  600. package/dist/test/test/revisions/store.test.d.ts.map +1 -0
  601. package/dist/test/test/revisions/store.test.js +245 -0
  602. package/dist/test/test/revisions/store.test.js.map +1 -0
  603. package/dist/test/test/server.test.d.ts +2 -0
  604. package/dist/test/test/server.test.d.ts.map +1 -0
  605. package/dist/test/test/server.test.js +157 -0
  606. package/dist/test/test/server.test.js.map +1 -0
  607. package/dist/test/test/skill-tools.test.d.ts +2 -0
  608. package/dist/test/test/skill-tools.test.d.ts.map +1 -0
  609. package/dist/test/test/skill-tools.test.js +84 -0
  610. package/dist/test/test/skill-tools.test.js.map +1 -0
  611. package/dist/test/test/smoke.test.d.ts +2 -0
  612. package/dist/test/test/smoke.test.d.ts.map +1 -0
  613. package/dist/test/test/smoke.test.js +8 -0
  614. package/dist/test/test/smoke.test.js.map +1 -0
  615. package/dist/test/test/tools/asset-generate.test.d.ts +2 -0
  616. package/dist/test/test/tools/asset-generate.test.d.ts.map +1 -0
  617. package/dist/test/test/tools/asset-generate.test.js +66 -0
  618. package/dist/test/test/tools/asset-generate.test.js.map +1 -0
  619. package/dist/test/test/tools/edit.test.d.ts +2 -0
  620. package/dist/test/test/tools/edit.test.d.ts.map +1 -0
  621. package/dist/test/test/tools/edit.test.js +205 -0
  622. package/dist/test/test/tools/edit.test.js.map +1 -0
  623. package/dist/test/test/tools/export.test.d.ts +2 -0
  624. package/dist/test/test/tools/export.test.d.ts.map +1 -0
  625. package/dist/test/test/tools/export.test.js +144 -0
  626. package/dist/test/test/tools/export.test.js.map +1 -0
  627. package/dist/test/test/tools/history.test.d.ts +2 -0
  628. package/dist/test/test/tools/history.test.d.ts.map +1 -0
  629. package/dist/test/test/tools/history.test.js +29 -0
  630. package/dist/test/test/tools/history.test.js.map +1 -0
  631. package/dist/test/test/tools/inspect.test.d.ts +2 -0
  632. package/dist/test/test/tools/inspect.test.d.ts.map +1 -0
  633. package/dist/test/test/tools/inspect.test.js +62 -0
  634. package/dist/test/test/tools/inspect.test.js.map +1 -0
  635. package/dist/test/test/tools/list.test.d.ts +2 -0
  636. package/dist/test/test/tools/list.test.d.ts.map +1 -0
  637. package/dist/test/test/tools/list.test.js +23 -0
  638. package/dist/test/test/tools/list.test.js.map +1 -0
  639. package/dist/test/test/tools/open-editor.test.d.ts +2 -0
  640. package/dist/test/test/tools/open-editor.test.d.ts.map +1 -0
  641. package/dist/test/test/tools/open-editor.test.js +53 -0
  642. package/dist/test/test/tools/open-editor.test.js.map +1 -0
  643. package/dist/test/test/tools/preview.test.d.ts +2 -0
  644. package/dist/test/test/tools/preview.test.d.ts.map +1 -0
  645. package/dist/test/test/tools/preview.test.js +73 -0
  646. package/dist/test/test/tools/preview.test.js.map +1 -0
  647. package/dist/test/test/tools/rename.test.d.ts +2 -0
  648. package/dist/test/test/tools/rename.test.d.ts.map +1 -0
  649. package/dist/test/test/tools/rename.test.js +17 -0
  650. package/dist/test/test/tools/rename.test.js.map +1 -0
  651. package/dist/test/test/viewer/broadcaster.test.d.ts +2 -0
  652. package/dist/test/test/viewer/broadcaster.test.d.ts.map +1 -0
  653. package/dist/test/test/viewer/broadcaster.test.js +53 -0
  654. package/dist/test/test/viewer/broadcaster.test.js.map +1 -0
  655. package/dist/test/test/viewer/resource-route.test.d.ts +2 -0
  656. package/dist/test/test/viewer/resource-route.test.d.ts.map +1 -0
  657. package/dist/test/test/viewer/resource-route.test.js +70 -0
  658. package/dist/test/test/viewer/resource-route.test.js.map +1 -0
  659. package/dist/test/test/viewer/router.test.d.ts +2 -0
  660. package/dist/test/test/viewer/router.test.d.ts.map +1 -0
  661. package/dist/test/test/viewer/router.test.js +171 -0
  662. package/dist/test/test/viewer/router.test.js.map +1 -0
  663. package/dist/test/test/viewer/url-builder.test.d.ts +2 -0
  664. package/dist/test/test/viewer/url-builder.test.d.ts.map +1 -0
  665. package/dist/test/test/viewer/url-builder.test.js +31 -0
  666. package/dist/test/test/viewer/url-builder.test.js.map +1 -0
  667. package/dist/test/test/workspace/hosted-stub.test.d.ts +2 -0
  668. package/dist/test/test/workspace/hosted-stub.test.d.ts.map +1 -0
  669. package/dist/test/test/workspace/hosted-stub.test.js +30 -0
  670. package/dist/test/test/workspace/hosted-stub.test.js.map +1 -0
  671. package/dist/test/test/workspace/in-memory.test.d.ts +2 -0
  672. package/dist/test/test/workspace/in-memory.test.d.ts.map +1 -0
  673. package/dist/test/test/workspace/in-memory.test.js +4 -0
  674. package/dist/test/test/workspace/in-memory.test.js.map +1 -0
  675. package/dist/test/test/workspace/node-fs.test.d.ts +2 -0
  676. package/dist/test/test/workspace/node-fs.test.d.ts.map +1 -0
  677. package/dist/test/test/workspace/node-fs.test.js +20 -0
  678. package/dist/test/test/workspace/node-fs.test.js.map +1 -0
  679. package/dist/test/test/workspace/shared-contract.d.ts +3 -0
  680. package/dist/test/test/workspace/shared-contract.d.ts.map +1 -0
  681. package/dist/test/test/workspace/shared-contract.js +92 -0
  682. package/dist/test/test/workspace/shared-contract.js.map +1 -0
  683. package/dist/test/tsconfig.test.tsbuildinfo +1 -0
  684. package/dist/test/vitest.config.d.ts +3 -0
  685. package/dist/test/vitest.config.d.ts.map +1 -0
  686. package/dist/test/vitest.config.js +8 -0
  687. package/dist/test/vitest.config.js.map +1 -0
  688. package/dist/tools/asset-generate.d.ts +12 -0
  689. package/dist/tools/asset-generate.d.ts.map +1 -0
  690. package/dist/tools/asset-generate.js +112 -0
  691. package/dist/tools/asset-generate.js.map +1 -0
  692. package/dist/tools/asset-search.d.ts +10 -0
  693. package/dist/tools/asset-search.d.ts.map +1 -0
  694. package/dist/tools/asset-search.js +120 -0
  695. package/dist/tools/asset-search.js.map +1 -0
  696. package/dist/tools/content-types.d.ts +11 -0
  697. package/dist/tools/content-types.d.ts.map +1 -0
  698. package/dist/tools/content-types.js +2 -0
  699. package/dist/tools/content-types.js.map +1 -0
  700. package/dist/tools/edit.d.ts +29 -0
  701. package/dist/tools/edit.d.ts.map +1 -0
  702. package/dist/tools/edit.js +165 -0
  703. package/dist/tools/edit.js.map +1 -0
  704. package/dist/tools/engine.d.ts +31 -0
  705. package/dist/tools/engine.d.ts.map +1 -0
  706. package/dist/tools/engine.js +59 -0
  707. package/dist/tools/engine.js.map +1 -0
  708. package/dist/tools/export.d.ts +19 -0
  709. package/dist/tools/export.d.ts.map +1 -0
  710. package/dist/tools/export.js +179 -0
  711. package/dist/tools/export.js.map +1 -0
  712. package/dist/tools/history.d.ts +7 -0
  713. package/dist/tools/history.d.ts.map +1 -0
  714. package/dist/tools/history.js +54 -0
  715. package/dist/tools/history.js.map +1 -0
  716. package/dist/tools/index.d.ts +35 -0
  717. package/dist/tools/index.d.ts.map +1 -0
  718. package/dist/tools/index.js +72 -0
  719. package/dist/tools/index.js.map +1 -0
  720. package/dist/tools/inspect.d.ts +7 -0
  721. package/dist/tools/inspect.d.ts.map +1 -0
  722. package/dist/tools/inspect.js +80 -0
  723. package/dist/tools/inspect.js.map +1 -0
  724. package/dist/tools/list.d.ts +7 -0
  725. package/dist/tools/list.d.ts.map +1 -0
  726. package/dist/tools/list.js +18 -0
  727. package/dist/tools/list.js.map +1 -0
  728. package/dist/tools/metrics.d.ts +11 -0
  729. package/dist/tools/metrics.d.ts.map +1 -0
  730. package/dist/tools/metrics.js +28 -0
  731. package/dist/tools/metrics.js.map +1 -0
  732. package/dist/tools/open-editor.d.ts +10 -0
  733. package/dist/tools/open-editor.d.ts.map +1 -0
  734. package/dist/tools/open-editor.js +62 -0
  735. package/dist/tools/open-editor.js.map +1 -0
  736. package/dist/tools/preview.d.ts +12 -0
  737. package/dist/tools/preview.d.ts.map +1 -0
  738. package/dist/tools/preview.js +104 -0
  739. package/dist/tools/preview.js.map +1 -0
  740. package/dist/tools/rename.d.ts +7 -0
  741. package/dist/tools/rename.d.ts.map +1 -0
  742. package/dist/tools/rename.js +39 -0
  743. package/dist/tools/rename.js.map +1 -0
  744. package/dist/tools/result.d.ts +12 -0
  745. package/dist/tools/result.d.ts.map +1 -0
  746. package/dist/tools/result.js +55 -0
  747. package/dist/tools/result.js.map +1 -0
  748. package/dist/tools/save.d.ts +19 -0
  749. package/dist/tools/save.d.ts.map +1 -0
  750. package/dist/tools/save.js +117 -0
  751. package/dist/tools/save.js.map +1 -0
  752. package/dist/viewer/broadcaster.d.ts +13 -0
  753. package/dist/viewer/broadcaster.d.ts.map +1 -0
  754. package/dist/viewer/broadcaster.js +44 -0
  755. package/dist/viewer/broadcaster.js.map +1 -0
  756. package/dist/viewer/index.d.ts +7 -0
  757. package/dist/viewer/index.d.ts.map +1 -0
  758. package/dist/viewer/index.js +7 -0
  759. package/dist/viewer/index.js.map +1 -0
  760. package/dist/viewer/listener.d.ts +16 -0
  761. package/dist/viewer/listener.d.ts.map +1 -0
  762. package/dist/viewer/listener.js +30 -0
  763. package/dist/viewer/listener.js.map +1 -0
  764. package/dist/viewer/presigned-r2-url-builder.d.ts +30 -0
  765. package/dist/viewer/presigned-r2-url-builder.d.ts.map +1 -0
  766. package/dist/viewer/presigned-r2-url-builder.js +40 -0
  767. package/dist/viewer/presigned-r2-url-builder.js.map +1 -0
  768. package/dist/viewer/resource-route.d.ts +9 -0
  769. package/dist/viewer/resource-route.d.ts.map +1 -0
  770. package/dist/viewer/resource-route.js +59 -0
  771. package/dist/viewer/resource-route.js.map +1 -0
  772. package/dist/viewer/router.d.ts +20 -0
  773. package/dist/viewer/router.d.ts.map +1 -0
  774. package/dist/viewer/router.js +142 -0
  775. package/dist/viewer/router.js.map +1 -0
  776. package/dist/viewer/session-mount.d.ts +10 -0
  777. package/dist/viewer/session-mount.d.ts.map +1 -0
  778. package/dist/viewer/session-mount.js +24 -0
  779. package/dist/viewer/session-mount.js.map +1 -0
  780. package/dist/viewer/spa-assets.generated.d.ts +2 -0
  781. package/dist/viewer/spa-assets.generated.d.ts.map +1 -0
  782. package/dist/viewer/spa-assets.generated.js +989 -0
  783. package/dist/viewer/spa-assets.generated.js.map +1 -0
  784. package/dist/viewer/url-builder.d.ts +48 -0
  785. package/dist/viewer/url-builder.d.ts.map +1 -0
  786. package/dist/viewer/url-builder.js +38 -0
  787. package/dist/viewer/url-builder.js.map +1 -0
  788. package/dist/workspace/hosted-stub.d.ts +28 -0
  789. package/dist/workspace/hosted-stub.d.ts.map +1 -0
  790. package/dist/workspace/hosted-stub.js +44 -0
  791. package/dist/workspace/hosted-stub.js.map +1 -0
  792. package/dist/workspace/in-memory.d.ts +23 -0
  793. package/dist/workspace/in-memory.d.ts.map +1 -0
  794. package/dist/workspace/in-memory.js +161 -0
  795. package/dist/workspace/in-memory.js.map +1 -0
  796. package/dist/workspace/index.d.ts +6 -0
  797. package/dist/workspace/index.d.ts.map +1 -0
  798. package/dist/workspace/index.js +6 -0
  799. package/dist/workspace/index.js.map +1 -0
  800. package/dist/workspace/node-fs.d.ts +23 -0
  801. package/dist/workspace/node-fs.d.ts.map +1 -0
  802. package/dist/workspace/node-fs.js +90 -0
  803. package/dist/workspace/node-fs.js.map +1 -0
  804. package/dist/workspace/s3.d.ts +32 -0
  805. package/dist/workspace/s3.d.ts.map +1 -0
  806. package/dist/workspace/s3.js +191 -0
  807. package/dist/workspace/s3.js.map +1 -0
  808. package/dist/workspace/scoped.d.ts +32 -0
  809. package/dist/workspace/scoped.d.ts.map +1 -0
  810. package/dist/workspace/scoped.js +76 -0
  811. package/dist/workspace/scoped.js.map +1 -0
  812. package/dist/workspace/types.d.ts +75 -0
  813. package/dist/workspace/types.d.ts.map +1 -0
  814. package/dist/workspace/types.js +18 -0
  815. package/dist/workspace/types.js.map +1 -0
  816. package/package.json +80 -0
@@ -0,0 +1,796 @@
1
+ > This is one page of the CE.SDK Vanilla JS/TS documentation. For a complete overview, see the [Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md). For all docs in one file, see [llms-full.txt](./llms-full.txt.md).
2
+
3
+ **Navigation:** [Guides](./guides.md) > [Create and Edit Text](./text.md) > [Understanding Text Rendering](./guides/text/rendering-internals.md)
4
+
5
+ ---
6
+
7
+ Understand how CE.SDK positions and renders text by exploring font metrics—ascenders, descenders, baselines, and line height—and see these concepts visualized directly on the canvas.
8
+
9
+ ![Text rendering visualization showing font metrics overlays](https://img.ly/docs/cesdk/./assets/browser.hero.webp)
10
+
11
+ > **Reading time:** 10 minutes
12
+ >
13
+ > **Resources:**
14
+ >
15
+ > - [Download examples](https://github.com/imgly/cesdk-web-examples/archive/refs/heads/main.zip)
16
+ > - [View source on GitHub](https://github.com/imgly/cesdk-web-examples/tree/main/guides-text-rendering-internals-browser)
17
+ > - [Open in StackBlitz](https://stackblitz.com/~/github.com/imgly/cesdk-web-examples/tree/main/guides-text-rendering-internals-browser)
18
+ > - [Live demo](https://img.ly/docs/cesdk/examples/guides-text-rendering-internals-browser/)
19
+
20
+ Every font defines metrics that determine how text is positioned vertically. Understanding these metrics helps you debug text layout issues, align text precisely with other design elements, and comprehend why fonts at the "same size" can appear different heights.
21
+
22
+ ```typescript file=@cesdk_web_examples/guides-text-rendering-internals-browser/browser.ts reference-only
23
+ import type {
24
+ CreativeEngine,
25
+ DesignUnit,
26
+ EditorPlugin,
27
+ EditorPluginContext,
28
+ FontMetrics,
29
+ RGBAColor,
30
+ Typeface
31
+ } from '@cesdk/cesdk-js';
32
+ import {
33
+ BlurAssetSource,
34
+ ColorPaletteAssetSource,
35
+ CropPresetsAssetSource,
36
+ DemoAssetSources,
37
+ EffectsAssetSource,
38
+ FiltersAssetSource,
39
+ PagePresetsAssetSource,
40
+ StickerAssetSource,
41
+ TextAssetSource,
42
+ TextComponentAssetSource,
43
+ TypefaceAssetSource,
44
+ UploadAssetSources,
45
+ VectorShapeAssetSource
46
+ } from '@cesdk/cesdk-js/plugins';
47
+ import { DesignEditorConfig } from './design-editor/plugin';
48
+ import packageJson from './package.json';
49
+
50
+ // Color constants for visualization overlays
51
+ const COLORS: Record<string, RGBAColor> = {
52
+ ascender: { r: 1.0, g: 0.42, b: 0.42, a: 0.3 }, // Light red
53
+ descender: { r: 0.31, g: 0.8, b: 0.77, a: 0.3 }, // Light cyan
54
+ baseline: { r: 1.0, g: 0.84, b: 0.0, a: 0.8 }, // Gold
55
+ lineGap: { r: 0.59, g: 0.81, b: 0.71, a: 0.4 }, // Light green
56
+ paragraphSpacing: { r: 1.0, g: 0.6, b: 0.2, a: 0.5 }, // Orange
57
+ frame: { r: 0.87, g: 0.63, b: 0.87, a: 0.15 } // Light purple
58
+ };
59
+
60
+ /** Calculated metrics for a single line of text, in the scene's design unit. */
61
+ interface LineMetrics {
62
+ ascenderHeight: number; // Design units above baseline
63
+ descenderHeight: number; // Design units below baseline
64
+ lineHeight: number; // Total line height (ascender + descender)
65
+ baselineOffset: number; // Distance from line top to baseline (= ascenderHeight)
66
+ }
67
+
68
+ /** Multiline layout metrics derived from LineMetrics. */
69
+ interface MultilineMetrics {
70
+ lineSpacing: number; // Distance between line tops
71
+ lineGap: number; // Extra space between lines (when multiplier > 1)
72
+ totalHeight: number; // Total height for all lines
73
+ }
74
+
75
+ /**
76
+ * Unit Conversion Constants
77
+ *
78
+ * Font sizes are specified in typographic points (pt).
79
+ * CE.SDK supports three design unit types, each with different relationships to points:
80
+ *
81
+ * - Millimeter: 1 inch = 25.4 mm, so 1 pt = 25.4/72 mm ≈ 0.3528 mm
82
+ * - Inch: 1 inch = 72 pt, so 1 pt = 1/72 inch ≈ 0.0139 inch
83
+ * - Pixel: At 72 DPI (CE.SDK default), 1 pt = 1 px
84
+ *
85
+ * The conversion factor transforms point-based font measurements to design units.
86
+ */
87
+ const POINTS_PER_INCH = 72;
88
+ const MM_PER_INCH = 25.4;
89
+ const CESDK_DEFAULT_DPI = 72; // CE.SDK uses 72 DPI for pixel mode
90
+
91
+ /** Convert typographic points to the specified design unit. */
92
+ export function getDesignUnitsPerPoint(designUnit: DesignUnit): number {
93
+ switch (designUnit) {
94
+ case 'Millimeter':
95
+ // 1 point = 25.4/72 mm ≈ 0.3528 mm
96
+ return MM_PER_INCH / POINTS_PER_INCH;
97
+ case 'Inch':
98
+ // 1 point = 1/72 inch ≈ 0.0139 inch
99
+ return 1 / POINTS_PER_INCH;
100
+ case 'Pixel':
101
+ // At 72 DPI: 1 point = 1 pixel
102
+ return CESDK_DEFAULT_DPI / POINTS_PER_INCH;
103
+ default:
104
+ throw new Error(`Unknown design unit: ${designUnit}`);
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Calculate single-line metrics from font metrics and font size.
110
+ * lineHeight = fontSize × (ascender + |descender|) / unitsPerEm × designUnitsPerPoint
111
+ */
112
+ export function calculateLineMetrics(
113
+ fontMetrics: FontMetrics,
114
+ fontSize: number,
115
+ designUnit: DesignUnit = 'Millimeter'
116
+ ): LineMetrics {
117
+ const designUnitsPerPoint = getDesignUnitsPerPoint(designUnit);
118
+
119
+ const totalTypographicUnits =
120
+ fontMetrics.ascender + Math.abs(fontMetrics.descender);
121
+ const ascenderRatio = fontMetrics.ascender / totalTypographicUnits;
122
+ const descenderRatio =
123
+ Math.abs(fontMetrics.descender) / totalTypographicUnits;
124
+
125
+ const lineHeightInPoints =
126
+ (fontSize * totalTypographicUnits) / fontMetrics.unitsPerEm;
127
+ const lineHeight = lineHeightInPoints * designUnitsPerPoint;
128
+
129
+ const ascenderHeight = lineHeight * ascenderRatio;
130
+ const descenderHeight = lineHeight * descenderRatio;
131
+ const baselineOffset = ascenderHeight;
132
+
133
+ return {
134
+ ascenderHeight,
135
+ descenderHeight,
136
+ lineHeight,
137
+ baselineOffset
138
+ };
139
+ }
140
+
141
+ /**
142
+ * Calculate multiline layout metrics from single-line metrics.
143
+ * lineSpacing = lineHeight × multiplier; lineGap = lineSpacing - lineHeight
144
+ */
145
+ export function calculateMultilineMetrics(
146
+ lineMetrics: LineMetrics,
147
+ lineCount: number,
148
+ lineHeightMultiplier: number
149
+ ): MultilineMetrics {
150
+ const lineSpacing = lineMetrics.lineHeight * lineHeightMultiplier;
151
+ const lineGap = lineSpacing - lineMetrics.lineHeight;
152
+ const totalHeight = lineMetrics.lineHeight + (lineCount - 1) * lineSpacing;
153
+
154
+ return {
155
+ lineSpacing,
156
+ lineGap,
157
+ totalHeight
158
+ };
159
+ }
160
+
161
+ interface LineVisualization {
162
+ ascenderRect: number;
163
+ descenderRect: number;
164
+ baselineRect: number;
165
+ lineGapRect: number;
166
+ paragraphSpacingRect: number;
167
+ }
168
+
169
+ interface VisualizationSet {
170
+ textBlock: number;
171
+ lineVisualizations: LineVisualization[];
172
+ frameRect: number;
173
+ fontUri: string;
174
+ }
175
+
176
+ class Example implements EditorPlugin {
177
+ name = packageJson.name;
178
+
179
+ version = packageJson.version;
180
+
181
+ private visualizationBlocks: Map<number, VisualizationSet> = new Map();
182
+
183
+ async initialize({ cesdk }: EditorPluginContext): Promise<void> {
184
+ if (!cesdk) {
185
+ throw new Error('CE.SDK instance is required for this plugin');
186
+ }
187
+
188
+ await cesdk.addPlugin(new DesignEditorConfig());
189
+
190
+ await cesdk.addPlugin(new BlurAssetSource());
191
+ await cesdk.addPlugin(new ColorPaletteAssetSource());
192
+ await cesdk.addPlugin(new CropPresetsAssetSource());
193
+ await cesdk.addPlugin(
194
+ new UploadAssetSources({ include: ['ly.img.image.upload'] })
195
+ );
196
+ await cesdk.addPlugin(
197
+ new DemoAssetSources({
198
+ include: [
199
+ 'ly.img.templates.blank.*',
200
+ 'ly.img.templates.presentation.*',
201
+ 'ly.img.templates.print.*',
202
+ 'ly.img.templates.social.*',
203
+ 'ly.img.image.*'
204
+ ]
205
+ })
206
+ );
207
+ await cesdk.addPlugin(new EffectsAssetSource());
208
+ await cesdk.addPlugin(new FiltersAssetSource());
209
+ await cesdk.addPlugin(new PagePresetsAssetSource());
210
+ await cesdk.addPlugin(new StickerAssetSource());
211
+ await cesdk.addPlugin(new TextAssetSource());
212
+ await cesdk.addPlugin(new TextComponentAssetSource());
213
+ await cesdk.addPlugin(new TypefaceAssetSource());
214
+ await cesdk.addPlugin(new VectorShapeAssetSource());
215
+
216
+ await cesdk.actions.run('scene.create', {
217
+ page: { width: 1000, height: 1000, unit: 'Pixel' }
218
+ });
219
+
220
+ const engine = cesdk.engine;
221
+ const page = engine.block.findByType('page')[0];
222
+
223
+ const fontNames = [
224
+ 'Roboto',
225
+ 'Playfair Display',
226
+ 'Abril Fatface',
227
+ 'Caveat',
228
+ 'Lato'
229
+ ];
230
+
231
+ let yOffset = 30;
232
+ for (const fontName of fontNames) {
233
+ const result = await engine.asset.findAssets('ly.img.typeface', {
234
+ query: fontName,
235
+ page: 0,
236
+ perPage: 1
237
+ });
238
+
239
+ if (result.assets.length === 0) {
240
+ console.warn(`Font "${fontName}" not found in asset library`);
241
+ continue;
242
+ }
243
+
244
+ const typefaceAsset = result.assets[0];
245
+ const typeface = typefaceAsset.payload?.typeface;
246
+ if (typeface && typeface.fonts?.[0]?.uri) {
247
+ const fontUri = typeface.fonts[0].uri;
248
+
249
+ const vizSet = await this.createVisualizationSet(
250
+ engine,
251
+ page,
252
+ fontName,
253
+ fontUri,
254
+ typeface,
255
+ yOffset
256
+ );
257
+ this.visualizationBlocks.set(vizSet.textBlock, vizSet);
258
+
259
+ yOffset += 180;
260
+ }
261
+ }
262
+
263
+ engine.event.subscribe([], async (events) => {
264
+ for (const event of events) {
265
+ if (this.visualizationBlocks.has(event.block)) {
266
+ await this.updateVisualization(engine, event.block);
267
+ }
268
+ }
269
+ });
270
+
271
+ const scene = engine.scene.get();
272
+ if (scene) {
273
+ engine.event.subscribe([scene], async () => {
274
+ for (const vizSet of this.visualizationBlocks.values()) {
275
+ await this.updateVisualization(engine, vizSet.textBlock);
276
+ }
277
+ });
278
+ }
279
+
280
+ for (const vizSet of this.visualizationBlocks.values()) {
281
+ await this.updateVisualization(engine, vizSet.textBlock);
282
+ }
283
+
284
+ await this.createLegend(engine, page);
285
+
286
+ await engine.scene.zoomToBlock(page, { padding: 40 });
287
+
288
+ const firstVizSet = this.visualizationBlocks.values().next().value;
289
+ if (firstVizSet) {
290
+ engine.block.setSelected(firstVizSet.textBlock, true);
291
+ }
292
+ }
293
+
294
+ private async createVisualizationSet(
295
+ engine: CreativeEngine,
296
+ page: number,
297
+ fontName: string,
298
+ fontUri: string,
299
+ typeface: Typeface,
300
+ yPosition: number
301
+ ): Promise<VisualizationSet> {
302
+ const frameRect = this.createColoredRect(engine, page, COLORS.frame);
303
+
304
+ const textBlock = engine.block.create('text');
305
+ engine.block.appendChild(page, textBlock);
306
+ engine.block.replaceText(
307
+ textBlock,
308
+ `${fontName}\u2028Second Line\nNew Paragraph`
309
+ );
310
+ engine.block.setTextFontSize(textBlock, 36);
311
+ engine.block.setFont(textBlock, fontUri, typeface);
312
+ engine.block.setFloat(textBlock, 'text/paragraphSpacing', 0.5);
313
+ engine.block.setHeightMode(textBlock, 'Auto');
314
+ engine.block.setWidthMode(textBlock, 'Auto');
315
+ engine.block.setPositionX(textBlock, 30);
316
+ engine.block.setPositionY(textBlock, yPosition);
317
+
318
+ return {
319
+ textBlock,
320
+ lineVisualizations: [],
321
+ frameRect,
322
+ fontUri
323
+ };
324
+ }
325
+
326
+ private ensureLineVisualizations(
327
+ engine: CreativeEngine,
328
+ page: number,
329
+ vizSet: VisualizationSet,
330
+ requiredLineCount: number
331
+ ): void {
332
+ const previousCount = vizSet.lineVisualizations.length;
333
+
334
+ while (vizSet.lineVisualizations.length < requiredLineCount) {
335
+ vizSet.lineVisualizations.push({
336
+ ascenderRect: this.createColoredRect(engine, page, COLORS.ascender),
337
+ descenderRect: this.createColoredRect(engine, page, COLORS.descender),
338
+ baselineRect: this.createColoredRect(engine, page, COLORS.baseline),
339
+ lineGapRect: this.createColoredRect(engine, page, COLORS.lineGap),
340
+ paragraphSpacingRect: this.createColoredRect(
341
+ engine,
342
+ page,
343
+ COLORS.paragraphSpacing
344
+ )
345
+ });
346
+ }
347
+
348
+ if (vizSet.lineVisualizations.length > previousCount) {
349
+ engine.block.appendChild(page, vizSet.textBlock);
350
+ }
351
+
352
+ for (let i = requiredLineCount; i < vizSet.lineVisualizations.length; i++) {
353
+ this.setLineVizVisibility(engine, vizSet.lineVisualizations[i], false);
354
+ }
355
+ }
356
+
357
+ private async createLegend(
358
+ engine: CreativeEngine,
359
+ page: number
360
+ ): Promise<void> {
361
+ const legendX = 700;
362
+ const legendY = 30;
363
+ const swatchSize = 20;
364
+ const lineHeight = 35;
365
+
366
+ const result = await engine.asset.findAssets('ly.img.typeface', {
367
+ query: 'Roboto',
368
+ page: 0,
369
+ perPage: 1
370
+ });
371
+ const typeface = result.assets[0]?.payload?.typeface;
372
+ const fontUri = typeface?.fonts?.[0]?.uri;
373
+
374
+ const legendItems = [
375
+ { color: COLORS.ascender, label: 'Ascender' },
376
+ { color: COLORS.descender, label: 'Descender' },
377
+ { color: COLORS.baseline, label: 'Baseline' },
378
+ { color: COLORS.lineGap, label: 'Line Gap' },
379
+ { color: COLORS.paragraphSpacing, label: 'Paragraph Gap' },
380
+ { color: COLORS.frame, label: 'Text Frame' }
381
+ ];
382
+
383
+ const titleBlock = engine.block.create('text');
384
+ engine.block.appendChild(page, titleBlock);
385
+ engine.block.replaceText(titleBlock, 'Legend');
386
+ engine.block.setTextFontSize(titleBlock, 24);
387
+ if (fontUri && typeface) {
388
+ engine.block.setFont(titleBlock, fontUri, typeface);
389
+ }
390
+ engine.block.setHeightMode(titleBlock, 'Auto');
391
+ engine.block.setWidthMode(titleBlock, 'Auto');
392
+ engine.block.setPositionX(titleBlock, legendX);
393
+ engine.block.setPositionY(titleBlock, legendY);
394
+
395
+ for (let i = 0; i < legendItems.length; i++) {
396
+ const item = legendItems[i];
397
+ const itemY = legendY + 40 + i * lineHeight;
398
+
399
+ const swatch = this.createColoredRect(engine, page, {
400
+ ...item.color,
401
+ a: item.color.a < 0.5 ? 0.6 : item.color.a // Make swatches more visible
402
+ });
403
+ this.positionRect(engine, swatch, legendX, itemY, swatchSize, swatchSize);
404
+
405
+ const label = engine.block.create('text');
406
+ engine.block.appendChild(page, label);
407
+ engine.block.replaceText(label, item.label);
408
+ engine.block.setTextFontSize(label, 16);
409
+ if (fontUri && typeface) {
410
+ engine.block.setFont(label, fontUri, typeface);
411
+ }
412
+ engine.block.setHeightMode(label, 'Auto');
413
+ engine.block.setWidthMode(label, 'Auto');
414
+ engine.block.setPositionX(label, legendX + swatchSize + 10);
415
+ engine.block.setPositionY(label, itemY + 2);
416
+ }
417
+ }
418
+
419
+ private createColoredRect(
420
+ engine: CreativeEngine,
421
+ page: number,
422
+ color: RGBAColor
423
+ ): number {
424
+ const rect = engine.block.create('graphic');
425
+ engine.block.appendChild(page, rect);
426
+ const shape = engine.block.createShape('rect');
427
+ engine.block.setShape(rect, shape);
428
+ const fill = engine.block.createFill('color');
429
+ engine.block.setFill(rect, fill);
430
+ engine.block.setColor(fill, 'fill/color/value', color);
431
+ return rect;
432
+ }
433
+
434
+ private positionRect(
435
+ engine: CreativeEngine,
436
+ block: number,
437
+ x: number,
438
+ y: number,
439
+ width: number,
440
+ height: number
441
+ ): void {
442
+ engine.block.setPositionX(block, x);
443
+ engine.block.setPositionY(block, y);
444
+ engine.block.setWidth(block, width);
445
+ engine.block.setHeight(block, height);
446
+ }
447
+
448
+ private setLineVizVisibility(
449
+ engine: CreativeEngine,
450
+ lineViz: LineVisualization,
451
+ visible: boolean
452
+ ): void {
453
+ engine.block.setVisible(lineViz.ascenderRect, visible);
454
+ engine.block.setVisible(lineViz.descenderRect, visible);
455
+ engine.block.setVisible(lineViz.baselineRect, visible);
456
+ engine.block.setVisible(lineViz.lineGapRect, visible);
457
+ engine.block.setVisible(lineViz.paragraphSpacingRect, visible);
458
+ }
459
+
460
+ /**
461
+ * Find lines ending with paragraph breaks (\n) vs line separators (\u2028).
462
+ * Queries the engine's visual line content to handle soft wraps correctly.
463
+ */
464
+ private findParagraphBreakLines(
465
+ engine: CreativeEngine,
466
+ textBlock: number,
467
+ lineCount: number
468
+ ): Set<number> {
469
+ const result = new Set<number>();
470
+
471
+ for (let lineIndex = 0; lineIndex < lineCount; lineIndex++) {
472
+ const lineContent = engine.block.getTextVisibleLineContent(
473
+ textBlock,
474
+ lineIndex
475
+ );
476
+ if (lineContent.endsWith('\n')) {
477
+ result.add(lineIndex);
478
+ }
479
+ }
480
+
481
+ return result;
482
+ }
483
+
484
+ private async updateVisualization(
485
+ engine: CreativeEngine,
486
+ textBlock: number
487
+ ): Promise<void> {
488
+ const vizSet = this.visualizationBlocks.get(textBlock);
489
+ if (!vizSet) return;
490
+
491
+ const page = engine.block.getParent(textBlock);
492
+ if (!page) return;
493
+
494
+ const fontUri = engine.block.getString(textBlock, 'text/fontFileUri');
495
+ if (!fontUri) return;
496
+ vizSet.fontUri = fontUri;
497
+
498
+ // Returns FontMetrics in font design units, e.g. for Roboto:
499
+ // { ascender: 1900, descender: -500, unitsPerEm: 2048, lineGap: 0,
500
+ // capHeight: 1456, xHeight: 1082, underlineOffset: -200,
501
+ // underlineSize: 100, strikeoutOffset: 528, strikeoutSize: 102 }
502
+ let metrics: FontMetrics;
503
+ try {
504
+ metrics = await engine.editor.getFontMetrics(fontUri);
505
+ } catch (error) {
506
+ console.error(`Failed to load font metrics for ${fontUri}:`, error);
507
+ return;
508
+ }
509
+
510
+ const frameX = engine.block.getPositionX(textBlock);
511
+ const frameY = engine.block.getPositionY(textBlock);
512
+ const frameWidth = engine.block.getFrameWidth(textBlock);
513
+ const frameHeight = engine.block.getFrameHeight(textBlock);
514
+ const fontSizePt = engine.block.getTextFontSizes(textBlock)[0] ?? 36;
515
+ const lineHeightMultiplier = engine.block.getFloat(
516
+ textBlock,
517
+ 'text/lineHeight'
518
+ );
519
+ const lineCount = engine.block.getTextVisibleLineCount(textBlock);
520
+
521
+ if (lineCount === 0) return;
522
+
523
+ this.ensureLineVisualizations(engine, page, vizSet, lineCount);
524
+
525
+ const designUnit = engine.scene.getDesignUnit();
526
+
527
+ const lineMetrics = calculateLineMetrics(metrics, fontSizePt, designUnit);
528
+ const multilineMetrics = calculateMultilineMetrics(
529
+ lineMetrics,
530
+ lineCount,
531
+ lineHeightMultiplier
532
+ );
533
+
534
+ const { ascenderHeight, descenderHeight, lineHeight } = lineMetrics;
535
+ const { lineSpacing } = multilineMetrics;
536
+
537
+ const paragraphSpacingMultiplier = engine.block.getFloat(
538
+ textBlock,
539
+ 'text/paragraphSpacing'
540
+ );
541
+ const paragraphGap = paragraphSpacingMultiplier * lineHeight;
542
+
543
+ const linesEndingWithParagraphBreak = this.findParagraphBreakLines(
544
+ engine,
545
+ textBlock,
546
+ lineCount
547
+ );
548
+
549
+ const lineX = frameX;
550
+ const lineWidth = frameWidth;
551
+
552
+ const regularLineGap = lineSpacing - lineHeight;
553
+ let cumulativeY = frameY;
554
+
555
+ for (let lineIndex = 0; lineIndex < lineCount; lineIndex++) {
556
+ const lineViz = vizSet.lineVisualizations[lineIndex];
557
+
558
+ const lineTopY = cumulativeY;
559
+ const baselineY = lineTopY + ascenderHeight;
560
+ const ascenderTop = lineTopY;
561
+ const descenderBottom = baselineY + descenderHeight;
562
+
563
+ engine.block.setVisible(lineViz.ascenderRect, true);
564
+ this.positionRect(
565
+ engine,
566
+ lineViz.ascenderRect,
567
+ lineX,
568
+ ascenderTop,
569
+ lineWidth,
570
+ ascenderHeight
571
+ );
572
+
573
+ engine.block.setVisible(lineViz.descenderRect, true);
574
+ this.positionRect(
575
+ engine,
576
+ lineViz.descenderRect,
577
+ lineX,
578
+ baselineY,
579
+ lineWidth,
580
+ descenderHeight
581
+ );
582
+
583
+ const baselineThicknessPx = 2;
584
+ const baselineThickness =
585
+ baselineThicknessPx * getDesignUnitsPerPoint(designUnit);
586
+ engine.block.setVisible(lineViz.baselineRect, true);
587
+ this.positionRect(
588
+ engine,
589
+ lineViz.baselineRect,
590
+ lineX,
591
+ baselineY - baselineThickness / 2,
592
+ lineWidth,
593
+ baselineThickness
594
+ );
595
+
596
+ if (lineIndex < lineCount - 1) {
597
+ const gapTop = descenderBottom;
598
+
599
+ const hasParagraphBreak = linesEndingWithParagraphBreak.has(lineIndex);
600
+ const extraParagraphGap = hasParagraphBreak ? paragraphGap : 0;
601
+
602
+ if (regularLineGap > 0.5) {
603
+ engine.block.setVisible(lineViz.lineGapRect, true);
604
+ this.positionRect(
605
+ engine,
606
+ lineViz.lineGapRect,
607
+ lineX,
608
+ gapTop,
609
+ lineWidth,
610
+ regularLineGap
611
+ );
612
+ } else {
613
+ engine.block.setVisible(lineViz.lineGapRect, false);
614
+ }
615
+
616
+ if (hasParagraphBreak && extraParagraphGap > 0.5) {
617
+ engine.block.setVisible(lineViz.paragraphSpacingRect, true);
618
+ this.positionRect(
619
+ engine,
620
+ lineViz.paragraphSpacingRect,
621
+ lineX,
622
+ gapTop + regularLineGap,
623
+ lineWidth,
624
+ extraParagraphGap
625
+ );
626
+ } else {
627
+ engine.block.setVisible(lineViz.paragraphSpacingRect, false);
628
+ }
629
+
630
+ cumulativeY += lineSpacing + extraParagraphGap;
631
+ } else {
632
+ engine.block.setVisible(lineViz.lineGapRect, false);
633
+ engine.block.setVisible(lineViz.paragraphSpacingRect, false);
634
+ }
635
+ }
636
+
637
+ this.positionRect(
638
+ engine,
639
+ vizSet.frameRect,
640
+ frameX,
641
+ frameY,
642
+ frameWidth,
643
+ frameHeight
644
+ );
645
+ }
646
+ }
647
+
648
+ export default Example;
649
+ ```
650
+
651
+ This guide covers how font metrics determine text positioning, how CE.SDK converts font sizes to design units, and how the line height and paragraph spacing properties affect multiline layout.
652
+
653
+ ## Font Metrics Fundamentals
654
+
655
+ Use `getFontMetrics()` to read a font's metrics in its design units:
656
+
657
+ ```typescript highlight-get-metrics
658
+ // Returns FontMetrics in font design units, e.g. for Roboto:
659
+ // { ascender: 1900, descender: -500, unitsPerEm: 2048, lineGap: 0,
660
+ // capHeight: 1456, xHeight: 1082, underlineOffset: -200,
661
+ // underlineSize: 100, strikeoutOffset: 528, strikeoutSize: 102 }
662
+ let metrics: FontMetrics;
663
+ try {
664
+ metrics = await engine.editor.getFontMetrics(fontUri);
665
+ } catch (error) {
666
+ console.error(`Failed to load font metrics for ${fontUri}:`, error);
667
+ return;
668
+ }
669
+ ```
670
+
671
+ Typography positions text relative to the **baseline**—the invisible line characters sit on. Every font defines these key measurements:
672
+
673
+ - **Ascender**: Distance above the baseline to the top of tall characters (b, d, h, l)
674
+ - **Descender**: Distance below the baseline where characters like g, p, y extend
675
+ - **EM Square**: The design space containing all glyphs, typically 1000 or 2048 units
676
+ - **Line Height**: Total vertical space allocated for a line, calculated from ascender + descender
677
+
678
+ These values are stored in **font units** relative to the EM square. When you set a font size of 36pt, CE.SDK scales these proportionally:
679
+
680
+ ```
681
+ lineHeight = fontSize × (ascender + |descender|) / unitsPerEm × designUnitsPerPoint
682
+ ```
683
+
684
+ ## Design Units and Point Conversion
685
+
686
+ CE.SDK supports three design unit types. Font sizes are always specified in **typographic points** (72 pt = 1 inch), then converted:
687
+
688
+ | Design Unit | Conversion Factor | Example: 36pt Font |
689
+ | ----------- | ------------------------ | --------------------- |
690
+ | Millimeter | 25.4 / 72 ≈ 0.3528 mm/pt | ~12.7 mm line height |
691
+ | Inch | 1 / 72 ≈ 0.0139 in/pt | ~0.5 inch line height |
692
+ | Pixel | 1.0 (at 72 DPI) | 36 px line height |
693
+
694
+ Use `engine.scene.getDesignUnit()` to retrieve the current design unit for correct positioning.
695
+
696
+ ## Line Height and the lineHeight Multiplier
697
+
698
+ The `text/lineHeight` property is a **multiplier** that controls spacing between lines. A value of 1.0 means lines touch (no gap); 2.0 doubles the spacing.
699
+
700
+ Ascender and descender heights are **constant** for a given font and size. The multiplier only affects the gap between lines—not the glyph regions themselves.
701
+
702
+ At `lineHeight = 1.0`:
703
+
704
+ - Line spacing equals the natural line height
705
+ - Lines touch with no gap
706
+
707
+ At `lineHeight = 2.0`:
708
+
709
+ - Line spacing doubles
710
+ - A gap appears between descender of one line and ascender of the next
711
+
712
+ ## Line Breaks vs Paragraph Breaks
713
+
714
+ CE.SDK distinguishes between two types of line breaks, each with different spacing behavior:
715
+
716
+ | Break Type | Key | Character | Triggers Paragraph Spacing |
717
+ | ------------------- | ----------- | ------------- | -------------------------- |
718
+ | **Paragraph Break** | Enter | `\n` (U+000A) | Yes |
719
+ | **Line Separator** | Shift+Enter | U+2028 | No |
720
+
721
+ When users press **Enter**, CE.SDK inserts a paragraph break (`\n`). This triggers paragraph spacing—extra vertical space controlled by the `text/paragraphSpacing` property.
722
+
723
+ When users press **Shift+Enter**, CE.SDK inserts a line separator (U+2028). This creates a new line but does **not** add paragraph spacing, keeping lines closer together within the same logical paragraph.
724
+
725
+ ## Paragraph Spacing
726
+
727
+ The `text/paragraphSpacing` property controls extra space added after paragraph breaks. It's a **multiplier** applied to the line height:
728
+
729
+ ```
730
+ paragraphGap = paragraphSpacing × lineHeight
731
+ ```
732
+
733
+ This gap appears **only** after lines ending with `\n` (paragraph breaks), not after lines ending with U+2028 (line separators).
734
+
735
+ ```typescript highlight-paragraph-spacing
736
+ const paragraphSpacingMultiplier = engine.block.getFloat(
737
+ textBlock,
738
+ 'text/paragraphSpacing'
739
+ );
740
+ const paragraphGap = paragraphSpacingMultiplier * lineHeight;
741
+
742
+ const linesEndingWithParagraphBreak = this.findParagraphBreakLines(
743
+ engine,
744
+ textBlock,
745
+ lineCount
746
+ );
747
+ ```
748
+
749
+ **Use cases**:
750
+
751
+ - Set `paragraphSpacing = 0` to have paragraph breaks behave like line breaks
752
+ - Set `paragraphSpacing = 0.5` for subtle paragraph separation
753
+ - Set `paragraphSpacing = 1.0` for full line spacing between paragraphs
754
+
755
+ ## Why Fonts Look Different at the Same Size
756
+
757
+ Different fonts allocate the EM square differently. A serif font like Playfair Display may have taller ascenders than a sans-serif like Roboto, even at the same point size. Each typeface has unique proportions—this is normal.
758
+
759
+ ## Troubleshooting Text Layout
760
+
761
+ **Text appears cut off**: Check if your text block's frame height is sufficient. Use `getTextVisibleLineCount()` to verify how many lines are rendering.
762
+
763
+ **Fonts look different sizes**: This is expected—fonts have different ascender/descender ratios. Set frames based on measured line heights rather than assumed pixel values.
764
+
765
+ **Text not aligning with other elements**: Different fonts have different baselines. For precise alignment, calculate baseline position using the font's ascender height.
766
+
767
+ **Line gap not appearing**: The gap only shows when `text/lineHeight > 1.0`. At 1.0, lines touch directly.
768
+
769
+ **Paragraph spacing not appearing after Shift+Enter**: Shift+Enter inserts a line separator (U+2028), not a paragraph break (`\n`). Only paragraph breaks trigger `text/paragraphSpacing`. Use Enter for paragraph breaks with extra spacing.
770
+
771
+ **How to insert a line break without paragraph spacing**: Use Shift+Enter to insert a line separator (U+2028). This creates a visual line break but keeps the content within the same paragraph, without triggering paragraph spacing.
772
+
773
+ ## API Reference
774
+
775
+ | Method | Purpose |
776
+ | ------------------------------------------------------- | ----------------------------------------------------------------------- |
777
+ | `engine.editor.getFontMetrics(fontUri)` | Get font metrics (ascender, descender, unitsPerEm) in font design units |
778
+ | `engine.scene.getDesignUnit()` | Get current design unit (Millimeter, Inch, or Pixel) |
779
+ | `engine.block.getTextFontSizes(id)` | Get current font sizes |
780
+ | `engine.block.getFloat(id, 'text/lineHeight')` | Get line height multiplier |
781
+ | `engine.block.getFloat(id, 'text/paragraphSpacing')` | Get paragraph spacing multiplier |
782
+ | `engine.block.getString(id, 'text/fontFileUri')` | Get current font file URI |
783
+ | `engine.block.getTextVisibleLineContent(id, lineIndex)` | Get rendered text content for a specific visual line |
784
+ | `engine.block.getTextVisibleLineCount(id)` | Get number of rendered text lines |
785
+ | `engine.block.getPositionX/Y(id)` | Get block position in design units |
786
+ | `engine.block.getFrameWidth/Height(id)` | Get block frame dimensions |
787
+ | `engine.asset.findAssets('ly.img.typeface', options)` | Query typeface asset source by name |
788
+
789
+ ---
790
+
791
+ ## More Resources
792
+
793
+ - **[Vanilla JS/TS Documentation Index](https://img.ly/docs/cesdk/js.md)** - Browse all Vanilla JS/TS documentation
794
+ - **[Complete Documentation](./llms-full.txt.md)** - Full documentation in one file (for LLMs)
795
+ - **[Web Documentation](./js.md)** - Interactive documentation with examples
796
+ - **[Support](mailto:support@img.ly)** - Contact IMG.LY support