@orangecatai/adgen-canvas 0.0.39 → 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/dist/dev/chunk-2K6ZAAHB.js +1535 -0
- package/dist/dev/chunk-2K6ZAAHB.js.map +7 -0
- package/dist/dev/{chunk-E7VZGEUJ.js → chunk-2Q5Z4UTF.js} +2 -2
- package/dist/dev/{chunk-E7VZGEUJ.js.map → chunk-2Q5Z4UTF.js.map} +1 -1
- package/dist/dev/{chunk-LIELFD5T.js → chunk-3WIRZ6S7.js} +6 -1
- package/dist/dev/chunk-3WIRZ6S7.js.map +7 -0
- package/dist/dev/{chunk-5XP2WJAQ.js → chunk-7XZBXIDZ.js} +1300 -1252
- package/dist/dev/chunk-7XZBXIDZ.js.map +7 -0
- package/dist/dev/chunk-AKA4GZ3R.js +62 -0
- package/dist/dev/chunk-AKA4GZ3R.js.map +7 -0
- package/dist/dev/chunk-LWUV2KR2.js +27 -0
- package/dist/dev/chunk-LWUV2KR2.js.map +7 -0
- package/dist/dev/chunk-T57LHRZV.js +2167 -0
- package/dist/dev/chunk-T57LHRZV.js.map +7 -0
- package/dist/dev/components/auto-resize/nativeResizeAgent-5XWJJ74W.js +1074 -0
- package/dist/dev/components/auto-resize/nativeResizeAgent-5XWJJ74W.js.map +7 -0
- package/dist/dev/data/{image-PUPXCX7M.js → image-MTDE3WXB.js} +4 -3
- package/dist/dev/index.css +618 -27
- package/dist/dev/index.css.map +3 -3
- package/dist/dev/index.js +6769 -8217
- package/dist/dev/index.js.map +4 -4
- package/dist/dev/locales/{en-VCZQBJ2N.js → en-3S2H3QGO.js} +2 -2
- package/dist/dev/model-capabilities.js +47 -0
- package/dist/dev/model-capabilities.js.map +7 -0
- package/dist/dev/subset-shared.chunk.js +1 -1
- package/dist/dev/subset-worker.chunk.js +1 -1
- package/dist/prod/chunk-6YYSQB5E.js +1 -0
- package/dist/prod/{chunk-CLQPYXMS.js → chunk-PIM2DC2L.js} +3 -3
- package/dist/prod/chunk-POCDVKZK.js +142 -0
- package/dist/prod/chunk-PWBUVPCU.js +1 -0
- package/dist/prod/{chunk-WBFDC4WN.js → chunk-R4DNAEVN.js} +1 -1
- package/dist/prod/chunk-U2I2OXQ7.js +4 -0
- package/dist/prod/chunk-UR7GPHHO.js +1 -0
- package/dist/prod/components/auto-resize/nativeResizeAgent-45UNA3LO.js +5 -0
- package/dist/prod/data/image-U4RMOYQQ.js +1 -0
- package/dist/prod/index.css +1 -1
- package/dist/prod/index.js +67 -298
- package/dist/prod/locales/{en-ZZURI326.js → en-Z3CKUL4S.js} +1 -1
- package/dist/prod/model-capabilities.js +1 -0
- package/dist/prod/subset-shared.chunk.js +1 -1
- package/dist/prod/subset-worker.chunk.js +1 -1
- package/dist/types/common/src/utils.d.ts +4 -1
- package/dist/types/element/src/index.d.ts +3 -0
- package/dist/types/element/src/newElement.d.ts +2 -1
- package/dist/types/element/src/textHtml.d.ts +14 -0
- package/dist/types/element/src/textLayout.d.ts +97 -0
- package/dist/types/element/src/textStyleRanges.d.ts +62 -0
- package/dist/types/element/src/textWrapping.d.ts +27 -0
- package/dist/types/element/src/types.d.ts +35 -0
- package/dist/types/excalidraw/actions/actionFrame.d.ts +1 -0
- package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +1 -0
- package/dist/types/excalidraw/actions/actionProperties.d.ts +50 -0
- package/dist/types/excalidraw/actions/index.d.ts +1 -1
- package/dist/types/excalidraw/actions/types.d.ts +1 -1
- package/dist/types/excalidraw/components/AIChatPanel.d.ts +18 -2
- package/dist/types/excalidraw/components/App.d.ts +6 -0
- package/dist/types/excalidraw/components/FontSizeInput.d.ts +19 -0
- package/dist/types/excalidraw/components/ImageGeneratorPanel.d.ts +946 -45
- package/dist/types/excalidraw/components/VideoGeneratorPanel.d.ts +67 -53
- package/dist/types/excalidraw/components/ai-chat/ActivityTimeline.d.ts +18 -0
- package/dist/types/excalidraw/components/ai-chat/activitySteps.d.ts +106 -0
- package/dist/types/excalidraw/components/ai-chat/agentLoop.d.ts +66 -3
- package/dist/types/excalidraw/components/ai-chat/canvasTools.d.ts +23 -8
- package/dist/types/excalidraw/components/ai-chat/htmlToExcalidraw.d.ts +3 -0
- package/dist/types/excalidraw/components/ai-chat/openRouterStream.d.ts +13 -0
- package/dist/types/excalidraw/components/auto-resize/ResizeActivityCard.d.ts +7 -0
- package/dist/types/excalidraw/components/auto-resize/autoResizeEngine.d.ts +5 -2
- package/dist/types/excalidraw/components/auto-resize/autoResizeStore.d.ts +23 -0
- package/dist/types/excalidraw/components/auto-resize/imageBounds.d.ts +11 -0
- package/dist/types/excalidraw/components/auto-resize/nativeResizeAgent.d.ts +5 -0
- package/dist/types/excalidraw/components/auto-resize/resizeFitting.d.ts +7 -0
- package/dist/types/excalidraw/components/auto-resize/resizeLayout.d.ts +33 -0
- package/dist/types/excalidraw/components/icons.d.ts +6 -0
- package/dist/types/excalidraw/components/template-builder/TemplateBuilderTray.d.ts +1 -0
- package/dist/types/excalidraw/index.d.ts +9 -0
- package/dist/types/excalidraw/modelCapabilities/index.d.ts +17 -0
- package/dist/types/excalidraw/modelCapabilities/registry.image.d.ts +2 -0
- package/dist/types/excalidraw/modelCapabilities/registry.video.d.ts +2 -0
- package/dist/types/excalidraw/modelCapabilities/shared.d.ts +24 -0
- package/dist/types/excalidraw/modelCapabilities/types.d.ts +276 -0
- package/dist/types/excalidraw/modelCapabilities/validate.d.ts +48 -0
- package/dist/types/excalidraw/types.d.ts +4 -4
- package/dist/types/excalidraw/utils/imageApi.d.ts +3 -0
- package/dist/types/excalidraw/utils/referenceBudget.d.ts +12 -23
- package/dist/types/excalidraw/utils/videoApi.d.ts +21 -1
- package/dist/types/excalidraw/wysiwyg/richTextEditable.d.ts +36 -0
- package/dist/types/excalidraw/wysiwyg/textSelectionStyles.d.ts +32 -0
- package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +6 -2
- package/package.json +10 -4
- package/dist/dev/chunk-5XP2WJAQ.js.map +0 -7
- package/dist/dev/chunk-LIELFD5T.js.map +0 -7
- package/dist/prod/chunk-T3ZLBHX4.js +0 -4
- package/dist/prod/data/image-AG3CTRSJ.js +0 -1
- /package/dist/dev/data/{image-PUPXCX7M.js.map → image-MTDE3WXB.js.map} +0 -0
- /package/dist/dev/locales/{en-VCZQBJ2N.js.map → en-3S2H3QGO.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../modelCapabilities/shared.ts", "../../modelCapabilities/registry.image.ts", "../../modelCapabilities/registry.video.ts", "../../modelCapabilities/validate.ts", "../../modelCapabilities/index.ts"],
|
|
4
|
+
"sourcesContent": ["// Small shared building blocks for the capability records. Import-free.\n\nimport type { AssetCapabilities, FrameCapabilities } from \"./types\";\n\nexport const MB = 1024 * 1024;\n\n/** Image models have no frame slots at all. */\nexport const NO_FRAMES: FrameCapabilities = {\n start: { supported: false, maxImages: 0 },\n end: { supported: false, maxImages: 0 },\n allowsStartAndEndTogether: false,\n endFrameRequiresStartFrame: false,\n};\n\n/**\n * Per-asset dimension/size fields left UNCHECKED because the provider does not\n * document them.\n *\n * Conservative defaults cut two different ways, and the distinction matters:\n *\n * - For COUNTS and COMBINATIONS, the safest default is restrictive. Sending\n * one reference too many, or an unsupported refs+frames mix, means a paid\n * request that fails upstream. So an undocumented cap becomes the tightest\n * documented-adjacent value (MAI Image -> 1 image; Veo refs+frames -> not\n * allowed).\n *\n * - For per-asset DIMENSION bounds, the safest default is no check at all.\n * Inventing a ceiling would reject images the provider would have accepted,\n * turning a missing doc into a broken feature. The transport guard\n * (REFERENCE_WIRE_BUDGET_BYTES) still bounds the payload.\n *\n * Every field defaulted this way is listed in the record's `unknownFields`.\n */\nexport const unchecked: Pick<\n AssetCapabilities,\n | \"maxImageBytes\"\n | \"minEdgePx\"\n | \"maxEdgePx\"\n | \"inputPixels\"\n | \"inputAspectRatioRange\"\n> = {\n maxImageBytes: null,\n minEdgePx: null,\n maxEdgePx: null,\n inputPixels: null,\n inputAspectRatioRange: null,\n};\n", "// Image-model input capabilities, transcribed from each MODEL MAKER's own API\n// docs. No value here comes from OpenRouter or any other aggregator.\n//\n// Checked on 2026-09-11. When a model is added or a provider changes a limit,\n// update the record AND its `verified.checkedOn`.\n\nimport { MB, NO_FRAMES, unchecked } from \"./shared\";\n\nimport type { ModelInputCapabilities } from \"./types\";\n\n// \u2500\u2500\u2500 Shared MIME lists \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** ai.google.dev/gemini-api/docs/image-understanding */\nconst GEMINI_IMAGE_MIMES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/webp\",\n \"image/heic\",\n \"image/heif\",\n] as const;\n\n/** developers.openai.com/api/reference/python/resources/images/methods/edit */\nconst OPENAI_IMAGE_MIMES = [\"image/png\", \"image/webp\", \"image/jpeg\"] as const;\n\n/** docs.byteplus.com/en/docs/ModelArk/1541523 */\nconst SEEDREAM_IMAGE_MIMES = [\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/bmp\",\n \"image/tiff\",\n \"image/gif\",\n \"image/heic\",\n \"image/heif\",\n] as const;\n\n/** docs.x.ai/developers/rest-api-reference/inference/images */\nconst XAI_IMAGE_MIMES = [\"image/jpeg\", \"image/png\", \"image/webp\"] as const;\n\n// \u2500\u2500\u2500 Google Gemini image models \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst GEMINI_IMAGE_DOCS = [\n \"https://ai.google.dev/gemini-api/docs/image-generation\",\n \"https://ai.google.dev/gemini-api/docs/image-understanding\",\n] as const;\n\n/**\n * Google enumerates only the aspect ratios each model ADDS relative to its\n * predecessor, never the full set, while separately stating the models support\n * \"a discrete set of 14 aspect ratios\". We therefore keep the full 14 rather\n * than narrowing to the enumerated subset -- and flag the field as unverified.\n *\n * Narrowing would also break auto-resize: `gemini-3.1-flash-lite-image` is the\n * `outpaintModel`, and adgen-canvas/CLAUDE.md requires that model to support\n * 4:1 / 1:4 / 8:1 / 1:8 for banner formats.\n */\nconst GEMINI_ASPECT_RATIOS = [\n \"21:9\",\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"9:16\",\n \"3:4\",\n \"2:3\",\n \"5:4\",\n \"4:5\",\n \"4:1\",\n \"1:4\",\n \"8:1\",\n \"1:8\",\n] as const;\n\nconst GEMINI_ASSETS = {\n imageMimeTypes: GEMINI_IMAGE_MIMES,\n // No PER-FILE cap is documented. The 20 MB figure is the documented\n // aggregate inline-request cap, which necessarily bounds a single image too,\n // so this is a derivation rather than a guess.\n maxImageBytes: 20 * MB,\n minEdgePx: null,\n maxEdgePx: null,\n inputPixels: null,\n inputAspectRatioRange: null,\n maxRequestBytes: 20 * MB,\n} as const;\n\nconst GEMINI_UNKNOWN_NOTES = {\n \"controls.aspectRatios\":\n \"Docs state 14 supported ratios but enumerate only the newly added ones. Keeping all 14; verify against a live call before trusting the tail.\",\n \"assets.minEdgePx\":\n \"No input dimension floor documented. Left unchecked rather than inventing one, which would reject valid images.\",\n \"assets.maxEdgePx\":\n \"No input dimension ceiling documented; docs only note that large images are tiled into 768x768 tiles.\",\n} as const;\n\nconst geminiFlashImage: ModelInputCapabilities = {\n modelId: \"google/gemini-3.1-flash-image\",\n modality: \"image\",\n verified: {\n sources: [\n ...GEMINI_IMAGE_DOCS,\n \"https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-image\",\n ],\n checkedOn: \"2026-09-11\",\n },\n unknownFields: [\n \"controls.aspectRatios\",\n \"assets.minEdgePx\",\n \"assets.maxEdgePx\",\n ],\n unknownNotes: GEMINI_UNKNOWN_NOTES,\n references: {\n supported: true,\n grouping: \"flat\",\n // \"Up to 10 images of objects\" + \"Up to 4 images of characters\".\n maxImages: 14,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: NO_FRAMES,\n assets: GEMINI_ASSETS,\n controls: {\n aspectRatioMode: \"settable\",\n aspectRatios: GEMINI_ASPECT_RATIOS,\n // \"support for 0.5K, 2K and 4K, default 1K\"\n resolutions: [\"0.5K\", \"1K\", \"2K\", \"4K\"],\n audio: \"none\",\n supportsNegativePrompt: false,\n supportsSeed: false,\n },\n constraints: [],\n};\n\nconst geminiFlashLiteImage: ModelInputCapabilities = {\n ...geminiFlashImage,\n modelId: \"google/gemini-3.1-flash-lite-image\",\n verified: {\n sources: [\n ...GEMINI_IMAGE_DOCS,\n \"https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite-image\",\n ],\n checkedOn: \"2026-09-11\",\n },\n references: {\n ...geminiFlashImage.references,\n // \"Up to 14 images of objects\". Unlike Flash, no character-reference\n // capability is documented for Flash-Lite.\n maxImages: 14,\n },\n controls: {\n ...geminiFlashImage.controls,\n // \"Optimized for lower resolutions of 1K (1024x1024px)\";\n // \"(Note: 2K and 4K are unsupported)\".\n resolutions: [\"1K\"],\n },\n};\n\n// \u2500\u2500\u2500 OpenAI GPT Image 2.5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst OPENAI_IMAGE_DOCS = [\n \"https://developers.openai.com/api/reference/python/resources/images/methods/edit\",\n \"https://developers.openai.com/api/docs/guides/image-prompting\",\n \"https://developers.openai.com/api/docs/guides/image-generation\",\n] as const;\n\n/**\n * OpenAI documents no discrete aspect-ratio enum -- only a pixel envelope\n * (\"Each edge must be no more than 3,840 pixels\", \"Both edges must be\n * multiples of 16 pixels\", \"The ratio of the longer edge to the shorter edge\n * must not exceed 3:1\", \"The total pixel count must be between 655,360 and\n * 8,294,400\"). The ratio list below is OUR product subset, which sits inside\n * that envelope; the envelope itself is what validation enforces.\n *\n * This envelope was previously hardcoded in three places (imageApi.ts,\n * ImageGeneratorPanel.tsx and the host image-gen route). It now lives here.\n */\nconst OPENAI_ASPECT_RATIOS = [\n \"21:9\",\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"9:16\",\n \"3:4\",\n \"2:3\",\n] as const;\n\nconst gptImage25Flare: ModelInputCapabilities = {\n modelId: \"openai/gpt-image-2.5-flare\",\n modality: \"image\",\n verified: { sources: OPENAI_IMAGE_DOCS, checkedOn: \"2026-09-11\" },\n unknownFields: [\"assets.maxRequestBytes\"],\n unknownNotes: {\n \"assets.maxRequestBytes\":\n \"Only the per-image 50 MB and per-mask 4 MB caps are documented; no whole-request cap.\",\n },\n references: {\n supported: true,\n grouping: \"flat\",\n // \"You can provide up to 16 images.\"\n maxImages: 16,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: NO_FRAMES,\n assets: {\n imageMimeTypes: OPENAI_IMAGE_MIMES,\n // \"each image should be a png, webp, or jpg file less than 50MB\"\n maxImageBytes: 50 * MB,\n minEdgePx: null,\n maxEdgePx: null,\n inputPixels: null,\n inputAspectRatioRange: null,\n maxRequestBytes: null,\n },\n controls: {\n aspectRatioMode: \"settable\",\n aspectRatios: OPENAI_ASPECT_RATIOS,\n resolutions: [\"1K\", \"2K\"],\n audio: \"none\",\n supportsNegativePrompt: false,\n supportsSeed: false,\n outputPixels: { min: 655_360, max: 8_294_400 },\n outputEdge: { max: 3840, multipleOf: 16 },\n maxOutputEdgeRatio: 3,\n },\n constraints: [],\n};\n\nconst gptImage25Sunburst: ModelInputCapabilities = {\n ...gptImage25Flare,\n modelId: \"openai/gpt-image-2.5-sunburst\",\n};\n\n// \u2500\u2500\u2500 ByteDance Seedream 5.0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SEEDREAM_DOCS = [\n \"https://docs.byteplus.com/en/docs/ModelArk/1541523\",\n \"https://docs.volcengine.com/docs/82379/1541523\",\n] as const;\n\nconst SEEDREAM_ASSETS = {\n imageMimeTypes: SEEDREAM_IMAGE_MIMES,\n // \"Size: Up to 30 MB\"\n maxImageBytes: 30 * MB,\n // \"Width and height (px): > 14\"\n minEdgePx: 15,\n maxEdgePx: null,\n // \"Total pixels: [196, 6000x6000 (36,000,000)]\" -- the product is bounded,\n // not either edge individually.\n inputPixels: { min: 196, max: 36_000_000 },\n // \"Aspect ratio (width / height): [1/16, 16]\"\n inputAspectRatioRange: [1 / 16, 16] as readonly [number, number],\n maxRequestBytes: null,\n} as const;\n\nconst SEEDREAM_ASPECT_RATIOS = [\n \"21:9\",\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"9:16\",\n \"3:4\",\n \"2:3\",\n \"5:4\",\n \"4:5\",\n] as const;\n\nconst seedream50Lite: ModelInputCapabilities = {\n modelId: \"bytedance-seed/seedream-5-0-lite\",\n modality: \"image\",\n verified: { sources: SEEDREAM_DOCS, checkedOn: \"2026-09-11\" },\n unknownFields: [\"assets.maxEdgePx\", \"assets.maxRequestBytes\"],\n unknownNotes: {\n \"assets.maxEdgePx\":\n \"Docs bound total pixels rather than either edge; see assets.inputPixels.\",\n \"assets.maxRequestBytes\": \"No whole-request cap documented for the image API.\",\n },\n references: {\n supported: true,\n grouping: \"flat\",\n // \"Seedream 5.0 lite, 4.5, and 4.0 support up to 14 reference images.\"\n maxImages: 14,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: NO_FRAMES,\n assets: SEEDREAM_ASSETS,\n controls: {\n aspectRatioMode: \"settable\",\n aspectRatios: SEEDREAM_ASPECT_RATIOS,\n // Lite and Pro have DISJOINT resolution ladders -- they are not drop-in\n // substitutes for one another.\n resolutions: [\"2K\", \"3K\", \"4K\"],\n audio: \"none\",\n supportsNegativePrompt: false,\n supportsSeed: false,\n // \"Total pixels range: [2560x1440(3,686,400), 4096x4096(16,777,216)]\"\n outputPixels: { min: 3_686_400, max: 16_777_216 },\n },\n constraints: [],\n providerCaveats: [\n \"Input reference images plus generated images must total 15 or fewer.\",\n ],\n};\n\nconst seedream50Pro: ModelInputCapabilities = {\n ...seedream50Lite,\n modelId: \"bytedance-seed/seedream-5-0-pro\",\n references: {\n ...seedream50Lite.references,\n // \"Seedream 5.0 pro supports up to 10 reference images.\"\n maxImages: 10,\n },\n controls: {\n ...seedream50Lite.controls,\n resolutions: [\"1K\", \"1.5K\", \"2K\"],\n // \"Total pixels range: [1280x720(921,600), 2048x2048x1.1025(4,624,220)]\"\n outputPixels: { min: 921_600, max: 4_624_220 },\n },\n providerCaveats: [\n \"Layer decomposition accepts exactly one input image and yields at most 16 layers.\",\n \"Sequential image generation and streaming are not supported on Pro.\",\n ],\n};\n\n// \u2500\u2500\u2500 xAI Grok Imagine Image 2.0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst grokImagineImage20: ModelInputCapabilities = {\n modelId: \"x-ai/grok-imagine-image-2.0\",\n modality: \"image\",\n verified: {\n sources: [\n \"https://docs.x.ai/developers/rest-api-reference/inference/images\",\n \"https://docs.x.ai/developers/model-capabilities/images/multi-image-editing\",\n ],\n checkedOn: \"2026-09-11\",\n },\n unknownFields: [\n \"assets.maxImageBytes\",\n \"assets.minEdgePx\",\n \"assets.maxEdgePx\",\n \"assets.inputPixels\",\n ],\n unknownNotes: {\n \"assets.maxImageBytes\":\n \"xAI's documented 20 MiB / jpg-png limit is scoped to CHAT vision models and contradicts Imagine's documented WebP support, so it is deliberately not carried over. Left unchecked; the transport guard binds first anyway.\",\n \"assets.minEdgePx\": \"No input dimension floor documented.\",\n \"assets.maxEdgePx\": \"No input dimension ceiling documented.\",\n \"assets.inputPixels\": \"No input pixel bound documented.\",\n },\n references: {\n supported: true,\n grouping: \"flat\",\n // \"Multi-image editing supports up to 5 source images in a single request\"\n maxImages: 5,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: NO_FRAMES,\n assets: {\n imageMimeTypes: XAI_IMAGE_MIMES,\n ...unchecked,\n maxRequestBytes: null,\n },\n controls: {\n aspectRatioMode: \"settable\",\n aspectRatios: [\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"9:16\",\n \"3:4\",\n \"2:3\",\n \"5:4\",\n \"4:5\",\n ],\n resolutions: [\"1K\", \"2K\"],\n audio: \"none\",\n supportsNegativePrompt: false,\n supportsSeed: false,\n },\n constraints: [],\n providerCaveats: [\n \"The `images[]` array is mutually exclusive with the single `image` field.\",\n \"By default the output ratio follows the first input image unless aspect_ratio is set.\",\n ],\n};\n\n// \u2500\u2500\u2500 Microsoft MAI Image 2.6 Flash \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst maiImage26Flash: ModelInputCapabilities = {\n modelId: \"microsoft/mai-image-2.6-flash\",\n modality: \"image\",\n verified: {\n sources: [\n \"https://learn.microsoft.com/en-us/azure/foundry/foundry-models/how-to/use-foundry-models-mai-image\",\n \"https://microsoft.ai/pdf/MAI-Image-2.6-Model-Card.pdf\",\n ],\n checkedOn: \"2026-09-11\",\n },\n unknownFields: [\n \"references.maxImages\",\n \"assets.maxImageBytes\",\n \"assets.minEdgePx\",\n \"assets.maxEdgePx\",\n \"assets.inputPixels\",\n ],\n unknownNotes: {\n \"references.maxImages\":\n \"The edits endpoint documents a single `image` multipart field and no multi-image cap. Conservative default of 1 -- the tightest limit of any registered model, and the reason Quick Edit must not spend the slot on a user reference.\",\n \"assets.maxImageBytes\": \"No input file size cap documented.\",\n \"assets.minEdgePx\":\n \"The 768 px floor is documented for output width/height, not for input images.\",\n \"assets.maxEdgePx\": \"No input dimension ceiling documented.\",\n \"assets.inputPixels\": \"No input pixel bound documented.\",\n },\n references: {\n supported: true,\n grouping: \"flat\",\n maxImages: 1,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: NO_FRAMES,\n assets: {\n imageMimeTypes: [\"image/jpeg\", \"image/png\"],\n ...unchecked,\n maxRequestBytes: null,\n },\n controls: {\n aspectRatioMode: \"settable\",\n // 21:9 is deliberately absent: at the documented 768 px per-side minimum\n // it would need 1792x768 = 1,376,256 pixels, over the 1,048,576 cap.\n aspectRatios: [\"1:1\", \"16:9\", \"3:2\", \"4:3\", \"3:4\", \"2:3\", \"9:16\"],\n resolutions: [\"1K\"],\n audio: \"none\",\n supportsNegativePrompt: false,\n supportsSeed: false,\n // Microsoft's two first-party docs conflict: Learn says 1,048,576 and\n // documents the 400 that enforces it; the model card PDF says 2,359,296.\n // Take the lower, demonstrably enforced figure.\n outputPixels: { min: 768 * 768, max: 1_048_576 },\n outputEdge: { min: 768 },\n },\n constraints: [],\n providerCaveats: [\n \"Output is always PNG, and exactly one image per request.\",\n \"Learn documents a 1,048,576 output pixel cap; the model card PDF claims 2,359,296. The lower figure is enforced.\",\n ],\n};\n\nexport const IMAGE_MODEL_CAPABILITIES: readonly ModelInputCapabilities[] = [\n geminiFlashImage,\n geminiFlashLiteImage,\n gptImage25Flare,\n gptImage25Sunburst,\n seedream50Lite,\n seedream50Pro,\n grokImagineImage20,\n maiImage26Flash,\n];\n", "// Video-model input capabilities, transcribed from each MODEL MAKER's own API\n// docs. No value here comes from OpenRouter or any other aggregator.\n//\n// Checked on 2026-09-11.\n//\n// \u2500\u2500 The field that matters most \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Whether reference images may accompany a start/end frame is NOT a shared\n// rule, and cannot be implemented as one:\n//\n// ByteDance (Seedance 2.x) FORBIDDEN. \"Image-to-video (first frame),\n// image-to-video (first and last frames), and omni\n// reference-to-video ... are mutually exclusive\n// scenarios and cannot be mixed.\"\n// Alibaba (Wan 3.0) FORBIDDEN. \"first_frame / last_frame are mutually\n// exclusive with reference_image / reference_video /\n// reference_audio / file / link types and cannot be\n// mixed in the same request.\"\n// xAI (Grok Imagine 1.5) ALLOWED, explicitly: \"image combined with\n// reference_images, reference_audios, or last_frame\n// is reference-to-video with a pinned first frame.\"\n// Kuaishou (Kling 3.0) ALLOWED. first_frame, last_frame and element are\n// co-equal members of one contents[] array. The only\n// such prohibition in Kling's docs is scoped to a\n// different model (kling-video-o1).\n// Google (Veo 3.1) UNDOCUMENTED -> conservative `false`.\n\nimport { MB, unchecked } from \"./shared\";\n\nimport type { ModelInputCapabilities } from \"./types\";\n\n// \u2500\u2500\u2500 Google Veo 3.1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst VEO_DOCS = [\"https://ai.google.dev/gemini-api/docs/veo\"] as const;\n\n/**\n * Veo's input-asset limits are the largest documentation gap in the registry.\n * The Gemini API guide states none, and the Vertex AI pages that would carry\n * them do not serve their body to a fetcher. All four fields are unchecked.\n */\nconst VEO_ASSET_UNKNOWNS = [\n \"assets.imageMimeTypes\",\n \"assets.maxImageBytes\",\n \"assets.minEdgePx\",\n \"assets.maxEdgePx\",\n \"assets.inputPixels\",\n \"assets.inputAspectRatioRange\",\n] as const;\n\nconst VEO_ASSETS = {\n // Empty list means \"do not check\" -- see `unchecked` in ./shared.\n imageMimeTypes: [] as readonly string[],\n ...unchecked,\n maxRequestBytes: null,\n} as const;\n\nconst veo31Fast: ModelInputCapabilities = {\n modelId: \"google/veo-3.1-fast\",\n modality: \"video\",\n verified: {\n sources: [\n ...VEO_DOCS,\n \"https://ai.google.dev/gemini-api/docs/models/veo-3.1-generate-preview\",\n ],\n checkedOn: \"2026-09-11\",\n },\n unknownFields: [\n \"references.canCombineWithStartFrame\",\n \"references.canCombineWithEndFrame\",\n \"controls.supportsNegativePrompt\",\n ...VEO_ASSET_UNKNOWNS,\n ],\n unknownNotes: {\n \"references.canCombineWithStartFrame\":\n \"Google documents neither permission nor prohibition. The guide establishes that referenceImages accepts up to 3, that lastFrame requires image, and that duration must be 8 when using reference images -- but never whether references and frames may coexist. Defaulted to `false` so the combination is blocked as REFERENCE_FRAME_COMBINATION_UNVERIFIED rather than discovered by the provider after charging.\",\n \"references.canCombineWithEndFrame\": \"Same gap as canCombineWithStartFrame.\",\n \"controls.supportsNegativePrompt\":\n \"Absent from the Gemini API Veo parameter table, but Vertex accepts negativePrompt inside the google-vertex `parameters` block, which is how the host forwards it today. Defaulted to supported so validation does not reject a working passthrough; confirm against the Vertex reference.\",\n \"assets.imageMimeTypes\":\n \"Not stated in the Gemini API Veo guide; the Vertex AI pages do not serve their body.\",\n \"assets.maxImageBytes\": \"Not stated.\",\n \"assets.minEdgePx\": \"Not stated.\",\n \"assets.maxEdgePx\": \"Not stated.\",\n \"assets.inputPixels\": \"Not stated.\",\n \"assets.inputAspectRatioRange\": \"Not stated.\",\n },\n references: {\n supported: true,\n grouping: \"flat\",\n // \"up to three asset images of a single person, character, or product\"\n maxImages: 3,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: {\n start: { supported: true, maxImages: 1 },\n end: { supported: true, maxImages: 1 },\n allowsStartAndEndTogether: true,\n // \"Must be used in combination with the `image` parameter\"\n endFrameRequiresStartFrame: true,\n },\n assets: VEO_ASSETS,\n controls: {\n aspectRatioMode: \"settable\",\n aspectRatios: [\"16:9\", \"9:16\"],\n resolutions: [\"720p\", \"1080p\", \"4K\"],\n durationsSeconds: [4, 6, 8],\n audio: \"always-on\",\n supportsNegativePrompt: true,\n // \"It doesn't guarantee determinism, but slightly improves it\"\n supportsSeed: true,\n },\n constraints: [\n {\n whenAny: [\n { kind: \"hasReferences\" },\n { kind: \"resolutionIn\", values: [\"1080p\", \"4K\"] },\n ],\n requires: { kind: \"durationMustBe\", seconds: 8 },\n message:\n \"Veo 3.1 requires an 8 second duration when using reference images, 1080p or 4K.\",\n },\n ],\n providerCaveats: [\n \"personGeneration is restricted to allow_adult for image-to-video, interpolation and reference-image modes.\",\n \"Video extension is 720p only.\",\n ],\n};\n\nconst veo31Lite: ModelInputCapabilities = {\n modelId: \"google/veo-3.1-lite\",\n modality: \"video\",\n verified: {\n sources: [\n ...VEO_DOCS,\n \"https://ai.google.dev/gemini-api/docs/models/veo-3.1-lite-generate-preview\",\n ],\n checkedOn: \"2026-09-11\",\n },\n unknownFields: [\n \"controls.supportsSeed\",\n \"controls.supportsNegativePrompt\",\n ...VEO_ASSET_UNKNOWNS,\n ],\n unknownNotes: {\n \"controls.supportsNegativePrompt\":\n \"Same Vertex passthrough as Veo 3.1 Fast \u2014 see that record's note.\",\n \"controls.supportsSeed\":\n \"The guide's seed note refers to 'Veo 3 models' generically and is not confirmed per-model for Lite. Defaulted to unsupported so we never send a parameter the model may reject.\",\n \"assets.imageMimeTypes\": \"Not stated.\",\n \"assets.maxImageBytes\": \"Not stated.\",\n \"assets.minEdgePx\": \"Not stated.\",\n \"assets.maxEdgePx\": \"Not stated.\",\n \"assets.inputPixels\": \"Not stated.\",\n \"assets.inputAspectRatioRange\": \"Not stated.\",\n },\n references: {\n // `referenceImages` is explicitly `n/a` for Veo 3.1 Lite.\n supported: false,\n grouping: \"flat\",\n maxImages: 0,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: veo31Fast.frames,\n assets: VEO_ASSETS,\n controls: {\n aspectRatioMode: \"settable\",\n aspectRatios: [\"16:9\", \"9:16\"],\n // \"Veo 3.1 Lite Preview does not support 4K outputs or Extension.\"\n resolutions: [\"720p\", \"1080p\"],\n durationsSeconds: [4, 6, 8],\n audio: \"always-on\",\n supportsNegativePrompt: true,\n supportsSeed: false,\n },\n constraints: [\n {\n whenAny: [{ kind: \"resolutionIn\", values: [\"1080p\"] }],\n requires: { kind: \"durationMustBe\", seconds: 8 },\n message: \"Veo 3.1 Lite requires an 8 second duration for 1080p output.\",\n },\n ],\n};\n\n// \u2500\u2500\u2500 Kuaishou Kling 3.0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst KLING_DOCS = [\n \"https://klingai.com/document-api/api/video/3-0-omni/image-to-video\",\n \"https://klingai.com/document-api/api/video/3-0-omni/elements\",\n \"https://klingai.com/document-api/guides/capability-map/video\",\n] as const;\n\n/**\n * Kling 3.0 Pro and Standard are ONE model (`kling-v3`) behind a mode switch --\n * `pro` yields 1080p, `std` yields 720p. Nothing in the capability map\n * conditions frames, Elements, duration or audio on the mode for 3.0 (unlike\n * Kling 2.6 and 2.5 Turbo, whose first/last-frame support IS mode-restricted),\n * so the two records differ only in `controls.resolutions`.\n */\nconst klingBase = {\n modality: \"video\" as const,\n verified: { sources: KLING_DOCS, checkedOn: \"2026-09-11\" },\n unknownFields: [\"assets.maxEdgePx\", \"assets.inputPixels\"],\n unknownNotes: {\n \"assets.maxEdgePx\":\n \"Only the 300 px floor is documented; no ceiling is stated.\",\n \"assets.inputPixels\": \"No input pixel bound documented.\",\n },\n references: {\n supported: true,\n // Kling references are nested SUBJECTS, not a flat list: each Element is\n // built from \"at least 1 frontal reference image\" plus \"1-3 other\n // reference images\" that must differ from it.\n grouping: \"elements\" as const,\n maxGroups: 3,\n imagesPerGroup: { min: 2, max: 4 },\n maxImages: 12,\n maxVideos: 0,\n maxAudios: 0,\n acceptsImageAndVideoReferences: false,\n canCombineWithStartFrame: true,\n canCombineWithEndFrame: true,\n },\n frames: {\n start: { supported: true as const, maxImages: 1 as const },\n end: { supported: true as const, maxImages: 1 as const },\n allowsStartAndEndTogether: true,\n // \"Supports first-frame-to-video and first-and-last-frame-to-video\n // generation; last-frame-only video generation is not supported.\"\n endFrameRequiresStartFrame: true,\n },\n assets: {\n imageMimeTypes: [\"image/jpeg\", \"image/png\"],\n // 50 MB on the current API; the legacy /v1/videos/image2video endpoint\n // caps at 10 MB.\n maxImageBytes: 50 * MB,\n minEdgePx: 300,\n maxEdgePx: null,\n inputPixels: null,\n // \"The image aspect ratio must be between 1:2.5 and 2.5:1.\"\n inputAspectRatioRange: [0.4, 2.5] as readonly [number, number],\n maxRequestBytes: null,\n },\n constraints: [],\n providerCaveats: [\n \"Image-to-video has no aspect_ratio parameter; the output ratio follows the first frame.\",\n \"Prompt length must not exceed 3072 characters.\",\n \"Multi-image reference-to-video (as distinct from Elements) is not supported on Kling 3.0.\",\n ],\n};\n\nconst KLING_CONTROLS = {\n // Text-to-video accepts an explicit ratio; image-to-video has no such\n // parameter at all, so the control must disappear once a frame is attached.\n aspectRatioMode: \"notApplicableWithFrames\" as const,\n aspectRatios: [\"16:9\", \"9:16\", \"1:1\"],\n minDurationSeconds: 3,\n maxDurationSeconds: 15,\n // `audio` defaults to `off` on Kling, unlike every other toggle model here.\n audio: \"toggle-default-off\" as const,\n // The current API folds negative guidance into `prompt`; the legacy\n // image2video endpoint documents a `negative_prompt` field (max 2500\n // chars). Either way the provider accepts negative guidance, so rejecting\n // it here would be wrong.\n supportsNegativePrompt: true,\n supportsSeed: false,\n};\n\nconst klingV3Pro: ModelInputCapabilities = {\n ...klingBase,\n modelId: \"kwaivgi/kling-v3.0-pro\",\n controls: { ...KLING_CONTROLS, resolutions: [\"1080p\", \"4K\"] },\n};\n\nconst klingV3Std: ModelInputCapabilities = {\n ...klingBase,\n modelId: \"kwaivgi/kling-v3.0-std\",\n controls: { ...KLING_CONTROLS, resolutions: [\"720p\"] },\n};\n\n// \u2500\u2500\u2500 ByteDance Seedance 2.x \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SEEDANCE_DOCS = [\n \"https://docs.byteplus.com/en/docs/ModelArk/1520757\",\n \"https://docs.byteplus.com/en/docs/ModelArk/2607688\",\n] as const;\n\nconst SEEDANCE_ASSETS = {\n imageMimeTypes: [\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/bmp\",\n \"image/tiff\",\n \"image/gif\",\n \"image/heic\",\n \"image/heif\",\n ],\n // \"Single image must be less than 30 MB\"\n maxImageBytes: 30 * MB,\n // \"Width and height (px): [300, 6000]\"\n minEdgePx: 300,\n maxEdgePx: 6000,\n inputPixels: null,\n // \"Aspect ratio (width/height): [0.4, 2.5]\"\n inputAspectRatioRange: [0.4, 2.5] as readonly [number, number],\n // \"Request body size does not exceed 64 MB.\"\n maxRequestBytes: 64 * MB,\n};\n\nconst SEEDANCE_CAVEATS = [\n \"Reference images and videos containing real human faces are rejected. Use model-generated faces, preset digital characters (asset://), or authorized assets.\",\n \"The first and last frame images may be identical; mismatched ratios crop the last frame to the first.\",\n];\n\nconst seedance20Mini: ModelInputCapabilities = {\n modelId: \"bytedance/seedance-2.0-mini\",\n modality: \"video\",\n verified: { sources: SEEDANCE_DOCS, checkedOn: \"2026-09-11\" },\n unknownFields: [\"controls.supportsNegativePrompt\"],\n unknownNotes: {\n \"controls.supportsNegativePrompt\":\n \"The word 'negative' does not appear anywhere in the video generation API reference. Defaulted to unsupported.\",\n },\n references: {\n supported: true,\n grouping: \"flat\",\n // \"Dreamina Seedance 2.0 series (1-9 images)\"\n maxImages: 9,\n maxVideos: 3,\n maxAudios: 3,\n // \"15 (9 images + 3 videos + 3 audios)\"\n maxTotalAssets: 15,\n acceptsImageAndVideoReferences: true,\n // Documented prohibition, NOT a conservative default.\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: {\n start: { supported: true, maxImages: 1 },\n end: { supported: true, maxImages: 1 },\n allowsStartAndEndTogether: true,\n // Only \"first frame\" and \"first and last frames\" are documented modes;\n // there is no last-frame-only mode.\n endFrameRequiresStartFrame: true,\n },\n assets: SEEDANCE_ASSETS,\n controls: {\n // \"ratio must be adaptive\" once a first frame is supplied.\n aspectRatioMode: \"forcedAdaptiveWithFrames\",\n // 9:21 is NOT supported, despite previously appearing in our registry.\n aspectRatios: [\"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\", \"21:9\", \"adaptive\"],\n resolutions: [\"480p\", \"720p\"],\n minDurationSeconds: 4,\n maxDurationSeconds: 15,\n supportsAutoDuration: true,\n audio: \"toggle-default-on\",\n supportsNegativePrompt: false,\n // `seed` exists on the shared video API but its \"Supported models\" list\n // names only Seedance 1.5 pro and 1.0 pro -- 2.x is deliberately absent.\n supportsSeed: false,\n },\n constraints: [],\n providerCaveats: [\n ...SEEDANCE_CAVEATS,\n \"Audio-only references are not supported; an image or video reference is required.\",\n ],\n};\n\nconst seedance25: ModelInputCapabilities = {\n ...seedance20Mini,\n modelId: \"bytedance/seedance-2.5\",\n references: {\n ...seedance20Mini.references,\n // \"Dreamina Seedance 2.5 (1-30 images)\"\n maxImages: 30,\n maxVideos: 10,\n maxAudios: 10,\n // \"50 (30 images + 10 video clips + 10 audio clips)\"\n maxTotalAssets: 50,\n },\n controls: {\n ...seedance20Mini.controls,\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n maxDurationSeconds: 30,\n },\n providerCaveats: SEEDANCE_CAVEATS,\n};\n\n// \u2500\u2500\u2500 xAI Grok Imagine Video 1.5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst grokImagineVideo15: ModelInputCapabilities = {\n modelId: \"x-ai/grok-imagine-video-1.5\",\n modality: \"video\",\n verified: {\n sources: [\n \"https://docs.x.ai/developers/rest-api-reference/inference/videos\",\n \"https://docs.x.ai/developers/model-capabilities/video\",\n \"https://docs.x.ai/developers/model-capabilities/video/reference-to-video\",\n ],\n checkedOn: \"2026-09-11\",\n },\n unknownFields: [\n \"references.maxImages\",\n \"assets.maxImageBytes\",\n \"assets.minEdgePx\",\n \"assets.maxEdgePx\",\n \"assets.inputPixels\",\n ],\n unknownNotes: {\n \"references.maxImages\":\n \"The schema caps reference_audios at 3 entries but states no cap for reference_images. Defaulted to 3 to match the documented audio cap and the docs' own examples. The 5-image figure in xAI's docs is scoped to IMAGE editing, not video, and is deliberately not carried over.\",\n \"assets.maxImageBytes\": \"Not stated for video inputs.\",\n \"assets.minEdgePx\": \"Not stated.\",\n \"assets.maxEdgePx\": \"Not stated.\",\n \"assets.inputPixels\": \"Not stated.\",\n },\n references: {\n supported: true,\n grouping: \"flat\",\n maxImages: 3,\n maxVideos: 0,\n // \"Max 3 voices per request\"\n maxAudios: 3,\n acceptsImageAndVideoReferences: false,\n // The ONLY registered model that explicitly permits this.\n canCombineWithStartFrame: true,\n canCombineWithEndFrame: true,\n },\n frames: {\n start: { supported: true, maxImages: 1 },\n end: { supported: true, maxImages: 1 },\n allowsStartAndEndTogether: true,\n // \"last_frame only | Pinned last frame. The model generates the opening\n // and lands on the pinned image.\" -- a documented standalone mode.\n endFrameRequiresStartFrame: false,\n },\n assets: {\n imageMimeTypes: [\"image/jpeg\", \"image/png\", \"image/webp\"],\n ...unchecked,\n maxRequestBytes: null,\n },\n controls: {\n aspectRatioMode: \"settable\",\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\"],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n minDurationSeconds: 1,\n maxDurationSeconds: 15,\n audio: \"toggle-default-on\",\n supportsNegativePrompt: false,\n supportsSeed: false,\n },\n constraints: [\n {\n whenAny: [{ kind: \"hasReferences\" }],\n requires: { kind: \"resolutionAtMost\", value: \"720p\" },\n message:\n \"Grok Imagine Video caps reference-to-video at 720p; 1080p is available only for text-to-video and image-to-video.\",\n },\n ],\n providerCaveats: [\n \"Prompt is optional whenever image, reference_images or last_frame is supplied.\",\n \"The legacy grok-imagine-video model rejects last_frame and rejects combining image with reference inputs; 1.5 does not.\",\n ],\n};\n\n// \u2500\u2500\u2500 Alibaba Wan 3.0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst WAN_DOCS = [\n \"https://help.aliyun.com/zh/model-studio/wan3-video-generation-api-reference\",\n] as const;\n\nconst wanBase = {\n modality: \"video\" as const,\n unknownFields: [\"frames.endFrameRequiresStartFrame\", \"controls.supportsNegativePrompt\"],\n unknownNotes: {\n \"frames.endFrameRequiresStartFrame\":\n \"The docs enumerate the permitted material combinations and warn that 'passing other combinations returns an error', but a last-frame-only combination is not among those listed. Defaulted to requiring a start frame rather than sending an unlisted combination.\",\n \"controls.supportsNegativePrompt\":\n \"No negative_prompt field exists on the API reference; the adjacent knob is prompt_extend. Defaulted to unsupported.\",\n },\n references: {\n supported: true,\n grouping: \"flat\" as const,\n // \"reference_image: reference image. At most 10.\"\n maxImages: 10,\n maxVideos: 5,\n maxAudios: 5,\n acceptsImageAndVideoReferences: true,\n // Documented prohibition, quoted at the top of this file.\n canCombineWithStartFrame: false,\n canCombineWithEndFrame: false,\n },\n frames: {\n start: { supported: true as const, maxImages: 1 as const },\n end: { supported: true as const, maxImages: 1 as const },\n allowsStartAndEndTogether: true,\n endFrameRequiresStartFrame: true,\n },\n assets: {\n imageMimeTypes: [\"image/jpeg\", \"image/png\", \"image/bmp\", \"image/webp\"],\n // \"File size: no more than 20MB.\"\n maxImageBytes: 20 * MB,\n // \"Resolution: single side [240, 8000] pixels.\"\n minEdgePx: 240,\n maxEdgePx: 8000,\n inputPixels: null,\n // \"Aspect ratio: no more than 8:1.\"\n inputAspectRatioRange: [1 / 8, 8] as readonly [number, number],\n maxRequestBytes: null,\n },\n controls: {\n aspectRatioMode: \"settable\" as const,\n aspectRatios: [\"adaptive\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\"],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n minDurationSeconds: 2,\n maxDurationSeconds: 30,\n supportsAutoDuration: true,\n audio: \"toggle-default-on\" as const,\n supportsNegativePrompt: false,\n // \"seed integer (optional) random seed, used to reproduce results.\"\n supportsSeed: true,\n },\n constraints: [],\n providerCaveats: [\n \"Input PNGs must not carry an alpha channel.\",\n \"Input aspect ratio must not exceed 8:1.\",\n \"With a video input, input duration plus output duration must not exceed 30 seconds.\",\n \"reference_image, reference_video and reference_audio combine freely with each other, but never with a frame.\",\n ],\n};\n\nconst wan30Prime: ModelInputCapabilities = {\n ...wanBase,\n modelId: \"alibaba/wan-3.0-prime\",\n verified: {\n sources: [\n ...WAN_DOCS,\n \"https://www.alibabacloud.com/help/zh/model-studio/wan3-0-video-prime\",\n ],\n checkedOn: \"2026-09-11\",\n },\n};\n\nconst wan30: ModelInputCapabilities = {\n ...wanBase,\n modelId: \"alibaba/wan-3.0\",\n verified: {\n sources: [\n ...WAN_DOCS,\n \"https://www.alibabacloud.com/help/zh/model-studio/wan3-0-video\",\n ],\n checkedOn: \"2026-09-11\",\n },\n};\n\nexport const VIDEO_MODEL_CAPABILITIES: readonly ModelInputCapabilities[] = [\n veo31Fast,\n veo31Lite,\n klingV3Pro,\n klingV3Std,\n seedance20Mini,\n seedance25,\n grokImagineVideo15,\n wan30Prime,\n wan30,\n];\n", "// Capability-aware input validation. Pure, import-free beyond this folder, and\n// shared verbatim by the SDK and the host proxy so the two can never drift into\n// two different interpretations of the same provider rule.\n//\n// Validation order is fixed (and matches docs/model-specific-reference-capabilities.md):\n//\n// 1. resolve the canonical capability record\n// 2. apply conservative defaults for undocumented fields (baked into the\n// record; never a rejection of the whole model)\n// 3. normalize inputs into distinct slots\n// 4. validate media types, dimensions and per-asset limits\n// 5. validate frame support and counts\n// 6. validate reference counts by category\n// 7. validate frame/reference COMBINATION rules\n// 8. validate controls, then cross-field constraints\n//\n// Byte-budget allocation and the post-compression recount happen outside this\n// module (SDK: referenceBudget; host: after asset injection), because both need\n// to mutate the payload rather than merely inspect it.\n\nimport {\n ADAPTIVE_ASPECT_RATIO,\n MAX_USER_REFERENCE_IMAGES,\n RESOLUTION_RANK,\n} from \"./types\";\n\nimport type {\n CapabilityCondition,\n InputAsset,\n InputCapabilityError,\n ModelInputCapabilities,\n NormalizedGenerationInputs,\n RawGenerationInputs,\n ReferenceGroup,\n RequestedControls,\n} from \"./types\";\n\n/** The sentinel providers use for \"pick a duration for me\". */\nexport const AUTO_DURATION = -1;\n\nconst asList = (\n value: InputAsset | InputAsset[] | null | undefined,\n): InputAsset[] => {\n if (!value) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n};\n\n/**\n * Normalize a request into explicit slots. The categories stay distinct: a\n * start frame is never folded into the reference list, and neither is a Quick\n * Edit source image, because providers count them separately.\n */\nexport function normalizeInputs(\n raw: RawGenerationInputs,\n): NormalizedGenerationInputs {\n const startFrames = asList(raw.startFrame);\n const endFrames = asList(raw.endFrame);\n\n return {\n startFrame: startFrames[0] ?? null,\n endFrame: endFrames[0] ?? null,\n startFrameCount: startFrames.length,\n endFrameCount: endFrames.length,\n referenceImages: raw.referenceImages ? [...raw.referenceImages] : [],\n referenceVideos: raw.referenceVideos ? [...raw.referenceVideos] : [],\n referenceAudios: raw.referenceAudios ? [...raw.referenceAudios] : [],\n referenceGroups: raw.referenceGroups ? [...raw.referenceGroups] : [],\n sourceImage: raw.sourceImage ?? null,\n brandLogo: raw.brandLogo ?? null,\n hostReferences: raw.hostReferences ? [...raw.hostReferences] : [],\n };\n}\n\n/** Every image in a reference group, frontal view first. */\nexport function groupImages(group: ReferenceGroup): InputAsset[] {\n return [group.frontal, ...group.additional].filter(Boolean);\n}\n\n/**\n * Reference images the PROVIDER counts against its limit. Frames are excluded:\n * providers treat \"image-to-video (first frame)\" as its own scenario with its\n * own allowance, not as a reference slot.\n */\nfunction providerCountedImages(\n caps: ModelInputCapabilities,\n inputs: NormalizedGenerationInputs,\n): InputAsset[] {\n const grouped =\n caps.references.grouping === \"elements\"\n ? inputs.referenceGroups.flatMap(groupImages)\n : [];\n\n return [\n ...inputs.referenceImages,\n ...grouped,\n ...(inputs.sourceImage ? [inputs.sourceImage] : []),\n ...(inputs.brandLogo ? [inputs.brandLogo] : []),\n ...inputs.hostReferences,\n ];\n}\n\n/**\n * How many user-supplied reference images this model can actually take.\n *\n * The transport guard and the provider limit are different things and either\n * may bind: most providers accept far more than we ever send (Seedance allows\n * 30), while two accept fewer (MAI Image 1, Grok Imagine Image 5).\n *\n * `reserved` is the number of provider-counted inputs already spoken for \u2014 a\n * Quick Edit source image, a logo, a host-injected brand asset.\n */\nexport function effectiveUserReferenceLimit(\n caps: ModelInputCapabilities,\n reserved: number,\n globalLimit: number = MAX_USER_REFERENCE_IMAGES,\n): number {\n if (!caps.references.supported) {\n return 0;\n }\n return Math.max(0, Math.min(globalLimit, caps.references.maxImages - reserved));\n}\n\n// \u2500\u2500\u2500 Per-asset checks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst hasBytes = (asset: InputAsset): boolean => asset.dataUrl !== \"\";\n\nfunction validateAsset(\n caps: ModelInputCapabilities,\n asset: InputAsset,\n field: string,\n): InputCapabilityError[] {\n const errors: InputCapabilityError[] = [];\n const { assets } = caps;\n\n // A host-filled placeholder carries a byte reservation but no image, so\n // there is nothing to inspect.\n if (!hasBytes(asset)) {\n return errors;\n }\n\n // An empty MIME list means the provider documents none. Inventing one would\n // reject images the provider would have accepted.\n if (\n assets.imageMimeTypes.length > 0 &&\n asset.mimeType &&\n !assets.imageMimeTypes.includes(asset.mimeType.toLowerCase())\n ) {\n errors.push({\n code: \"UNSUPPORTED_MEDIA_TYPE\",\n modelId: caps.modelId,\n field,\n message: `${caps.modelId} does not accept ${asset.mimeType} input images.`,\n allowed: assets.imageMimeTypes,\n received: asset.mimeType,\n });\n }\n\n if (assets.maxImageBytes != null && (asset.bytes ?? 0) > assets.maxImageBytes) {\n errors.push({\n code: \"REQUEST_TOO_LARGE\",\n modelId: caps.modelId,\n field,\n message: `${field} is larger than the ${Math.round(\n assets.maxImageBytes / (1024 * 1024),\n )} MB per-image limit for ${caps.modelId}.`,\n allowed: assets.maxImageBytes,\n received: asset.bytes,\n });\n }\n\n const { widthPx: w, heightPx: h } = asset;\n if (w == null || h == null || w <= 0 || h <= 0) {\n // No dimension metadata to check against.\n return errors;\n }\n\n const shortest = Math.min(w, h);\n const longest = Math.max(w, h);\n\n if (assets.minEdgePx != null && shortest < assets.minEdgePx) {\n errors.push({\n code: \"UNSUPPORTED_DIMENSIONS\",\n modelId: caps.modelId,\n field,\n message: `${field} is ${w}x${h}; ${caps.modelId} requires at least ${assets.minEdgePx}px on each side.`,\n allowed: assets.minEdgePx,\n received: `${w}x${h}`,\n });\n }\n\n if (assets.maxEdgePx != null && longest > assets.maxEdgePx) {\n errors.push({\n code: \"UNSUPPORTED_DIMENSIONS\",\n modelId: caps.modelId,\n field,\n message: `${field} is ${w}x${h}; ${caps.modelId} allows at most ${assets.maxEdgePx}px on any side.`,\n allowed: assets.maxEdgePx,\n received: `${w}x${h}`,\n });\n }\n\n if (assets.inputPixels) {\n const pixels = w * h;\n if (pixels < assets.inputPixels.min || pixels > assets.inputPixels.max) {\n errors.push({\n code: \"UNSUPPORTED_DIMENSIONS\",\n modelId: caps.modelId,\n field,\n message: `${field} is ${pixels.toLocaleString()} pixels; ${caps.modelId} accepts ${assets.inputPixels.min.toLocaleString()}-${assets.inputPixels.max.toLocaleString()}.`,\n received: `${w}x${h}`,\n });\n }\n }\n\n if (assets.inputAspectRatioRange) {\n const [min, max] = assets.inputAspectRatioRange;\n const ratio = w / h;\n if (ratio < min || ratio > max) {\n errors.push({\n code: \"UNSUPPORTED_DIMENSIONS\",\n modelId: caps.modelId,\n field,\n message: `${field} has a ${ratio.toFixed(2)}:1 aspect ratio; ${caps.modelId} accepts ${min}-${max}.`,\n received: `${w}x${h}`,\n });\n }\n }\n\n return errors;\n}\n\n// \u2500\u2500\u2500 Frames \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction validateFrames(\n caps: ModelInputCapabilities,\n inputs: NormalizedGenerationInputs,\n): InputCapabilityError[] {\n const errors: InputCapabilityError[] = [];\n const { frames, modelId } = caps;\n const hasStart = inputs.startFrame != null;\n const hasEnd = inputs.endFrame != null;\n\n if (hasStart && !frames.start.supported) {\n errors.push({\n code: \"START_FRAME_NOT_SUPPORTED\",\n modelId,\n field: \"startFrame\",\n message: `${modelId} does not accept a start frame.`,\n });\n }\n\n if (hasEnd && !frames.end.supported) {\n errors.push({\n code: \"END_FRAME_NOT_SUPPORTED\",\n modelId,\n field: \"endFrame\",\n message: `${modelId} does not accept an end frame.`,\n });\n }\n\n if (inputs.startFrameCount > frames.start.maxImages) {\n errors.push({\n code: \"TOO_MANY_START_FRAMES\",\n modelId,\n field: \"startFrame\",\n message: `${modelId} accepts ${frames.start.maxImages} start frame image(s).`,\n allowed: frames.start.maxImages,\n received: inputs.startFrameCount,\n });\n }\n\n if (inputs.endFrameCount > frames.end.maxImages) {\n errors.push({\n code: \"TOO_MANY_END_FRAMES\",\n modelId,\n field: \"endFrame\",\n message: `${modelId} accepts ${frames.end.maxImages} end frame image(s).`,\n allowed: frames.end.maxImages,\n received: inputs.endFrameCount,\n });\n }\n\n if (\n hasEnd &&\n frames.end.supported &&\n !hasStart &&\n frames.endFrameRequiresStartFrame\n ) {\n errors.push({\n code: \"END_FRAME_REQUIRES_START_FRAME\",\n modelId,\n field: \"endFrame\",\n message: `${modelId} only accepts an end frame alongside a start frame.`,\n });\n }\n\n if (hasStart && hasEnd && !frames.allowsStartAndEndTogether) {\n errors.push({\n code: \"START_AND_END_FRAME_NOT_SUPPORTED_TOGETHER\",\n modelId,\n message: `${modelId} cannot take a start frame and an end frame in the same job.`,\n });\n }\n\n return errors;\n}\n\n// \u2500\u2500\u2500 References \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction validateReferences(\n caps: ModelInputCapabilities,\n inputs: NormalizedGenerationInputs,\n): InputCapabilityError[] {\n const errors: InputCapabilityError[] = [];\n const { references: refs, modelId } = caps;\n const isElements = refs.grouping === \"elements\";\n\n const flatCount = inputs.referenceImages.length;\n const groupCount = inputs.referenceGroups.length;\n const countedImages = providerCountedImages(caps, inputs);\n const userSuppliedCount =\n flatCount + inputs.referenceGroups.flatMap(groupImages).length;\n\n if (!refs.supported && userSuppliedCount > 0) {\n errors.push({\n code: \"REFERENCES_NOT_SUPPORTED\",\n modelId,\n field: \"referenceImages\",\n message: `${modelId} does not accept reference images.`,\n received: userSuppliedCount,\n });\n return errors;\n }\n\n // An elements-grouped model takes nested subjects, not a flat list. Sending\n // a flat list would silently lose the grouping the provider requires.\n if (isElements && flatCount > 0) {\n errors.push({\n code: \"REFERENCES_NOT_SUPPORTED\",\n modelId,\n field: \"referenceImages\",\n message: `${modelId} takes reference subjects (each a frontal image plus other angles), not a flat reference list.`,\n received: flatCount,\n });\n }\n\n if (!isElements && groupCount > 0) {\n errors.push({\n code: \"REFERENCES_NOT_SUPPORTED\",\n modelId,\n field: \"referenceGroups\",\n message: `${modelId} does not support grouped reference subjects.`,\n received: groupCount,\n });\n }\n\n if (isElements) {\n if (refs.maxGroups != null && groupCount > refs.maxGroups) {\n errors.push({\n code: \"TOO_MANY_REFERENCE_GROUPS\",\n modelId,\n field: \"referenceGroups\",\n message: `${modelId} accepts at most ${refs.maxGroups} reference subjects.`,\n allowed: refs.maxGroups,\n received: groupCount,\n });\n }\n\n if (refs.imagesPerGroup) {\n const { min, max } = refs.imagesPerGroup;\n inputs.referenceGroups.forEach((group, index) => {\n const size = groupImages(group).length;\n if (size < min || size > max) {\n errors.push({\n code: \"INVALID_REFERENCE_GROUP_SIZE\",\n modelId,\n field: `referenceGroups[${index}]`,\n message: `${\n group.label ?? `Subject ${index + 1}`\n } has ${size} image(s); ${modelId} needs a frontal image plus ${\n min - 1\n }-${max - 1} other angles.`,\n allowed: max,\n received: size,\n });\n }\n });\n }\n }\n\n if (countedImages.length > refs.maxImages) {\n errors.push({\n code: \"TOO_MANY_REFERENCE_IMAGES\",\n modelId,\n field: \"referenceImages\",\n message: `${modelId} accepts ${refs.maxImages} reference image(s); this request has ${countedImages.length}.`,\n allowed: refs.maxImages,\n received: countedImages.length,\n });\n }\n\n if (inputs.referenceVideos.length > refs.maxVideos) {\n errors.push({\n code: \"TOO_MANY_REFERENCE_VIDEOS\",\n modelId,\n field: \"referenceVideos\",\n message: `${modelId} accepts ${refs.maxVideos} reference video(s).`,\n allowed: refs.maxVideos,\n received: inputs.referenceVideos.length,\n });\n }\n\n if (inputs.referenceAudios.length > refs.maxAudios) {\n errors.push({\n code: \"TOO_MANY_REFERENCE_AUDIOS\",\n modelId,\n field: \"referenceAudios\",\n message: `${modelId} accepts ${refs.maxAudios} reference audio clip(s).`,\n allowed: refs.maxAudios,\n received: inputs.referenceAudios.length,\n });\n }\n\n if (refs.maxTotalAssets != null) {\n const total =\n countedImages.length +\n inputs.referenceVideos.length +\n inputs.referenceAudios.length;\n if (total > refs.maxTotalAssets) {\n errors.push({\n code: \"TOO_MANY_REFERENCE_ASSETS\",\n modelId,\n message: `${modelId} accepts ${refs.maxTotalAssets} reference assets in total; this request has ${total}.`,\n allowed: refs.maxTotalAssets,\n received: total,\n });\n }\n }\n\n return errors;\n}\n\n/**\n * The frame/reference combination matrix. Passing each individual count is not\n * sufficient \u2014 the exact combination has to be permitted.\n */\nfunction validateCombination(\n caps: ModelInputCapabilities,\n inputs: NormalizedGenerationInputs,\n): InputCapabilityError[] {\n const { references: refs, modelId, unknownFields } = caps;\n const hasRefs =\n inputs.referenceImages.length > 0 ||\n inputs.referenceGroups.length > 0 ||\n inputs.referenceVideos.length > 0 ||\n inputs.referenceAudios.length > 0;\n\n if (!hasRefs) {\n return [];\n }\n\n const errors: InputCapabilityError[] = [];\n\n const blocked = (\n slot: \"startFrame\" | \"endFrame\",\n unknownPath: string,\n ): InputCapabilityError => {\n // A block caused by MISSING DOCUMENTATION gets its own code, so it stays\n // separable in logs from a block caused by a documented provider rule --\n // and so it can be lifted the moment the provider documents the answer.\n const isUnverified = unknownFields.includes(unknownPath);\n return {\n code: isUnverified\n ? \"REFERENCE_FRAME_COMBINATION_UNVERIFIED\"\n : \"FRAME_REFERENCE_COMBINATION_NOT_SUPPORTED\",\n modelId,\n field: slot,\n message: isUnverified\n ? `Combining reference images with a ${\n slot === \"startFrame\" ? \"start\" : \"end\"\n } frame is not documented for ${modelId}, so it is blocked rather than risking a failed paid request. Use references or frames, not both.`\n : `${modelId} cannot combine reference images with a ${\n slot === \"startFrame\" ? \"start\" : \"end\"\n } frame \u2014 the provider documents these as mutually exclusive.`,\n };\n };\n\n if (inputs.startFrame && !refs.canCombineWithStartFrame) {\n errors.push(\n blocked(\"startFrame\", \"references.canCombineWithStartFrame\"),\n );\n }\n\n if (inputs.endFrame && !refs.canCombineWithEndFrame) {\n errors.push(blocked(\"endFrame\", \"references.canCombineWithEndFrame\"));\n }\n\n if (\n inputs.referenceVideos.length > 0 &&\n inputs.referenceImages.length > 0 &&\n !refs.acceptsImageAndVideoReferences\n ) {\n errors.push({\n code: \"FRAME_REFERENCE_COMBINATION_NOT_SUPPORTED\",\n modelId,\n message: `${modelId} cannot take image references and video references in the same request.`,\n });\n }\n\n return errors;\n}\n\n// \u2500\u2500\u2500 Controls \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst resolutionRank = (value: string): number | undefined =>\n RESOLUTION_RANK[value.toLowerCase()];\n\nfunction validateControls(\n caps: ModelInputCapabilities,\n inputs: NormalizedGenerationInputs,\n controls: RequestedControls,\n): InputCapabilityError[] {\n const errors: InputCapabilityError[] = [];\n const { controls: cfg, modelId } = caps;\n const hasFrame = inputs.startFrame != null || inputs.endFrame != null;\n\n if (controls.aspectRatio != null) {\n const mode = cfg.aspectRatioMode;\n\n if (\n mode === \"notApplicable\" ||\n (mode === \"notApplicableWithFrames\" && hasFrame)\n ) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"aspectRatio\",\n message: `${modelId} has no aspect ratio setting when a frame is supplied \u2014 the output follows the frame.`,\n received: controls.aspectRatio,\n });\n } else if (\n mode === \"forcedAdaptiveWithFrames\" &&\n hasFrame &&\n controls.aspectRatio !== ADAPTIVE_ASPECT_RATIO\n ) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"aspectRatio\",\n message: `${modelId} requires an adaptive aspect ratio when a frame is supplied; it derives the ratio from the first frame.`,\n allowed: [ADAPTIVE_ASPECT_RATIO],\n received: controls.aspectRatio,\n });\n } else if (!cfg.aspectRatios.includes(controls.aspectRatio)) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"aspectRatio\",\n message: `${modelId} does not support a ${controls.aspectRatio} aspect ratio.`,\n allowed: cfg.aspectRatios,\n received: controls.aspectRatio,\n });\n }\n }\n\n if (\n controls.resolution != null &&\n !cfg.resolutions.some(\n (r) => r.toLowerCase() === controls.resolution!.toLowerCase(),\n )\n ) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"resolution\",\n message: `${modelId} does not support ${controls.resolution} output.`,\n allowed: cfg.resolutions,\n received: controls.resolution,\n });\n }\n\n const duration = controls.durationSeconds;\n if (duration != null) {\n if (duration === AUTO_DURATION) {\n if (!cfg.supportsAutoDuration) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"durationSeconds\",\n message: `${modelId} requires an explicit duration.`,\n received: duration,\n });\n }\n } else if (cfg.durationsSeconds) {\n if (!cfg.durationsSeconds.includes(duration)) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"durationSeconds\",\n message: `${modelId} supports ${cfg.durationsSeconds.join(\n \", \",\n )} second durations.`,\n allowed: cfg.durationsSeconds.map(String),\n received: duration,\n });\n }\n } else {\n const min = cfg.minDurationSeconds;\n const max = cfg.maxDurationSeconds;\n if ((min != null && duration < min) || (max != null && duration > max)) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"durationSeconds\",\n message: `${modelId} supports durations between ${min} and ${max} seconds.`,\n received: duration,\n });\n }\n }\n }\n\n if (controls.seed != null && !cfg.supportsSeed) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"seed\",\n message: `${modelId} does not document a seed parameter.`,\n received: controls.seed,\n });\n }\n\n if (controls.negativePrompt && !cfg.supportsNegativePrompt) {\n errors.push({\n code: \"UNSUPPORTED_CONTROL\",\n modelId,\n field: \"negativePrompt\",\n message: `${modelId} does not document a negative prompt parameter. Put negative guidance in the prompt instead.`,\n });\n }\n\n return errors;\n}\n\nfunction conditionHolds(\n condition: CapabilityCondition,\n inputs: NormalizedGenerationInputs,\n controls: RequestedControls,\n): boolean {\n switch (condition.kind) {\n case \"hasReferences\":\n return (\n inputs.referenceImages.length > 0 ||\n inputs.referenceGroups.length > 0 ||\n inputs.referenceVideos.length > 0\n );\n case \"hasStartFrame\":\n return inputs.startFrame != null;\n case \"hasEndFrame\":\n return inputs.endFrame != null;\n case \"hasAnyFrame\":\n return inputs.startFrame != null || inputs.endFrame != null;\n case \"resolutionIn\":\n return (\n controls.resolution != null &&\n condition.values.some(\n (v) => v.toLowerCase() === controls.resolution!.toLowerCase(),\n )\n );\n default:\n return false;\n }\n}\n\nfunction validateConstraints(\n caps: ModelInputCapabilities,\n inputs: NormalizedGenerationInputs,\n controls: RequestedControls,\n): InputCapabilityError[] {\n const errors: InputCapabilityError[] = [];\n\n for (const constraint of caps.constraints) {\n const fires = constraint.whenAny.some((c) =>\n conditionHolds(c, inputs, controls),\n );\n if (!fires) {\n continue;\n }\n\n const { requires } = constraint;\n\n if (\n requires.kind === \"durationMustBe\" &&\n controls.durationSeconds != null &&\n controls.durationSeconds !== requires.seconds\n ) {\n errors.push({\n code: \"CONTROL_CONSTRAINT_VIOLATED\",\n modelId: caps.modelId,\n field: \"durationSeconds\",\n message: constraint.message,\n allowed: requires.seconds,\n received: controls.durationSeconds,\n });\n }\n\n if (requires.kind === \"resolutionAtMost\" && controls.resolution != null) {\n const cap = resolutionRank(requires.value);\n const requested = resolutionRank(controls.resolution);\n if (cap != null && requested != null && requested > cap) {\n errors.push({\n code: \"CONTROL_CONSTRAINT_VIOLATED\",\n modelId: caps.modelId,\n field: \"resolution\",\n message: constraint.message,\n allowed: requires.value,\n received: controls.resolution,\n });\n }\n }\n\n if (\n requires.kind === \"aspectRatioMustBe\" &&\n controls.aspectRatio != null &&\n controls.aspectRatio !== requires.value\n ) {\n errors.push({\n code: \"CONTROL_CONSTRAINT_VIOLATED\",\n modelId: caps.modelId,\n field: \"aspectRatio\",\n message: constraint.message,\n allowed: requires.value,\n received: controls.aspectRatio,\n });\n }\n }\n\n return errors;\n}\n\n/**\n * The duration a model's own constraints force for this request, or null when\n * nothing is forced.\n *\n * Veo 3.1 is the case that matters: reference images, 1080p and 4K each\n * require an 8 second duration. The UI needs this to pick a valid default and\n * to coerce the duration when the user changes resolution, rather than\n * letting the two controls drift into a combination the provider rejects.\n */\nexport function requiredDurationFor(\n caps: ModelInputCapabilities | null | undefined,\n inputs: NormalizedGenerationInputs,\n controls: RequestedControls,\n): number | null {\n if (!caps) {\n return null;\n }\n for (const constraint of caps.constraints) {\n if (constraint.requires.kind !== \"durationMustBe\") {\n continue;\n }\n if (constraint.whenAny.some((c) => conditionHolds(c, inputs, controls))) {\n return constraint.requires.seconds;\n }\n }\n return null;\n}\n\n/**\n * The highest resolution this request may use, given the model's constraints,\n * or null when nothing is capped. Grok Imagine Video caps reference-to-video\n * at 720p even though the model itself supports 1080p.\n */\nexport function maxResolutionFor(\n caps: ModelInputCapabilities | null | undefined,\n inputs: NormalizedGenerationInputs,\n controls: RequestedControls,\n): string | null {\n if (!caps) {\n return null;\n }\n for (const constraint of caps.constraints) {\n if (constraint.requires.kind !== \"resolutionAtMost\") {\n continue;\n }\n if (constraint.whenAny.some((c) => conditionHolds(c, inputs, controls))) {\n return constraint.requires.value;\n }\n }\n return null;\n}\n\n/** Resolutions from `caps` that are usable for this request. */\nexport function allowedResolutionsFor(\n caps: ModelInputCapabilities | null | undefined,\n inputs: NormalizedGenerationInputs,\n controls: RequestedControls,\n): readonly string[] {\n if (!caps) {\n return [];\n }\n const cap = maxResolutionFor(caps, inputs, controls);\n if (!cap) {\n return caps.controls.resolutions;\n }\n const ceiling = resolutionRank(cap);\n if (ceiling == null) {\n return caps.controls.resolutions;\n }\n return caps.controls.resolutions.filter((r) => {\n const rank = resolutionRank(r);\n return rank == null || rank <= ceiling;\n });\n}\n\n/**\n * Validate a normalized request against a capability record.\n *\n * `caps` is nullable on purpose: an unregistered model must be rejected, not\n * waved through, and the host resolves the record itself rather than trusting\n * anything the client sent.\n */\nexport function validateInputs(\n caps: ModelInputCapabilities | null | undefined,\n inputs: NormalizedGenerationInputs,\n controls: RequestedControls,\n): InputCapabilityError[] {\n if (!caps) {\n return [\n {\n code: \"UNKNOWN_MODEL_CAPABILITIES\",\n modelId: \"\",\n message:\n \"This model has no verified input capability record, so the request cannot be validated or sent.\",\n },\n ];\n }\n\n const assetErrors: InputCapabilityError[] = [];\n const named: [InputAsset | null, string][] = [\n [inputs.startFrame, \"startFrame\"],\n [inputs.endFrame, \"endFrame\"],\n [inputs.sourceImage, \"sourceImage\"],\n [inputs.brandLogo, \"brandLogo\"],\n ];\n for (const [asset, field] of named) {\n if (asset) {\n assetErrors.push(...validateAsset(caps, asset, field));\n }\n }\n inputs.referenceImages.forEach((asset, i) => {\n assetErrors.push(...validateAsset(caps, asset, `referenceImages[${i}]`));\n });\n inputs.referenceGroups.forEach((group, gi) => {\n groupImages(group).forEach((asset, i) => {\n assetErrors.push(\n ...validateAsset(caps, asset, `referenceGroups[${gi}][${i}]`),\n );\n });\n });\n\n return [\n ...assetErrors,\n ...validateFrames(caps, inputs),\n ...validateReferences(caps, inputs),\n ...validateCombination(caps, inputs),\n ...validateControls(caps, inputs, controls),\n ...validateConstraints(caps, inputs, controls),\n ];\n}\n", "// Canonical model input capability contract.\n//\n// This is a SERVER-SAFE entry point: it has no React, DOM or canvas\n// dependency, so the Next.js host can import it inside an API route to run the\n// same validation the SDK runs in the browser.\n//\n// import { getCapabilities, validateInputs } from \"@orangecatai/adgen-canvas/model-capabilities\";\n//\n// Every limit is transcribed from the MODEL MAKER's own API documentation --\n// never from OpenRouter or any other aggregator. See registry.image.ts and\n// registry.video.ts for the per-model sources and for the audit trail of\n// fields that carry a conservative default because the provider documents no\n// value.\n\nimport { IMAGE_MODEL_CAPABILITIES } from \"./registry.image\";\nimport { VIDEO_MODEL_CAPABILITIES } from \"./registry.video\";\n\nimport type { ModelInputCapabilities } from \"./types\";\n\nexport * from \"./types\";\nexport * from \"./validate\";\nexport { IMAGE_MODEL_CAPABILITIES } from \"./registry.image\";\nexport { VIDEO_MODEL_CAPABILITIES } from \"./registry.video\";\n\nexport const ALL_MODEL_CAPABILITIES: readonly ModelInputCapabilities[] = [\n ...IMAGE_MODEL_CAPABILITIES,\n ...VIDEO_MODEL_CAPABILITIES,\n];\n\nconst BY_ID: ReadonlyMap<string, ModelInputCapabilities> = new Map(\n ALL_MODEL_CAPABILITIES.map((caps) => [caps.modelId, caps]),\n);\n\n/**\n * Resolve the capability record for a model id, or null when the model is not\n * registered. The host MUST resolve through this rather than trusting any\n * capability values sent by the client.\n *\n * OpenRouter's web-search variant appends \":online\" to a model id; strip it\n * before looking up, mirroring `isModelAllowed` on the host.\n */\nexport function getCapabilities(\n modelId: string | null | undefined,\n): ModelInputCapabilities | null {\n if (!modelId || typeof modelId !== \"string\") {\n return null;\n }\n const base = modelId.endsWith(\":online\")\n ? modelId.slice(0, -\":online\".length)\n : modelId;\n return BY_ID.get(base) ?? null;\n}\n\n/** Every registered model id, for allowlist parity checks. */\nexport function registeredModelIds(): string[] {\n return [...BY_ID.keys()];\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// <define:import.meta.env>
|
|
2
|
-
var define_import_meta_env_default = { MODE: "development", VITE_APP_GEMINI_API_KEY: "", VITE_APP_OPENROUTER_API_KEY: "", VITE_APP_BACKEND_V2_GET_URL: "https://json-dev.excalidraw.com/api/v2/", VITE_APP_BACKEND_V2_POST_URL: "https://json-dev.excalidraw.com/api/v2/post/", VITE_APP_LIBRARY_URL: "https://libraries.excalidraw.com", VITE_APP_LIBRARY_BACKEND: "https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries", VITE_APP_WS_SERVER_URL: "http://localhost:3002", VITE_APP_PLUS_LP: "https://plus.excalidraw.com", VITE_APP_PLUS_APP: "http://localhost:3000", VITE_APP_AI_BACKEND: "http://localhost:3016", VITE_APP_FIREBASE_CONFIG: '{"apiKey":"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8","authDomain":"excalidraw-oss-dev.firebaseapp.com","projectId":"excalidraw-oss-dev","storageBucket":"excalidraw-oss-dev.appspot.com","messagingSenderId":"664559512677","appId":"1:664559512677:web:a385181f2928d328a7aa8c"}', VITE_APP_DEV_DISABLE_LIVE_RELOAD: "", VITE_APP_ENABLE_TRACKING: "true", FAST_REFRESH: "false", VITE_APP_PORT: "3001", VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX: "", VITE_APP_COLLAPSE_OVERLAY: "true", VITE_APP_ENABLE_ESLINT: "true", VITE_APP_ENABLE_PWA: "false", VITE_APP_PLUS_EXPORT_PUBLIC_KEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\nHQIDAQAB", VITE_APP_DISABLE_PREVENT_UNLOAD: "", PKG_NAME: "@orangecatai/adgen-canvas", PKG_VERSION: "0.0
|
|
2
|
+
var define_import_meta_env_default = { MODE: "development", VITE_APP_GEMINI_API_KEY: "", VITE_APP_OPENROUTER_API_KEY: "", VITE_APP_BACKEND_V2_GET_URL: "https://json-dev.excalidraw.com/api/v2/", VITE_APP_BACKEND_V2_POST_URL: "https://json-dev.excalidraw.com/api/v2/post/", VITE_APP_LIBRARY_URL: "https://libraries.excalidraw.com", VITE_APP_LIBRARY_BACKEND: "https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries", VITE_APP_WS_SERVER_URL: "http://localhost:3002", VITE_APP_PLUS_LP: "https://plus.excalidraw.com", VITE_APP_PLUS_APP: "http://localhost:3000", VITE_APP_AI_BACKEND: "http://localhost:3016", VITE_APP_FIREBASE_CONFIG: '{"apiKey":"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8","authDomain":"excalidraw-oss-dev.firebaseapp.com","projectId":"excalidraw-oss-dev","storageBucket":"excalidraw-oss-dev.appspot.com","messagingSenderId":"664559512677","appId":"1:664559512677:web:a385181f2928d328a7aa8c"}', VITE_APP_DEV_DISABLE_LIVE_RELOAD: "", VITE_APP_ENABLE_TRACKING: "true", FAST_REFRESH: "false", VITE_APP_PORT: "3001", VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX: "", VITE_APP_COLLAPSE_OVERLAY: "true", VITE_APP_ENABLE_ESLINT: "true", VITE_APP_ENABLE_PWA: "false", VITE_APP_PLUS_EXPORT_PUBLIC_KEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm2g5T+Rub6Kbf1Mf57t0\n7r2zeHuVg4dla3r5ryXMswtzz6x767octl6oLThn33mQsPSy3GKglFZoCTXJR4ij\nba8SxB04sL/N8eRrKja7TFWjCVtRwTTfyy771NYYNFVJclkxHyE5qw4m27crHF1y\nUNWEjuqNMi/lwAErS9fFa2oJlWyT8U7zzv/5kQREkxZI6y9v0AF3qcbsy2731FnD\ns9ChJvOUW9toIab2gsIdrKW8ZNpu084ZFVKb6LNjvIXI1Se4oMTHeszXzNptzlot\nkdxxjOoaQMAyfljFSot1F1FlU6MQlag7UnFGvFjRHN1JI5q4K+n3a67DX+TMyRqS\nHQIDAQAB", VITE_APP_DISABLE_PREVENT_UNLOAD: "", PKG_NAME: "@orangecatai/adgen-canvas", PKG_VERSION: "0.1.0", DEV: true };
|
|
3
3
|
|
|
4
4
|
export {
|
|
5
5
|
define_import_meta_env_default
|
|
6
6
|
};
|
|
7
|
-
//# sourceMappingURL=chunk-
|
|
7
|
+
//# sourceMappingURL=chunk-2Q5Z4UTF.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["<define:import.meta.env>"],
|
|
4
4
|
"sourcesContent": [""],
|
|
5
|
-
"mappings": ";AAAA,uCAAC,MAAO,eAAc,yBAA0B,IAAG,6BAA8B,IAAG,6BAA8B,2CAA0C,8BAA+B,gDAA+C,sBAAuB,oCAAmC,0BAA2B,gFAA+E,wBAAyB,yBAAwB,kBAAmB,+BAA8B,mBAAoB,yBAAwB,qBAAsB,yBAAwB,0BAA2B,mRAA0S,kCAAmC,IAAG,0BAA2B,QAAO,cAAe,SAAQ,eAAgB,QAAO,mDAAoD,IAAG,2BAA4B,QAAO,wBAAyB,QAAO,qBAAsB,SAAQ,iCAAkC,wZAAuZ,iCAAkC,IAAG,UAAW,6BAA4B,aAAc,
|
|
5
|
+
"mappings": ";AAAA,uCAAC,MAAO,eAAc,yBAA0B,IAAG,6BAA8B,IAAG,6BAA8B,2CAA0C,8BAA+B,gDAA+C,sBAAuB,oCAAmC,0BAA2B,gFAA+E,wBAAyB,yBAAwB,kBAAmB,+BAA8B,mBAAoB,yBAAwB,qBAAsB,yBAAwB,0BAA2B,mRAA0S,kCAAmC,IAAG,0BAA2B,QAAO,cAAe,SAAQ,eAAgB,QAAO,mDAAoD,IAAG,2BAA4B,QAAO,wBAAyB,QAAO,qBAAsB,SAAQ,iCAAkC,wZAAuZ,iCAAkC,IAAG,UAAW,6BAA4B,aAAc,SAAQ,KAAM,KAAI;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -55,6 +55,11 @@ var labels = {
|
|
|
55
55
|
arrowtype_round: "Curved arrow",
|
|
56
56
|
arrowtype_elbowed: "Elbow arrow",
|
|
57
57
|
fontSize: "Font size",
|
|
58
|
+
textStyle: "Text style",
|
|
59
|
+
italic: "Italic",
|
|
60
|
+
underline: "Underline",
|
|
61
|
+
strikethrough: "Strikethrough",
|
|
62
|
+
textHighlight: "Highlight",
|
|
58
63
|
fontFamily: "Font family",
|
|
59
64
|
addWatermark: 'Add "Made with Excalidraw"',
|
|
60
65
|
handDrawn: "Hand-drawn",
|
|
@@ -798,4 +803,4 @@ export {
|
|
|
798
803
|
keys,
|
|
799
804
|
en_default
|
|
800
805
|
};
|
|
801
|
-
//# sourceMappingURL=chunk-
|
|
806
|
+
//# sourceMappingURL=chunk-3WIRZ6S7.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../locales/en.json"],
|
|
4
|
+
"sourcesContent": ["{\n \"labels\": {\n \"paste\": \"Paste\",\n \"pasteAsPlaintext\": \"Paste as plaintext\",\n \"pasteCharts\": \"Paste charts\",\n \"selectAll\": \"Select all\",\n \"multiSelect\": \"Add element to selection\",\n \"moveCanvas\": \"Move canvas\",\n \"cut\": \"Cut\",\n \"copy\": \"Copy\",\n \"copyAsPng\": \"Copy to clipboard as PNG\",\n \"copyAsSvg\": \"Copy to clipboard as SVG\",\n \"copyText\": \"Copy to clipboard as text\",\n \"copySource\": \"Copy source to clipboard\",\n \"convertToCode\": \"Convert to code\",\n \"bringForward\": \"Bring forward\",\n \"sendToBack\": \"Send to back\",\n \"bringToFront\": \"Bring to front\",\n \"sendBackward\": \"Send backward\",\n \"delete\": \"Delete\",\n \"copyStyles\": \"Copy styles\",\n \"pasteStyles\": \"Paste styles\",\n \"stroke\": \"Stroke\",\n \"changeStroke\": \"Change stroke color\",\n \"background\": \"Background\",\n \"changeBackground\": \"Change background color\",\n \"fill\": \"Fill\",\n \"strokeWidth\": \"Stroke width\",\n \"strokeStyle\": \"Stroke style\",\n \"strokeStyle_solid\": \"Solid\",\n \"strokeStyle_dashed\": \"Dashed\",\n \"strokeStyle_dotted\": \"Dotted\",\n \"sloppiness\": \"Sloppiness\",\n \"opacity\": \"Opacity\",\n \"textAlign\": \"Text align\",\n \"edges\": \"Edges\",\n \"sharp\": \"Sharp\",\n \"round\": \"Round\",\n \"arrowheads\": \"Arrowheads\",\n \"arrowhead_none\": \"None\",\n \"arrowhead_arrow\": \"Arrow\",\n \"arrowhead_bar\": \"Bar\",\n \"arrowhead_circle\": \"Circle\",\n \"arrowhead_circle_outline\": \"Circle (outline)\",\n \"arrowhead_triangle\": \"Triangle\",\n \"arrowhead_triangle_outline\": \"Triangle (outline)\",\n \"arrowhead_diamond\": \"Diamond\",\n \"arrowhead_diamond_outline\": \"Diamond (outline)\",\n \"arrowhead_crowfoot_many\": \"Crow's foot (many)\",\n \"arrowhead_crowfoot_one\": \"Crow's foot (one)\",\n \"arrowhead_crowfoot_one_or_many\": \"Crow's foot (one or many)\",\n \"more_options\": \"More options\",\n \"arrowtypes\": \"Arrow type\",\n \"arrowtype_sharp\": \"Sharp arrow\",\n \"arrowtype_round\": \"Curved arrow\",\n \"arrowtype_elbowed\": \"Elbow arrow\",\n \"fontSize\": \"Font size\",\n \"textStyle\": \"Text style\",\n \"italic\": \"Italic\",\n \"underline\": \"Underline\",\n \"strikethrough\": \"Strikethrough\",\n \"textHighlight\": \"Highlight\",\n \"fontFamily\": \"Font family\",\n \"addWatermark\": \"Add \\\"Made with Excalidraw\\\"\",\n \"handDrawn\": \"Hand-drawn\",\n \"normal\": \"Normal\",\n \"code\": \"Code\",\n \"small\": \"Small\",\n \"medium\": \"Medium\",\n \"large\": \"Large\",\n \"veryLarge\": \"Very large\",\n \"solid\": \"Solid\",\n \"hachure\": \"Hachure\",\n \"zigzag\": \"Zigzag\",\n \"crossHatch\": \"Cross-hatch\",\n \"thin\": \"Thin\",\n \"bold\": \"Bold\",\n \"left\": \"Left\",\n \"center\": \"Center\",\n \"right\": \"Right\",\n \"extraBold\": \"Extra bold\",\n \"architect\": \"Architect\",\n \"artist\": \"Artist\",\n \"cartoonist\": \"Cartoonist\",\n \"fileTitle\": \"File name\",\n \"colorPicker\": \"Color picker\",\n \"canvasColors\": \"Used on canvas\",\n \"canvasBackground\": \"Canvas background\",\n \"drawingCanvas\": \"Drawing canvas\",\n \"clearCanvas\": \"Clear canvas\",\n \"layers\": \"Layers\",\n \"actions\": \"Actions\",\n \"language\": \"Language\",\n \"liveCollaboration\": \"Live collaboration...\",\n \"duplicateSelection\": \"Duplicate\",\n \"untitled\": \"Untitled\",\n \"name\": \"Name\",\n \"yourName\": \"Your name\",\n \"madeWithExcalidraw\": \"Made with Excalidraw\",\n \"group\": \"Group selection\",\n \"ungroup\": \"Ungroup selection\",\n \"collaborators\": \"Collaborators\",\n \"toggleGrid\": \"Toggle grid\",\n \"addToLibrary\": \"Add to library\",\n \"removeFromLibrary\": \"Remove from library\",\n \"libraryLoadingMessage\": \"Loading library\u2026\",\n \"libraries\": \"Browse libraries\",\n \"loadingScene\": \"Loading scene\u2026\",\n \"loadScene\": \"Load scene from file\",\n \"align\": \"Align\",\n \"alignTop\": \"Align top\",\n \"alignBottom\": \"Align bottom\",\n \"alignLeft\": \"Align left\",\n \"alignRight\": \"Align right\",\n \"centerVertically\": \"Center vertically\",\n \"centerHorizontally\": \"Center horizontally\",\n \"distributeHorizontally\": \"Distribute horizontally\",\n \"distributeVertically\": \"Distribute vertically\",\n \"flipHorizontal\": \"Flip horizontal\",\n \"flipVertical\": \"Flip vertical\",\n \"viewMode\": \"View mode\",\n \"share\": \"Share\",\n \"showStroke\": \"Show stroke color picker\",\n \"showBackground\": \"Show background color picker\",\n \"showFonts\": \"Show font picker\",\n \"toggleTheme\": \"Toggle light/dark theme\",\n \"theme\": \"Theme\",\n \"personalLib\": \"Personal Library\",\n \"excalidrawLib\": \"Excalidraw Library\",\n \"decreaseFontSize\": \"Decrease font size\",\n \"increaseFontSize\": \"Increase font size\",\n \"unbindText\": \"Unbind text\",\n \"bindText\": \"Bind text to the container\",\n \"createContainerFromText\": \"Wrap text in a container\",\n \"link\": {\n \"edit\": \"Edit link\",\n \"editEmbed\": \"Edit embeddable link\",\n \"create\": \"Add link\",\n \"label\": \"Link\",\n \"labelEmbed\": \"Link & embed\",\n \"empty\": \"No link is set\",\n \"hint\": \"Type or paste your link here\",\n \"goToElement\": \"Go to target element\"\n },\n \"lineEditor\": {\n \"edit\": \"Edit line\",\n \"editArrow\": \"Edit arrow\"\n },\n \"polygon\": {\n \"breakPolygon\": \"Break polygon\",\n \"convertToPolygon\": \"Convert to polygon\"\n },\n \"elementLock\": {\n \"lock\": \"Lock\",\n \"unlock\": \"Unlock\",\n \"lockAll\": \"Lock all\",\n \"unlockAll\": \"Unlock all\"\n },\n \"statusPublished\": \"Published\",\n \"sidebarLock\": \"Keep sidebar open\",\n \"selectAllElementsInFrame\": \"Select all elements in frame\",\n \"removeAllElementsFromFrame\": \"Remove all elements from frame\",\n \"cycleThroughFrameChildren\": \"Cycle through frame elements\",\n \"eyeDropper\": \"Pick color from canvas\",\n \"textToDiagram\": \"Text to diagram\",\n \"prompt\": \"Prompt\",\n \"followUs\": \"Follow us\",\n \"discordChat\": \"Discord chat\",\n \"zoomToFitViewport\": \"Zoom to fit in viewport\",\n \"zoomToFitSelection\": \"Zoom to fit selection\",\n \"zoomToFit\": \"Zoom to fit all elements\",\n \"installPWA\": \"Install Excalidraw locally (PWA)\",\n \"autoResize\": \"Enable text auto-resizing\",\n \"imageCropping\": \"Image cropping\",\n \"unCroppedDimension\": \"Uncropped dimension\",\n \"copyElementLink\": \"Copy link to object\",\n \"linkToElement\": \"Link to object\",\n \"wrapSelectionInFrame\": \"Wrap selection in frame\",\n \"tab\": \"Tab\",\n \"shapeSwitch\": \"Switch shape\",\n \"preferences\": \"Preferences\",\n \"preferences_toolLock\": \"Tool lock\"\n },\n \"elementLink\": {\n \"title\": \"Link to object\",\n \"desc\": \"Click on a shape on canvas or paste a link.\",\n \"notFound\": \"Linked object wasn't found on canvas.\"\n },\n \"library\": {\n \"noItems\": \"No items added yet...\",\n \"hint_emptyLibrary\": \"Select an item on canvas to add it here, or install a library from the public repository, below.\",\n \"hint_emptyPrivateLibrary\": \"Select an item on canvas to add it here.\",\n \"search\": {\n \"inputPlaceholder\": \"Search library\",\n \"heading\": \"Library matches\",\n \"noResults\": \"No matching items found...\",\n \"clearSearch\": \"Clear search\"\n }\n },\n \"search\": {\n \"title\": \"Find on canvas\",\n \"noMatch\": \"No matches found...\",\n \"singleResult\": \"result\",\n \"multipleResults\": \"results\",\n \"placeholder\": \"Find text on canvas...\",\n \"frames\": \"Frames\",\n \"texts\": \"Texts\"\n },\n \"buttons\": {\n \"clearReset\": \"Reset the canvas\",\n \"exportJSON\": \"Export to file\",\n \"exportImage\": \"Export image...\",\n \"export\": \"Save to...\",\n \"copyToClipboard\": \"Copy to clipboard\",\n \"copyLink\": \"Copy link\",\n \"save\": \"Save to current file\",\n \"saveAs\": \"Save as\",\n \"load\": \"Open\",\n \"getShareableLink\": \"Get shareable link\",\n \"close\": \"Close\",\n \"selectLanguage\": \"Select language\",\n \"scrollBackToContent\": \"Scroll back to content\",\n \"zoomIn\": \"Zoom in\",\n \"zoomOut\": \"Zoom out\",\n \"resetZoom\": \"Reset zoom\",\n \"menu\": \"Menu\",\n \"done\": \"Done\",\n \"edit\": \"Edit\",\n \"undo\": \"Undo\",\n \"redo\": \"Redo\",\n \"resetLibrary\": \"Reset library\",\n \"createNewRoom\": \"Create new room\",\n \"fullScreen\": \"Full screen\",\n \"darkMode\": \"Dark mode\",\n \"lightMode\": \"Light mode\",\n \"systemMode\": \"System mode\",\n \"zenMode\": \"Zen mode\",\n \"objectsSnapMode\": \"Snap to objects\",\n \"exitZenMode\": \"Exit zen mode\",\n \"cancel\": \"Cancel\",\n \"saveLibNames\": \"Save name(s) and exit\",\n \"clear\": \"Clear\",\n \"remove\": \"Remove\",\n \"embed\": \"Toggle embedding\",\n \"publishLibrary\": \"Rename or publish\",\n \"submit\": \"Submit\",\n \"confirm\": \"Confirm\",\n \"embeddableInteractionButton\": \"Click to interact\"\n },\n \"alerts\": {\n \"clearReset\": \"This will clear the whole canvas. Are you sure?\",\n \"couldNotCreateShareableLink\": \"Couldn't create shareable link.\",\n \"couldNotCreateShareableLinkTooBig\": \"Couldn't create shareable link: the scene is too big\",\n \"couldNotLoadInvalidFile\": \"Couldn't load invalid file\",\n \"importBackendFailed\": \"Importing from backend failed.\",\n \"cannotExportEmptyCanvas\": \"Cannot export empty canvas.\",\n \"couldNotCopyToClipboard\": \"Couldn't copy to clipboard.\",\n \"decryptFailed\": \"Couldn't decrypt data.\",\n \"uploadedSecurly\": \"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can't read the content.\",\n \"loadSceneOverridePrompt\": \"Loading external drawing will replace your existing content. Do you wish to continue?\",\n \"collabStopOverridePrompt\": \"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)\",\n \"errorAddingToLibrary\": \"Couldn't add item to the library\",\n \"errorRemovingFromLibrary\": \"Couldn't remove item from the library\",\n \"confirmAddLibrary\": \"This will add {{numShapes}} shape(s) to your library. Are you sure?\",\n \"imageDoesNotContainScene\": \"This image does not seem to contain any scene data. Have you enabled scene embedding during export?\",\n \"cannotRestoreFromImage\": \"Scene couldn't be restored from this image file\",\n \"invalidSceneUrl\": \"Couldn't import scene from the supplied URL. It's either malformed, or doesn't contain valid Excalidraw JSON data.\",\n \"resetLibrary\": \"This will clear your library. Are you sure?\",\n \"removeItemsFromsLibrary\": \"Delete {{count}} item(s) from library?\",\n \"invalidEncryptionKey\": \"Encryption key must be of 22 characters. Live collaboration is disabled.\",\n \"collabOfflineWarning\": \"No internet connection available.\\nYour changes will not be saved!\",\n \"localStorageQuotaExceeded\": \"Browser storage quota exceeded. Changes will not be saved.\"\n },\n \"errors\": {\n \"unsupportedFileType\": \"Unsupported file type.\",\n \"imageInsertError\": \"Couldn't insert image. Try again later...\",\n \"fileTooBig\": \"File is too big. Maximum allowed size is {{maxSize}}.\",\n \"svgImageInsertError\": \"Couldn't insert SVG image. The SVG markup looks invalid.\",\n \"failedToFetchImage\": \"Failed to fetch image.\",\n \"cannotResolveCollabServer\": \"Couldn't connect to the collab server. Please reload the page and try again.\",\n \"importLibraryError\": \"Couldn't load library\",\n \"saveLibraryError\": \"Couldn't save library to storage. Please save your library to a file locally to make sure you don't lose changes.\",\n \"collabSaveFailed\": \"Couldn't save to the backend database. If problems persist, you should save your file locally to ensure you don't lose your work.\",\n \"collabSaveFailed_sizeExceeded\": \"Couldn't save to the backend database, the canvas seems to be too big. You should save the file locally to ensure you don't lose your work.\",\n \"imageToolNotSupported\": \"Images are disabled.\",\n \"brave_measure_text_error\": {\n \"line1\": \"Looks like you are using Brave browser with the <bold>Aggressively Block Fingerprinting</bold> setting enabled.\",\n \"line2\": \"This could result in breaking the <bold>Text Elements</bold> in your drawings.\",\n \"line3\": \"We strongly recommend disabling this setting. You can follow <link>these steps</link> on how to do so.\",\n \"line4\": \"If disabling this setting doesn't fix the display of text elements, please open an <issueLink>issue</issueLink> on our GitHub, or write us on <discordLink>Discord</discordLink>\"\n },\n \"libraryElementTypeError\": {\n \"embeddable\": \"Embeddable elements cannot be added to the library.\",\n \"iframe\": \"IFrame elements cannot be added to the library.\",\n \"image\": \"Support for adding images to the library coming soon!\"\n },\n \"asyncPasteFailedOnRead\": \"Couldn't paste (couldn't read from system clipboard).\",\n \"asyncPasteFailedOnParse\": \"Couldn't paste.\",\n \"copyToSystemClipboardFailed\": \"Couldn't copy to clipboard.\"\n },\n \"toolBar\": {\n \"selection\": \"Selection\",\n \"lasso\": \"Lasso selection\",\n \"image\": \"Insert image\",\n \"rectangle\": \"Rectangle\",\n \"diamond\": \"Diamond\",\n \"ellipse\": \"Ellipse\",\n \"arrow\": \"Arrow\",\n \"line\": \"Line\",\n \"freedraw\": \"Draw\",\n \"text\": \"Text\",\n \"library\": \"Library\",\n \"lock\": \"Keep selected tool active after drawing\",\n \"penMode\": \"Pen mode - prevent touch\",\n \"link\": \"Add / Update link for a selected shape\",\n \"eraser\": \"Eraser\",\n \"frame\": \"Frame tool\",\n \"magicframe\": \"Wireframe to code\",\n \"embeddable\": \"Web Embed\",\n \"laser\": \"Laser pointer\",\n \"hand\": \"Hand (panning tool)\",\n \"extraTools\": \"More tools\",\n \"mermaidToExcalidraw\": \"Mermaid to Excalidraw\",\n \"convertElementType\": \"Toggle shape type\"\n },\n \"element\": {\n \"rectangle\": \"Rectangle\",\n \"diamond\": \"Diamond\",\n \"ellipse\": \"Ellipse\",\n \"arrow\": \"Arrow\",\n \"line\": \"Line\",\n \"freedraw\": \"Freedraw\",\n \"text\": \"Text\",\n \"image\": \"Image\",\n \"video\": \"Video\",\n \"group\": \"Group\",\n \"frame\": \"Frame\",\n \"magicframe\": \"Wireframe to code\",\n \"embeddable\": \"Web Embed\",\n \"selection\": \"Selection\",\n \"iframe\": \"IFrame\"\n },\n \"headings\": {\n \"canvasActions\": \"Canvas actions\",\n \"selectedShapeActions\": \"Selected shape actions\",\n \"shapes\": \"Shapes\"\n },\n \"hints\": {\n \"dismissSearch\": \"{{shortcut}} to dismiss search\",\n \"canvasPanning\": \"To move canvas, hold {{shortcut_1}} or {{shortcut_2}} while dragging, or use the hand tool\",\n \"linearElement\": \"Click to start multiple points, drag for single line\",\n \"arrowTool\": \"Click to start multiple points, drag for single line. Press {{shortcut}} again to change arrow type.\",\n \"arrowBindModifiers\": \"Hold {{shortcut_1}} to disable binding, or {{shortcut_2}} to bind at a fixed point\",\n \"freeDraw\": \"Click and drag, release when you're finished\",\n \"text\": \"Tip: you can also add text by double-clicking anywhere with the selection tool\",\n \"embeddable\": \"Click-drag to create a website embed\",\n \"text_selected\": \"Double-click or press {{shortcut}} to edit text\",\n \"text_editing\": \"Press {{shortcut_1}} or {{shortcut_2}} to finish editing\",\n \"linearElementMulti\": \"Click on last point or press {{shortcut_1}} or {{shortcut_2}} to finish\",\n \"lockAngle\": \"You can constrain angle by holding {{shortcut}}\",\n \"resize\": \"You can constrain proportions by holding {{shortcut_1}} while resizing,\\nhold {{shortcut_2}} to resize from the center\",\n \"resizeImage\": \"You can resize freely by holding {{shortcut_1}},\\nhold {{shortcut_2}} to resize from the center\",\n \"rotate\": \"You can constrain angles by holding {{shortcut}} while rotating\",\n \"lineEditor_info\": \"Hold {{shortcut_1}} and Double-click or press {{shortcut_2}} to edit points\",\n \"lineEditor_line_info\": \"Double-click or press {{shortcut}} to edit points\",\n \"lineEditor_pointSelected\": \"Press {{shortcut_1}} to remove point(s),\\n{{shortcut_2}} to duplicate, or drag to move\",\n \"lineEditor_nothingSelected\": \"Select a point to edit (hold {{shortcut_1}} to select multiple),\\nor hold {{shortcut_2}} and click to add new points\",\n \"publishLibrary\": \"Publish your own library\",\n \"bindTextToElement\": \"{{shortcut}} to add text\",\n \"createFlowchart\": \"{{shortcut}} to create a flowchart\",\n \"deepBoxSelect\": \"Hold {{shortcut}} to deep select, and to prevent dragging\",\n \"eraserRevert\": \"Hold {{shortcut}} to revert the elements marked for deletion\",\n \"firefox_clipboard_write\": \"This feature can likely be enabled by setting the \\\"dom.events.asyncClipboard.clipboardItem\\\" flag to \\\"true\\\". To change the browser flags in Firefox, visit the \\\"about:config\\\" page.\",\n \"disableSnapping\": \"Hold {{shortcut}} to disable snapping\",\n \"enterCropEditor\": \"Double click the image or press {{shortcut}} to crop the image\",\n \"leaveCropEditor\": \"Click outside the image or press {{shortcut_1}} or {{shortcut_2}} to finish cropping\"\n },\n \"canvasError\": {\n \"cannotShowPreview\": \"Cannot show preview\",\n \"canvasTooBig\": \"The canvas may be too big.\",\n \"canvasTooBigTip\": \"Tip: try moving the farthest elements a bit closer together.\"\n },\n \"errorSplash\": {\n \"headingMain\": \"Encountered an error. Try <button>reloading the page</button>.\",\n \"clearCanvasMessage\": \"If reloading doesn't work, try <button>clearing the canvas</button>.\",\n \"clearCanvasCaveat\": \" This will result in loss of work \",\n \"trackedToSentry\": \"The error with identifier {{eventId}} was tracked on our system.\",\n \"openIssueMessage\": \"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our <button>bug tracker</button>. Please include information below by copying and pasting into the GitHub issue.\",\n \"sceneContent\": \"Scene content:\"\n },\n \"shareDialog\": {\n \"or\": \"Or\"\n },\n \"roomDialog\": {\n \"desc_intro\": \"Invite people to collaborate on your drawing.\",\n \"desc_privacy\": \"Don't worry, the session is end-to-end encrypted, and fully private. Not even our server can see what you draw.\",\n \"button_startSession\": \"Start session\",\n \"button_stopSession\": \"Stop session\",\n \"desc_inProgressIntro\": \"Live-collaboration session is now in progress.\",\n \"desc_shareLink\": \"Share this link with anyone you want to collaborate with:\",\n \"desc_exitSession\": \"Stopping the session will disconnect you from the room, but you'll be able to continue working with the scene, locally. Note that this won't affect other people, and they'll still be able to collaborate on their version.\",\n \"shareTitle\": \"Join a live collaboration session on Excalidraw\"\n },\n \"errorDialog\": {\n \"title\": \"Error\"\n },\n \"exportDialog\": {\n \"disk_title\": \"Save to disk\",\n \"disk_details\": \"Export the scene data to a file from which you can import later.\",\n \"disk_button\": \"Save to file\",\n \"link_title\": \"Shareable link\",\n \"link_details\": \"Export as a read-only link.\",\n \"link_button\": \"Export to Link\",\n \"excalidrawplus_description\": \"Save the scene to your Excalidraw+ workspace.\",\n \"excalidrawplus_button\": \"Export\",\n \"excalidrawplus_exportError\": \"Couldn't export to Excalidraw+ at this moment...\"\n },\n \"helpDialog\": {\n \"blog\": \"Read our blog\",\n \"click\": \"click\",\n \"deepSelect\": \"Deep select\",\n \"deepBoxSelect\": \"Deep select within box, and prevent dragging\",\n \"createFlowchart\": \"Create a flowchart from a generic element\",\n \"navigateFlowchart\": \"Navigate a flowchart\",\n \"curvedArrow\": \"Curved arrow\",\n \"curvedLine\": \"Curved line\",\n \"documentation\": \"Documentation\",\n \"doubleClick\": \"double-click\",\n \"drag\": \"drag\",\n \"editor\": \"Editor\",\n \"editLineArrowPoints\": \"Edit line/arrow points\",\n \"editText\": \"Edit text / add label\",\n \"github\": \"Found an issue? Submit\",\n \"howto\": \"Follow our guides\",\n \"or\": \"or\",\n \"preventBinding\": \"Prevent arrow binding\",\n \"tools\": \"Tools\",\n \"shortcuts\": \"Keyboard shortcuts\",\n \"textFinish\": \"Finish editing (text editor)\",\n \"textNewLine\": \"Add new line (text editor)\",\n \"title\": \"Help\",\n \"view\": \"View\",\n \"zoomToFit\": \"Zoom to fit all elements\",\n \"zoomToSelection\": \"Zoom to selection\",\n \"toggleElementLock\": \"Lock/unlock selection\",\n \"movePageUpDown\": \"Move page up/down\",\n \"movePageLeftRight\": \"Move page left/right\",\n \"cropStart\": \"Crop image\",\n \"cropFinish\": \"Finish image cropping\"\n },\n \"clearCanvasDialog\": {\n \"title\": \"Clear canvas\"\n },\n \"publishDialog\": {\n \"title\": \"Publish library\",\n \"itemName\": \"Item name\",\n \"authorName\": \"Author name\",\n \"githubUsername\": \"GitHub username\",\n \"twitterUsername\": \"Twitter username\",\n \"libraryName\": \"Library name\",\n \"libraryDesc\": \"Library description\",\n \"website\": \"Website\",\n \"placeholder\": {\n \"authorName\": \"Your name or username\",\n \"libraryName\": \"Name of your library\",\n \"libraryDesc\": \"Description of your library to help people understand its usage\",\n \"githubHandle\": \"GitHub handle (optional), so you can edit the library once submitted for review\",\n \"twitterHandle\": \"Twitter username (optional), so we know who to credit when promoting over Twitter\",\n \"website\": \"Link to your personal website or elsewhere (optional)\"\n },\n \"errors\": {\n \"required\": \"Required\",\n \"website\": \"Enter a valid URL\"\n },\n \"noteDescription\": \"Submit your library to be included in the <link>public library repository</link> for other people to use in their drawings.\",\n \"noteGuidelines\": \"The library needs to be manually approved first. Please read the <link>guidelines</link> before submitting. You will need a GitHub account to communicate and make changes if requested, but it is not strictly required.\",\n \"noteLicense\": \"By submitting, you agree the library will be published under the <link>MIT License</link>, which in short means anyone can use them without restrictions.\",\n \"noteItems\": \"Each library item must have its own name so it's filterable. The following library items will be included:\",\n \"atleastOneLibItem\": \"Please select at least one library item to get started\",\n \"republishWarning\": \"Note: some of the selected items are marked as already published/submitted. You should only resubmit items when updating an existing library or submission.\"\n },\n \"publishSuccessDialog\": {\n \"title\": \"Library submitted\",\n \"content\": \"Thank you {{authorName}}. Your library has been submitted for review. You can track the status <link>here</link>\"\n },\n \"confirmDialog\": {\n \"resetLibrary\": \"Reset library\",\n \"removeItemsFromLib\": \"Remove selected items from library\"\n },\n \"imageExportDialog\": {\n \"header\": \"Export image\",\n \"label\": {\n \"withBackground\": \"Background\",\n \"onlySelected\": \"Only selected\",\n \"darkMode\": \"Dark mode\",\n \"embedScene\": \"Embed scene\",\n \"scale\": \"Scale\",\n \"padding\": \"Padding\"\n },\n \"tooltip\": {\n \"embedScene\": \"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.\"\n },\n \"title\": {\n \"exportToPng\": \"Export to PNG\",\n \"exportToSvg\": \"Export to SVG\",\n \"copyPngToClipboard\": \"Copy PNG to clipboard\"\n },\n \"button\": {\n \"exportToPng\": \"PNG\",\n \"exportToSvg\": \"SVG\",\n \"copyPngToClipboard\": \"Copy to clipboard\"\n }\n },\n \"encrypted\": {\n \"tooltip\": \"Your drawings are end-to-end encrypted so Excalidraw's servers will never see them.\",\n \"link\": \"Blog post on end-to-end encryption in Excalidraw\"\n },\n \"stats\": {\n \"angle\": \"Angle\",\n \"shapes\": \"Shapes\",\n \"height\": \"Height\",\n \"scene\": \"Scene\",\n \"selected\": \"Selected\",\n \"storage\": \"Storage\",\n \"fullTitle\": \"Canvas & Shape properties\",\n \"title\": \"Properties\",\n \"generalStats\": \"General\",\n \"elementProperties\": \"Shape properties\",\n \"total\": \"Total\",\n \"version\": \"Version\",\n \"versionCopy\": \"Click to copy\",\n \"versionNotAvailable\": \"Version not available\",\n \"width\": \"Width\"\n },\n \"toast\": {\n \"addedToLibrary\": \"Added to library\",\n \"copyStyles\": \"Copied styles.\",\n \"copyToClipboard\": \"Copied to clipboard.\",\n \"copyToClipboardAsPng\": \"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})\",\n \"copyToClipboardAsSvg\": \"Copied {{exportSelection}} to clipboard as SVG\\n({{exportColorScheme}})\",\n \"fileSaved\": \"File saved.\",\n \"fileSavedToFilename\": \"Saved to {filename}\",\n \"canvas\": \"canvas\",\n \"selection\": \"selection\",\n \"pasteAsSingleElement\": \"Use {{shortcut}} to paste as a single element,\\nor paste into an existing text editor\",\n \"unableToEmbed\": \"Embedding this url is currently not allowed. Raise an issue on GitHub to request the url whitelisted\",\n \"unrecognizedLinkFormat\": \"The link you embedded does not match the expected format. Please try to paste the 'embed' string provided by the source site\",\n \"elementLinkCopied\": \"Link copied to clipboard\"\n },\n \"colors\": {\n \"transparent\": \"Transparent\",\n \"black\": \"Black\",\n \"white\": \"White\",\n \"red\": \"Red\",\n \"pink\": \"Pink\",\n \"grape\": \"Grape\",\n \"violet\": \"Violet\",\n \"gray\": \"Gray\",\n \"blue\": \"Blue\",\n \"cyan\": \"Cyan\",\n \"teal\": \"Teal\",\n \"green\": \"Green\",\n \"yellow\": \"Yellow\",\n \"orange\": \"Orange\",\n \"bronze\": \"Bronze\"\n },\n \"welcomeScreen\": {\n \"app\": {\n \"center_heading\": \"Your drawings are saved in your browser's storage.\",\n \"center_heading_line2\": \"Browser storage can be cleared unexpectedly.\",\n \"center_heading_line3\": \"Save your work to a file regularly to avoid losing it.\",\n \"center_heading_plus\": \"Did you want to go to the Excalidraw+ instead?\",\n \"menuHint\": \"Export, preferences, languages, ...\"\n },\n \"defaults\": {\n \"menuHint\": \"Export, preferences, and more...\",\n \"center_heading\": \"Diagrams. Made. Simple.\",\n \"toolbarHint\": \"Pick a tool & Start drawing!\",\n \"helpHint\": \"Shortcuts & help\"\n }\n },\n \"colorPicker\": {\n \"color\": \"Color\",\n \"mostUsedCustomColors\": \"Most used custom colors\",\n \"colors\": \"Colors\",\n \"shades\": \"Shades\",\n \"hexCode\": \"Hex code\",\n \"noShades\": \"No shades available for this color\"\n },\n \"overwriteConfirm\": {\n \"action\": {\n \"exportToImage\": {\n \"title\": \"Export as image\",\n \"button\": \"Export as image\",\n \"description\": \"Export the scene data as an image from which you can import later.\"\n },\n \"saveToDisk\": {\n \"title\": \"Save to disk\",\n \"button\": \"Save to disk\",\n \"description\": \"Export the scene data to a file from which you can import later.\"\n },\n \"excalidrawPlus\": {\n \"title\": \"Excalidraw+\",\n \"button\": \"Export to Excalidraw+\",\n \"description\": \"Save the scene to your Excalidraw+ workspace.\"\n }\n },\n \"modal\": {\n \"loadFromFile\": {\n \"title\": \"Load from file\",\n \"button\": \"Load from file\",\n \"description\": \"Loading from a file will <bold>replace your existing content</bold>.<br></br>You can back up your drawing first using one of the options below.\"\n },\n \"shareableLink\": {\n \"title\": \"Load from link\",\n \"button\": \"Replace my content\",\n \"description\": \"Loading external drawing will <bold>replace your existing content</bold>.<br></br>You can back up your drawing first by using one of the options below.\"\n }\n }\n },\n \"mermaid\": {\n \"title\": \"Mermaid to Excalidraw\",\n \"button\": \"Insert\",\n \"description\": \"Currently only <flowchartLink>Flowchart</flowchartLink>,<sequenceLink> Sequence, </sequenceLink> and <classLink>Class </classLink>Diagrams are supported. The other types will be rendered as image in Excalidraw.\",\n \"syntax\": \"Mermaid Syntax\",\n \"preview\": \"Preview\",\n \"label\": \"Mermaid\",\n \"inputPlaceholder\": \"Write Mermaid diagram defintion here...\"\n },\n \"ttd\": {\n \"error\": \"Error!\"\n },\n \"chat\": {\n \"inputPlaceholder\": \"Start typing your diagram idea here... ({{shortcut}} for new line)\",\n \"inputPlaceholderWithMessages\": \"Continue refining your diagram...\",\n \"generating\": \"Generating...\",\n \"rateLimitRemaining\": \"{{count}} requests left today\",\n \"role\": {\n \"user\": \"You\",\n \"assistant\": \"AI Assistant\",\n \"system\": \"System\"\n },\n \"aiBeta\": \"AI Beta\",\n \"label\": \"Chat\",\n \"menu\": \"Menu\",\n \"newChat\": \"New Chat\",\n \"deleteChat\": \"Delete chat\",\n \"deleteMessage\": \"Delete message\",\n \"viewAsMermaid\": \"View as Mermaid\",\n \"placeholder\": {\n \"title\": \"Let's design your diagram\",\n \"description\": \"Describe the diagram you want to create, and we'll generate it for you.\",\n \"hint\": \"At the moment we know Flowchart, Sequence, and Class diagrams.\"\n },\n \"preview\": \"Preview\",\n \"insert\": \"Insert\",\n \"retry\": \"Retry\",\n \"errors\": {\n \"promptTooShort\": \"Prompt is too short (min {{min}} characters)\",\n \"promptTooLong\": \"Prompt is too long (max {{max}} characters)\",\n \"generationFailed\": \"Generation failed\",\n \"invalidDiagram\": \"Generated an invalid diagram :(. You may edit manually, retry with auto-fix, or try a different prompt.\",\n \"fixInMermaid\": \"Edit Mermaid manually \u2192\",\n \"aiRepair\": \"Regenerate (auto-fix) \u2192\",\n \"requestAborted\": \"Request aborted\",\n \"requestFailed\": \"Request failed\",\n \"mermaidParseError\": \"Mermaid syntax error\"\n },\n \"rateLimit\": {\n \"messageLimit\": \"You've hit your AI limit on the free plan. Try out Excalidraw+ for more or come back tomorrow.\",\n \"generalRateLimit\": \"Hold your horses, you're too fast for us! Please wait a moment before trying again.\",\n \"messageLimitInputPlaceholder\": \"You've reached your message limit\"\n },\n \"upsellBtnLabel\": \"Upgrade to Plus\"\n },\n \"quickSearch\": {\n \"placeholder\": \"Quick search\"\n },\n \"fontList\": {\n \"badge\": {\n \"old\": \"old\"\n },\n \"sceneFonts\": \"In this scene\",\n \"availableFonts\": \"Available fonts\",\n \"empty\": \"No fonts found\"\n },\n \"userList\": {\n \"empty\": \"No users found\",\n \"hint\": {\n \"text\": \"Click on user to follow\",\n \"followStatus\": \"You're currently following this user\",\n \"inCall\": \"User is in a voice call\",\n \"micMuted\": \"User's microphone is muted\",\n \"isSpeaking\": \"User is speaking\"\n }\n },\n \"commandPalette\": {\n \"title\": \"Command palette\",\n \"shortcuts\": {\n \"select\": \"Select\",\n \"confirm\": \"Confirm\",\n \"close\": \"Close\"\n },\n \"recents\": \"Recently used\",\n \"search\": {\n \"placeholder\": \"Search menus, commands, and discover hidden gems\",\n \"noMatch\": \"No matching commands...\"\n },\n \"itemNotAvailable\": \"Command is not available...\",\n \"shortcutHint\": \"For Command palette, use {{shortcut}}\"\n },\n \"keys\": {\n \"ctrl\": \"Ctrl\",\n \"option\": \"Option\",\n \"cmd\": \"Cmd\",\n \"alt\": \"Alt\",\n \"escape\": \"Esc\",\n \"enter\": \"Enter\",\n \"shift\": \"Shift\",\n \"spacebar\": \"Space\",\n \"delete\": \"Delete\",\n \"mmb\": \"Scroll wheel\"\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|