@imgly/codesign-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +16 -0
- package/README.md +158 -0
- package/assets/docs/api/SKILL.md +49 -0
- package/assets/docs/api/index.d.ts +10518 -0
- package/assets/docs/guide/SKILL.md +142 -0
- package/assets/docs/guide/actions.md +1038 -0
- package/assets/docs/guide/animation/create/base.md +467 -0
- package/assets/docs/guide/animation/create/text.md +453 -0
- package/assets/docs/guide/animation/create.md +558 -0
- package/assets/docs/guide/animation/edit.md +501 -0
- package/assets/docs/guide/animation/overview.md +22 -0
- package/assets/docs/guide/animation/types.md +430 -0
- package/assets/docs/guide/animation.md +23 -0
- package/assets/docs/guide/api/AssetAPI.md +602 -0
- package/assets/docs/guide/api/BlockAPI.md +6152 -0
- package/assets/docs/guide/api/CreativeEngine.md +180 -0
- package/assets/docs/guide/api/EditorAPI.md +1261 -0
- package/assets/docs/guide/api/EventAPI.md +25 -0
- package/assets/docs/guide/api/SceneAPI.md +729 -0
- package/assets/docs/guide/api/VariableAPI.md +59 -0
- package/assets/docs/guide/api/types.md +71 -0
- package/assets/docs/guide/api-reference/overview.md +20 -0
- package/assets/docs/guide/automation/auto-resize.md +412 -0
- package/assets/docs/guide/automation/batch-processing.md +474 -0
- package/assets/docs/guide/automation/data-merge.md +406 -0
- package/assets/docs/guide/automation/design-generation.md +107 -0
- package/assets/docs/guide/automation/overview.md +16 -0
- package/assets/docs/guide/automation.md +24 -0
- package/assets/docs/guide/browser-support.md +38 -0
- package/assets/docs/guide/capabilities.md +18 -0
- package/assets/docs/guide/colors/adjust.md +551 -0
- package/assets/docs/guide/colors/apply.md +349 -0
- package/assets/docs/guide/colors/basics.md +440 -0
- package/assets/docs/guide/colors/conversion.md +504 -0
- package/assets/docs/guide/colors/create-color-palette.md +426 -0
- package/assets/docs/guide/colors/for-print/cmyk.md +577 -0
- package/assets/docs/guide/colors/for-print/spot.md +751 -0
- package/assets/docs/guide/colors/for-print.md +21 -0
- package/assets/docs/guide/colors/for-screen/p3.md +60 -0
- package/assets/docs/guide/colors/for-screen/srgb.md +463 -0
- package/assets/docs/guide/colors/for-screen.md +21 -0
- package/assets/docs/guide/colors/overview.md +20 -0
- package/assets/docs/guide/colors/replace.md +535 -0
- package/assets/docs/guide/colors.md +28 -0
- package/assets/docs/guide/compatibility.md +27 -0
- package/assets/docs/guide/concepts/architecture.md +99 -0
- package/assets/docs/guide/concepts/assets.md +360 -0
- package/assets/docs/guide/concepts/blocks.md +750 -0
- package/assets/docs/guide/concepts/buffers.md +546 -0
- package/assets/docs/guide/concepts/design-units.md +333 -0
- package/assets/docs/guide/concepts/edit-modes.md +431 -0
- package/assets/docs/guide/concepts/editing-workflow.md +303 -0
- package/assets/docs/guide/concepts/events.md +466 -0
- package/assets/docs/guide/concepts/headless-mode/browser.md +291 -0
- package/assets/docs/guide/concepts/pages.md +396 -0
- package/assets/docs/guide/concepts/resources.md +496 -0
- package/assets/docs/guide/concepts/scenes.md +443 -0
- package/assets/docs/guide/concepts/templating.md +194 -0
- package/assets/docs/guide/concepts/terminology.md +296 -0
- package/assets/docs/guide/concepts/undo-and-history.md +461 -0
- package/assets/docs/guide/concepts.md +38 -0
- package/assets/docs/guide/configuration.md +469 -0
- package/assets/docs/guide/conversion/overview.md +22 -0
- package/assets/docs/guide/conversion/to-base64.md +234 -0
- package/assets/docs/guide/conversion/to-pdf.md +616 -0
- package/assets/docs/guide/conversion/to-png.md +290 -0
- package/assets/docs/guide/conversion.md +23 -0
- package/assets/docs/guide/create-audio/audio/add-music.md +430 -0
- package/assets/docs/guide/create-audio/audio/add-sound-effects.md +664 -0
- package/assets/docs/guide/create-audio/audio/loop.md +370 -0
- package/assets/docs/guide/create-audio/audio.md +336 -0
- package/assets/docs/guide/create-composition/add-background.md +395 -0
- package/assets/docs/guide/create-composition/blend-modes.md +372 -0
- package/assets/docs/guide/create-composition/collage.md +432 -0
- package/assets/docs/guide/create-composition/group-and-ungroup.md +388 -0
- package/assets/docs/guide/create-composition/layer-management.md +503 -0
- package/assets/docs/guide/create-composition/layout.md +396 -0
- package/assets/docs/guide/create-composition/lock-design.md +362 -0
- package/assets/docs/guide/create-composition/multi-page.md +204 -0
- package/assets/docs/guide/create-composition/overview.md +18 -0
- package/assets/docs/guide/create-composition/programmatic.md +593 -0
- package/assets/docs/guide/create-composition.md +30 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/placeholders.md +688 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/set-editing-constraints.md +600 -0
- package/assets/docs/guide/create-templates/add-dynamic-content/text-variables.md +647 -0
- package/assets/docs/guide/create-templates/add-dynamic-content.md +307 -0
- package/assets/docs/guide/create-templates/add-to-template-library.md +297 -0
- package/assets/docs/guide/create-templates/edit-or-remove.md +441 -0
- package/assets/docs/guide/create-templates/from-scratch.md +558 -0
- package/assets/docs/guide/create-templates/import/from-scene-file.md +440 -0
- package/assets/docs/guide/create-templates/import.md +244 -0
- package/assets/docs/guide/create-templates/lock.md +325 -0
- package/assets/docs/guide/create-templates/overview.md +16 -0
- package/assets/docs/guide/create-templates.md +32 -0
- package/assets/docs/guide/create-video/audio/adjust-speed.md +302 -0
- package/assets/docs/guide/create-video/audio/adjust-volume.md +346 -0
- package/assets/docs/guide/create-video/control.md +285 -0
- package/assets/docs/guide/create-video/limitations.md +396 -0
- package/assets/docs/guide/create-video/overview.md +224 -0
- package/assets/docs/guide/create-video/timeline-editor.md +622 -0
- package/assets/docs/guide/create-video/update-caption-presets.md +676 -0
- package/assets/docs/guide/create-video.md +32 -0
- package/assets/docs/guide/edit-image/add-watermark.md +497 -0
- package/assets/docs/guide/edit-image/overview.md +22 -0
- package/assets/docs/guide/edit-image/remove-bg.md +420 -0
- package/assets/docs/guide/edit-image/replace-colors.md +680 -0
- package/assets/docs/guide/edit-image/transform/crop.md +523 -0
- package/assets/docs/guide/edit-image/transform/move.md +279 -0
- package/assets/docs/guide/edit-image/transform/resize.md +301 -0
- package/assets/docs/guide/edit-image/transform/rotate.md +408 -0
- package/assets/docs/guide/edit-image/transform/scale.md +278 -0
- package/assets/docs/guide/edit-image/transform.md +24 -0
- package/assets/docs/guide/edit-image/vectorize.md +204 -0
- package/assets/docs/guide/edit-image.md +25 -0
- package/assets/docs/guide/edit-video/add-captions.md +589 -0
- package/assets/docs/guide/edit-video/add-watermark.md +429 -0
- package/assets/docs/guide/edit-video/join-and-arrange.md +540 -0
- package/assets/docs/guide/edit-video/redaction.md +544 -0
- package/assets/docs/guide/edit-video/split.md +634 -0
- package/assets/docs/guide/edit-video/transform/crop.md +380 -0
- package/assets/docs/guide/edit-video/transform/flip.md +182 -0
- package/assets/docs/guide/edit-video/transform/move.md +413 -0
- package/assets/docs/guide/edit-video/transform/resize.md +534 -0
- package/assets/docs/guide/edit-video/transform/rotate.md +312 -0
- package/assets/docs/guide/edit-video/transform/scale.md +603 -0
- package/assets/docs/guide/edit-video/transform.md +25 -0
- package/assets/docs/guide/edit-video/trim.md +773 -0
- package/assets/docs/guide/engine-interface.md +108 -0
- package/assets/docs/guide/export-save-publish/create-thumbnail.md +292 -0
- package/assets/docs/guide/export-save-publish/export/compress.md +639 -0
- package/assets/docs/guide/export-save-publish/export/overview.md +576 -0
- package/assets/docs/guide/export-save-publish/export/partial-export.md +694 -0
- package/assets/docs/guide/export-save-publish/export/size-limits.md +401 -0
- package/assets/docs/guide/export-save-publish/export/to-html5.md +474 -0
- package/assets/docs/guide/export-save-publish/export/to-jpeg.md +312 -0
- package/assets/docs/guide/export-save-publish/export/to-mp4.md +364 -0
- package/assets/docs/guide/export-save-publish/export/to-pdf.md +389 -0
- package/assets/docs/guide/export-save-publish/export/to-png.md +255 -0
- package/assets/docs/guide/export-save-publish/export/to-raw-data.md +303 -0
- package/assets/docs/guide/export-save-publish/export/to-webp.md +261 -0
- package/assets/docs/guide/export-save-publish/export/with-color-mask.md +278 -0
- package/assets/docs/guide/export-save-publish/export.md +36 -0
- package/assets/docs/guide/export-save-publish/for-printing.md +423 -0
- package/assets/docs/guide/export-save-publish/for-social-media.md +318 -0
- package/assets/docs/guide/export-save-publish/pre-export-validation.md +698 -0
- package/assets/docs/guide/export-save-publish/save.md +340 -0
- package/assets/docs/guide/export-save-publish/store-custom-metadata.md +367 -0
- package/assets/docs/guide/file-format-support.md +34 -0
- package/assets/docs/guide/fills/color.md +678 -0
- package/assets/docs/guide/fills/image.md +539 -0
- package/assets/docs/guide/fills/overview.md +144 -0
- package/assets/docs/guide/fills/video.md +641 -0
- package/assets/docs/guide/fills.md +24 -0
- package/assets/docs/guide/filters-and-effects/apply.md +1019 -0
- package/assets/docs/guide/filters-and-effects/blur.md +382 -0
- package/assets/docs/guide/filters-and-effects/chroma-key-green-screen.md +445 -0
- package/assets/docs/guide/filters-and-effects/create-custom-filters.md +614 -0
- package/assets/docs/guide/filters-and-effects/create-custom-lut-filter.md +426 -0
- package/assets/docs/guide/filters-and-effects/distortion.md +527 -0
- package/assets/docs/guide/filters-and-effects/duotone.md +602 -0
- package/assets/docs/guide/filters-and-effects/gradients.md +1311 -0
- package/assets/docs/guide/filters-and-effects/overview.md +22 -0
- package/assets/docs/guide/filters-and-effects/support.md +623 -0
- package/assets/docs/guide/filters-and-effects.md +28 -0
- package/assets/docs/guide/get-started/agent-skills.md +119 -0
- package/assets/docs/guide/get-started/build-with-ai.md +45 -0
- package/assets/docs/guide/get-started/mcp-server.md +119 -0
- package/assets/docs/guide/get-started/overview.md +28 -0
- package/assets/docs/guide/get-started/vanilla-js/quickstart.md +175 -0
- package/assets/docs/guide/grid-and-rulers.md +222 -0
- package/assets/docs/guide/guides/export-save-publish/export/audio.md +224 -0
- package/assets/docs/guide/guides/text/rendering-internals.md +796 -0
- package/assets/docs/guide/guides.md +49 -0
- package/assets/docs/guide/import-media/asset-library.md +23 -0
- package/assets/docs/guide/import-media/asset-panel/basics.md +324 -0
- package/assets/docs/guide/import-media/asset-panel/customize.md +478 -0
- package/assets/docs/guide/import-media/asset-panel/refresh-assets.md +415 -0
- package/assets/docs/guide/import-media/asset-panel/thumbnails.md +633 -0
- package/assets/docs/guide/import-media/capture-from-camera/record-video.md +137 -0
- package/assets/docs/guide/import-media/capture-from-camera.md +20 -0
- package/assets/docs/guide/import-media/concepts.md +173 -0
- package/assets/docs/guide/import-media/content-json-schema.md +615 -0
- package/assets/docs/guide/import-media/default-assets.md +381 -0
- package/assets/docs/guide/import-media/edit-or-remove-assets.md +489 -0
- package/assets/docs/guide/import-media/file-format-support.md +178 -0
- package/assets/docs/guide/import-media/from-local-source/user-upload.md +438 -0
- package/assets/docs/guide/import-media/from-local-source.md +20 -0
- package/assets/docs/guide/import-media/from-remote-source/asset-versioning.md +390 -0
- package/assets/docs/guide/import-media/from-remote-source/getty-images.md +627 -0
- package/assets/docs/guide/import-media/from-remote-source/imgly-premium-assets.md +625 -0
- package/assets/docs/guide/import-media/from-remote-source/pexels.md +692 -0
- package/assets/docs/guide/import-media/from-remote-source/remote-asset.md +473 -0
- package/assets/docs/guide/import-media/from-remote-source/soundstripe.md +497 -0
- package/assets/docs/guide/import-media/from-remote-source/third-party.md +51 -0
- package/assets/docs/guide/import-media/from-remote-source/unsplash.md +914 -0
- package/assets/docs/guide/import-media/from-remote-source/your-server.md +764 -0
- package/assets/docs/guide/import-media/from-remote-source.md +28 -0
- package/assets/docs/guide/import-media/overview.md +32 -0
- package/assets/docs/guide/import-media/retrieve-mimetype.md +274 -0
- package/assets/docs/guide/import-media/size-limits.md +20 -0
- package/assets/docs/guide/import-media/source-sets.md +476 -0
- package/assets/docs/guide/import-media.md +32 -0
- package/assets/docs/guide/insert-media/audio.md +291 -0
- package/assets/docs/guide/insert-media/images.md +380 -0
- package/assets/docs/guide/insert-media/position-and-align.md +734 -0
- package/assets/docs/guide/insert-media/shapes-or-stickers.md +799 -0
- package/assets/docs/guide/insert-media/videos.md +308 -0
- package/assets/docs/guide/insert-media.md +24 -0
- package/assets/docs/guide/key-capabilities.md +24 -0
- package/assets/docs/guide/key-concepts.md +83 -0
- package/assets/docs/guide/licensing.md +45 -0
- package/assets/docs/guide/llms-txt.md +53 -0
- package/assets/docs/guide/open-the-editor/blank-canvas.md +124 -0
- package/assets/docs/guide/open-the-editor/from-htmlcanvas.md +228 -0
- package/assets/docs/guide/open-the-editor/from-image.md +205 -0
- package/assets/docs/guide/open-the-editor/from-template.md +189 -0
- package/assets/docs/guide/open-the-editor/from-video.md +274 -0
- package/assets/docs/guide/open-the-editor/import-design/from-archive.md +504 -0
- package/assets/docs/guide/open-the-editor/import-design/from-indesign.md +680 -0
- package/assets/docs/guide/open-the-editor/import-design/from-photoshop.md +865 -0
- package/assets/docs/guide/open-the-editor/import-design.md +481 -0
- package/assets/docs/guide/open-the-editor/load-scene.md +178 -0
- package/assets/docs/guide/open-the-editor/overview.md +20 -0
- package/assets/docs/guide/open-the-editor/set-zoom-level.md +303 -0
- package/assets/docs/guide/open-the-editor/uri-resolver.md +347 -0
- package/assets/docs/guide/open-the-editor.md +29 -0
- package/assets/docs/guide/outlines/overview.md +14 -0
- package/assets/docs/guide/outlines/shadows-and-glows.md +515 -0
- package/assets/docs/guide/outlines/strokes.md +292 -0
- package/assets/docs/guide/outlines.md +22 -0
- package/assets/docs/guide/overview.md +22 -0
- package/assets/docs/guide/performance.md +217 -0
- package/assets/docs/guide/plugins/asset-sources.md +553 -0
- package/assets/docs/guide/plugins/print-ready-pdf.md +549 -0
- package/assets/docs/guide/plugins.md +36 -0
- package/assets/docs/guide/rules/asset-handling.md +180 -0
- package/assets/docs/guide/rules/common-pitfalls.md +272 -0
- package/assets/docs/guide/rules/content-fill-mode.md +29 -0
- package/assets/docs/guide/rules/enforce-brand-guidelines.md +672 -0
- package/assets/docs/guide/rules/lock-content.md +478 -0
- package/assets/docs/guide/rules/moderate-content.md +761 -0
- package/assets/docs/guide/rules/overview.md +514 -0
- package/assets/docs/guide/rules/silent-init-errors.md +137 -0
- package/assets/docs/guide/rules/verify-properties-before-use.md +78 -0
- package/assets/docs/guide/rules.md +23 -0
- package/assets/docs/guide/security.md +199 -0
- package/assets/docs/guide/serve-assets.md +332 -0
- package/assets/docs/guide/settings.md +199 -0
- package/assets/docs/guide/shapes.md +23 -0
- package/assets/docs/guide/starterkits/3d-mockup-editor.md +748 -0
- package/assets/docs/guide/starterkits/advanced-editor.md +698 -0
- package/assets/docs/guide/starterkits/advanced-video-editor.md +696 -0
- package/assets/docs/guide/starterkits/ai-editor.md +749 -0
- package/assets/docs/guide/starterkits/airtable-image-editor.md +672 -0
- package/assets/docs/guide/starterkits/apparel-ui.md +188 -0
- package/assets/docs/guide/starterkits/assets.md +27 -0
- package/assets/docs/guide/starterkits/auto-resize.md +586 -0
- package/assets/docs/guide/starterkits/automated-video-generation.md +692 -0
- package/assets/docs/guide/starterkits/background-removal-editor.md +480 -0
- package/assets/docs/guide/starterkits/content-moderation.md +863 -0
- package/assets/docs/guide/starterkits/creative-automation.md +28 -0
- package/assets/docs/guide/starterkits/custom-built-uis.md +26 -0
- package/assets/docs/guide/starterkits/customization.md +29 -0
- package/assets/docs/guide/starterkits/cutout-lines-editor.md +470 -0
- package/assets/docs/guide/starterkits/data-merge.md +850 -0
- package/assets/docs/guide/starterkits/design-editor.md +698 -0
- package/assets/docs/guide/starterkits/design-generation.md +719 -0
- package/assets/docs/guide/starterkits/design-validation.md +808 -0
- package/assets/docs/guide/starterkits/editor-ui-configurations.md +14 -0
- package/assets/docs/guide/starterkits/export-options.md +724 -0
- package/assets/docs/guide/starterkits/export-using-renderer.md +708 -0
- package/assets/docs/guide/starterkits/extensibility.md +28 -0
- package/assets/docs/guide/starterkits/force-crop-editor.md +675 -0
- package/assets/docs/guide/starterkits/form-based-template-adoption.md +522 -0
- package/assets/docs/guide/starterkits/getty-images-editor.md +700 -0
- package/assets/docs/guide/starterkits/html5-ads-exporter.md +719 -0
- package/assets/docs/guide/starterkits/indesign-template-import.md +580 -0
- package/assets/docs/guide/starterkits/layouts-editor.md +724 -0
- package/assets/docs/guide/starterkits/mobile-ui.md +185 -0
- package/assets/docs/guide/starterkits/mockup-editor.md +745 -0
- package/assets/docs/guide/starterkits/multi-image-generation.md +542 -0
- package/assets/docs/guide/starterkits/page-sizes-editor.md +657 -0
- package/assets/docs/guide/starterkits/pexels-image-editor.md +665 -0
- package/assets/docs/guide/starterkits/photo-editor.md +755 -0
- package/assets/docs/guide/starterkits/photo-ui.md +186 -0
- package/assets/docs/guide/starterkits/photobook-ui.md +188 -0
- package/assets/docs/guide/starterkits/placeholders.md +678 -0
- package/assets/docs/guide/starterkits/player.md +405 -0
- package/assets/docs/guide/starterkits/plugins.md +25 -0
- package/assets/docs/guide/starterkits/postcard-editor.md +202 -0
- package/assets/docs/guide/starterkits/pptx-template-import.md +581 -0
- package/assets/docs/guide/starterkits/print-ready-pdf-editor.md +746 -0
- package/assets/docs/guide/starterkits/product-editor.md +773 -0
- package/assets/docs/guide/starterkits/psd-template-import.md +580 -0
- package/assets/docs/guide/starterkits/qr-code-editor.md +470 -0
- package/assets/docs/guide/starterkits/single-page-editor.md +661 -0
- package/assets/docs/guide/starterkits/start-with-image.md +684 -0
- package/assets/docs/guide/starterkits/start-with-video.md +651 -0
- package/assets/docs/guide/starterkits/t-shirt-designer.md +742 -0
- package/assets/docs/guide/starterkits/templating.md +23 -0
- package/assets/docs/guide/starterkits/theming.md +662 -0
- package/assets/docs/guide/starterkits/translation-internationalization.md +662 -0
- package/assets/docs/guide/starterkits/unsplash-editor.md +839 -0
- package/assets/docs/guide/starterkits/vectorizer-editor.md +466 -0
- package/assets/docs/guide/starterkits/version-history.md +745 -0
- package/assets/docs/guide/starterkits/video-animations.md +853 -0
- package/assets/docs/guide/starterkits/video-captions.md +884 -0
- package/assets/docs/guide/starterkits/video-editing.md +25 -0
- package/assets/docs/guide/starterkits/video-editor.md +696 -0
- package/assets/docs/guide/starterkits/video-export-options.md +676 -0
- package/assets/docs/guide/starterkits/viewer.md +400 -0
- package/assets/docs/guide/starterkits.md +41 -0
- package/assets/docs/guide/stickers-and-shapes/combine.md +743 -0
- package/assets/docs/guide/stickers-and-shapes/create-cutout.md +425 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-shapes.md +794 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/create-stickers.md +290 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/edit-shapes.md +211 -0
- package/assets/docs/guide/stickers-and-shapes/create-edit/vector-edit.md +362 -0
- package/assets/docs/guide/stickers-and-shapes/insert-qr-code.md +208 -0
- package/assets/docs/guide/stickers.md +21 -0
- package/assets/docs/guide/text/add.md +641 -0
- package/assets/docs/guide/text/adjust-spacing.md +288 -0
- package/assets/docs/guide/text/auto-size.md +404 -0
- package/assets/docs/guide/text/custom-fonts.md +401 -0
- package/assets/docs/guide/text/decorations.md +330 -0
- package/assets/docs/guide/text/edit.md +458 -0
- package/assets/docs/guide/text/effects.md +244 -0
- package/assets/docs/guide/text/emojis.md +310 -0
- package/assets/docs/guide/text/enumerations.md +258 -0
- package/assets/docs/guide/text/language-support.md +604 -0
- package/assets/docs/guide/text/overview.md +14 -0
- package/assets/docs/guide/text/styling.md +390 -0
- package/assets/docs/guide/text/text-designs.md +834 -0
- package/assets/docs/guide/text.md +33 -0
- package/assets/docs/guide/to-v1-10.md +131 -0
- package/assets/docs/guide/to-v1-13.md +165 -0
- package/assets/docs/guide/to-v1-19.md +315 -0
- package/assets/docs/guide/to-v1-32.md +110 -0
- package/assets/docs/guide/to-v1-69.md +468 -0
- package/assets/docs/guide/to-v1-72.md +193 -0
- package/assets/docs/guide/upgrade.md +25 -0
- package/assets/docs/guide/use-templates/apply-template.md +279 -0
- package/assets/docs/guide/use-templates/generate.md +405 -0
- package/assets/docs/guide/use-templates/library.md +450 -0
- package/assets/docs/guide/use-templates/overview.md +20 -0
- package/assets/docs/guide/use-templates/programmatic.md +482 -0
- package/assets/docs/guide/use-templates/replace-content.md +399 -0
- package/assets/docs/guide/user-interface/ai-integration/audio-generation.md +428 -0
- package/assets/docs/guide/user-interface/ai-integration/auto-captions.md +337 -0
- package/assets/docs/guide/user-interface/ai-integration/custom-provider.md +853 -0
- package/assets/docs/guide/user-interface/ai-integration/gateway-provider.md +1045 -0
- package/assets/docs/guide/user-interface/ai-integration/image-generation.md +641 -0
- package/assets/docs/guide/user-interface/ai-integration/integrate.md +966 -0
- package/assets/docs/guide/user-interface/ai-integration/proxy-server.md +99 -0
- package/assets/docs/guide/user-interface/ai-integration/text-generation.md +498 -0
- package/assets/docs/guide/user-interface/ai-integration/video-generation.md +493 -0
- package/assets/docs/guide/user-interface/ai-integration.md +30 -0
- package/assets/docs/guide/user-interface/appearance/change-ui-font.md +316 -0
- package/assets/docs/guide/user-interface/appearance/custom-labels.md +509 -0
- package/assets/docs/guide/user-interface/appearance/icons.md +373 -0
- package/assets/docs/guide/user-interface/appearance/theming.md +665 -0
- package/assets/docs/guide/user-interface/appearance.md +23 -0
- package/assets/docs/guide/user-interface/build-your-own-ui.md +620 -0
- package/assets/docs/guide/user-interface/customization/canvas-menu.md +412 -0
- package/assets/docs/guide/user-interface/customization/canvas.md +281 -0
- package/assets/docs/guide/user-interface/customization/color-palette.md +413 -0
- package/assets/docs/guide/user-interface/customization/crop-presets.md +384 -0
- package/assets/docs/guide/user-interface/customization/disable-or-enable.md +676 -0
- package/assets/docs/guide/user-interface/customization/dock.md +399 -0
- package/assets/docs/guide/user-interface/customization/force-crop.md +289 -0
- package/assets/docs/guide/user-interface/customization/inspector-bar.md +371 -0
- package/assets/docs/guide/user-interface/customization/navigation-bar.md +516 -0
- package/assets/docs/guide/user-interface/customization/page-format.md +436 -0
- package/assets/docs/guide/user-interface/customization/panel.md +605 -0
- package/assets/docs/guide/user-interface/customization/quick-start/add-action-buttons.md +531 -0
- package/assets/docs/guide/user-interface/customization/quick-start/add-dock-buttons.md +358 -0
- package/assets/docs/guide/user-interface/customization/quick-start/create-custom-components.md +374 -0
- package/assets/docs/guide/user-interface/customization/quick-start/reorder-components.md +323 -0
- package/assets/docs/guide/user-interface/customization/quick-start/show-hide-components.md +294 -0
- package/assets/docs/guide/user-interface/customization/quick-start.md +12 -0
- package/assets/docs/guide/user-interface/customization/reference/component-order-api.md +519 -0
- package/assets/docs/guide/user-interface/customization/reference/component-reference.md +333 -0
- package/assets/docs/guide/user-interface/customization/reference.md +12 -0
- package/assets/docs/guide/user-interface/customization.md +39 -0
- package/assets/docs/guide/user-interface/localization.md +633 -0
- package/assets/docs/guide/user-interface/overview.md +167 -0
- package/assets/docs/guide/user-interface/ui-extensions/add-custom-feature.md +411 -0
- package/assets/docs/guide/user-interface/ui-extensions/asset-library.md +721 -0
- package/assets/docs/guide/user-interface/ui-extensions/create-custom-panel.md +331 -0
- package/assets/docs/guide/user-interface/ui-extensions/customize-behaviour.md +553 -0
- package/assets/docs/guide/user-interface/ui-extensions/notifications-and-dialogs.md +672 -0
- package/assets/docs/guide/user-interface/ui-extensions/quick-actions.md +415 -0
- package/assets/docs/guide/user-interface/ui-extensions/register-new-component.md +521 -0
- package/assets/docs/guide/user-interface/ui-extensions.md +26 -0
- package/assets/docs/guide/user-interface.md +25 -0
- package/assets/docs/guide/what-is-cesdk.md +319 -0
- package/assets/docs/handbook/SKILL.md +521 -0
- package/assets/prompts/evals-assetGenerate.md +12 -0
- package/assets/prompts/evals-brutalistCore.md +34 -0
- package/assets/prompts/evals-danskCatalogue.md +31 -0
- package/assets/prompts/evals-exportRoundTrip.md +12 -0
- package/assets/prompts/evals-inspectPriorCode.md +16 -0
- package/assets/prompts/evals-listProjectFiles.md +6 -0
- package/assets/prompts/evals-readAndExplainScript.md +6 -0
- package/assets/prompts/evals-resumeAcrossRestart.md +15 -0
- package/assets/prompts/evals-rewindRecovery.md +10 -0
- package/assets/prompts/evals-searchAcrossFiles.md +6 -0
- package/assets/prompts/evals-weddingCard.md +20 -0
- package/assets/prompts/explain.md +6 -0
- package/assets/prompts/review.md +6 -0
- package/dist/assets/inline.generated.d.ts +2 -0
- package/dist/assets/inline.generated.d.ts.map +1 -0
- package/dist/assets/inline.generated.js +413 -0
- package/dist/assets/inline.generated.js.map +1 -0
- package/dist/assets/load-browser.d.ts +8 -0
- package/dist/assets/load-browser.d.ts.map +1 -0
- package/dist/assets/load-browser.js +11 -0
- package/dist/assets/load-browser.js.map +1 -0
- package/dist/assets/load-node.d.ts +8 -0
- package/dist/assets/load-node.d.ts.map +1 -0
- package/dist/assets/load-node.js +11 -0
- package/dist/assets/load-node.js.map +1 -0
- package/dist/cli/http.d.ts +2 -0
- package/dist/cli/http.d.ts.map +1 -0
- package/dist/cli/http.js +231 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/redirect-console.d.ts +10 -0
- package/dist/cli/redirect-console.d.ts.map +1 -0
- package/dist/cli/redirect-console.js +18 -0
- package/dist/cli/redirect-console.js.map +1 -0
- package/dist/cli/resolve-license.d.ts +2 -0
- package/dist/cli/resolve-license.d.ts.map +1 -0
- package/dist/cli/resolve-license.js +13 -0
- package/dist/cli/resolve-license.js.map +1 -0
- package/dist/cli/stdio.d.ts +2 -0
- package/dist/cli/stdio.d.ts.map +1 -0
- package/dist/cli/stdio.js +124 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/trial-license.generated.d.ts +2 -0
- package/dist/cli/trial-license.generated.d.ts.map +1 -0
- package/dist/cli/trial-license.generated.js +4 -0
- package/dist/cli/trial-license.generated.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/cross-ref.d.ts +2 -0
- package/dist/cross-ref.d.ts.map +1 -0
- package/dist/cross-ref.js +31 -0
- package/dist/cross-ref.js.map +1 -0
- package/dist/dashboard/router.d.ts +3 -0
- package/dist/dashboard/router.d.ts.map +1 -0
- package/dist/dashboard/router.js +19 -0
- package/dist/dashboard/router.js.map +1 -0
- package/dist/dashboard/spa-assets.generated.d.ts +2 -0
- package/dist/dashboard/spa-assets.generated.d.ts.map +1 -0
- package/dist/dashboard/spa-assets.generated.js +220 -0
- package/dist/dashboard/spa-assets.generated.js.map +1 -0
- package/dist/engine/asset-sources.d.ts +17 -0
- package/dist/engine/asset-sources.d.ts.map +1 -0
- package/dist/engine/asset-sources.js +75 -0
- package/dist/engine/asset-sources.js.map +1 -0
- package/dist/engine/cesdk-adapter.d.ts +10 -0
- package/dist/engine/cesdk-adapter.d.ts.map +1 -0
- package/dist/engine/cesdk-adapter.js +19 -0
- package/dist/engine/cesdk-adapter.js.map +1 -0
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +3 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/mutex.d.ts +5 -0
- package/dist/engine/mutex.d.ts.map +1 -0
- package/dist/engine/mutex.js +42 -0
- package/dist/engine/mutex.js.map +1 -0
- package/dist/engine/session.d.ts +50 -0
- package/dist/engine/session.d.ts.map +1 -0
- package/dist/engine/session.js +95 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/engine/uri-resolver.d.ts +14 -0
- package/dist/engine/uri-resolver.d.ts.map +1 -0
- package/dist/engine/uri-resolver.js +12 -0
- package/dist/engine/uri-resolver.js.map +1 -0
- package/dist/frontmatter.d.ts +15 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +46 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gateway/hosted-stub.d.ts +6 -0
- package/dist/gateway/hosted-stub.d.ts.map +1 -0
- package/dist/gateway/hosted-stub.js +11 -0
- package/dist/gateway/hosted-stub.js.map +1 -0
- package/dist/gateway/index.d.ts +4 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +4 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/local.d.ts +14 -0
- package/dist/gateway/local.d.ts.map +1 -0
- package/dist/gateway/local.js +41 -0
- package/dist/gateway/local.js.map +1 -0
- package/dist/gateway/types.d.ts +24 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +7 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/http/server.d.ts +80 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +183 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/session-manager.d.ts +42 -0
- package/dist/http/session-manager.d.ts.map +1 -0
- package/dist/http/session-manager.js +82 -0
- package/dist/http/session-manager.js.map +1 -0
- package/dist/http/workspace-auth.d.ts +9 -0
- package/dist/http/workspace-auth.d.ts.map +1 -0
- package/dist/http/workspace-auth.js +29 -0
- package/dist/http/workspace-auth.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/mount.d.ts +11 -0
- package/dist/metrics/mount.d.ts.map +1 -0
- package/dist/metrics/mount.js +13 -0
- package/dist/metrics/mount.js.map +1 -0
- package/dist/metrics/recorder.d.ts +55 -0
- package/dist/metrics/recorder.d.ts.map +1 -0
- package/dist/metrics/recorder.js +97 -0
- package/dist/metrics/recorder.js.map +1 -0
- package/dist/revisions/hash.d.ts +7 -0
- package/dist/revisions/hash.d.ts.map +1 -0
- package/dist/revisions/hash.js +24 -0
- package/dist/revisions/hash.js.map +1 -0
- package/dist/revisions/index.d.ts +4 -0
- package/dist/revisions/index.d.ts.map +1 -0
- package/dist/revisions/index.js +4 -0
- package/dist/revisions/index.js.map +1 -0
- package/dist/revisions/store.d.ts +69 -0
- package/dist/revisions/store.d.ts.map +1 -0
- package/dist/revisions/store.js +196 -0
- package/dist/revisions/store.js.map +1 -0
- package/dist/revisions/types.d.ts +39 -0
- package/dist/revisions/types.d.ts.map +1 -0
- package/dist/revisions/types.js +2 -0
- package/dist/revisions/types.js.map +1 -0
- package/dist/server.d.ts +51 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +175 -0
- package/dist/server.js.map +1 -0
- package/dist/skill-tools.d.ts +3 -0
- package/dist/skill-tools.d.ts.map +1 -0
- package/dist/skill-tools.js +105 -0
- package/dist/skill-tools.js.map +1 -0
- package/dist/test/test/cli/dispatcher.test.d.ts +2 -0
- package/dist/test/test/cli/dispatcher.test.d.ts.map +1 -0
- package/dist/test/test/cli/dispatcher.test.js +47 -0
- package/dist/test/test/cli/dispatcher.test.js.map +1 -0
- package/dist/test/test/cross-ref.test.d.ts +2 -0
- package/dist/test/test/cross-ref.test.d.ts.map +1 -0
- package/dist/test/test/cross-ref.test.js +39 -0
- package/dist/test/test/cross-ref.test.js.map +1 -0
- package/dist/test/test/engine/session.test.d.ts +2 -0
- package/dist/test/test/engine/session.test.d.ts.map +1 -0
- package/dist/test/test/engine/session.test.js +144 -0
- package/dist/test/test/engine/session.test.js.map +1 -0
- package/dist/test/test/engine/uri-resolver.test.d.ts +2 -0
- package/dist/test/test/engine/uri-resolver.test.d.ts.map +1 -0
- package/dist/test/test/engine/uri-resolver.test.js +38 -0
- package/dist/test/test/engine/uri-resolver.test.js.map +1 -0
- package/dist/test/test/frontmatter.test.d.ts +2 -0
- package/dist/test/test/frontmatter.test.d.ts.map +1 -0
- package/dist/test/test/frontmatter.test.js +55 -0
- package/dist/test/test/frontmatter.test.js.map +1 -0
- package/dist/test/test/gateway/hosted-stub.test.d.ts +2 -0
- package/dist/test/test/gateway/hosted-stub.test.d.ts.map +1 -0
- package/dist/test/test/gateway/hosted-stub.test.js +11 -0
- package/dist/test/test/gateway/hosted-stub.test.js.map +1 -0
- package/dist/test/test/gateway/local.test.d.ts +2 -0
- package/dist/test/test/gateway/local.test.d.ts.map +1 -0
- package/dist/test/test/gateway/local.test.js +29 -0
- package/dist/test/test/gateway/local.test.js.map +1 -0
- package/dist/test/test/handbook-contract.test.d.ts +2 -0
- package/dist/test/test/handbook-contract.test.d.ts.map +1 -0
- package/dist/test/test/handbook-contract.test.js +71 -0
- package/dist/test/test/handbook-contract.test.js.map +1 -0
- package/dist/test/test/http/server.test.d.ts +2 -0
- package/dist/test/test/http/server.test.d.ts.map +1 -0
- package/dist/test/test/http/server.test.js +245 -0
- package/dist/test/test/http/server.test.js.map +1 -0
- package/dist/test/test/http/session-manager.test.d.ts +2 -0
- package/dist/test/test/http/session-manager.test.d.ts.map +1 -0
- package/dist/test/test/http/session-manager.test.js +83 -0
- package/dist/test/test/http/session-manager.test.js.map +1 -0
- package/dist/test/test/revisions/hash.test.d.ts +2 -0
- package/dist/test/test/revisions/hash.test.d.ts.map +1 -0
- package/dist/test/test/revisions/hash.test.js +33 -0
- package/dist/test/test/revisions/hash.test.js.map +1 -0
- package/dist/test/test/revisions/store.test.d.ts +2 -0
- package/dist/test/test/revisions/store.test.d.ts.map +1 -0
- package/dist/test/test/revisions/store.test.js +245 -0
- package/dist/test/test/revisions/store.test.js.map +1 -0
- package/dist/test/test/server.test.d.ts +2 -0
- package/dist/test/test/server.test.d.ts.map +1 -0
- package/dist/test/test/server.test.js +157 -0
- package/dist/test/test/server.test.js.map +1 -0
- package/dist/test/test/skill-tools.test.d.ts +2 -0
- package/dist/test/test/skill-tools.test.d.ts.map +1 -0
- package/dist/test/test/skill-tools.test.js +84 -0
- package/dist/test/test/skill-tools.test.js.map +1 -0
- package/dist/test/test/smoke.test.d.ts +2 -0
- package/dist/test/test/smoke.test.d.ts.map +1 -0
- package/dist/test/test/smoke.test.js +8 -0
- package/dist/test/test/smoke.test.js.map +1 -0
- package/dist/test/test/tools/asset-generate.test.d.ts +2 -0
- package/dist/test/test/tools/asset-generate.test.d.ts.map +1 -0
- package/dist/test/test/tools/asset-generate.test.js +66 -0
- package/dist/test/test/tools/asset-generate.test.js.map +1 -0
- package/dist/test/test/tools/edit.test.d.ts +2 -0
- package/dist/test/test/tools/edit.test.d.ts.map +1 -0
- package/dist/test/test/tools/edit.test.js +205 -0
- package/dist/test/test/tools/edit.test.js.map +1 -0
- package/dist/test/test/tools/export.test.d.ts +2 -0
- package/dist/test/test/tools/export.test.d.ts.map +1 -0
- package/dist/test/test/tools/export.test.js +144 -0
- package/dist/test/test/tools/export.test.js.map +1 -0
- package/dist/test/test/tools/history.test.d.ts +2 -0
- package/dist/test/test/tools/history.test.d.ts.map +1 -0
- package/dist/test/test/tools/history.test.js +29 -0
- package/dist/test/test/tools/history.test.js.map +1 -0
- package/dist/test/test/tools/inspect.test.d.ts +2 -0
- package/dist/test/test/tools/inspect.test.d.ts.map +1 -0
- package/dist/test/test/tools/inspect.test.js +62 -0
- package/dist/test/test/tools/inspect.test.js.map +1 -0
- package/dist/test/test/tools/list.test.d.ts +2 -0
- package/dist/test/test/tools/list.test.d.ts.map +1 -0
- package/dist/test/test/tools/list.test.js +23 -0
- package/dist/test/test/tools/list.test.js.map +1 -0
- package/dist/test/test/tools/open-editor.test.d.ts +2 -0
- package/dist/test/test/tools/open-editor.test.d.ts.map +1 -0
- package/dist/test/test/tools/open-editor.test.js +53 -0
- package/dist/test/test/tools/open-editor.test.js.map +1 -0
- package/dist/test/test/tools/preview.test.d.ts +2 -0
- package/dist/test/test/tools/preview.test.d.ts.map +1 -0
- package/dist/test/test/tools/preview.test.js +73 -0
- package/dist/test/test/tools/preview.test.js.map +1 -0
- package/dist/test/test/tools/rename.test.d.ts +2 -0
- package/dist/test/test/tools/rename.test.d.ts.map +1 -0
- package/dist/test/test/tools/rename.test.js +17 -0
- package/dist/test/test/tools/rename.test.js.map +1 -0
- package/dist/test/test/viewer/broadcaster.test.d.ts +2 -0
- package/dist/test/test/viewer/broadcaster.test.d.ts.map +1 -0
- package/dist/test/test/viewer/broadcaster.test.js +53 -0
- package/dist/test/test/viewer/broadcaster.test.js.map +1 -0
- package/dist/test/test/viewer/resource-route.test.d.ts +2 -0
- package/dist/test/test/viewer/resource-route.test.d.ts.map +1 -0
- package/dist/test/test/viewer/resource-route.test.js +70 -0
- package/dist/test/test/viewer/resource-route.test.js.map +1 -0
- package/dist/test/test/viewer/router.test.d.ts +2 -0
- package/dist/test/test/viewer/router.test.d.ts.map +1 -0
- package/dist/test/test/viewer/router.test.js +171 -0
- package/dist/test/test/viewer/router.test.js.map +1 -0
- package/dist/test/test/viewer/url-builder.test.d.ts +2 -0
- package/dist/test/test/viewer/url-builder.test.d.ts.map +1 -0
- package/dist/test/test/viewer/url-builder.test.js +31 -0
- package/dist/test/test/viewer/url-builder.test.js.map +1 -0
- package/dist/test/test/workspace/hosted-stub.test.d.ts +2 -0
- package/dist/test/test/workspace/hosted-stub.test.d.ts.map +1 -0
- package/dist/test/test/workspace/hosted-stub.test.js +30 -0
- package/dist/test/test/workspace/hosted-stub.test.js.map +1 -0
- package/dist/test/test/workspace/in-memory.test.d.ts +2 -0
- package/dist/test/test/workspace/in-memory.test.d.ts.map +1 -0
- package/dist/test/test/workspace/in-memory.test.js +4 -0
- package/dist/test/test/workspace/in-memory.test.js.map +1 -0
- package/dist/test/test/workspace/node-fs.test.d.ts +2 -0
- package/dist/test/test/workspace/node-fs.test.d.ts.map +1 -0
- package/dist/test/test/workspace/node-fs.test.js +20 -0
- package/dist/test/test/workspace/node-fs.test.js.map +1 -0
- package/dist/test/test/workspace/shared-contract.d.ts +3 -0
- package/dist/test/test/workspace/shared-contract.d.ts.map +1 -0
- package/dist/test/test/workspace/shared-contract.js +92 -0
- package/dist/test/test/workspace/shared-contract.js.map +1 -0
- package/dist/test/tsconfig.test.tsbuildinfo +1 -0
- package/dist/test/vitest.config.d.ts +3 -0
- package/dist/test/vitest.config.d.ts.map +1 -0
- package/dist/test/vitest.config.js +8 -0
- package/dist/test/vitest.config.js.map +1 -0
- package/dist/tools/asset-generate.d.ts +12 -0
- package/dist/tools/asset-generate.d.ts.map +1 -0
- package/dist/tools/asset-generate.js +112 -0
- package/dist/tools/asset-generate.js.map +1 -0
- package/dist/tools/asset-search.d.ts +10 -0
- package/dist/tools/asset-search.d.ts.map +1 -0
- package/dist/tools/asset-search.js +120 -0
- package/dist/tools/asset-search.js.map +1 -0
- package/dist/tools/content-types.d.ts +11 -0
- package/dist/tools/content-types.d.ts.map +1 -0
- package/dist/tools/content-types.js +2 -0
- package/dist/tools/content-types.js.map +1 -0
- package/dist/tools/edit.d.ts +29 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +165 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/engine.d.ts +31 -0
- package/dist/tools/engine.d.ts.map +1 -0
- package/dist/tools/engine.js +59 -0
- package/dist/tools/engine.js.map +1 -0
- package/dist/tools/export.d.ts +19 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +179 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/history.d.ts +7 -0
- package/dist/tools/history.d.ts.map +1 -0
- package/dist/tools/history.js +54 -0
- package/dist/tools/history.js.map +1 -0
- package/dist/tools/index.d.ts +35 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +72 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inspect.d.ts +7 -0
- package/dist/tools/inspect.d.ts.map +1 -0
- package/dist/tools/inspect.js +80 -0
- package/dist/tools/inspect.js.map +1 -0
- package/dist/tools/list.d.ts +7 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +18 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/metrics.d.ts +11 -0
- package/dist/tools/metrics.d.ts.map +1 -0
- package/dist/tools/metrics.js +28 -0
- package/dist/tools/metrics.js.map +1 -0
- package/dist/tools/open-editor.d.ts +10 -0
- package/dist/tools/open-editor.d.ts.map +1 -0
- package/dist/tools/open-editor.js +62 -0
- package/dist/tools/open-editor.js.map +1 -0
- package/dist/tools/preview.d.ts +12 -0
- package/dist/tools/preview.d.ts.map +1 -0
- package/dist/tools/preview.js +104 -0
- package/dist/tools/preview.js.map +1 -0
- package/dist/tools/rename.d.ts +7 -0
- package/dist/tools/rename.d.ts.map +1 -0
- package/dist/tools/rename.js +39 -0
- package/dist/tools/rename.js.map +1 -0
- package/dist/tools/result.d.ts +12 -0
- package/dist/tools/result.d.ts.map +1 -0
- package/dist/tools/result.js +55 -0
- package/dist/tools/result.js.map +1 -0
- package/dist/tools/save.d.ts +19 -0
- package/dist/tools/save.d.ts.map +1 -0
- package/dist/tools/save.js +117 -0
- package/dist/tools/save.js.map +1 -0
- package/dist/viewer/broadcaster.d.ts +13 -0
- package/dist/viewer/broadcaster.d.ts.map +1 -0
- package/dist/viewer/broadcaster.js +44 -0
- package/dist/viewer/broadcaster.js.map +1 -0
- package/dist/viewer/index.d.ts +7 -0
- package/dist/viewer/index.d.ts.map +1 -0
- package/dist/viewer/index.js +7 -0
- package/dist/viewer/index.js.map +1 -0
- package/dist/viewer/listener.d.ts +16 -0
- package/dist/viewer/listener.d.ts.map +1 -0
- package/dist/viewer/listener.js +30 -0
- package/dist/viewer/listener.js.map +1 -0
- package/dist/viewer/presigned-r2-url-builder.d.ts +30 -0
- package/dist/viewer/presigned-r2-url-builder.d.ts.map +1 -0
- package/dist/viewer/presigned-r2-url-builder.js +40 -0
- package/dist/viewer/presigned-r2-url-builder.js.map +1 -0
- package/dist/viewer/resource-route.d.ts +9 -0
- package/dist/viewer/resource-route.d.ts.map +1 -0
- package/dist/viewer/resource-route.js +59 -0
- package/dist/viewer/resource-route.js.map +1 -0
- package/dist/viewer/router.d.ts +20 -0
- package/dist/viewer/router.d.ts.map +1 -0
- package/dist/viewer/router.js +142 -0
- package/dist/viewer/router.js.map +1 -0
- package/dist/viewer/session-mount.d.ts +10 -0
- package/dist/viewer/session-mount.d.ts.map +1 -0
- package/dist/viewer/session-mount.js +24 -0
- package/dist/viewer/session-mount.js.map +1 -0
- package/dist/viewer/spa-assets.generated.d.ts +2 -0
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -0
- package/dist/viewer/spa-assets.generated.js +989 -0
- package/dist/viewer/spa-assets.generated.js.map +1 -0
- package/dist/viewer/url-builder.d.ts +48 -0
- package/dist/viewer/url-builder.d.ts.map +1 -0
- package/dist/viewer/url-builder.js +38 -0
- package/dist/viewer/url-builder.js.map +1 -0
- package/dist/workspace/hosted-stub.d.ts +28 -0
- package/dist/workspace/hosted-stub.d.ts.map +1 -0
- package/dist/workspace/hosted-stub.js +44 -0
- package/dist/workspace/hosted-stub.js.map +1 -0
- package/dist/workspace/in-memory.d.ts +23 -0
- package/dist/workspace/in-memory.d.ts.map +1 -0
- package/dist/workspace/in-memory.js +161 -0
- package/dist/workspace/in-memory.js.map +1 -0
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +6 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/node-fs.d.ts +23 -0
- package/dist/workspace/node-fs.d.ts.map +1 -0
- package/dist/workspace/node-fs.js +90 -0
- package/dist/workspace/node-fs.js.map +1 -0
- package/dist/workspace/s3.d.ts +32 -0
- package/dist/workspace/s3.d.ts.map +1 -0
- package/dist/workspace/s3.js +191 -0
- package/dist/workspace/s3.js.map +1 -0
- package/dist/workspace/scoped.d.ts +32 -0
- package/dist/workspace/scoped.d.ts.map +1 -0
- package/dist/workspace/scoped.js +76 -0
- package/dist/workspace/scoped.js.map +1 -0
- package/dist/workspace/types.d.ts +75 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +18 -0
- package/dist/workspace/types.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,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
|
+

|
|
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
|