@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,989 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-spa-assets.mjs. Do not edit by hand.
|
|
2
|
+
export const SPA_ASSETS = {
|
|
3
|
+
"index.html": `<!doctype html>
|
|
4
|
+
<html lang="en">
|
|
5
|
+
<head>
|
|
6
|
+
<meta charset="utf-8" />
|
|
7
|
+
<title>codesign viewer</title>
|
|
8
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
9
|
+
<!-- Mount prefix injected by the viewer router (router.ts). "" on the stdio
|
|
10
|
+
listener, "/viewer" on the HTTP transport. Read by viewer.js. -->
|
|
11
|
+
<script>
|
|
12
|
+
window.__VIEWER_BASE__ = '{{VIEWER_BASE}}';
|
|
13
|
+
</script>
|
|
14
|
+
<style>
|
|
15
|
+
/* -------- reset & canvas -------- */
|
|
16
|
+
html,
|
|
17
|
+
body {
|
|
18
|
+
margin: 0;
|
|
19
|
+
padding: 0;
|
|
20
|
+
height: 100%;
|
|
21
|
+
width: 100%;
|
|
22
|
+
background: #1d1d1f;
|
|
23
|
+
color: #eee;
|
|
24
|
+
font-family: -apple-system, system-ui, sans-serif;
|
|
25
|
+
}
|
|
26
|
+
#cesdk {
|
|
27
|
+
position: fixed;
|
|
28
|
+
inset: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* -------- pill base (spec §7) -------- */
|
|
32
|
+
.pill {
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: 5px;
|
|
36
|
+
padding: 6px 11px;
|
|
37
|
+
border-radius: 999px;
|
|
38
|
+
font:
|
|
39
|
+
500 12px -apple-system,
|
|
40
|
+
system-ui,
|
|
41
|
+
sans-serif;
|
|
42
|
+
color: #e8e8e8;
|
|
43
|
+
background: rgba(20, 20, 22, 0.72);
|
|
44
|
+
backdrop-filter: blur(12px);
|
|
45
|
+
-webkit-backdrop-filter: blur(12px);
|
|
46
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
47
|
+
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25);
|
|
48
|
+
text-decoration: none;
|
|
49
|
+
cursor: pointer;
|
|
50
|
+
white-space: nowrap;
|
|
51
|
+
}
|
|
52
|
+
.pill.icon {
|
|
53
|
+
padding: 6px 9px;
|
|
54
|
+
}
|
|
55
|
+
.pill:hover {
|
|
56
|
+
background: rgba(30, 30, 33, 0.82);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* -------- cluster anchors -------- */
|
|
60
|
+
#bar-left,
|
|
61
|
+
#bar-right {
|
|
62
|
+
position: fixed;
|
|
63
|
+
top: 14px;
|
|
64
|
+
z-index: 10;
|
|
65
|
+
display: flex;
|
|
66
|
+
gap: 8px;
|
|
67
|
+
}
|
|
68
|
+
#bar-left {
|
|
69
|
+
left: 14px;
|
|
70
|
+
}
|
|
71
|
+
#bar-right {
|
|
72
|
+
right: 14px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* -------- title pill --------
|
|
76
|
+
Non-interactive (no click handler) — override .pill's cursor + hover so
|
|
77
|
+
the title visually matches its actual behavior. For a local MCP the URL
|
|
78
|
+
isn't shareable, so there's nothing useful to copy. Revisit when a
|
|
79
|
+
remote MCP ships — copy-share-URL is the natural fit there. */
|
|
80
|
+
#title {
|
|
81
|
+
font-weight: 600;
|
|
82
|
+
max-width: 240px;
|
|
83
|
+
overflow: hidden;
|
|
84
|
+
text-overflow: ellipsis;
|
|
85
|
+
white-space: nowrap;
|
|
86
|
+
cursor: default;
|
|
87
|
+
}
|
|
88
|
+
#title:hover {
|
|
89
|
+
background: rgba(20, 20, 22, 0.72);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* -------- LIVE pill (read-only) -------- */
|
|
93
|
+
.pill.live {
|
|
94
|
+
color: #c8e6c9;
|
|
95
|
+
cursor: default;
|
|
96
|
+
}
|
|
97
|
+
.pill.live:hover {
|
|
98
|
+
background: rgba(20, 20, 22, 0.72);
|
|
99
|
+
}
|
|
100
|
+
.pill.live::before {
|
|
101
|
+
content: '';
|
|
102
|
+
width: 6px;
|
|
103
|
+
height: 6px;
|
|
104
|
+
border-radius: 999px;
|
|
105
|
+
background: #34c759;
|
|
106
|
+
box-shadow: 0 0 5px rgba(52, 199, 89, 0.55);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* -------- hash chip -------- */
|
|
110
|
+
.pill.hash {
|
|
111
|
+
font-family: ui-monospace, monospace;
|
|
112
|
+
font-size: 11px;
|
|
113
|
+
color: #b8b8b8;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* -------- Go Live pill + count badge -------- */
|
|
117
|
+
.pill.golive {
|
|
118
|
+
color: #9ec8ff;
|
|
119
|
+
}
|
|
120
|
+
.pill.golive .count {
|
|
121
|
+
display: inline-flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
justify-content: center;
|
|
124
|
+
min-width: 16px;
|
|
125
|
+
height: 16px;
|
|
126
|
+
padding: 0 4px;
|
|
127
|
+
border-radius: 999px;
|
|
128
|
+
background: #2b6cb0;
|
|
129
|
+
color: #fff;
|
|
130
|
+
font-size: 10px;
|
|
131
|
+
font-weight: 600;
|
|
132
|
+
margin-left: 4px;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* -------- History pill -------- */
|
|
136
|
+
.pill.history::before {
|
|
137
|
+
content: '⎇';
|
|
138
|
+
opacity: 0.8;
|
|
139
|
+
}
|
|
140
|
+
.pill.history.active,
|
|
141
|
+
.pill.history.active:hover {
|
|
142
|
+
background: rgba(43, 108, 176, 0.85);
|
|
143
|
+
border-color: rgba(43, 108, 176, 0.95);
|
|
144
|
+
color: #fff;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* -------- floating history panel (spec §6) -------- */
|
|
148
|
+
#revision-panel {
|
|
149
|
+
position: fixed;
|
|
150
|
+
top: 62px;
|
|
151
|
+
right: 14px;
|
|
152
|
+
bottom: 14px;
|
|
153
|
+
width: 280px;
|
|
154
|
+
background: rgba(20, 20, 22, 0.88);
|
|
155
|
+
backdrop-filter: blur(16px);
|
|
156
|
+
-webkit-backdrop-filter: blur(16px);
|
|
157
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
158
|
+
border-radius: 12px;
|
|
159
|
+
box-shadow: 0 14px 36px rgba(0, 0, 0, 0.42);
|
|
160
|
+
box-sizing: border-box;
|
|
161
|
+
overflow-y: auto;
|
|
162
|
+
display: none;
|
|
163
|
+
opacity: 0;
|
|
164
|
+
transform: translateX(8px);
|
|
165
|
+
z-index: 10;
|
|
166
|
+
}
|
|
167
|
+
body.panel-open #revision-panel {
|
|
168
|
+
display: block;
|
|
169
|
+
}
|
|
170
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
171
|
+
#revision-panel {
|
|
172
|
+
transition:
|
|
173
|
+
opacity 160ms ease-out,
|
|
174
|
+
transform 160ms ease-out;
|
|
175
|
+
}
|
|
176
|
+
body.panel-open #revision-panel {
|
|
177
|
+
opacity: 1;
|
|
178
|
+
transform: translateX(0);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
@media (prefers-reduced-motion: reduce) {
|
|
182
|
+
body.panel-open #revision-panel {
|
|
183
|
+
opacity: 1;
|
|
184
|
+
transform: none;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* -------- panel internals (polish pass) -------- */
|
|
189
|
+
.rp-header {
|
|
190
|
+
padding: 12px 14px 10px;
|
|
191
|
+
font-size: 10px;
|
|
192
|
+
letter-spacing: 0.08em;
|
|
193
|
+
text-transform: uppercase;
|
|
194
|
+
color: #888;
|
|
195
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
|
|
196
|
+
}
|
|
197
|
+
.rp-tree {
|
|
198
|
+
padding: 8px 6px;
|
|
199
|
+
}
|
|
200
|
+
.rp-empty {
|
|
201
|
+
padding: 16px 14px;
|
|
202
|
+
font-size: 12px;
|
|
203
|
+
color: #888;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.rp-node {
|
|
207
|
+
display: block;
|
|
208
|
+
text-decoration: none;
|
|
209
|
+
color: inherit;
|
|
210
|
+
padding: 6px 8px;
|
|
211
|
+
border-radius: 6px;
|
|
212
|
+
}
|
|
213
|
+
.rp-node:hover {
|
|
214
|
+
background: rgba(255, 255, 255, 0.04);
|
|
215
|
+
}
|
|
216
|
+
.rp-node.rp-current {
|
|
217
|
+
background: rgba(30, 47, 68, 0.6);
|
|
218
|
+
box-shadow: inset 2px 0 0 #4a9eff;
|
|
219
|
+
}
|
|
220
|
+
.rp-node-row {
|
|
221
|
+
display: flex;
|
|
222
|
+
gap: 8px;
|
|
223
|
+
align-items: baseline;
|
|
224
|
+
}
|
|
225
|
+
.rp-elbow {
|
|
226
|
+
color: #555;
|
|
227
|
+
flex: none;
|
|
228
|
+
}
|
|
229
|
+
.rp-dot {
|
|
230
|
+
flex: none;
|
|
231
|
+
width: 12px;
|
|
232
|
+
text-align: center;
|
|
233
|
+
font-size: 10px;
|
|
234
|
+
color: #888;
|
|
235
|
+
}
|
|
236
|
+
.rp-node.rp-head .rp-dot {
|
|
237
|
+
color: #4a9eff;
|
|
238
|
+
}
|
|
239
|
+
.rp-node.rp-branch .rp-dot {
|
|
240
|
+
color: #d6973f;
|
|
241
|
+
}
|
|
242
|
+
.rp-body {
|
|
243
|
+
flex: 1;
|
|
244
|
+
min-width: 0;
|
|
245
|
+
}
|
|
246
|
+
.rp-id {
|
|
247
|
+
display: flex;
|
|
248
|
+
align-items: center;
|
|
249
|
+
gap: 6px;
|
|
250
|
+
font-family: ui-monospace, monospace;
|
|
251
|
+
font-size: 10px;
|
|
252
|
+
color: #888;
|
|
253
|
+
}
|
|
254
|
+
.rp-tag {
|
|
255
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
256
|
+
border-radius: 4px;
|
|
257
|
+
padding: 0 4px;
|
|
258
|
+
font-size: 9px;
|
|
259
|
+
}
|
|
260
|
+
.rp-tag.rp-tag-head {
|
|
261
|
+
background: rgba(43, 108, 176, 0.85);
|
|
262
|
+
border-color: rgba(43, 108, 176, 0.95);
|
|
263
|
+
color: #fff;
|
|
264
|
+
}
|
|
265
|
+
.rp-tag.rp-tag-fork {
|
|
266
|
+
color: #d6973f;
|
|
267
|
+
border-color: rgba(214, 151, 63, 0.35);
|
|
268
|
+
}
|
|
269
|
+
.rp-note {
|
|
270
|
+
font-size: 12px;
|
|
271
|
+
color: #eee;
|
|
272
|
+
white-space: nowrap;
|
|
273
|
+
overflow: hidden;
|
|
274
|
+
text-overflow: ellipsis;
|
|
275
|
+
}
|
|
276
|
+
.rp-time {
|
|
277
|
+
font-size: 10px;
|
|
278
|
+
color: #777;
|
|
279
|
+
}
|
|
280
|
+
.rp-node.rp-current .rp-time::after {
|
|
281
|
+
content: ' · on canvas';
|
|
282
|
+
color: #4a9eff;
|
|
283
|
+
}
|
|
284
|
+
.rp-copy {
|
|
285
|
+
font: inherit;
|
|
286
|
+
font-size: 9px;
|
|
287
|
+
color: #ccc;
|
|
288
|
+
background: rgba(20, 20, 22, 0.72);
|
|
289
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
290
|
+
border-radius: 999px;
|
|
291
|
+
padding: 2px 7px;
|
|
292
|
+
cursor: pointer;
|
|
293
|
+
opacity: 0;
|
|
294
|
+
margin-left: auto;
|
|
295
|
+
transition:
|
|
296
|
+
opacity 120ms ease-out,
|
|
297
|
+
background 120ms ease-out;
|
|
298
|
+
}
|
|
299
|
+
.rp-node:hover .rp-copy {
|
|
300
|
+
opacity: 1;
|
|
301
|
+
}
|
|
302
|
+
.rp-copy:hover {
|
|
303
|
+
background: rgba(30, 30, 33, 0.82);
|
|
304
|
+
}
|
|
305
|
+
</style>
|
|
306
|
+
</head>
|
|
307
|
+
<body>
|
|
308
|
+
<div id="cesdk"></div>
|
|
309
|
+
<div id="bar-left">
|
|
310
|
+
<a id="back" class="pill icon" href="{{VIEWER_BASE}}/">←</a>
|
|
311
|
+
<span id="title" class="pill">loading…</span>
|
|
312
|
+
</div>
|
|
313
|
+
<div id="bar-right"></div>
|
|
314
|
+
<aside id="revision-panel"></aside>
|
|
315
|
+
<script type="module" src="{{VIEWER_BASE}}/static/viewer.js"></script>
|
|
316
|
+
</body>
|
|
317
|
+
</html>
|
|
318
|
+
`,
|
|
319
|
+
"revision-panel.js": `// revision-panel.js — the in-viewer revision history panel. Fetches a design's
|
|
320
|
+
// full revision tree from /api/design/<root>/revisions and renders it; clicking
|
|
321
|
+
// a node asks the viewer to navigate there. The viewer drives setCurrent()
|
|
322
|
+
// (highlight) and refresh() (re-fetch on SSE).
|
|
323
|
+
//
|
|
324
|
+
// All DOM is built with createElement + textContent: revision notes are
|
|
325
|
+
// agent-authored text and must never reach innerHTML.
|
|
326
|
+
|
|
327
|
+
// Mount prefix set by index.html ("" on stdio, "/viewer" on HTTP); node hrefs
|
|
328
|
+
// and the revisions fetch are built relative to it. See router.ts.
|
|
329
|
+
const BASE = window.__VIEWER_BASE__ ?? '';
|
|
330
|
+
|
|
331
|
+
export function createRevisionPanel({ container, root, onNavigate, onCount }) {
|
|
332
|
+
let currentRev = null;
|
|
333
|
+
|
|
334
|
+
function relTime(ms) {
|
|
335
|
+
const s = Math.max(0, Math.round((Date.now() - ms) / 1000));
|
|
336
|
+
if (s < 60) return \`\${s}s ago\`;
|
|
337
|
+
const m = Math.round(s / 60);
|
|
338
|
+
if (m < 60) return \`\${m}m ago\`;
|
|
339
|
+
const h = Math.round(m / 60);
|
|
340
|
+
if (h < 24) return \`\${h}h ago\`;
|
|
341
|
+
return \`\${Math.round(h / 24)}d ago\`;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Depth-first walk. At each node the spine child (or, off-spine, the latest
|
|
345
|
+
// child) continues at the same depth; other children are branches at
|
|
346
|
+
// depth + 1, emitted before the continuation so the spine reads top-to-bottom.
|
|
347
|
+
function order(nodes) {
|
|
348
|
+
const byId = new Map(nodes.map((n) => [n.id, n]));
|
|
349
|
+
const children = new Map();
|
|
350
|
+
for (const n of nodes) {
|
|
351
|
+
if (n.parent != null) {
|
|
352
|
+
const sibs = children.get(n.parent) ?? [];
|
|
353
|
+
sibs.push(n);
|
|
354
|
+
children.set(n.parent, sibs);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
for (const sibs of children.values())
|
|
358
|
+
sibs.sort((a, b) => a.createdAt - b.createdAt);
|
|
359
|
+
const rootNode = nodes.find((n) => n.parent === null);
|
|
360
|
+
const head = nodes.reduce((a, b) => (b.createdAt > a.createdAt ? b : a));
|
|
361
|
+
const spine = new Set();
|
|
362
|
+
for (let n = head; n; n = n.parent != null ? byId.get(n.parent) : null)
|
|
363
|
+
spine.add(n.id);
|
|
364
|
+
const out = [];
|
|
365
|
+
function walk(node, depth) {
|
|
366
|
+
out.push({
|
|
367
|
+
node,
|
|
368
|
+
depth,
|
|
369
|
+
isHead: node.id === head.id,
|
|
370
|
+
isRoot: node.parent === null
|
|
371
|
+
});
|
|
372
|
+
const kids = children.get(node.id) ?? [];
|
|
373
|
+
if (kids.length === 0) return;
|
|
374
|
+
const primary =
|
|
375
|
+
kids.find((k) => spine.has(k.id)) ?? kids[kids.length - 1];
|
|
376
|
+
for (const k of kids) if (k !== primary) walk(k, depth + 1);
|
|
377
|
+
walk(primary, depth);
|
|
378
|
+
}
|
|
379
|
+
if (rootNode) walk(rootNode, 0);
|
|
380
|
+
return out;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function tag(text, cls) {
|
|
384
|
+
const el = document.createElement('span');
|
|
385
|
+
el.className = cls ? \`rp-tag \${cls}\` : 'rp-tag';
|
|
386
|
+
el.textContent = text;
|
|
387
|
+
return el;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function makeNode({ node, depth, isHead, isRoot }) {
|
|
391
|
+
const a = document.createElement('a');
|
|
392
|
+
a.className = \`rp-node\${depth > 0 ? ' rp-branch' : ''}\${isHead ? ' rp-head' : ''}\`;
|
|
393
|
+
if (isRoot) a.dataset.root = '';
|
|
394
|
+
a.dataset.rev = node.id;
|
|
395
|
+
a.href = \`\${BASE}/d/\${root}/\${node.id}\`;
|
|
396
|
+
a.style.marginLeft = \`\${depth * 16}px\`;
|
|
397
|
+
if (node.id === currentRev) a.classList.add('rp-current');
|
|
398
|
+
|
|
399
|
+
const row = document.createElement('div');
|
|
400
|
+
row.className = 'rp-node-row';
|
|
401
|
+
if (depth > 0) {
|
|
402
|
+
const elbow = document.createElement('span');
|
|
403
|
+
elbow.className = 'rp-elbow';
|
|
404
|
+
elbow.textContent = '└';
|
|
405
|
+
row.appendChild(elbow);
|
|
406
|
+
}
|
|
407
|
+
const dot = document.createElement('span');
|
|
408
|
+
dot.className = 'rp-dot';
|
|
409
|
+
dot.textContent = '●';
|
|
410
|
+
row.appendChild(dot);
|
|
411
|
+
|
|
412
|
+
const body = document.createElement('div');
|
|
413
|
+
body.className = 'rp-body';
|
|
414
|
+
|
|
415
|
+
const idLine = document.createElement('div');
|
|
416
|
+
idLine.className = 'rp-id';
|
|
417
|
+
const idText = document.createElement('span');
|
|
418
|
+
idText.textContent = node.id.slice(0, 7);
|
|
419
|
+
idLine.appendChild(idText);
|
|
420
|
+
if (isRoot) idLine.appendChild(tag('root', ''));
|
|
421
|
+
if (isHead) idLine.appendChild(tag('head', 'rp-tag-head'));
|
|
422
|
+
if (depth > 0) idLine.appendChild(tag('⑂ fork', 'rp-tag-fork'));
|
|
423
|
+
|
|
424
|
+
const copy = document.createElement('button');
|
|
425
|
+
copy.type = 'button';
|
|
426
|
+
copy.className = 'rp-copy';
|
|
427
|
+
copy.textContent = '⧉ copy id';
|
|
428
|
+
copy.addEventListener('click', async (e) => {
|
|
429
|
+
e.preventDefault();
|
|
430
|
+
e.stopPropagation();
|
|
431
|
+
try {
|
|
432
|
+
await navigator.clipboard?.writeText(node.id);
|
|
433
|
+
copy.textContent = 'copied';
|
|
434
|
+
setTimeout(() => {
|
|
435
|
+
copy.textContent = '⧉ copy id';
|
|
436
|
+
}, 1200);
|
|
437
|
+
} catch {
|
|
438
|
+
/* clipboard unavailable — fail quietly (spec §6) */
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
idLine.appendChild(copy);
|
|
442
|
+
body.appendChild(idLine);
|
|
443
|
+
|
|
444
|
+
const note = document.createElement('div');
|
|
445
|
+
note.className = 'rp-note';
|
|
446
|
+
note.textContent = node.note || '(no note)';
|
|
447
|
+
note.title = node.note || '';
|
|
448
|
+
body.appendChild(note);
|
|
449
|
+
|
|
450
|
+
const time = document.createElement('div');
|
|
451
|
+
time.className = 'rp-time';
|
|
452
|
+
time.textContent = relTime(node.createdAt);
|
|
453
|
+
body.appendChild(time);
|
|
454
|
+
|
|
455
|
+
row.appendChild(body);
|
|
456
|
+
a.appendChild(row);
|
|
457
|
+
|
|
458
|
+
a.addEventListener('click', (e) => {
|
|
459
|
+
// Modified clicks (⌘/Ctrl/Shift/middle) fall through to the browser,
|
|
460
|
+
// which opens the pinned /d/<root>/<rev> href in a new tab.
|
|
461
|
+
if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
|
|
462
|
+
return;
|
|
463
|
+
e.preventDefault();
|
|
464
|
+
onNavigate(node.id);
|
|
465
|
+
});
|
|
466
|
+
return a;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
function paint(nodes) {
|
|
470
|
+
container.replaceChildren();
|
|
471
|
+
const header = document.createElement('div');
|
|
472
|
+
header.className = 'rp-header';
|
|
473
|
+
header.textContent = 'Revisions';
|
|
474
|
+
container.appendChild(header);
|
|
475
|
+
if (nodes.length === 0) {
|
|
476
|
+
const empty = document.createElement('div');
|
|
477
|
+
empty.className = 'rp-empty';
|
|
478
|
+
empty.textContent = 'no revisions yet';
|
|
479
|
+
container.appendChild(empty);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
const tree = document.createElement('div');
|
|
483
|
+
tree.className = 'rp-tree';
|
|
484
|
+
for (const item of order(nodes)) tree.appendChild(makeNode(item));
|
|
485
|
+
container.appendChild(tree);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
function showError(message) {
|
|
489
|
+
container.replaceChildren();
|
|
490
|
+
const el = document.createElement('div');
|
|
491
|
+
el.className = 'rp-empty';
|
|
492
|
+
el.textContent = message;
|
|
493
|
+
container.appendChild(el);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
async function refresh() {
|
|
497
|
+
try {
|
|
498
|
+
const res = await fetch(\`\${BASE}/api/design/\${root}/revisions\`);
|
|
499
|
+
if (!res.ok) throw new Error(String(res.status));
|
|
500
|
+
const nodes = await res.json();
|
|
501
|
+
paint(nodes);
|
|
502
|
+
onCount(nodes.length);
|
|
503
|
+
} catch {
|
|
504
|
+
showError("couldn't load history");
|
|
505
|
+
onCount(0);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function setCurrent(rev) {
|
|
510
|
+
currentRev = rev;
|
|
511
|
+
for (const el of container.querySelectorAll('.rp-node')) {
|
|
512
|
+
el.classList.toggle('rp-current', el.dataset.rev === rev);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
refresh();
|
|
517
|
+
return { setCurrent, refresh };
|
|
518
|
+
}
|
|
519
|
+
`,
|
|
520
|
+
"studio.html": `<!doctype html>
|
|
521
|
+
<html lang="en">
|
|
522
|
+
<head>
|
|
523
|
+
<meta charset="utf-8" />
|
|
524
|
+
<title>IMG.LY CODESIGN MCP Workspace</title>
|
|
525
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
526
|
+
<!-- Mount prefix injected by the viewer router (router.ts). "" on the stdio
|
|
527
|
+
listener, "/viewer" on the HTTP transport. Read by studio.js. -->
|
|
528
|
+
<script>
|
|
529
|
+
window.__VIEWER_BASE__ = '{{VIEWER_BASE}}';
|
|
530
|
+
</script>
|
|
531
|
+
<style>
|
|
532
|
+
/* -------- reset --------
|
|
533
|
+
Same palette + typography as the viewer SPA so the overview reads
|
|
534
|
+
as part of the same product. See src/viewer/spa/index.html. */
|
|
535
|
+
html,
|
|
536
|
+
body {
|
|
537
|
+
margin: 0;
|
|
538
|
+
padding: 0;
|
|
539
|
+
min-height: 100%;
|
|
540
|
+
background: #1d1d1f;
|
|
541
|
+
color: #eee;
|
|
542
|
+
font-family: -apple-system, system-ui, sans-serif;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/* -------- sticky frosted strip --------
|
|
546
|
+
Same frosted-glass material as the viewer pills + history panel:
|
|
547
|
+
translucent dark + backdrop-blur + 1px hairline border. Sticky so
|
|
548
|
+
the title stays visible while scrolling. */
|
|
549
|
+
#bar {
|
|
550
|
+
position: sticky;
|
|
551
|
+
top: 0;
|
|
552
|
+
z-index: 10;
|
|
553
|
+
padding: 14px 24px;
|
|
554
|
+
background: rgba(20, 20, 22, 0.72);
|
|
555
|
+
backdrop-filter: blur(12px);
|
|
556
|
+
-webkit-backdrop-filter: blur(12px);
|
|
557
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
|
558
|
+
}
|
|
559
|
+
#bar .title {
|
|
560
|
+
font:
|
|
561
|
+
600 14px -apple-system,
|
|
562
|
+
system-ui,
|
|
563
|
+
sans-serif;
|
|
564
|
+
letter-spacing: 0.02em;
|
|
565
|
+
color: #e8e8e8;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/* -------- design grid -------- */
|
|
569
|
+
.grid {
|
|
570
|
+
display: grid;
|
|
571
|
+
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
|
572
|
+
gap: 16px;
|
|
573
|
+
padding: 24px;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
.empty {
|
|
577
|
+
padding: 24px 4px;
|
|
578
|
+
font-size: 13px;
|
|
579
|
+
color: #888;
|
|
580
|
+
}
|
|
581
|
+
.empty code {
|
|
582
|
+
font-family: ui-monospace, monospace;
|
|
583
|
+
background: rgba(255, 255, 255, 0.05);
|
|
584
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
585
|
+
border-radius: 4px;
|
|
586
|
+
padding: 1px 6px;
|
|
587
|
+
font-size: 12px;
|
|
588
|
+
color: #cfcfcf;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/* -------- card --------
|
|
592
|
+
Frosted-glass card, same materials as the history panel rows.
|
|
593
|
+
Hover lifts the card and brightens the border + shadow to match the
|
|
594
|
+
pill-hover pattern in the viewer chrome. */
|
|
595
|
+
.card {
|
|
596
|
+
display: block;
|
|
597
|
+
text-decoration: none;
|
|
598
|
+
color: inherit;
|
|
599
|
+
background: rgba(20, 20, 22, 0.72);
|
|
600
|
+
backdrop-filter: blur(12px);
|
|
601
|
+
-webkit-backdrop-filter: blur(12px);
|
|
602
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
603
|
+
border-radius: 12px;
|
|
604
|
+
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25);
|
|
605
|
+
overflow: hidden;
|
|
606
|
+
transition:
|
|
607
|
+
transform 120ms ease-out,
|
|
608
|
+
border-color 120ms ease-out,
|
|
609
|
+
box-shadow 120ms ease-out;
|
|
610
|
+
}
|
|
611
|
+
.card:hover {
|
|
612
|
+
transform: translateY(-2px);
|
|
613
|
+
border-color: rgba(255, 255, 255, 0.15);
|
|
614
|
+
box-shadow: 0 8px 22px rgba(0, 0, 0, 0.35);
|
|
615
|
+
}
|
|
616
|
+
.card img {
|
|
617
|
+
display: block;
|
|
618
|
+
width: 100%;
|
|
619
|
+
aspect-ratio: 4/3;
|
|
620
|
+
object-fit: cover;
|
|
621
|
+
background: #000;
|
|
622
|
+
}
|
|
623
|
+
.card .meta {
|
|
624
|
+
padding: 12px 14px;
|
|
625
|
+
}
|
|
626
|
+
.card .title {
|
|
627
|
+
font:
|
|
628
|
+
600 13px -apple-system,
|
|
629
|
+
system-ui,
|
|
630
|
+
sans-serif;
|
|
631
|
+
color: #eee;
|
|
632
|
+
overflow: hidden;
|
|
633
|
+
text-overflow: ellipsis;
|
|
634
|
+
white-space: nowrap;
|
|
635
|
+
}
|
|
636
|
+
.card .updated {
|
|
637
|
+
margin-top: 4px;
|
|
638
|
+
font-size: 11px;
|
|
639
|
+
color: #888;
|
|
640
|
+
}
|
|
641
|
+
</style>
|
|
642
|
+
</head>
|
|
643
|
+
<body>
|
|
644
|
+
<header id="bar">
|
|
645
|
+
<span class="title">IMG.LY CODESIGN MCP Workspace</span>
|
|
646
|
+
</header>
|
|
647
|
+
<div id="grid" class="grid"></div>
|
|
648
|
+
<script type="module" src="{{VIEWER_BASE}}/static/studio.js"></script>
|
|
649
|
+
</body>
|
|
650
|
+
</html>
|
|
651
|
+
`,
|
|
652
|
+
"studio.js": `// Workspace overview landing page. Fetches /api/designs and renders one card
|
|
653
|
+
// per design (keyed by root revision). Re-renders on tab focus and a 10s poll
|
|
654
|
+
// so card links and thumbnails never go stale after the agent edits.
|
|
655
|
+
//
|
|
656
|
+
// DOM is built with createElement + textContent (never innerHTML for
|
|
657
|
+
// design-supplied strings) so an author-controlled title can't escape into
|
|
658
|
+
// HTML. Same pattern as viewer.js.
|
|
659
|
+
|
|
660
|
+
// Mount prefix set by studio.html ("" on stdio, "/viewer" on HTTP); card
|
|
661
|
+
// links, thumbnails, and the designs fetch are built relative to it. See
|
|
662
|
+
// router.ts.
|
|
663
|
+
const BASE = window.__VIEWER_BASE__ ?? '';
|
|
664
|
+
|
|
665
|
+
const grid = document.getElementById('grid');
|
|
666
|
+
|
|
667
|
+
function buildCard(d) {
|
|
668
|
+
const card = document.createElement('a');
|
|
669
|
+
card.className = 'card';
|
|
670
|
+
card.href = \`\${BASE}/d/\${d.rootRevision}\`;
|
|
671
|
+
|
|
672
|
+
const img = document.createElement('img');
|
|
673
|
+
img.src = \`\${BASE}/snapshot/\${d.latestLeaf}/thumbnail\`;
|
|
674
|
+
img.alt = '';
|
|
675
|
+
img.addEventListener('error', () => {
|
|
676
|
+
img.style.display = 'none';
|
|
677
|
+
});
|
|
678
|
+
card.appendChild(img);
|
|
679
|
+
|
|
680
|
+
const meta = document.createElement('div');
|
|
681
|
+
meta.className = 'meta';
|
|
682
|
+
|
|
683
|
+
const title = document.createElement('div');
|
|
684
|
+
title.className = 'title';
|
|
685
|
+
title.textContent = d.title || 'Untitled';
|
|
686
|
+
meta.appendChild(title);
|
|
687
|
+
|
|
688
|
+
const updated = document.createElement('div');
|
|
689
|
+
updated.className = 'updated';
|
|
690
|
+
updated.textContent = \`updated \${new Date(d.updatedAt).toLocaleString()}\`;
|
|
691
|
+
meta.appendChild(updated);
|
|
692
|
+
|
|
693
|
+
card.appendChild(meta);
|
|
694
|
+
return card;
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
function renderEmptyText(text) {
|
|
698
|
+
const div = document.createElement('div');
|
|
699
|
+
div.className = 'empty';
|
|
700
|
+
div.textContent = text;
|
|
701
|
+
grid.replaceChildren(div);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
function renderFirstRunEmpty() {
|
|
705
|
+
const div = document.createElement('div');
|
|
706
|
+
div.className = 'empty';
|
|
707
|
+
div.appendChild(document.createTextNode('No designs yet — your first '));
|
|
708
|
+
const code = document.createElement('code');
|
|
709
|
+
code.textContent = 'edit({ parent: null, ... })';
|
|
710
|
+
div.appendChild(code);
|
|
711
|
+
div.appendChild(document.createTextNode(' will land here.'));
|
|
712
|
+
grid.replaceChildren(div);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
async function render() {
|
|
716
|
+
const res = await fetch(\`\${BASE}/api/designs\`);
|
|
717
|
+
if (!res.ok) {
|
|
718
|
+
renderEmptyText(\`failed to load designs: \${res.status}\`);
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
const designs = await res.json();
|
|
722
|
+
if (designs.length === 0) {
|
|
723
|
+
renderFirstRunEmpty();
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
grid.replaceChildren(...designs.map(buildCard));
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// \`render()\` rejects on a network error; every caller logs it rather than
|
|
730
|
+
// leaving an unhandled promise rejection.
|
|
731
|
+
await render().catch(console.error);
|
|
732
|
+
document.addEventListener('visibilitychange', () => {
|
|
733
|
+
if (!document.hidden) render().catch(console.error);
|
|
734
|
+
});
|
|
735
|
+
setInterval(() => render().catch(console.error), 10000);
|
|
736
|
+
`,
|
|
737
|
+
"viewer.js": `// Read-only CE.SDK viewer with a revision-history side panel.
|
|
738
|
+
// /d/<root> LIVE — opens at the design head, follows new revisions
|
|
739
|
+
// /d/<root>/<rev> PINNED — opens frozen at <rev>
|
|
740
|
+
//
|
|
741
|
+
// Chrome is floating pill clusters in the corners; the history panel is a
|
|
742
|
+
// detached card on the right.
|
|
743
|
+
// See: docs/superpowers/specs/2026-05-24-viewer-ui-refresh-design.md
|
|
744
|
+
//
|
|
745
|
+
// Navigation is client-side: clicking a panel node (or the "Go Live →"
|
|
746
|
+
// affordance) swaps the canvas and rewrites the URL via the History API — one
|
|
747
|
+
// CE.SDK instance for the life of the tab. The SSE connection is held open
|
|
748
|
+
// in BOTH modes so the panel's tree always stays fresh; it moves the canvas
|
|
749
|
+
// only while \`following\`.
|
|
750
|
+
|
|
751
|
+
// Mount prefix set by index.html ("" on stdio, "/viewer" on HTTP). Every
|
|
752
|
+
// API/asset/history URL below is built relative to it so the SPA works under
|
|
753
|
+
// any mount path. See router.ts.
|
|
754
|
+
const BASE = window.__VIEWER_BASE__ ?? '';
|
|
755
|
+
|
|
756
|
+
// Path of the current page with the mount prefix stripped, so PATH_RE (which
|
|
757
|
+
// is written relative to the SPA root) matches under "/viewer" too.
|
|
758
|
+
const relPath = () =>
|
|
759
|
+
location.pathname.startsWith(BASE)
|
|
760
|
+
? location.pathname.slice(BASE.length)
|
|
761
|
+
: location.pathname;
|
|
762
|
+
|
|
763
|
+
const { createRevisionPanel } = await import(
|
|
764
|
+
\`\${BASE}/static/revision-panel.js\`
|
|
765
|
+
);
|
|
766
|
+
|
|
767
|
+
const PATH_RE = /^\\/d\\/([0-9a-f]{12})(?:\\/([0-9a-f]{12}))?$/;
|
|
768
|
+
const titleEl = document.getElementById('title');
|
|
769
|
+
const barRightEl = document.getElementById('bar-right');
|
|
770
|
+
const panelEl = document.getElementById('revision-panel');
|
|
771
|
+
|
|
772
|
+
const match = relPath().match(PATH_RE);
|
|
773
|
+
|
|
774
|
+
if (!match) {
|
|
775
|
+
titleEl.textContent = 'invalid URL';
|
|
776
|
+
} else {
|
|
777
|
+
const root = match[1];
|
|
778
|
+
|
|
779
|
+
// Server-supplied license + resource base, fetched before bootstrapping
|
|
780
|
+
// CE.SDK. CE.SDK validates the license regardless of role; \`resourceBase\`
|
|
781
|
+
// is where workspace:// asset URIs resolve.
|
|
782
|
+
const cfgRes = await fetch(\`\${BASE}/api/config\`);
|
|
783
|
+
if (!cfgRes.ok) throw new Error(\`/api/config failed: \${cfgRes.status}\`);
|
|
784
|
+
const { license, resourceBase } = await cfgRes.json();
|
|
785
|
+
|
|
786
|
+
const cesdkMod =
|
|
787
|
+
await import('https://cdn.img.ly/packages/imgly/cesdk-js/1.74.0/index.js');
|
|
788
|
+
const CreativeEditorSDK = cesdkMod.default ?? cesdkMod.CreativeEditorSDK;
|
|
789
|
+
const instance = await CreativeEditorSDK.create(
|
|
790
|
+
document.getElementById('cesdk'),
|
|
791
|
+
{
|
|
792
|
+
license,
|
|
793
|
+
role: 'Viewer',
|
|
794
|
+
theme: 'dark',
|
|
795
|
+
// The refresh moved all chrome out of CE.SDK and into our own floating
|
|
796
|
+
// pills + history panel — back / title / LIVE / Go Live / hash / History.
|
|
797
|
+
// CE.SDK's own nav + dock would render in the same physical space and,
|
|
798
|
+
// because #cesdk has no stacking context, their internal z-indexes
|
|
799
|
+
// outrank our z:10 pills, hiding them. \`ui.hide: true\` disables the
|
|
800
|
+
// CE.SDK chrome entirely; users keep mousewheel zoom + drag-to-pan via
|
|
801
|
+
// the engine, which is unaffected.
|
|
802
|
+
ui: { hide: true }
|
|
803
|
+
}
|
|
804
|
+
);
|
|
805
|
+
|
|
806
|
+
// Resolve workspace:// asset URIs to the /r/ HTTP route.
|
|
807
|
+
const absResourceBase = location.origin + resourceBase;
|
|
808
|
+
instance.engine.editor.setURIResolver((uri, defaultResolver) =>
|
|
809
|
+
uri.startsWith('workspace://')
|
|
810
|
+
? absResourceBase + uri.slice('workspace://'.length)
|
|
811
|
+
: defaultResolver(uri)
|
|
812
|
+
);
|
|
813
|
+
|
|
814
|
+
// --- runtime state ----------------------------------------------------
|
|
815
|
+
let head = null; // the design's latest leaf
|
|
816
|
+
let currentRev = null; // the revision currently on canvas
|
|
817
|
+
let following = false; // true → the canvas tracks head as SSE arrives
|
|
818
|
+
let newCount = 0; // revisions arrived since following stopped
|
|
819
|
+
let panelOpen = false; // whether the history panel is visible
|
|
820
|
+
|
|
821
|
+
async function loadRevision(rev) {
|
|
822
|
+
const res = await fetch(\`\${BASE}/snapshot/\${rev}\`);
|
|
823
|
+
if (!res.ok) throw new Error(\`snapshot \${rev} \${res.status}\`);
|
|
824
|
+
const snap = await res.json();
|
|
825
|
+
await instance.engine.scene.loadFromString(snap.scene);
|
|
826
|
+
titleEl.textContent = snap.title ?? 'Untitled';
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
// Builds the right-side cluster from current state. Idempotent — called on
|
|
830
|
+
// every mode flip, panel toggle, and newCount change. Uses createElement +
|
|
831
|
+
// textContent everywhere (never innerHTML) so any author-supplied strings
|
|
832
|
+
// can't escape into HTML.
|
|
833
|
+
function renderRightCluster() {
|
|
834
|
+
const nodes = [];
|
|
835
|
+
|
|
836
|
+
if (following) {
|
|
837
|
+
// LIVE — read-only green-dot pill.
|
|
838
|
+
const live = document.createElement('span');
|
|
839
|
+
live.className = 'pill live';
|
|
840
|
+
live.textContent = 'LIVE';
|
|
841
|
+
nodes.push(live);
|
|
842
|
+
} else {
|
|
843
|
+
// PINNED — hash chip (click-to-copy) + Go Live (+ count badge).
|
|
844
|
+
const hash = document.createElement('button');
|
|
845
|
+
hash.type = 'button';
|
|
846
|
+
hash.className = 'pill hash';
|
|
847
|
+
hash.title = 'copy revision id';
|
|
848
|
+
hash.textContent = currentRev ? currentRev.slice(0, 7) : '';
|
|
849
|
+
hash.addEventListener('click', async () => {
|
|
850
|
+
if (!currentRev) return;
|
|
851
|
+
try {
|
|
852
|
+
await navigator.clipboard?.writeText(currentRev);
|
|
853
|
+
} catch {
|
|
854
|
+
/* clipboard unavailable — fail quietly (matches .rp-copy) */
|
|
855
|
+
}
|
|
856
|
+
});
|
|
857
|
+
nodes.push(hash);
|
|
858
|
+
|
|
859
|
+
const golive = document.createElement('button');
|
|
860
|
+
golive.type = 'button';
|
|
861
|
+
golive.className = 'pill golive';
|
|
862
|
+
golive.appendChild(document.createTextNode('Go Live →'));
|
|
863
|
+
if (newCount > 0) {
|
|
864
|
+
const count = document.createElement('span');
|
|
865
|
+
count.className = 'count';
|
|
866
|
+
count.textContent = String(newCount);
|
|
867
|
+
golive.appendChild(count);
|
|
868
|
+
}
|
|
869
|
+
golive.addEventListener('click', (e) => {
|
|
870
|
+
if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
|
|
871
|
+
return;
|
|
872
|
+
e.preventDefault();
|
|
873
|
+
if (head) show(head, { following: true, historyMode: 'push' });
|
|
874
|
+
});
|
|
875
|
+
nodes.push(golive);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
const history = document.createElement('button');
|
|
879
|
+
history.type = 'button';
|
|
880
|
+
history.className = \`pill history\${panelOpen ? ' active' : ''}\`;
|
|
881
|
+
history.textContent = 'History';
|
|
882
|
+
history.addEventListener('click', () => setPanelOpen(!panelOpen));
|
|
883
|
+
nodes.push(history);
|
|
884
|
+
|
|
885
|
+
barRightEl.replaceChildren(...nodes);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
function setPanelOpen(open) {
|
|
889
|
+
panelOpen = open;
|
|
890
|
+
document.body.classList.toggle('panel-open', open);
|
|
891
|
+
renderRightCluster();
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
// The single navigation primitive. Loads \`rev\` onto the canvas, sets the
|
|
895
|
+
// LIVE/PINNED state, and writes the URL. \`historyMode\`: "push" adds a
|
|
896
|
+
// history entry, "replace" rewrites in place, "none" leaves history alone
|
|
897
|
+
// (used by popstate, where the browser already changed the URL).
|
|
898
|
+
async function show(rev, { following: nextFollowing, historyMode }) {
|
|
899
|
+
try {
|
|
900
|
+
await loadRevision(rev);
|
|
901
|
+
currentRev = rev;
|
|
902
|
+
following = nextFollowing;
|
|
903
|
+
if (following) newCount = 0;
|
|
904
|
+
const url = following ? \`\${BASE}/d/\${root}\` : \`\${BASE}/d/\${root}/\${rev}\`;
|
|
905
|
+
if (historyMode === 'push') window.history.pushState({ rev }, '', url);
|
|
906
|
+
else if (historyMode === 'replace')
|
|
907
|
+
window.history.replaceState({ rev }, '', url);
|
|
908
|
+
panel.setCurrent(rev);
|
|
909
|
+
} catch {
|
|
910
|
+
titleEl.textContent = 'unknown revision';
|
|
911
|
+
}
|
|
912
|
+
renderRightCluster();
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
// --- revision panel ---------------------------------------------------
|
|
916
|
+
const panel = createRevisionPanel({
|
|
917
|
+
container: panelEl,
|
|
918
|
+
root,
|
|
919
|
+
// Clicking a node pins it — unless it is the head, which is LIVE.
|
|
920
|
+
onNavigate: (rev) =>
|
|
921
|
+
show(rev, { following: rev === head, historyMode: 'push' }),
|
|
922
|
+
onCount: () => {
|
|
923
|
+
/* The History pill no longer carries the total count; the unseen-since-
|
|
924
|
+
pin count lives on Go Live and is driven by \`newCount\` directly. */
|
|
925
|
+
}
|
|
926
|
+
});
|
|
927
|
+
|
|
928
|
+
// --- keyboard ---------------------------------------------------------
|
|
929
|
+
window.addEventListener('keydown', (e) => {
|
|
930
|
+
if (e.key === 'Escape' && panelOpen) setPanelOpen(false);
|
|
931
|
+
});
|
|
932
|
+
|
|
933
|
+
// --- bootstrap --------------------------------------------------------
|
|
934
|
+
let latestLeaf;
|
|
935
|
+
try {
|
|
936
|
+
const res = await fetch(\`\${BASE}/api/design/\${root}\`);
|
|
937
|
+
if (!res.ok) throw new Error(String(res.status));
|
|
938
|
+
latestLeaf = (await res.json()).latestLeaf;
|
|
939
|
+
} catch {
|
|
940
|
+
titleEl.textContent = 'unknown design';
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
if (latestLeaf !== undefined) {
|
|
944
|
+
head = latestLeaf;
|
|
945
|
+
const pinned = match[2]; // undefined → LIVE
|
|
946
|
+
// Mode is the URL shape: a pinned URL stays pinned even if <rev> is head.
|
|
947
|
+
await show(pinned ?? head, {
|
|
948
|
+
following: pinned === undefined,
|
|
949
|
+
historyMode: 'replace'
|
|
950
|
+
});
|
|
951
|
+
|
|
952
|
+
// SSE — held open for the life of the tab, in both modes. Every event
|
|
953
|
+
// refreshes the panel's tree; it moves the canvas only while following.
|
|
954
|
+
const es = new EventSource(\`\${BASE}/sse/\${root}\`);
|
|
955
|
+
es.onmessage = (ev) => {
|
|
956
|
+
let payload;
|
|
957
|
+
try {
|
|
958
|
+
payload = JSON.parse(ev.data);
|
|
959
|
+
} catch (err) {
|
|
960
|
+
console.error('sse parse failed', err);
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
963
|
+
if (!payload || typeof payload.revision !== 'string') return;
|
|
964
|
+
head = payload.revision;
|
|
965
|
+
panel.refresh();
|
|
966
|
+
if (following) {
|
|
967
|
+
show(head, { following: true, historyMode: 'replace' });
|
|
968
|
+
} else {
|
|
969
|
+
newCount += 1;
|
|
970
|
+
renderRightCluster();
|
|
971
|
+
}
|
|
972
|
+
};
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
// Browser back/forward: re-resolve the URL shape and sync, without writing
|
|
976
|
+
// history (the entry already changed).
|
|
977
|
+
window.addEventListener('popstate', () => {
|
|
978
|
+
const m = relPath().match(PATH_RE);
|
|
979
|
+
if (!m || m[1] !== root) return;
|
|
980
|
+
const pinned = m[2];
|
|
981
|
+
show(pinned ?? head, {
|
|
982
|
+
following: pinned === undefined,
|
|
983
|
+
historyMode: 'none'
|
|
984
|
+
});
|
|
985
|
+
});
|
|
986
|
+
}
|
|
987
|
+
`,
|
|
988
|
+
};
|
|
989
|
+
//# sourceMappingURL=spa-assets.generated.js.map
|