@kittl/sdk 1.0.0-alpha.1 → 1.0.0-alpha.2

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.
@@ -56,7 +56,11 @@ declare const ANIMATION_CHANNELS: readonly [
56
56
  "scaleY",
57
57
  "skewX",
58
58
  "skewY",
59
- "opacity"
59
+ "opacity",
60
+ "offsetDistance",
61
+ "translateZ",
62
+ "rotateX",
63
+ "rotateY"
60
64
  ];
61
65
  declare const ANIMATION_EASING_NAMES: readonly [
62
66
  "linear",
@@ -65,6 +69,7 @@ declare const ANIMATION_EASING_NAMES: readonly [
65
69
  "ease-out",
66
70
  "ease-in-out"
67
71
  ];
72
+ declare const ANIMATION_SHAPE_CHANNEL = "d";
68
73
  declare const APP_STATE_SUBSCRIPTION_KEYS: readonly [
69
74
  "selectedObjectsIds",
70
75
  "selectedLayersIds",
@@ -171,9 +176,7 @@ declare const DEFAULT_VALUES$1: {
171
176
  generation?: {
172
177
  meta?: GenerationMeta;
173
178
  generationId?: string;
174
- aiArtId? /**
175
- * Cache key to support local history changes without relying on persistence
176
- */: string;
179
+ aiArtId?: string;
177
180
  generatorKey?: string;
178
181
  };
179
182
  };
@@ -264,6 +267,37 @@ declare const GUIDE_DEFAULT_VALUES: {
264
267
  version: string;
265
268
  type: ObjectType.Guide;
266
269
  };
270
+ declare const GenerateContentActionOrigin: {
271
+ readonly COPILOT: "COPILOT";
272
+ readonly RIGHT_PANEL: "RIGHT_PANEL";
273
+ readonly LEFT_PANEL: "LEFT_PANEL";
274
+ readonly MICRO_APP: "MICRO_APP";
275
+ readonly IMAGE_SETS: "IMAGE_SETS";
276
+ readonly AI_CHAT: "AI_CHAT";
277
+ readonly SMARTBOARD: "SMARTBOARD";
278
+ readonly AI_INPUT_GENERATE_IMAGE: "AI_INPUT_GENERATE_IMAGE";
279
+ readonly AI_INPUT_REMIX_IMAGE: "AI_INPUT_REMIX_IMAGE";
280
+ readonly AI_INPUT_GENERATE_VIDEO: "AI_INPUT_GENERATE_VIDEO";
281
+ readonly AI_INPUT_MICRO_EDITOR_REMIX: "AI_INPUT_MICRO_EDITOR_REMIX";
282
+ readonly AI_INPUT_MICRO_EDITOR_INPAINT: "AI_INPUT_MICRO_EDITOR_INPAINT";
283
+ readonly AI_HUB_GENERATE_IMAGE: "AI_HUB_GENERATE_IMAGE";
284
+ readonly AI_HUB_REMIX_IMAGE: "AI_HUB_REMIX_IMAGE";
285
+ readonly AI_HUB_GENERATE_VIDEO: "AI_HUB_GENERATE_VIDEO";
286
+ readonly VIDEOBOARD: "VIDEOBOARD";
287
+ readonly AGENT: "AGENT";
288
+ readonly WORKFLOW: "WORKFLOW";
289
+ readonly AI_HUB_AGENT: "AI_HUB_AGENT";
290
+ readonly MCP: "MCP";
291
+ readonly MCP_WORKFLOW: "MCP_WORKFLOW";
292
+ readonly AI_AGENT: "AI_AGENT";
293
+ readonly AI_AGENT_CHAT: "AI_AGENT_CHAT";
294
+ readonly AI_AGENT_CHAT_WEBSITE: "AI_AGENT_CHAT_WEBSITE";
295
+ readonly MOBILE_APP_GENERATE_IMAGE: "MOBILE_APP_GENERATE_IMAGE";
296
+ readonly MOBILE_APP_REMIX_IMAGE: "MOBILE_APP_REMIX_IMAGE";
297
+ readonly MOBILE_APP_GENERATE_VIDEO: "MOBILE_APP_GENERATE_VIDEO";
298
+ readonly MOBILE_APP_AGENT: "MOBILE_APP_AGENT";
299
+ readonly AI_AGENT_WORKFLOW: "AI_AGENT_WORKFLOW";
300
+ };
267
301
  declare const GenerationStatus: {
268
302
  readonly CREATED: "CREATED";
269
303
  readonly QUEUED: "QUEUED";
@@ -412,6 +446,7 @@ declare const PendingOperation: {
412
446
  readonly UPSCALE: "upscale";
413
447
  readonly REMOVE_BACKGROUND: "removeBackground";
414
448
  readonly REFRAME: "reframe";
449
+ readonly RASTERIZE: "rasterize";
415
450
  };
416
451
  declare const RICH_TEXT_DEFAULT_VALUES: {
417
452
  opacity?: number | undefined;
@@ -699,6 +734,17 @@ export interface AddFontStyleOptions {
699
734
  /**
700
735
  * API for managing application state including selection, viewport, active tool, and canvas mode.
701
736
  *
737
+ * ## Selection
738
+ *
739
+ * {@link AppState.selectionIds} is the only stored selection list; every
740
+ * selection getter is derived from it and the current design state. Derived results are identity-stable — the very same array instance is
741
+ * returned until the selection or the design state changes — so React
742
+ * subscribers and the extension bridge can diff them by reference.
743
+ *
744
+ * Every selection setter replaces the whole selection: whatever ids it is
745
+ * given are expanded into their closure and committed to
746
+ * {@link AppState.selectionIds}.
747
+ *
702
748
  * @public
703
749
  */
704
750
  export interface AppStateAPI {
@@ -707,7 +753,7 @@ export interface AppStateAPI {
707
753
  */
708
754
  getSelectedObjectsIds(): string[];
709
755
  /**
710
- * Sets the selected object IDs.
756
+ * Replaces the selection with the given objects.
711
757
  *
712
758
  * @param ids - Array of object IDs to select
713
759
  * @param origin - Optional origin tag for loop prevention in bidirectional syncs.
@@ -720,41 +766,51 @@ export interface AppStateAPI {
720
766
  */
721
767
  getSelectedLayersIds(): string[];
722
768
  /**
723
- * Sets the selected layer IDs.
769
+ * Replaces the selection with the given layers.
770
+ *
771
+ * Board sub-layer ids (artboard, background, texture) select the board they
772
+ * belong to.
724
773
  *
725
774
  * @param ids - Array of layer IDs to select
775
+ * @param origin - Optional origin tag for loop prevention in bidirectional syncs
726
776
  */
727
- setSelectedLayersIds(ids: string[]): void;
777
+ setSelectedLayersIds(ids: string[], origin?: Origin): void;
728
778
  /**
729
779
  * Gets the IDs of selected artboards.
730
780
  */
731
781
  getSelectedArtboardIds(): string[];
732
782
  /**
733
- * Sets the selected artboard IDs.
783
+ * Replaces the selection with the given artboards.
734
784
  *
735
785
  * @param ids - Array of artboard IDs to select
786
+ * @param origin - Optional origin tag for loop prevention in bidirectional syncs
736
787
  */
737
- setSelectedArtboardIds(ids: string[]): void;
788
+ setSelectedArtboardIds(ids: string[], origin?: Origin): void;
738
789
  /**
739
790
  * Gets the object IDs within selected artboards.
740
791
  */
741
792
  getSelectedArtboardsObjectIds(): string[];
742
793
  /**
743
- * Sets the object IDs within selected artboards.
794
+ * Replaces the selection with the given objects.
744
795
  *
745
796
  * @param ids - Array of object IDs
797
+ * @param origin - Optional origin tag for loop prevention in bidirectional syncs
746
798
  */
747
- setSelectedArtboardsObjectIds(ids: string[]): void;
799
+ setSelectedArtboardsObjectIds(ids: string[], origin?: Origin): void;
748
800
  /**
749
801
  * Gets all selected object IDs including objects, artboards, and artboard objects.
802
+ *
803
+ * A flat, deduplicated list of ids that exist as boards or objects; it never
804
+ * contains group ids or synthetic (`link__`, `path__`) ids.
750
805
  */
751
806
  getAllSelectedObjectsIds(): string[];
752
807
  /**
753
- * Sets all selected object IDs.
808
+ * Replaces the selection with the given ids.
754
809
  *
755
810
  * @param ids - Array of all object IDs to select
811
+ * @param origin - Optional origin tag for loop prevention in bidirectional syncs
756
812
  */
757
- setAllSelectedObjectsIds(ids: string[]): void;
813
+ setAllSelectedObjectsIds(ids: string[], origin?: Origin): void;
758
814
  /**
759
815
  * Gets the current canvas mode.
760
816
  *
@@ -948,11 +1004,13 @@ export interface AsyncAIAPI {
948
1004
  * Sandboxed-side API proxies where all calls resolve asynchronously.
949
1005
  */
950
1006
  export interface AsyncApiMapping {
1007
+ agent: WithAsync<PublicAgentAPI>;
951
1008
  ai: AsyncAIAPI;
952
1009
  aiGenerator: AsyncAIGeneratorAPI;
953
1010
  brandKit: WithAsync<PublicBrandKitAPI>;
954
1011
  mockup: WithAsync<MockupDataAPI>;
955
- context: AsyncContextAPI;
1012
+ /** One proxy serves every entrypoint, so it is typed with every mount's fields. */
1013
+ context: AsyncContextAPI<KittlWidestContext>;
956
1014
  data: AsyncDataAPI;
957
1015
  /** @deprecated Use `project.design.api`. */
958
1016
  design: AsyncDesignAPI;
@@ -1019,7 +1077,7 @@ export interface AsyncProjectAPI {
1019
1077
  createBatch(): Promise<AsyncBatchDesignAPI>;
1020
1078
  };
1021
1079
  app: {
1022
- state: AsyncPublicStateAPI<AppState, PublicAppSelectorState>;
1080
+ state: AsyncPublicStateAPI<PublicAppState, PublicAppSelectorState>;
1023
1081
  api: AsyncAppStateAPI;
1024
1082
  };
1025
1083
  }
@@ -1255,14 +1313,6 @@ export interface CancellableSubmission {
1255
1313
  * first point the backend reports a schedule.
1256
1314
  */
1257
1315
  until?: number;
1258
- /**
1259
- * Drops the work still being done to prepare this submission's generations,
1260
- * for a caller that handed the tracker an abort handle.
1261
- *
1262
- * Cancelling is `cancelGenerations`; this only saves finishing an upload for
1263
- * a generation the user has already stopped.
1264
- */
1265
- abort?: () => void;
1266
1316
  }
1267
1317
  /**
1268
1318
  * Methods for generating preview images and exports from the canvas.
@@ -1594,6 +1644,22 @@ export interface DesignStateSoleBoard extends DesignStateBase {
1594
1644
  objects: SerializedObject[];
1595
1645
  groupStructure: StructureObject;
1596
1646
  }
1647
+ /**
1648
+ * Host-provided iframe offsets used to translate sandboxed drop coordinates
1649
+ * into host screen coordinates.
1650
+ *
1651
+ * @public
1652
+ */
1653
+ export interface DragAndDropOffset {
1654
+ /**
1655
+ * Horizontal offset applied to the iframe client-space drop coordinate.
1656
+ */
1657
+ left: number;
1658
+ /**
1659
+ * Vertical offset applied to the iframe client-space drop coordinate.
1660
+ */
1661
+ top: number;
1662
+ }
1597
1663
  /** @public */
1598
1664
  export interface ErrorGenerationResult {
1599
1665
  type: typeof ResultType.ERROR;
@@ -2249,6 +2315,27 @@ export interface ImageAPI {
2249
2315
  * @throws When the specified image ID doesn't exist in the design
2250
2316
  */
2251
2317
  resetImageBackgroundRemoval(params: ResetImageBackgroundRemovalParams, opts?: DesignApiOptions): SdkResultAsync<NormalizedIllustrationImageObject, SdkError>;
2318
+ /**
2319
+ * Crops an image to its non-transparent pixels, for example after its
2320
+ * background was removed.
2321
+ *
2322
+ * Loads the image source, finds the transparent rows and columns along its
2323
+ * edges, and crops them away. The image is moved so its visible content
2324
+ * stays in place on the canvas, respecting rotation, scale, and flip.
2325
+ *
2326
+ * Leaves the image unchanged when it:
2327
+ * - is already cropped,
2328
+ * - has no transparent edges,
2329
+ * - is fully transparent, or
2330
+ * - had its source replaced while the image was loading.
2331
+ *
2332
+ * @param params - Configuration parameters identifying the image to trim
2333
+ * @param opts - Additional options for the design API operation
2334
+ * @returns Promise that resolves to the trimmed image object
2335
+ * @throws When the specified image ID doesn't exist in the design, or the
2336
+ * image source cannot be loaded or read
2337
+ */
2338
+ trimTransparentEdges(params: TrimTransparentEdgesParams, opts?: UpdateObjectApiOptions): SdkResultAsync<NormalizedIllustrationImageObject, SdkError>;
2252
2339
  }
2253
2340
  /** @public */
2254
2341
  export interface ImageGenerationResult {
@@ -2281,6 +2368,21 @@ export interface KittlContext {
2281
2368
  */
2282
2369
  colorScheme: HostColorScheme;
2283
2370
  }
2371
+ /**
2372
+ * Host context for editor mounting points, which can drag content onto the
2373
+ * canvas and so need the iframe's position in the editor.
2374
+ *
2375
+ * @public
2376
+ */
2377
+ export interface KittlEditorContext extends KittlContext {
2378
+ /** Offset from iframe client coordinates to the host. */
2379
+ iframeOffset: DragAndDropOffset;
2380
+ /** @deprecated Use iframeOffset. */
2381
+ dragAndDrop: {
2382
+ /** @deprecated Use iframeOffset. */
2383
+ offset: DragAndDropOffset;
2384
+ };
2385
+ }
2284
2386
  /**
2285
2387
  * Brand kit API exposed to the content panel and website standalone pages.
2286
2388
  *
@@ -2304,6 +2406,15 @@ export interface KittlSDKContextAPI<TContext extends KittlContext = KittlContext
2304
2406
  */
2305
2407
  context: AsyncContextAPI<TContext>;
2306
2408
  }
2409
+ /**
2410
+ * File picker API exposed to website mounting points.
2411
+ *
2412
+ * @public
2413
+ */
2414
+ export interface KittlSDKFilePickerAPI {
2415
+ /** Opens the host picker and returns the files selected by the user. */
2416
+ fileBrowser: AsyncFileBrowserAPI;
2417
+ }
2307
2418
  /**
2308
2419
  * Lifecycle fields shared by every public SDK mounting point.
2309
2420
  *
@@ -2323,6 +2434,24 @@ export interface KittlSDKLifecycle {
2323
2434
  */
2324
2435
  onReady: (cb: () => void) => void;
2325
2436
  }
2437
+ /**
2438
+ * Main editor handoff API exposed to standalone app pages.
2439
+ *
2440
+ * @public
2441
+ */
2442
+ export interface KittlSDKOpenMainEditorAPI {
2443
+ /** Hands a design over to the main editor, or opens the host project picker. */
2444
+ openMainEditor: AsyncApiMapping["openMainEditor"];
2445
+ }
2446
+ /**
2447
+ * Micro editor API exposed to website mounting points.
2448
+ *
2449
+ * @public
2450
+ */
2451
+ export interface KittlSDKOpenMicroEditorAPI {
2452
+ /** Opens the host micro editor dialog; resolves once the user closes it. */
2453
+ openMicroEditor: AsyncApiMapping["openMicroEditor"];
2454
+ }
2326
2455
  /**
2327
2456
  * Host-agnostic APIs every mounting-point SDK entrypoint exposes.
2328
2457
  *
@@ -2346,20 +2475,6 @@ export interface KittlSDKUploadAPI {
2346
2475
  */
2347
2476
  upload: AsyncUploadAPI;
2348
2477
  }
2349
- /**
2350
- * Website APIs exposed by the website mounting-point SDK entrypoints, on top
2351
- * of the shared, context and upload APIs they compose separately.
2352
- *
2353
- * @public
2354
- */
2355
- export interface KittlSDKWebsiteMountingPointAPIs extends KittlSDKBrandKitAPI {
2356
- /** Opens the host micro editor dialog; resolves once the user closes it. */
2357
- openMicroEditor: AsyncApiMapping["openMicroEditor"];
2358
- /** Hands a design over to the main editor, or opens the host project picker. */
2359
- openMainEditor: AsyncApiMapping["openMainEditor"];
2360
- /** Opens the host picker and returns the files selected by the user. */
2361
- fileBrowser: AsyncFileBrowserAPI;
2362
- }
2363
2478
  /**
2364
2479
  * API for reordering design state layers
2365
2480
  *
@@ -2669,8 +2784,15 @@ export interface MockupDataAPI {
2669
2784
  getOverview(options?: Pick<PaginationOptions, "sort">): SdkResultAsync<MockupOverviewDto>;
2670
2785
  /** Fetches a paginated list of mockups within a specific group. */
2671
2786
  getGroup(groupId: string, options?: PaginationOptions): SdkResultAsync<MockupGroupDto>;
2672
- /** Searches mockups by a text query. */
2673
- search(query: string, options?: PaginationOptions): SdkResultAsync<PaginatedResult<CatalogItem>>;
2787
+ /**
2788
+ * Searches mockups by text. OpenSearch uses relevance ordering and ignores sort.
2789
+ *
2790
+ * @param query - Search text.
2791
+ * @param options - Pagination, database sort, and optional OpenSearch mode.
2792
+ *
2793
+ * @returns Lightweight catalog summaries or an SDK error.
2794
+ */
2795
+ search(query: string, options?: MockupSearchOptions): SdkResultAsync<PaginatedResult<CatalogItem>>;
2674
2796
  /** Fetches suggested tags and groups for mockup discovery. */
2675
2797
  getSuggestions(): SdkResultAsync<MockupSuggestions>;
2676
2798
  }
@@ -2708,6 +2830,14 @@ export interface MockupOverviewGroupDto {
2708
2830
  /** Total number of mockups in this group */
2709
2831
  total: number;
2710
2832
  }
2833
+ /** Pagination and search source options for the mockup catalog. */
2834
+ export interface MockupSearchOptions extends PaginationOptions {
2835
+ /**
2836
+ * Uses OpenSearch relevance ordering instead of database sorting when true.
2837
+ * OpenSearch currently ignores `sort`. Defaults to false.
2838
+ */
2839
+ useOpenSearch?: boolean;
2840
+ }
2711
2841
  /**
2712
2842
  * Suggested tags and groups for mockup discovery.
2713
2843
  */
@@ -2834,7 +2964,7 @@ export interface ObjectAPI {
2834
2964
  *
2835
2965
  * @example
2836
2966
  * ```typescript
2837
- * const objectApi = new ObjectAPI(projectManager, store);
2967
+ * const objectApi = new ObjectAPI(projectCapability, store);
2838
2968
  *
2839
2969
  * // Lock a background image to prevent accidental modification
2840
2970
  * const result = await objectApi.setLockedState({
@@ -2874,7 +3004,7 @@ export interface ObjectAPI {
2874
3004
  *
2875
3005
  * @example
2876
3006
  * ```typescript
2877
- * const objectApi = new ObjectAPI(projectManager, store);
3007
+ * const objectApi = new ObjectAPI(projectCapability, store);
2878
3008
  *
2879
3009
  * // Hide an object
2880
3010
  * const result = await objectApi.setHiddenState({
@@ -2925,7 +3055,7 @@ export interface ObjectAPI {
2925
3055
 
2926
3056
  * @example
2927
3057
  * ```typescript
2928
- * const objectApi = new ObjectAPI(projectManager, store);
3058
+ * const objectApi = new ObjectAPI(projectCapability, store);
2929
3059
  *
2930
3060
  * // Rotate a text element 90 degrees clockwise around its center (default)
2931
3061
  * await objectApi.rotateObject({
@@ -3098,6 +3228,43 @@ export interface PlacementAPI {
3098
3228
  batchClient?: BatchClient<NormalizedDesignState>;
3099
3229
  }): SmartPlacementOutput;
3100
3230
  }
3231
+ /**
3232
+ * Agent methods sandboxed extensions can call through the public SDK.
3233
+ *
3234
+ * Deliberately narrower than {@link AgentAPI}: a single-object, JSON-serializable
3235
+ * argument per method, and only what an apps panel item needs to hand work to
3236
+ * the agent. Both act on the chat open beside the panel, which the host
3237
+ * decides (see {@link AgentAPI.getOpenChatId}); an app never names a chat.
3238
+ * Listing, archiving and feedback stay host-internal.
3239
+ */
3240
+ export interface PublicAgentAPI {
3241
+ /**
3242
+ * Posts a text user message into the open chat and runs the agent on it.
3243
+ * Resolves once the run leaves its interruptible phase, like
3244
+ * {@link AgentAPI.sendMessage}. Text only: an image an app wants the agent
3245
+ * to see goes through {@link PublicAgentAPI.attachImage}, so the user stays
3246
+ * in charge of what is sent. Rejects when no chat is open, and while that
3247
+ * chat's run is still active (see {@link AgentAPI.getIsRunActive}): unlike
3248
+ * the host API, an app never replaces an answer the user is waiting for.
3249
+ */
3250
+ sendMessage: (args: PublicAgentSendMessageArgs) => Promise<void>;
3251
+ /**
3252
+ * Adds an image to the open chat composer's reference row. The user sees it
3253
+ * beside the prompt, can remove it, and sends it with their next message.
3254
+ * Nothing is sent by this call. See {@link AgentAPI.attachImage}.
3255
+ */
3256
+ attachImage: (args: PublicAgentAttachImageArgs) => Promise<void>;
3257
+ }
3258
+ /** Arguments of {@link PublicAgentAPI.attachImage}. */
3259
+ export interface PublicAgentAttachImageArgs {
3260
+ /** The image to attach: the record `upload.image.upload` returned. */
3261
+ image: SandboxedAgentComposerImage;
3262
+ }
3263
+ /** Arguments of {@link PublicAgentAPI.sendMessage}. */
3264
+ export interface PublicAgentSendMessageArgs {
3265
+ /** The user-role prompt to send, as the user had typed it. */
3266
+ text: string;
3267
+ }
3101
3268
  /** Methods the export capability exposes to sandboxed SDK consumers. */
3102
3269
  export interface PublicExportAPI {
3103
3270
  /** Generates a file directly; requires `export:bypass` and organization approval. */
@@ -3233,6 +3400,18 @@ export interface RotateObjectParams {
3233
3400
  y: OriginY;
3234
3401
  };
3235
3402
  }
3403
+ /**
3404
+ * An image an apps panel item attaches to the chat composer: the record
3405
+ * `upload.image.upload` returned to it. `id` is the upload object id the agent
3406
+ * loop stores (see {@link AgentMessageFilePart}); `objectName` is what the
3407
+ * host builds the thumbnail from.
3408
+ */
3409
+ export interface SandboxedAgentComposerImage {
3410
+ /** Upload object id of the image. */
3411
+ id: string;
3412
+ /** Storage object name of the upload, for the composer thumbnail. */
3413
+ objectName: string;
3414
+ }
3236
3415
  export interface SerializeBoardBase {
3237
3416
  objects: SerializedObject[];
3238
3417
  groupStructure: StructureObject;
@@ -3714,26 +3893,6 @@ export interface StructureObjectMeta {
3714
3893
  */
3715
3894
  maskBackgroundColor?: string | null;
3716
3895
  }
3717
- /**
3718
- * What a generation's caller knows about the submission it belongs to.
3719
- *
3720
- * One submission is one Stop, so every generation of a group shares these.
3721
- *
3722
- * @public
3723
- */
3724
- export interface SubmissionOptions {
3725
- /**
3726
- * Abandons the work of preparing this generation - rasterizing and uploading
3727
- * its reference images - when the caller stops the submission it belongs to.
3728
- *
3729
- * An optimization, not the way to cancel: stopping a generation is
3730
- * {@link AIGeneratorAPI.cancelGenerations}, which works the same with or
3731
- * without this, and aborting once the create request has been sent does
3732
- * nothing. Pass it to avoid finishing an upload whose generation the user
3733
- * has already taken back.
3734
- */
3735
- signal?: AbortSignal;
3736
- }
3737
3896
  /**
3738
3897
  * API for creating and managing text elements in the design.
3739
3898
  *
@@ -4160,7 +4319,8 @@ export interface WithObjectLayout {
4160
4319
  flipX: boolean;
4161
4320
  flipY: boolean;
4162
4321
  }
4163
- export type AIGenerationActionOrigin = "COPILOT" | "RIGHT_PANEL" | "LEFT_PANEL" | "MICRO_APP" | "IMAGE_SETS" | "AI_CHAT" | "SMARTBOARD" | "AI_INPUT_GENERATE_IMAGE" | "AI_INPUT_REMIX_IMAGE" | "AI_INPUT_GENERATE_VIDEO" | "AI_INPUT_MICRO_EDITOR_REMIX" | "AI_INPUT_MICRO_EDITOR_INPAINT" | "AI_HUB_GENERATE_IMAGE" | "AI_HUB_REMIX_IMAGE" | "AI_HUB_GENERATE_VIDEO" | "VIDEOBOARD" | "AGENT" | "AI_HUB_AGENT" | "WORKFLOW" | "MCP" | "MCP_WORKFLOW" | "AI_AGENT" | "AI_AGENT_CHAT" | "AI_AGENT_CHAT_WEBSITE" | "MOBILE_APP_GENERATE_IMAGE" | "MOBILE_APP_REMIX_IMAGE" | "MOBILE_APP_GENERATE_VIDEO" | "MOBILE_APP_AGENT";
4322
+ /** Where generation started, using the API's action-origin contract. */
4323
+ export type AIGenerationActionOrigin = GenerateContentActionOrigin;
4164
4324
  export type AIGenerationContentType = "image" | "video";
4165
4325
  export type AIGenerationModelTaskType = "IMAGE_TO_IMAGE" | "IMAGE_INPAINT" | "IMAGE_OUTPAINT" | "TEXT_TO_IMAGE" | "IMAGE_TO_VIDEO";
4166
4326
  /**
@@ -4235,11 +4395,9 @@ export type AIGeneratorAPI = {
4235
4395
  * @param generatorId - Unique identifier for the generator type
4236
4396
  * @param inputSettings - Generator-specific input parameters matching the API schema
4237
4397
  * @param output - Requested output settings for the generation
4238
- * @param options - What the caller knows about the submission this
4239
- * generation belongs to, see {@link SubmissionOptions}
4240
4398
  * @returns Object containing the generation ID
4241
4399
  */
4242
- generate: (generatorId: string, inputSettings: GenerationInputSettings, output: GenerationOutputSettings, options?: SubmissionOptions) => {
4400
+ generate: (generatorId: string, inputSettings: GenerationInputSettings, output: GenerationOutputSettings) => {
4243
4401
  generationId: string;
4244
4402
  };
4245
4403
  /**
@@ -4283,10 +4441,6 @@ export type AIGeneratorAPI = {
4283
4441
  * generation whose create request has not been sent is taken back without the
4284
4442
  * backend ever hearing about it.
4285
4443
  *
4286
- * Takes the submission rather than bare ids so this is also where the
4287
- * preparation still running for it is dropped - callers never do that
4288
- * themselves, and so cannot forget to.
4289
- *
4290
4444
  * @param submission - The submission to stop, from `createSubmissionTracker`.
4291
4445
  * A caller without a tracker can pass `{ generationIds }`.
4292
4446
  * @returns Promise resolving once every cancellation settled, listing the
@@ -4593,7 +4747,7 @@ export type AddSmartboardParams = {
4593
4747
  } & {
4594
4748
  position: AbsolutePosition | RelativePosition;
4595
4749
  size: Dimensions;
4596
- };
4750
+ } & Pick<SmartboardOptions, "generationSettings">;
4597
4751
  /**
4598
4752
  * Comprehensive font and styling properties for text customization and typography control.
4599
4753
  *
@@ -4671,6 +4825,11 @@ export type AddTextParams = {
4671
4825
  * **Default dimensions**: 200x50 pixels if not specified
4672
4826
  */
4673
4827
  size: Dimensions;
4828
+ /**
4829
+ * When set, assigns the new text to this board instead of resolving the board
4830
+ * id via `getObjectBoardId`.
4831
+ */
4832
+ boardId?: string;
4674
4833
  };
4675
4834
  /**
4676
4835
  * Parameters for adding a new video to the design.
@@ -4758,6 +4917,11 @@ export type AnimateViewportToBoundsParams = ViewportAnimationSettings & ObjectPo
4758
4917
  */
4759
4918
  export type AnimateViewportToCenterParams = ViewportAnimationSettings & ObjectPositionRect;
4760
4919
  export type AnimationChannel = (typeof ANIMATION_CHANNELS)[number];
4920
+ /**
4921
+ * How a track combines with the object's own property: `add` is
4922
+ * `property + value`, `replace` sets it.
4923
+ */
4924
+ export type AnimationComposite = "add" | "replace";
4761
4925
  /**
4762
4926
  * `cubic-bezier(x1, y1, x2, y2)`; x values within `[0, 1]`, y values may
4763
4927
  * overshoot. A mutable tuple on purpose: `Normalized<>` cannot map `readonly`
@@ -4772,13 +4936,39 @@ export type AnimationCubicBezierEasing = {
4772
4936
  y2: number
4773
4937
  ];
4774
4938
  };
4775
- export type AnimationEasing = AnimationEasingName | AnimationCubicBezierEasing;
4939
+ export type AnimationEasing = AnimationEasingName | AnimationCubicBezierEasing | AnimationStepsEasing | AnimationHoldEasing;
4776
4940
  export type AnimationEasingName = (typeof ANIMATION_EASING_NAMES)[number];
4941
+ /** Keeps the keyframe value until the next keyframe. */
4942
+ export type AnimationHoldEasing = {
4943
+ type: "hold";
4944
+ };
4777
4945
  /**
4778
4946
  * Key of an animation in the design state, built from its
4779
4947
  * {@link AnimationTarget}: `objectId` or `objectId/pathItemId`.
4780
4948
  */
4781
4949
  export type AnimationKey = string;
4950
+ /**
4951
+ * Curve the target travels along, driven by the `offsetDistance` channel.
4952
+ * Offsets are added to the position, so the curve is relative to where the
4953
+ * target rests (usually ending at `0,0`), in its parent's units.
4954
+ */
4955
+ export type AnimationMotionPath = {
4956
+ /**
4957
+ * SVG path data made of one absolute `M` followed by absolute `L` / `C`
4958
+ * commands, e.g. `'M -200 300 C -150 100 -50 0 0 0'`. A string rather than
4959
+ * points keeps it one atomic value in the design state.
4960
+ */
4961
+ path: string;
4962
+ /** Rotates the target along the curve's tangent, on top of `rotate`. */
4963
+ autoRotate?: boolean;
4964
+ };
4965
+ export type AnimationShapeChannel = typeof ANIMATION_SHAPE_CHANNEL;
4966
+ /** `steps(count, position)`: jumps in `count` equal steps. */
4967
+ export type AnimationStepsEasing = {
4968
+ type: "steps";
4969
+ count: number;
4970
+ position: "start" | "end";
4971
+ };
4782
4972
  export type Animations = Record<AnimationKey, NormalizedAnimation>;
4783
4973
  /**
4784
4974
  * Application state interface containing selection, viewport, active tool, and other UI state.
@@ -4790,25 +4980,27 @@ export type Animations = Record<AnimationKey, NormalizedAnimation>;
4790
4980
  */
4791
4981
  export type AppState = {
4792
4982
  /**
4793
- * Array of selected objects' ids.
4794
- * Note: unlike `selectedLayersIds`, this includes all selected objects regardless group structure; there won't be ids of groups.
4795
- */
4796
- selectedObjectsIds: string[];
4797
- /**
4798
- * Array of selected layers' ids.
4799
- * Note: all items in the list are on the same level in the group structure; there might be ids of groups.
4800
- */
4801
- selectedLayersIds: string[];
4802
- /**
4803
- * Array of selected artboards' ids.
4804
- */
4805
- selectedArtboardIds: string[];
4806
- /**
4807
- * Array of selected artboards' object ids.
4983
+ * Every selected id, in selection order — the single stored selection list
4984
+ * every selection getter of {@link AppStateAPI} (including
4985
+ * `getAllSelectedObjectsIds`) is derived from.
4986
+ *
4987
+ * The list holds the full closure of the selection: selecting a board or a
4988
+ * group also lists everything nested inside it, in canvas render order. It
4989
+ * mixes all the kinds of things that can be selected:
4990
+ *
4991
+ * - board ids
4992
+ * - object ids
4993
+ * - group ids (structure nodes that are not objects themselves)
4994
+ * - `link__<inputBoardId>_<targetBoardId>` ids for the connection between a
4995
+ * smartboard input and its target
4996
+ * - `path__<childObjectId>` ids for a single sub-path of an illustration
4997
+ * - ids the design state does not know yet, passed through untouched
4998
+ *
4999
+ * A board's texture and background are not selectable on their own: they
5000
+ * exist only as layer ids, which {@link AppStateAPI.getSelectedLayersIds}
5001
+ * derives from the selected board.
4808
5002
  */
4809
- selectedArtboardsObjectIds: string[];
4810
- /** All selected objects including: objects, artboards and artboards' objects */
4811
- allSelectedObjectsIds: string[];
5003
+ selectionIds: string[];
4812
5004
  /**
4813
5005
  * Active canvas mode after its mode-specific entry succeeds.
4814
5006
  *
@@ -4830,6 +5022,12 @@ export type AppState = {
4830
5022
  isViewOnlyMode: boolean;
4831
5023
  /** Whether the loaded design contains objects outside the supported viewport bounds. */
4832
5024
  hasLegacyOutOfBoundsObjects: boolean;
5025
+ /**
5026
+ * Canvas-owned: true when recoverable content exists but none is in view.
5027
+ * Excludes helpers and hidden/transparent objects; false in runtimes without
5028
+ * the renderer's content visibility stage and outside the default working mode.
5029
+ */
5030
+ isContentOutOfView: boolean;
4833
5031
  canvasSettings: SettingsType;
4834
5032
  /** Last-used pen tool stroke/fill settings, applied to newly drawn paths. */
4835
5033
  penToolSetting: {
@@ -4950,7 +5148,7 @@ export type BoundingRect = {
4950
5148
  bottom: number;
4951
5149
  right: number;
4952
5150
  };
4953
- /** Brand kit data exposed through the project manager. */
5151
+ /** Brand kit data exposed through the `brandKit` capability. */
4954
5152
  export type BrandKit = {
4955
5153
  id: string;
4956
5154
  name: string;
@@ -5052,6 +5250,16 @@ export type CanvasMode = {
5052
5250
  } | {
5053
5251
  mode: "inpaint";
5054
5252
  targetId: string;
5253
+ }
5254
+ /**
5255
+ * A rich text object is being edited. Set by the canvas while the text is in
5256
+ * editing mode; it is not a `CanvasModeManager` mode. `range` holds the
5257
+ * selected characters and is absent until the canvas reports it.
5258
+ */
5259
+ | {
5260
+ mode: "text-editing";
5261
+ targetId: string;
5262
+ range?: TextRange;
5055
5263
  } | {
5056
5264
  mode: "custom";
5057
5265
  id: string;
@@ -5064,7 +5272,7 @@ export type CanvasMode = {
5064
5272
  *
5065
5273
  * @public
5066
5274
  */
5067
- export type CanvasModeKind = "erase" | "erase-and-fill" | "crop" | "reframe" | "inpaint" | null;
5275
+ export type CanvasModeKind = "erase" | "erase-and-fill" | "crop" | "reframe" | "inpaint" | "text-editing" | null;
5068
5276
  /**
5069
5277
  * The index of a character in the rich text object.
5070
5278
  */
@@ -5148,6 +5356,10 @@ export type CreateBasicShapeInput = CreateElementWithPositionAndSize & {
5148
5356
  */
5149
5357
  export type CreateBoardParams = Omit<CreateElementWithPositionAndSize, "size" | "boardId"> & {
5150
5358
  title?: string;
5359
+ /**
5360
+ * Layout of the new artboard. Defaults to the standard layout.
5361
+ */
5362
+ activeLayout?: ArtboardOptions["activeLayout"];
5151
5363
  /**
5152
5364
  * size required on artboard
5153
5365
  */
@@ -5564,6 +5776,7 @@ export type FullColor = {
5564
5776
  visible: boolean;
5565
5777
  };
5566
5778
  export type FunctionType = (...args: never) => unknown;
5779
+ export type GenerateContentActionOrigin = (typeof GenerateContentActionOrigin)[keyof typeof GenerateContentActionOrigin];
5567
5780
  /** Alias: capability name for AIGenerationInputSettings. @public */
5568
5781
  export type GenerationInputSettings = AIGenerationInputSettings;
5569
5782
  /** Alias: capability name for AIGenerationOutputSettings. @public */
@@ -5813,6 +6026,22 @@ export type JSONObject = {
5813
6026
  [key: string]: JSONValue;
5814
6027
  };
5815
6028
  export type JSONValue = null | boolean | number | string | Array<JSONValue> | JSONObject;
6029
+ export type KeyframeBase = {
6030
+ id: string;
6031
+ /**
6032
+ * Easing of the segment that starts at this keyframe. Defaults to
6033
+ * {@link DEFAULT_KEYFRAME_EASING}, ignored on the last keyframe.
6034
+ */
6035
+ easing?: AnimationEasing;
6036
+ };
6037
+ /**
6038
+ * Every field any mounting point's host context can carry. The extension-side
6039
+ * bridge is typed with it because it is one proxy shared by all entrypoints;
6040
+ * each entrypoint narrows it to the context its mounting point receives.
6041
+ *
6042
+ * @public
6043
+ */
6044
+ export type KittlWidestContext = KittlEditorContext;
5816
6045
  /**
5817
6046
  * The predefined OpenType variation axes. However, a font can define custom
5818
6047
  * axes using a four-character string.
@@ -5833,6 +6062,15 @@ export type LeftTopPosition = {
5833
6062
  left: number;
5834
6063
  top: number;
5835
6064
  };
6065
+ /**
6066
+ * The derived selection lists readable through the `appState` subscribe
6067
+ * channel. None of them is stored in {@link AppState} (only the selection
6068
+ * closure `selectionIds` is); they are derived by the app state API, and the host bridge merges
6069
+ * them in before delivering updates (see `createExtensionAppStateStore` in
6070
+ * `@repo/sandbox-wrapper`), so published extensions can keep subscribing to
6071
+ * them by their legacy names.
6072
+ */
6073
+ export type LegacySelectionKey = "selectedObjectsIds" | "selectedLayersIds" | "selectedArtboardIds" | "selectedArtboardsObjectIds" | "allSelectedObjectsIds";
5836
6074
  /**
5837
6075
  * The line height of the text.
5838
6076
  */
@@ -5928,8 +6166,6 @@ export type MicroEditorWorkflowSource = {
5928
6166
  presetId: string;
5929
6167
  /** Whether outputs from the workflow preset support layerization. */
5930
6168
  isLayerizable: boolean;
5931
- /** Whether this particular workflow result is ready for layerization. */
5932
- readyToLayerize?: boolean;
5933
6169
  /** Generated-content record associated with this workflow result. */
5934
6170
  generatedContentId?: string;
5935
6171
  /** Original upload id accepted by the image-spec API. */
@@ -6064,10 +6300,20 @@ export type NormalizeValue<T> = T extends null | undefined ? T : NonNullable<T>
6064
6300
  * instead of trying to normalize the union as a whole.
6065
6301
  */
6066
6302
  export type Normalized<T> = T extends null | undefined ? T : T extends Builtin ? T : T extends unknown[] | readonly unknown[] ? NormalizeArray<T> : T extends object ? NormalizeObject<T> : T;
6067
- /** `keyframes` becomes a record plus `keyframesIndices` for ordering. */
6068
- export type NormalizedAnimation = Normalized<SerializedAnimation>;
6303
+ /** `tracks` becomes a record plus `tracksIndices` for ordering. */
6304
+ export type NormalizedAnimation = Normalized<Omit<SerializedAnimation, "tracks">> & {
6305
+ tracks: Record<string, NormalizedTrack>;
6306
+ tracksIndices: Record<string, string>;
6307
+ };
6069
6308
  export type NormalizedBasicShapeObject = Normalized<BasicShapeSerializedObject>;
6070
6309
  export type NormalizedBoard = NormalizedStandardBoard | NormalizedFloatingBoard;
6310
+ /**
6311
+ * `keyframes` becomes a record plus `keyframesIndices` for ordering. A record
6312
+ * has no first entry, so it holds any {@link SerializedKeyframe}.
6313
+ */
6314
+ export type NormalizedChannelTrack = Normalized<Omit<SerializedChannelTrack, "keyframes"> & {
6315
+ keyframes: SerializedKeyframe[];
6316
+ }>;
6071
6317
  export type NormalizedCombinedShapeObject = Normalized<CombinedShapeSerializedObject>;
6072
6318
  export type NormalizedDesignState = {
6073
6319
  boards: Record<ID, NormalizedBoard>;
@@ -6101,11 +6347,14 @@ export type NormalizedPathTextObject = Normalized<PathTextSerializedObject>;
6101
6347
  * In the normalized form all object references are replaced by their ids.
6102
6348
  */
6103
6349
  export type NormalizedRichTextObject = Normalized<RichTextSerializedObject>;
6350
+ /** `keyframes` becomes a record plus `keyframesIndices` for ordering. */
6351
+ export type NormalizedShapeTrack = Normalized<SerializedShapeTrack>;
6104
6352
  /**
6105
6353
  * The normalized version of a StandardBoard
6106
6354
  */
6107
6355
  export type NormalizedStandardBoard<T extends ArtboardOptions = ArtboardOptions> = Normalized<BaseStandardBoard<T>>;
6108
6356
  export type NormalizedStandardObject = NormalizedBasicShapeObject | NormalizedCombinedShapeObject | NormalizedIllustrationImageObject | NormalizedIllustrationObject | NormalizedLoadingCardObject | NormalizedMaskObject | NormalizedMockupDesignObject | NormalizedPathTextObject | NormalizedRichTextObject | NormalizedVideoObject;
6357
+ export type NormalizedTrack = NormalizedChannelTrack | NormalizedShapeTrack;
6109
6358
  export type NormalizedVideoObject = Normalized<VideoSerializedObject>;
6110
6359
  export type NullablePathTextShadowOptions = PathTextShadowOptions | {
6111
6360
  type: null;
@@ -6333,6 +6582,8 @@ export type PlainInputSetting = {
6333
6582
  isPremium?: boolean;
6334
6583
  name: "combineBoards" | (string & {});
6335
6584
  label?: string;
6585
+ /** Help text shown when hovering a boolean setting. */
6586
+ tooltip?: string;
6336
6587
  disabled?: true;
6337
6588
  } & ({
6338
6589
  type: "selection";
@@ -6375,18 +6626,16 @@ export type PrintMargins = {
6375
6626
  bottom: number;
6376
6627
  left: number;
6377
6628
  };
6629
+ /** Generator API exposed to iframe clients. Same as {@link AIGeneratorAPI}. */
6630
+ export type PublicAIGeneratorAPI = AIGeneratorAPI;
6631
+ /** App selectors cover the approved subscription fields within the full snapshot. */
6632
+ export type PublicAppSelectorState = Pick<PublicAppState, (typeof APP_STATE_SUBSCRIPTION_KEYS)[number]>;
6378
6633
  /**
6379
- * Generator API exposed to iframe clients. Local AbortSignals and abort callbacks
6380
- * cannot cross postMessage; cancellation uses the host's generation IDs instead.
6634
+ * The shape of the state extensions can subscribe to over the `appState`
6635
+ * channel: the current {@link AppState} plus the five derived, read-only
6636
+ * {@link LegacySelectionKey} lists.
6381
6637
  */
6382
- export type PublicAIGeneratorAPI = Omit<AIGeneratorAPI, "generate" | "cancelGenerations"> & {
6383
- /** Starts a generation without accepting a caller-local AbortSignal. */
6384
- generate: (generatorId: string, inputSettings: GenerationInputSettings, output: GenerationOutputSettings) => ReturnType<AIGeneratorAPI["generate"]>;
6385
- /** Cancels a submission using only its serializable fields. */
6386
- cancelGenerations: (submission: Pick<CancellableSubmission, "generationIds" | "until">) => ReturnType<AIGeneratorAPI["cancelGenerations"]>;
6387
- };
6388
- /** App selectors cover the approved subscription fields within the full snapshot. */
6389
- export type PublicAppSelectorState = Pick<AppState, (typeof APP_STATE_SUBSCRIPTION_KEYS)[number]>;
6638
+ export type PublicAppState = AppState & Record<LegacySelectionKey, string[]>;
6390
6639
  /**
6391
6640
  * Brand kit methods sandboxed extensions can call through the public SDK.
6392
6641
  * Read-only for now: image uploads into a brand kit need a write scope first.
@@ -7074,8 +7323,9 @@ export type SerialisedPhotoFilter = ({
7074
7323
  export type SerializableCornerRadii = Record<string, Record<string, number>>;
7075
7324
  export type SerializableObjectType = ObjectType.IllustrationImage | ObjectType.Illustration | ObjectType.Artboard | ObjectType.Smartboard | ObjectType.Videoboard | ObjectType.MockupBoard | ObjectType.PathText | ObjectType.RichText | ObjectType.MockupDesign | ObjectType.OverlayTexture | ObjectType.Mask | ObjectType.BasicShape | ObjectType.VectorPath | ObjectType.Guide | ObjectType.CombinedShape | ObjectType.LoadingCard | ObjectType.Video;
7076
7325
  /**
7077
- * Keyframes of one target. The animation lasts until its last keyframe (see
7078
- * `getAnimationDuration`), so there is no separate duration to keep in sync.
7326
+ * Tracks of one target, at most one per channel. The animation lasts until
7327
+ * its last keyframe (see `getAnimationDuration`), so there is no separate
7328
+ * duration to keep in sync.
7079
7329
  */
7080
7330
  export type SerializedAnimation = {
7081
7331
  /**
@@ -7086,22 +7336,77 @@ export type SerializedAnimation = {
7086
7336
  x: number;
7087
7337
  y: number;
7088
7338
  };
7089
- keyframes: SerializedKeyframe[];
7339
+ motionPath?: AnimationMotionPath;
7340
+ /**
7341
+ * Distance from the viewer to the canvas plane for the 3D channels, in
7342
+ * canvas px, like CSS `perspective()`; positive. Defaults to `1000`. When
7343
+ * several animations apply to one object, the most specific one that sets
7344
+ * it wins.
7345
+ */
7346
+ perspective?: number;
7347
+ tracks: SerializedTrack[];
7090
7348
  };
7091
7349
  export type SerializedAnimations = Record<AnimationKey, SerializedAnimation>;
7092
7350
  export type SerializedBoard = SerializedStandardBoard | SerializedFloatingBoard;
7093
- export type SerializedKeyframe = {
7351
+ /** Keyframes of one channel. */
7352
+ export type SerializedChannelTrack = {
7094
7353
  id: string;
7354
+ channel: AnimationChannel;
7355
+ composite: AnimationComposite;
7356
+ /** Unique times; the fractional-index order only breaks ties. */
7357
+ keyframes: SerializedKeyframes;
7358
+ };
7359
+ /** Any keyframe of a track, see {@link SerializedKeyframes} for their order. */
7360
+ export type SerializedKeyframe<TValue = number> = SerializedStartKeyframe<TValue> | SerializedTimedKeyframe<TValue>;
7361
+ /**
7362
+ * Keyframes of a track. Only the first one may be a start keyframe without
7363
+ * `value`; every later keyframe has one. A track whose first keyframe comes
7364
+ * after `0` starts from the target's own value with
7365
+ * {@link DEFAULT_KEYFRAME_EASING}, as if it had a start keyframe without
7366
+ * value and easing.
7367
+ */
7368
+ export type SerializedKeyframes<TValue = number> = [
7369
+ ] | [
7370
+ SerializedKeyframe<TValue>,
7371
+ ...SerializedTimedKeyframe<TValue>[]
7372
+ ];
7373
+ export type SerializedObject = StandardSerializedObject | GuideSerializedObject;
7374
+ /**
7375
+ * Keyframe of the shape track: `value` is absolute SVG path data (`M L C Q
7376
+ * Z`). Lines, quadratics and cubics may morph into each other as long as the
7377
+ * structure (subpaths, segment count per subpath, closed flags) matches the
7378
+ * path's own; only positions interpolate. Every shape keyframe has a value,
7379
+ * since playback cannot read the path's own shape, and the track holds its
7380
+ * first shape before its first keyframe.
7381
+ */
7382
+ export type SerializedShapeKeyframe = SerializedTimedKeyframe<string>;
7383
+ /** Keyframes of the path shape; it replaces the shape, so has no composite. */
7384
+ export type SerializedShapeTrack = {
7385
+ id: string;
7386
+ channel: AnimationShapeChannel;
7387
+ /** Unique times; the fractional-index order only breaks ties. */
7388
+ keyframes: SerializedShapeKeyframe[];
7389
+ };
7390
+ /**
7391
+ * Keyframe at the animation start. Without `value` it starts from the
7392
+ * target's own value, like a CSS animation without a `0%` keyframe, so it
7393
+ * can set only the easing of the first segment.
7394
+ */
7395
+ export type SerializedStartKeyframe<TValue = number> = KeyframeBase & {
7396
+ time: 0;
7397
+ value?: TValue;
7398
+ };
7399
+ export type SerializedTimedKeyframe<TValue = number> = KeyframeBase & {
7095
7400
  /** Offset from the animation start, integer milliseconds. */
7096
7401
  time: number;
7097
- /** Easing of the segment that ends at this keyframe. Defaults to `linear`. */
7098
- easing?: AnimationEasing;
7099
- /** A channel that is omitted keeps its previous value. */
7100
- values: Partial<Record<AnimationChannel, number>>;
7101
- /** Channels not listed here use `add`. */
7102
- composites?: Partial<Record<AnimationChannel, "replace">>;
7402
+ /**
7403
+ * Relative to the object, not to the previous keyframe: with `add` an
7404
+ * offset from the object's own property (e.g. `translateX: 10` is 10px right
7405
+ * of the object), with `replace` the absolute property value.
7406
+ */
7407
+ value: TValue;
7103
7408
  };
7104
- export type SerializedObject = StandardSerializedObject | GuideSerializedObject;
7409
+ export type SerializedTrack = SerializedChannelTrack | SerializedShapeTrack;
7105
7410
  export type SetCanvasModeWithTargetOptions = {
7106
7411
  /**
7107
7412
  * Optional origin metadata for state propagation.
@@ -7111,6 +7416,11 @@ export type SetCanvasModeWithTargetOptions = {
7111
7416
  * Optional id of the object that should enter the mode.
7112
7417
  */
7113
7418
  targetId?: string | null;
7419
+ /**
7420
+ * Optional selected character range of the edited text. Only used by
7421
+ * `'text-editing'`.
7422
+ */
7423
+ range?: TextRange;
7114
7424
  };
7115
7425
  /** Color updates to apply to one object. */
7116
7426
  export type SetColorsParams = {
@@ -7190,6 +7500,7 @@ export type ShapeProperties = {
7190
7500
  skewY?: BasicShapeSerializedObject["skewY"];
7191
7501
  cornerRadii?: BasicShapeSerializedObject["cornerRadii"];
7192
7502
  name?: BasicShapeSerializedObject["name"];
7503
+ defaultName?: BasicShapeSerializedObject["defaultName"];
7193
7504
  shadowOptions?: BasicShapeSerializedObject["shadowOptions"];
7194
7505
  fill?: NonNullable<BasicShapeSerializedObject["fill"]>;
7195
7506
  fillColor?: NonNullable<BasicShapeSerializedObject["fill"]>[number]["value"];
@@ -7506,6 +7817,15 @@ export type TextProperties = {
7506
7817
  */
7507
7818
  strokeWidth?: number;
7508
7819
  };
7820
+ /**
7821
+ * Character range of the text being edited, in Fabric character indices.
7822
+ * A line break (`'\n'`) counts as one character, and `start === end` is a
7823
+ * caret without a selection.
7824
+ */
7825
+ export type TextRange = {
7826
+ start: number;
7827
+ end: number;
7828
+ };
7509
7829
  /**
7510
7830
  * Parameters for changing the hidden state of an illustration path.
7511
7831
  *
@@ -7526,6 +7846,9 @@ export type ToggleLockIllustrationPathParams = {
7526
7846
  pathId: string;
7527
7847
  locked: boolean;
7528
7848
  };
7849
+ export type TrimTransparentEdgesParams = {
7850
+ id: IllustrationImageSerializedObject["id"];
7851
+ };
7529
7852
  /** Preserves variant-specific object fields in design selectors. */
7530
7853
  export type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void ? I : never;
7531
7854
  /**
@@ -7593,6 +7916,9 @@ export type UpdateIllustrationParams = {
7593
7916
  stroke?: IllustrationSerializedObject["stroke"];
7594
7917
  strokeWidth?: IllustrationSerializedObject["strokeWidth"];
7595
7918
  fill?: IllustrationSerializedObject["fill"];
7919
+ opacity?: IllustrationSerializedObject["opacity"];
7920
+ flipX?: IllustrationSerializedObject["flipX"];
7921
+ flipY?: IllustrationSerializedObject["flipY"];
7596
7922
  };
7597
7923
  /**
7598
7924
  * Parameters for updating an existing image.
@@ -7614,6 +7940,23 @@ export type UpdateImageParams = {
7614
7940
  strokeWidth?: IllustrationImageSerializedObject["strokeWidth"];
7615
7941
  inpaintingStrokeWidth?: IllustrationImageSerializedObject["inpaintingStrokeWidth"];
7616
7942
  inpaintingSelectionMode?: IllustrationImageSerializedObject["inpaintingSelectionMode"];
7943
+ opacity?: IllustrationImageSerializedObject["opacity"];
7944
+ flipX?: IllustrationImageSerializedObject["flipX"];
7945
+ flipY?: IllustrationImageSerializedObject["flipY"];
7946
+ /**
7947
+ * Photo filters to add or replace, keyed by filter id; `null` removes one.
7948
+ * Merged into the current filters. Every filter must end up with an index
7949
+ * in `filtersIndices`, and an image has at most one filter of each type.
7950
+ */
7951
+ filters?: Record<string, NonNullable<NormalizedIllustrationImageObject["filters"]>[string] | null>;
7952
+ /**
7953
+ * Fractional index of each filter id, which sets the order the filters
7954
+ * apply in; `null` removes one. Merged into the current indices, so the
7955
+ * filters can be reordered without sending them.
7956
+ */
7957
+ filtersIndices?: Record<string, string | null>;
7958
+ globalCompositeOperation?: IllustrationImageSerializedObject["globalCompositeOperation"];
7959
+ backgroundRestorePathBoundary?: IllustrationImageSerializedObject["backgroundRestorePathBoundary"];
7617
7960
  } & GeneratableObject;
7618
7961
  export type UpdateImageSourceParams = {
7619
7962
  id: IllustrationImageSerializedObject["id"];
@@ -7753,6 +8096,36 @@ export type UpdateTextParams = {
7753
8096
  left?: number;
7754
8097
  top?: number;
7755
8098
  angle?: number;
8099
+ /**
8100
+ * Opacity of the whole text element, from 0 (transparent) to 1 (opaque)
8101
+ */
8102
+ opacity?: number;
8103
+ /**
8104
+ * Mirror the text horizontally
8105
+ */
8106
+ flipX?: boolean;
8107
+ /**
8108
+ * Mirror the text vertically
8109
+ */
8110
+ flipY?: boolean;
8111
+ /**
8112
+ * Width of the text box in pixels
8113
+ */
8114
+ width?: number;
8115
+ /**
8116
+ * Height of the text box in pixels
8117
+ */
8118
+ height?: number;
8119
+ /**
8120
+ * Per-character style overrides, in the compressed format the text
8121
+ * object stores. Replaces the stored overrides as a whole.
8122
+ */
8123
+ styles?: RichTextCompressedStyles;
8124
+ /**
8125
+ * Transform (warp, circle, free form or free line) shaping the text, with
8126
+ * its points. Replaces the stored transform as a whole.
8127
+ */
8128
+ activeTransformPlugin?: RichTextSerializedTransformPluginObject;
7756
8129
  } & Partial<TextProperties>;
7757
8130
  /**
7758
8131
  * Parameters for updating texture properties.
@@ -7916,6 +8289,13 @@ export type VideoboardOptions = ConnectedArtboardOptions<ObjectType.Videoboard>
7916
8289
  * @public
7917
8290
  */
7918
8291
  export type Viewport = {
8292
+ /**
8293
+ * Viewport size in screen pixels, measured from the canvas container.
8294
+ */
8295
+ pixelSize: {
8296
+ width: number;
8297
+ height: number;
8298
+ };
7919
8299
  /**
7920
8300
  * Viewport corners in canvas coordinates (derived from transform + canvas size).
7921
8301
  * - tl: top-left
@@ -8008,12 +8388,15 @@ export type ViewportAPI = {
8008
8388
  */
8009
8389
  setTransform(transform: Viewport["transform"], origin?: Origin): void;
8010
8390
  /**
8011
- * Returns the current viewport size in screen pixels.
8391
+ * Returns the current viewport size in screen pixels, measured from the
8392
+ * canvas container.
8012
8393
  */
8013
8394
  getPixelSize(): {
8014
8395
  width: number;
8015
8396
  height: number;
8016
8397
  };
8398
+ /** Reads the canvas-owned {@link AppState.isContentOutOfView} flag. */
8399
+ isContentOutOfView(): boolean;
8017
8400
  /**
8018
8401
  * Returns the current viewport zoom level.
8019
8402
  */
@@ -8043,7 +8426,8 @@ export type ViewportAPI = {
8043
8426
  */
8044
8427
  getCoords(): Viewport["coords"];
8045
8428
  /**
8046
- * Sets the viewport corner coordinates.
8429
+ * Sets the viewport corner coordinates and, when supplied, its measured
8430
+ * screen-space size.
8047
8431
  *
8048
8432
  * This is primarily for internal synchronization. In normal usage, prefer
8049
8433
  * updating the viewport via {@link set}, {@link setZoom}, or
@@ -8051,8 +8435,19 @@ export type ViewportAPI = {
8051
8435
  *
8052
8436
  * @param coords - The viewport corner coordinates to set
8053
8437
  * @param origin - Optional origin metadata for state propagation
8438
+ * @param pixelSize - Canvas-container size measured with these coordinates
8439
+ * (legacy callers that omit it derive a size from coordinates and zoom)
8440
+ */
8441
+ setCoords(coords: Viewport["coords"], origin?: Origin, pixelSize?: Viewport["pixelSize"]): void;
8442
+ /**
8443
+ * Publishes a viewport snapshot from the canvas renderer.
8444
+ *
8445
+ * Internal only — callers must obtain all fields from the same Fabric state.
8446
+ *
8447
+ * @param viewport - Transform, coordinates, and measured canvas size
8448
+ * @param origin - Optional origin metadata for state propagation
8054
8449
  */
8055
- setCoords(coords: Viewport["coords"], origin?: Origin): void;
8450
+ setSnapshot(viewport: Viewport, origin?: Origin): void;
8056
8451
  /**
8057
8452
  * Returns the current viewport center in world space.
8058
8453
  */
@@ -8252,7 +8647,7 @@ export type WithOptsRemoved<T> = {
8252
8647
  * There is no design on the website, so it gets the shared APIs, the shared
8253
8648
  * host context and upload, plus the host website APIs.
8254
8649
  */
8255
- type DashboardStandalonePageKittlSDK = KittlSDKLifecycle & KittlSDKSharedAPIs & KittlSDKContextAPI & KittlSDKUploadAPI & KittlSDKWebsiteMountingPointAPIs;
8650
+ type DashboardStandalonePageKittlSDK = KittlSDKLifecycle & KittlSDKSharedAPIs & KittlSDKContextAPI & KittlSDKUploadAPI & KittlSDKBrandKitAPI & KittlSDKOpenMicroEditorAPI & KittlSDKOpenMainEditorAPI & KittlSDKFilePickerAPI;
8256
8651
 
8257
8652
  export {
8258
8653
  DashboardStandalonePageKittlSDK as KittlSDK,