narraleaf-studio 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/_api.d.ts +458 -44
  2. package/package.json +1 -1
package/dist/_api.d.ts CHANGED
@@ -1775,6 +1775,38 @@ type BlueprintOpenExternalResult = {
1775
1775
  };
1776
1776
  type BlueprintGraphKind = "event" | "function" | "macro";
1777
1777
  type GameBuildPlatform = "windows" | "macos" | "linux" | "web" | "android" | "ios";
1778
+ declare const UI_STRUCT_FIELD_TYPES: readonly [
1779
+ "string",
1780
+ "number",
1781
+ "boolean",
1782
+ "image",
1783
+ "color",
1784
+ "json"
1785
+ ];
1786
+ type UIStructFieldType = (typeof UI_STRUCT_FIELD_TYPES)[number];
1787
+ type UIStructField = {
1788
+ /**
1789
+ * Stable identity. Value bindings, node params and generated pins all address a field by this,
1790
+ * so renaming `key` costs nothing and reshuffling the list costs nothing.
1791
+ */
1792
+ id: string;
1793
+ /** The property name this field occupies inside an item object. */
1794
+ key: string;
1795
+ /**
1796
+ * What the author called it, shown in the item table header and in every field picker.
1797
+ *
1798
+ * Optional because `key` is usually already the readable name; a label is what lets a field
1799
+ * whose key has to stay ASCII (it travels in JSON to a plugin, a save file, a story variable)
1800
+ * still read as words in the editor.
1801
+ */
1802
+ label?: string;
1803
+ type: UIStructFieldType;
1804
+ };
1805
+ type UIStructId = string;
1806
+ type UIStructDef = {
1807
+ id: UIStructId;
1808
+ fields: UIStructField[];
1809
+ };
1778
1810
  type PluginPermissionPersistence = "temporary" | "permanent";
1779
1811
  type PluginFileSystemPermissionMode = "read" | "write" | "readwrite";
1780
1812
  /**
@@ -2245,6 +2277,33 @@ export type PluginContributes = {
2245
2277
  * declaration only one of them made would be the half that drifts.
2246
2278
  */
2247
2279
  widgetText?: Record<string, PluginWidgetTextContribution[]>;
2280
+ /**
2281
+ * The shapes of the rows this plugin's nodes hand out, so a list can be given one and a field
2282
+ * read from one by name.
2283
+ *
2284
+ * A node pin carrying them says `struct:<id>` or `array<struct:<id>>` - `Get Gallery` answers
2285
+ * `array<struct:narraleaf.gallery.entry>` - and from then on the plugin's rows are what the
2286
+ * engine's own are: a list picks the shape under Edit content and its fields are the plugin's
2287
+ * and locked, Get Field offers them, and a list handed rows that lack them is reported.
2288
+ *
2289
+ * Declared in the manifest rather than at registration because the editor, the running game and
2290
+ * the command-line checker all need the shape, and only the manifest is read by all three before
2291
+ * any plugin code runs. Ids must start with the plugin id.
2292
+ */
2293
+ structs?: PluginStructContribution[];
2294
+ };
2295
+ type PluginStructContribution = {
2296
+ /** Prefixed with the plugin id: `narraleaf.gallery.entry`. */
2297
+ id: string;
2298
+ /** What the editor calls the shape - "Gallery entry". */
2299
+ name: string;
2300
+ /** `name` per editor locale, matched exactly as `localized` names are. */
2301
+ localized?: Record<string, string>;
2302
+ /** In the order the rows are read: the list's content editor shows them in this order. */
2303
+ fields: {
2304
+ key: string;
2305
+ type: UIStructFieldType;
2306
+ }[];
2248
2307
  };
2249
2308
  /**
2250
2309
  * One prop of a contributed widget whose value is words a player reads.
@@ -2558,6 +2617,9 @@ type UIInputBinding = {
2558
2617
  } | {
2559
2618
  kind: "key";
2560
2619
  key: string;
2620
+ } | {
2621
+ kind: "gamepad";
2622
+ button: string;
2561
2623
  };
2562
2624
  type UIInputActionDef = {
2563
2625
  id: string;
@@ -2610,38 +2672,6 @@ type UIPageAnimationSettings = {
2610
2672
  /** Surfaces only: hold the incoming Page until this exit has finished. */
2611
2673
  exitBlocking: boolean;
2612
2674
  };
2613
- declare const UI_STRUCT_FIELD_TYPES: readonly [
2614
- "string",
2615
- "number",
2616
- "boolean",
2617
- "image",
2618
- "color",
2619
- "json"
2620
- ];
2621
- type UIStructFieldType = (typeof UI_STRUCT_FIELD_TYPES)[number];
2622
- type UIStructField = {
2623
- /**
2624
- * Stable identity. Value bindings, node params and generated pins all address a field by this,
2625
- * so renaming `key` costs nothing and reshuffling the list costs nothing.
2626
- */
2627
- id: string;
2628
- /** The property name this field occupies inside an item object. */
2629
- key: string;
2630
- /**
2631
- * What the author called it, shown in the item table header and in every field picker.
2632
- *
2633
- * Optional because `key` is usually already the readable name; a label is what lets a field
2634
- * whose key has to stay ASCII (it travels in JSON to a plugin, a save file, a story variable)
2635
- * still read as words in the editor.
2636
- */
2637
- label?: string;
2638
- type: UIStructFieldType;
2639
- };
2640
- type UIStructId = string;
2641
- type UIStructDef = {
2642
- id: UIStructId;
2643
- fields: UIStructField[];
2644
- };
2645
2675
  type UISurfaceBackgroundFillMode = "cover" | "contain" | "stretch" | "tile";
2646
2676
  type UISurfaceBackgroundImage = {
2647
2677
  /** Image library asset id. Absent background = absent field, so this is never empty. */
@@ -2725,7 +2755,27 @@ type UIAppSurface = {
2725
2755
  * whether what it just did leaves anything for the surface behind to do.
2726
2756
  */
2727
2757
  actions?: UISurfaceActionEnablement[];
2758
+ /** The values this page is opened with, in author order. See {@link UIPageParam}. */
2759
+ params?: UIPageParam[];
2760
+ };
2761
+ type UIPageParam = {
2762
+ id: string;
2763
+ name: string;
2764
+ type: UIPageParamType;
2765
+ /**
2766
+ * For a `list`: the shape each row has, as a struct id (an engine shape such as `nl.confirmButton`,
2767
+ * a plugin's, or one of the project's). It types the value on both ends - the inputs that give it
2768
+ * and `Get Page Param` - and a list on the page bound to it is checked against it. Absent for
2769
+ * every other type, and for a list of rows of no declared shape.
2770
+ */
2771
+ struct?: string;
2772
+ /**
2773
+ * What the page reads when whoever opened it gave nothing for this name, in the declared type.
2774
+ * Absent reads as the type's empty value (`uiPageParamDefaultValue`).
2775
+ */
2776
+ defaultValue?: unknown;
2728
2777
  };
2778
+ type UIPageParamType = "string" | "text" | "number" | "boolean" | "list" | "json";
2729
2779
  type UIStageSurface = {
2730
2780
  id: UISurfaceId;
2731
2781
  name: string;
@@ -2866,6 +2916,20 @@ type UIElementValueBinding = {
2866
2916
  | {
2867
2917
  kind: "componentParam";
2868
2918
  paramId: string;
2919
+ }
2920
+ /**
2921
+ * Show the value the page this element is on was opened with for one of its text parameters.
2922
+ *
2923
+ * The page's counterpart of `componentParam`, read the same way: no graph - the value is taken from
2924
+ * the props the page was opened with (`resolveUIPageTextParams`), words given at the opening shown
2925
+ * as given, the declared default translated through the page's own unit. Only a text parameter
2926
+ * answers one, only a widget's words take one, and only on a page: a component's insides and a
2927
+ * Game UI have no page parameters to show. The editing canvas, where the page has not been opened,
2928
+ * draws the default, or the element's own words as sample text while the default is empty.
2929
+ */
2930
+ | {
2931
+ kind: "pageParam";
2932
+ paramId: string;
2869
2933
  };
2870
2934
  type UILayout = {
2871
2935
  x: number;
@@ -3402,6 +3466,10 @@ declare const en: {
3402
3466
  readonly downloadRewrites: {
3403
3467
  readonly label: "Download address rewrites";
3404
3468
  };
3469
+ readonly useSystemProxy: {
3470
+ readonly label: "Use this computer's proxy";
3471
+ readonly description: "Studio downloads follow the proxy this computer already uses.";
3472
+ };
3405
3473
  readonly pluginRegistryUrl: {
3406
3474
  readonly label: "Plugin registry URL";
3407
3475
  readonly description: "Where the plugin store looks for its index.";
@@ -4321,6 +4389,7 @@ declare const en: {
4321
4389
  readonly panelRenderError: "This panel hit a rendering error";
4322
4390
  readonly mainEditorRegion: "Main editor";
4323
4391
  readonly resizeSplit: "Resize split";
4392
+ readonly resizeSections: "Resize sections";
4324
4393
  readonly noActiveEditor: "No active editor";
4325
4394
  readonly closePanel: "Close panel";
4326
4395
  readonly closeTab: "Close {name}";
@@ -4897,6 +4966,15 @@ declare const en: {
4897
4966
  readonly alignBottom: "Align bottom";
4898
4967
  readonly distributeHorizontal: "Distribute horizontally";
4899
4968
  readonly distributeVertical: "Distribute vertically";
4969
+ readonly nudgeLeft: "Move left 1 px";
4970
+ readonly nudgeRight: "Move right 1 px";
4971
+ readonly nudgeUp: "Move up 1 px";
4972
+ readonly nudgeDown: "Move down 1 px";
4973
+ readonly nudgeLeftLarge: "Move left 10 px";
4974
+ readonly nudgeRightLarge: "Move right 10 px";
4975
+ readonly nudgeUpLarge: "Move up 10 px";
4976
+ readonly nudgeDownLarge: "Move down 10 px";
4977
+ readonly snapToGrid: "Snap to grid";
4900
4978
  };
4901
4979
  readonly blueprint: {
4902
4980
  readonly undo: "Undo";
@@ -5405,6 +5483,8 @@ declare const en: {
5405
5483
  readonly forkCondition: "Condition";
5406
5484
  readonly fallsThrough: "continues";
5407
5485
  readonly fallsThroughTitle: "No jump of its own; the scene continues past the fork";
5486
+ readonly ends: "ends";
5487
+ readonly endsTitle: "The story ends in this branch: {names}";
5408
5488
  readonly forkCount: {
5409
5489
  readonly one: "{count} branch";
5410
5490
  readonly other: "{count} branches";
@@ -5868,6 +5948,15 @@ declare const en: {
5868
5948
  readonly appliesTo: "Also filed under";
5869
5949
  readonly star: "Star";
5870
5950
  readonly unstar: "Unstar";
5951
+ readonly abbreviations: "Your abbreviations";
5952
+ readonly addAbbreviation: "Add abbreviation";
5953
+ readonly removeAbbreviation: "Remove {word}";
5954
+ readonly abbreviationPlaceholder: "Abbreviation";
5955
+ readonly abbreviationSpace: "An abbreviation cannot contain spaces.";
5956
+ readonly abbreviationCharacter: "Quotes, =, /, @ and # cannot be used.";
5957
+ readonly abbreviationBuiltIn: "Already a spelling of {command}.";
5958
+ readonly abbreviationTaken: "Already your abbreviation for {command}.";
5959
+ readonly abbreviationShadowed: "Now a spelling of {command}. This abbreviation has no effect.";
5871
5960
  readonly type: {
5872
5961
  readonly image: "Image asset";
5873
5962
  readonly audio: "Audio asset";
@@ -5995,7 +6084,7 @@ declare const en: {
5995
6084
  readonly openPreview: "Open live preview";
5996
6085
  readonly closePreview: "Close live preview";
5997
6086
  readonly title: "Live Preview";
5998
- readonly dock: "Dock to sidebar";
6087
+ readonly dock: "Dock in the scene editor";
5999
6088
  readonly pip: "Picture-in-picture";
6000
6089
  readonly selectRow: "Select a story row to preview its stage state.";
6001
6090
  readonly failed: "Preview failed";
@@ -7973,6 +8062,25 @@ declare const en: {
7973
8062
  readonly targetTooltip: "Target: {label} ({type})";
7974
8063
  readonly fromPin: "Create from pin";
7975
8064
  readonly connectEmpty: "No nodes can connect to this pin.";
8065
+ readonly fieldsCategory: "Fields";
8066
+ readonly readField: "Get {field}";
8067
+ readonly filterByField: "Filter by {field}";
8068
+ readonly sortByField: "Sort by {field}";
8069
+ readonly findByField: "Find by {field}";
8070
+ };
8071
+ readonly struct: {
8072
+ readonly any: "Struct";
8073
+ readonly listRow: "List row";
8074
+ readonly arrayOf: "{name} list";
8075
+ readonly choiceItem: "Choice";
8076
+ readonly notificationItem: "Notification";
8077
+ readonly nvlItem: "NVL line";
8078
+ readonly historyEntry: "History entry";
8079
+ readonly saveEntry: "Save entry";
8080
+ readonly confirmButton: "Confirm button";
8081
+ readonly ending: "Ending";
8082
+ readonly language: "Language";
8083
+ readonly voiceLanguage: "Voice language";
7976
8084
  };
7977
8085
  readonly diagnostics: {
7978
8086
  readonly empty: "No diagnostics.";
@@ -7991,7 +8099,7 @@ declare const en: {
7991
8099
  };
7992
8100
  readonly interaction: {
7993
8101
  readonly hiddenEvents: "Element \u201C{name}\u201D is not visible but still has interaction bindings";
7994
- readonly hiddenEventsHint: "Remove the events, or make the element visible. A hidden element receives no input.";
8102
+ readonly hiddenEventsHint: "Remove the events, make the element visible, or show it from a blueprint. A hidden element receives no input.";
7995
8103
  readonly opaqueEvents: "Element \u201C{name}\u201D is nearly invisible (opacity) but has interaction bindings";
7996
8104
  readonly opaqueEventsHint: "Players may not see this control. Check it in Dev Mode.";
7997
8105
  readonly smallHit: "Element \u201C{name}\u201D has a small hit area with interactions";
@@ -8052,6 +8160,11 @@ declare const en: {
8052
8160
  readonly variableIdInvalid: "Node \"{node}\": pick a variable.";
8053
8161
  readonly persistentVariableIdInvalid: "Node \"{node}\": pick a persistent variable.";
8054
8162
  readonly savedVariableIdInvalid: "Node \"{node}\": pick a saved variable.";
8163
+ readonly fieldMissing: "\"{node}\": {struct} has no field \"{field}\".";
8164
+ readonly fieldUnpicked: "Node \"{node}\": pick a field.";
8165
+ readonly keyNotAField: "\"{node}\": {struct} has no field \"{key}\". No item matches.";
8166
+ readonly listShapeMismatch: "\"{node}\": {struct} does not match this list's fields. Fields that differ show empty.";
8167
+ readonly pageParamMissing: "\"{node}\": the page does not declare this param.";
8055
8168
  };
8056
8169
  readonly fn: {
8057
8170
  readonly nameMissing: "Fn \"{node}\": set a function name.";
@@ -8324,6 +8437,7 @@ declare const en: {
8324
8437
  readonly editValue: "Edit value on card";
8325
8438
  readonly removeOutput: "Remove output pin";
8326
8439
  readonly jsonFieldName: "JSON object field name";
8440
+ readonly readsRow: "Current row";
8327
8441
  };
8328
8442
  readonly comment: {
8329
8443
  readonly color: {
@@ -8416,6 +8530,7 @@ declare const en: {
8416
8530
  readonly missingCharacter: "Missing character";
8417
8531
  readonly unnamedInputAction: "Unnamed action";
8418
8532
  readonly missingInputAction: "Missing action";
8533
+ readonly missingField: "Missing field \u201C{field}\u201D";
8419
8534
  };
8420
8535
  readonly script: {
8421
8536
  readonly fileLabel: "Script file";
@@ -8646,6 +8761,8 @@ declare const en: {
8646
8761
  readonly height: "Height";
8647
8762
  readonly held: "Held";
8648
8763
  readonly device: "Device";
8764
+ readonly connected: "Connected";
8765
+ readonly axis: "Axis";
8649
8766
  readonly hide: "Hide";
8650
8767
  readonly holdFinalValue: "Hold final value";
8651
8768
  readonly id: "Id";
@@ -8717,6 +8834,7 @@ declare const en: {
8717
8834
  readonly page: "Page";
8718
8835
  readonly pageProps: "Page props";
8719
8836
  readonly param: "Param";
8837
+ readonly parameter: "Parameter";
8720
8838
  readonly persistent: "Persistent";
8721
8839
  readonly pointer: "Pointer";
8722
8840
  readonly center: "Center";
@@ -9076,7 +9194,7 @@ declare const en: {
9076
9194
  readonly getLineHeight: "Get Line Height";
9077
9195
  readonly findItemByField: "Find Item By Field";
9078
9196
  readonly getItemAt: "Get Item At";
9079
- readonly getItemField: "Get Item Field";
9197
+ readonly getField: "Get Field";
9080
9198
  readonly getListContent: "Get List Content";
9081
9199
  readonly getListLength: "Get List Length";
9082
9200
  readonly setItemFieldAt: "Set Item Field At";
@@ -9138,6 +9256,9 @@ declare const en: {
9138
9256
  readonly isLayerMounted: "Is Layer Mounted";
9139
9257
  readonly isActionHeld: "Is Action Held";
9140
9258
  readonly getInputDevice: "Get Input Device";
9259
+ readonly isGamepadConnected: "Is Gamepad Connected";
9260
+ readonly isGamepadButtonHeld: "Is Gamepad Button Held";
9261
+ readonly getGamepadAxis: "Get Gamepad Axis";
9141
9262
  readonly showConfirm: "Show Confirm";
9142
9263
  readonly memo: "Memo";
9143
9264
  readonly clearPage: "Clear Page";
@@ -9236,6 +9357,10 @@ declare const en: {
9236
9357
  readonly onAction: "On Action";
9237
9358
  readonly onKeyDown: "On Key Down";
9238
9359
  readonly onKeyUp: "On Key Up";
9360
+ readonly onGamepadButtonDown: "On Gamepad Button Down";
9361
+ readonly onGamepadButtonUp: "On Gamepad Button Up";
9362
+ readonly anyGamepadButtonDown: "Any Gamepad Button Down";
9363
+ readonly anyGamepadButtonUp: "Any Gamepad Button Up";
9239
9364
  readonly onPreferenceChanged: "On Preference Changed";
9240
9365
  readonly openLink: "Open Link";
9241
9366
  readonly openScreenshotsFolder: "Open Screenshots Folder";
@@ -9386,6 +9511,7 @@ declare const en: {
9386
9511
  };
9387
9512
  readonly nodeDescription: {
9388
9513
  readonly getComponentParam: "The value this placement sets for the chosen parameter, or the parameter's default when it sets none. A Text parameter that reads from a translation key gives the key's name; Translation Key Text gives its words.";
9514
+ readonly getPageParam: "The value the page was opened with for the chosen param, or the param's default when it was given none. Params are declared in the page's properties.";
9389
9515
  readonly compareEqual: "True when A and B are the same value of the same type. The number 1 and the text \"1\" are not equal.";
9390
9516
  readonly compareNotEqual: "True when A and B differ in value or in type. The number 1 and the text \"1\" count as different.";
9391
9517
  readonly compareGreaterThan: "True when A is greater than B. Both sides are compared as numbers; a side that cannot be read as a number gives false.";
@@ -9405,6 +9531,7 @@ declare const en: {
9405
9531
  readonly translationKeyText: "A translation key's text in the player's current language, or its source text when that language has no translation. A key that does not exist gives its name. The same text as Get Text, and also usable in Blueprint Value and functions. A Blueprint Value that shows it updates when the player changes language.";
9406
9532
  readonly format: "Replaces the placeholders in Template with values: {0}, {1} and so on with the items of an array, {name} with the field of that name in an object. A placeholder with no value becomes empty. A translated template comes from Translation Key Text.";
9407
9533
  readonly formatText: "Replaces {0}, {1} and so on in Text with the items of Values. Format does the same, also fills {name} from an object, and can be used in Blueprint Value and functions.";
9534
+ readonly getField: "One field of the struct wired into Object, picked from that struct's fields. Inside a list row, leave Object unwired to read the row. Use Get JSON Field for an object whose fields are not declared.";
9408
9535
  };
9409
9536
  readonly live: {
9410
9537
  readonly nodeClaimed: "{name} is editing this node";
@@ -9816,6 +9943,27 @@ declare const en: {
9816
9943
  readonly bindNone: "No parameter";
9817
9944
  readonly bindMissing: "Missing parameter";
9818
9945
  };
9946
+ readonly pageParams: {
9947
+ readonly title: "Params";
9948
+ readonly none: "No params";
9949
+ readonly hint: "Given by whatever opens this page. A text param can be shown by a text directly; read the others with Get Page Param.";
9950
+ readonly rowShape: "Row struct";
9951
+ readonly anyShape: "Unspecified";
9952
+ readonly bindLabel: "Page param";
9953
+ readonly bindNone: "No param";
9954
+ readonly bindMissing: "Missing param";
9955
+ readonly add: "Add param";
9956
+ readonly remove: "Remove {name}";
9957
+ readonly namePlaceholder: "Name";
9958
+ readonly default: "Default";
9959
+ readonly type: "Type";
9960
+ readonly typeString: "String";
9961
+ readonly typeText: "Text";
9962
+ readonly typeNumber: "Number";
9963
+ readonly typeBoolean: "Boolean";
9964
+ readonly typeList: "List";
9965
+ readonly typeJson: "JSON";
9966
+ };
9819
9967
  readonly binding: {
9820
9968
  readonly notReady: "Blueprint not ready for this control.";
9821
9969
  readonly bindToField: "Bind to field\u2026";
@@ -9911,6 +10059,7 @@ declare const en: {
9911
10059
  readonly character: "Character";
9912
10060
  readonly voice: "Voice";
9913
10061
  readonly design: "Design";
10062
+ readonly projectSettings: "Settings";
9914
10063
  readonly plugin: "Plugin";
9915
10064
  };
9916
10065
  };
@@ -10229,10 +10378,15 @@ declare const en: {
10229
10378
  readonly newName: "Field";
10230
10379
  readonly none: "No fields";
10231
10380
  readonly engineOwned: "This list receives its fields from the engine.";
10381
+ readonly pluginOwned: "This list receives its fields from a plugin.";
10232
10382
  readonly picker: "Field";
10233
10383
  readonly visiblePicker: "Visible from field";
10234
10384
  readonly pickerEmpty: "No field";
10235
10385
  };
10386
+ readonly shape: {
10387
+ readonly label: "Struct";
10388
+ readonly custom: "Custom";
10389
+ };
10236
10390
  readonly row: {
10237
10391
  readonly add: "Add row";
10238
10392
  readonly remove: "Remove row";
@@ -10326,6 +10480,7 @@ declare const en: {
10326
10480
  readonly nvl: "Full-screen novel-mode dialog history.";
10327
10481
  };
10328
10482
  readonly panel: {
10483
+ readonly interfaces: "Interfaces";
10329
10484
  readonly interfaceType: "Interface Type";
10330
10485
  readonly createPage: "Create Page";
10331
10486
  readonly createGameUi: "Create Game UI";
@@ -10361,6 +10516,15 @@ declare const en: {
10361
10516
  readonly history: {
10362
10517
  readonly moveSurface: "move interface {name}";
10363
10518
  readonly setEntryPage: "set entry page {name}";
10519
+ readonly createComponent: "create component {name}";
10520
+ readonly duplicateComponent: "duplicate component {name}";
10521
+ readonly duplicateComponents: "duplicate {count} components";
10522
+ readonly deleteComponent: "delete component {name}";
10523
+ readonly deleteComponents: "delete {count} components";
10524
+ readonly importSurface: "add interface {name}";
10525
+ readonly importSurfaces: "add {count} interfaces";
10526
+ readonly importComponent: "add component {name}";
10527
+ readonly importComponents: "add {count} components";
10364
10528
  };
10365
10529
  readonly inputActions: {
10366
10530
  readonly title: "Input Actions";
@@ -10397,6 +10561,7 @@ declare const en: {
10397
10561
  readonly trackpad: "Trackpad";
10398
10562
  readonly touch: "Touch screen";
10399
10563
  readonly key: "Keyboard";
10564
+ readonly gamepad: "Gamepad";
10400
10565
  };
10401
10566
  readonly gesture: {
10402
10567
  readonly click: "Click";
@@ -10463,6 +10628,7 @@ declare const en: {
10463
10628
  readonly wordsFromRowField: "These words come from the list row field \u201C{field}\u201D.";
10464
10629
  readonly wordsFromBlueprintValue: "These words come from the blueprint value \u201C{name}\u201D.";
10465
10630
  readonly wordsFromComponentParam: "These words come from the component parameter \u201C{param}\u201D, set on each placement.";
10631
+ readonly wordsFromPageParam: "These words come from the page param \u201C{param}\u201D, given when the page is opened.";
10466
10632
  };
10467
10633
  readonly editor: {
10468
10634
  readonly componentNotFound: "Component not found";
@@ -10474,6 +10640,9 @@ declare const en: {
10474
10640
  readonly selectTool: "Select tool";
10475
10641
  readonly panTool: "Pan the canvas";
10476
10642
  readonly openInDevMode: "Open this interface in Dev Mode";
10643
+ readonly showInLivePreview: "Show this interface in the live preview";
10644
+ readonly livePreviewShowsNoNotifications: "Notifications are not shown in the live preview";
10645
+ readonly livePreviewNoRow: "No row in the story shows this interface";
10477
10646
  readonly componentDefinitionHint: "Components are edited as definitions";
10478
10647
  readonly bindElement: "Bind Element";
10479
10648
  readonly bindSelectHint: "Select one element on this Surface";
@@ -10501,6 +10670,11 @@ declare const en: {
10501
10670
  readonly canvasLayout: "Canvas layout (edges & center)";
10502
10671
  readonly elementBorders: "Element borders (edge to edge)";
10503
10672
  readonly elementLayout: "Element layout (centers)";
10673
+ readonly grid: "Grid";
10674
+ readonly gridStyle: "Grid style";
10675
+ readonly gridLines: "Lines";
10676
+ readonly gridDots: "Dots";
10677
+ readonly gridSize: "Grid size";
10504
10678
  };
10505
10679
  readonly contextMenu: {
10506
10680
  readonly pasteIntoContainer: "Paste into container";
@@ -10549,6 +10723,12 @@ declare const en: {
10549
10723
  readonly left: "left";
10550
10724
  };
10551
10725
  };
10726
+ readonly reference: {
10727
+ readonly label: "Game UI reference";
10728
+ readonly heading: "Other game UI";
10729
+ readonly none: "This project has no other game UI.";
10730
+ readonly sizeDiffers: "Different size: {name} {width}\u00D7{height}";
10731
+ };
10552
10732
  readonly crossProject: {
10553
10733
  readonly pasted: {
10554
10734
  readonly one: "{count} element pasted";
@@ -10695,6 +10875,7 @@ declare const en: {
10695
10875
  readonly removeBinding: "Remove";
10696
10876
  readonly hintBlueprintValue: "Shown in the editor only. The game shows the Blueprint Value's result.";
10697
10877
  readonly hintComponentParam: "Shown while editing the component only. Each placement shows the value it sets for the parameter.";
10878
+ readonly hintPageParam: "Shown while editing the page, when the param's default is empty. In the game the page shows the text it is opened with, or the default.";
10698
10879
  };
10699
10880
  readonly textWriters: {
10700
10881
  readonly title: "Written in the game by";
@@ -10730,6 +10911,9 @@ declare const en: {
10730
10911
  readonly stateKeyPlaceholder: "choices";
10731
10912
  readonly propName: "Prop name";
10732
10913
  readonly propNamePlaceholder: "choices";
10914
+ readonly pageParam: "Param";
10915
+ readonly pageParamUndeclared: "not declared on this page";
10916
+ readonly noPageParams: "This page declares no params";
10733
10917
  readonly placeholderCount: "Placeholder rows";
10734
10918
  readonly contentTitle: "List content";
10735
10919
  readonly fields: "Fields";
@@ -10829,6 +11013,7 @@ declare const en: {
10829
11013
  readonly title: "Page";
10830
11014
  readonly page: "Page";
10831
11015
  readonly props: "Props";
11016
+ readonly params: "Params";
10832
11017
  readonly animation: "Animation";
10833
11018
  readonly usePageAnimation: "Use Page animation";
10834
11019
  readonly pageLogic: "Page component logic";
@@ -11495,7 +11680,7 @@ declare const en: {
11495
11680
  };
11496
11681
  readonly settings: {
11497
11682
  readonly title: "Settings";
11498
- readonly description: "Security, signing, compression, loading, and mobile";
11683
+ readonly description: "Security, signing, compression, loading, letterbox, and mobile";
11499
11684
  };
11500
11685
  };
11501
11686
  readonly group: {
@@ -11525,6 +11710,7 @@ declare const en: {
11525
11710
  readonly videoCompression: "Video compression";
11526
11711
  readonly loading: "Loading";
11527
11712
  readonly crash: "Crashes";
11713
+ readonly letterbox: "Letterbox";
11528
11714
  readonly mobile: "Mobile";
11529
11715
  };
11530
11716
  readonly compressionMode: {
@@ -11909,6 +12095,10 @@ declare const en: {
11909
12095
  readonly portrait: "Portrait";
11910
12096
  readonly auto: "Follow device";
11911
12097
  };
12098
+ readonly letterboxColorTitle: "Letterbox color";
12099
+ readonly letterboxColorDescription: "Shown around the stage on screens of another aspect ratio.";
12100
+ readonly letterboxImageTitle: "Letterbox image";
12101
+ readonly letterboxImageDescription: "Drawn over the letterbox color. The stage covers its middle.";
11912
12102
  readonly stageFitTitle: "Screen fit";
11913
12103
  readonly stageFitDescription: "Mobile builds and Dev Mode. Desktop and web always letterbox.";
11914
12104
  readonly stageFit: {
@@ -13917,6 +14107,32 @@ declare const en: {
13917
14107
  readonly message: "This is bound to an item field the list does not declare, so every row shows the same value";
13918
14108
  readonly help: string;
13919
14109
  };
14110
+ readonly uiPagePropUndeclared: {
14111
+ readonly title: "Undeclared page param";
14112
+ readonly description: "A list showing a page prop the page does not declare as a param";
14113
+ readonly message: "This list shows the page prop \"{name}\", which the page does not declare as a param";
14114
+ readonly help: string;
14115
+ };
14116
+ readonly uiPageParamUnknown: {
14117
+ readonly title: "Unknown page param";
14118
+ readonly description: "A Page widget giving a value the page it shows does not declare";
14119
+ readonly message: "This Page widget gives \"{name}\", which the page it shows does not declare";
14120
+ readonly help: string;
14121
+ };
14122
+ readonly uiPageTextParamMissing: {
14123
+ readonly title: "Missing page text param";
14124
+ readonly description: "A text on a page showing a param the page does not declare as text";
14125
+ readonly message: "This shows a page param the page does not declare as text, so the game shows no words here";
14126
+ readonly messageOutside: "This shows a page param but is not on a page, so the game shows no words here";
14127
+ readonly help: string;
14128
+ };
14129
+ readonly uiPageParamListMismatch: {
14130
+ readonly title: "List not matching its page param";
14131
+ readonly description: "A list showing a page param that is not a list, or whose rows lack fields the list draws";
14132
+ readonly messageNotList: "This list shows the page param \"{name}\", which is not a list";
14133
+ readonly message: "This list shows the page param \"{name}\", whose rows lack fields the list draws: {fields}";
14134
+ readonly help: string;
14135
+ };
13920
14136
  readonly uiComponentParamMissing: {
13921
14137
  readonly title: "Missing text parameter";
13922
14138
  readonly description: "A widget in a component showing a parameter the component does not declare as text";
@@ -13954,6 +14170,24 @@ declare const en: {
13954
14170
  readonly message: "{node} has nothing connected to {pin}";
13955
14171
  readonly help: string;
13956
14172
  };
14173
+ readonly blueprintFieldMissing: {
14174
+ readonly title: "Field not in shape";
14175
+ readonly description: "A node that names a field the value it reads does not have";
14176
+ readonly message: "{node}: {struct} has no field {field}";
14177
+ readonly help: string;
14178
+ };
14179
+ readonly blueprintPageParamMissing: {
14180
+ readonly title: "Missing page param";
14181
+ readonly description: "Get Page Param reading a param the page does not declare";
14182
+ readonly message: "{node} reads a param the page does not declare";
14183
+ readonly help: string;
14184
+ };
14185
+ readonly blueprintListShapeMismatch: {
14186
+ readonly title: "List fields do not match";
14187
+ readonly description: "Rows of another shape given to a list";
14188
+ readonly message: "{node}: {struct} does not match the list's fields";
14189
+ readonly help: string;
14190
+ };
13957
14191
  readonly blueprintStartSceneForeign: {
13958
14192
  readonly title: "Scene from another story";
13959
14193
  readonly description: "A Start Game node whose scene is not in the story it names";
@@ -15933,12 +16167,13 @@ export type SearchJumpTarget = {
15933
16167
  }
15934
16168
  /**
15935
16169
  * A page of Project settings - the panel's sub-pages - and, with `part`, the part of it to scroll
15936
- * into view: `fonts` is the project's font stack on the Design page.
16170
+ * into view: `fonts` is the project's font stack on the Design page, `letterbox` the letterbox
16171
+ * settings on the Settings page.
15937
16172
  */
15938
16173
  | {
15939
16174
  kind: "projectPage";
15940
16175
  page: "app" | "game" | "design" | "project" | "runtimes" | "settings";
15941
- part?: "fonts";
16176
+ part?: "fonts" | "letterbox";
15942
16177
  }
15943
16178
  /**
15944
16179
  * A story's own row in the Story panel's list, selected and scrolled into view - the place a story
@@ -17151,6 +17386,13 @@ type ImportTemplateBundleInput = {
17151
17386
  * take those translations.
17152
17387
  */
17153
17388
  translations?: CarriedTranslations;
17389
+ /**
17390
+ * Whether the import is one step on the project's undo stack, which takes back every page and
17391
+ * definition it added. On unless a caller's own flow goes on to change more than the import did
17392
+ * - the starter title page also moves the entry page and removes the blank one, and a step that
17393
+ * took back only its middle would leave the project with neither page.
17394
+ */
17395
+ history?: boolean;
17154
17396
  };
17155
17397
  declare class UIDocumentService extends Service<UIDocumentService> implements IUIDocumentService {
17156
17398
  private document;
@@ -17246,7 +17488,15 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17246
17488
  updateElementLayout(elementId: string, layoutPatch: Partial<UILayout>, options?: {
17247
17489
  skipHistory?: boolean;
17248
17490
  }): void;
17249
- updateElementLayouts(layoutPatches: Record<string, Partial<UILayout>>): void;
17491
+ /**
17492
+ * Write several elements' layouts as one change: one `documentChanged` and one undo step.
17493
+ *
17494
+ * `mergeKey` folds this step into the previous one when that carried the same key and was
17495
+ * recorded within the merge window - how a run of arrow-key nudges stays a single undo.
17496
+ */
17497
+ updateElementLayouts(layoutPatches: Record<string, Partial<UILayout>>, options?: {
17498
+ mergeKey?: string;
17499
+ }): void;
17250
17500
  updateElementProps(elementId: string, propsPatch: Record<string, unknown>): void;
17251
17501
  /**
17252
17502
  * Every widget that reads its words from `keyName`, turned into one that holds `words` itself.
@@ -17316,6 +17566,25 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17316
17566
  * shape, and an instance that could redeclare it would be editing every other instance.
17317
17567
  */
17318
17568
  setListItemStructFields(elementId: string, fields: readonly UIStructField[]): void;
17569
+ /**
17570
+ * {@link setListItemStructFields} for a list inside a component definition, one step in the
17571
+ * definition's own history.
17572
+ *
17573
+ * The library's rules are the document's, not the page's: a shape another list names - on a page
17574
+ * or in any definition - is forked rather than reshaped (`applyUIStructFieldsForOwner` walks the
17575
+ * definitions too), and the pruning that follows counts what definitions name.
17576
+ */
17577
+ setComponentListItemStructFields(componentId: string, elementId: string, fields: readonly UIStructField[]): void;
17578
+ /**
17579
+ * Give one list one of the engine's shapes, or (`null`) a shape of its own again.
17580
+ *
17581
+ * One step: the pointer, the rows read into the new shape, the list's key field and its item
17582
+ * template's field bindings moved to the field of the same name, and the library pruned. Undo takes
17583
+ * all of it back, the library included (`UIEditorHistoryService` slices the shapes a page names).
17584
+ */
17585
+ setListItemStructShape(elementId: string, shapeId: string | null): void;
17586
+ /** {@link setListItemStructShape} for a list inside a component definition, in its own history. */
17587
+ setComponentListItemStructShape(componentId: string, elementId: string, shapeId: string | null): void;
17319
17588
  /** What the gestures of this project mean, keyed by id. */
17320
17589
  getInputActions(): Record<string, UIInputActionDef>;
17321
17590
  /**
@@ -17367,6 +17636,18 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17367
17636
  * field id. Switching between them therefore goes through the clear, which is why it runs here.
17368
17637
  */
17369
17638
  setElementListItemFieldBinding(elementId: string, propPath: string, fieldId: string | null): void;
17639
+ /**
17640
+ * Show one of its page's text parameters in the words of an element on that page, or (`null`)
17641
+ * stop showing one. The page's counterpart of `setElementComponentParamBinding`: an element on a
17642
+ * Game UI, which declares no parameters, is left alone.
17643
+ */
17644
+ setElementPageParamBinding(elementId: string, propPath: string, paramId: string | null): void;
17645
+ /**
17646
+ * Bind one prop of one element on a surface to something that needs no blueprint - a field of its
17647
+ * list row, a text parameter of its page - or (`null`) unbind it. A Blueprint Value the prop was
17648
+ * bound to is torn down on the way (`clearElementBlueprintValueBinding`).
17649
+ */
17650
+ private setElementPlainValueBinding;
17370
17651
  ensureElementBlueprintValueBinding(elementId: string, propPath: string, input: {
17371
17652
  valueType: UIElementValueBindingValueType;
17372
17653
  displayName?: string;
@@ -17456,10 +17737,65 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17456
17737
  private scheduleAutoSave;
17457
17738
  private setDirty;
17458
17739
  private getHistoryService;
17740
+ /**
17741
+ * Where an edit to a component definition is recorded: the definition's own undo stack, named by
17742
+ * the component editor's surface id (`UIEditorHistoryService` maps that to the definition's
17743
+ * scope). One stack per definition, so undoing in one component tab never touches another
17744
+ * definition or any page - and an instance on a page draws the definition from the library each
17745
+ * time, so putting the definition back puts every placement back with it.
17746
+ */
17747
+ private componentHistory;
17748
+ private getGraphService;
17749
+ /**
17750
+ * One step on the project's undo stack, for an operation on the library as a whole - adding,
17751
+ * copying, deleting or importing pages and definitions.
17752
+ *
17753
+ * The project's stack rather than any editor's, for the reason {@link reorderSurfaces} gives:
17754
+ * these are made from the rail, and that is the stack Ctrl+Z and the Edit menu reach from there
17755
+ * (`resolveWorkspaceUndoScope`). A definition's own stack holds edits *inside* it, and a deleted
17756
+ * definition has no tab to press Ctrl+Z in.
17757
+ *
17758
+ * Each step is a command over whole records, not a snapshot of the library: whichever direction
17759
+ * runs reads the records as they stand at that moment and writes them back exactly, and nothing
17760
+ * else in the library is touched. Tagged, so a live session drops these steps with the interface
17761
+ * editors' stacks (`LiveSessionService`): taking back an addition after a session would remove
17762
+ * whatever the room built inside it.
17763
+ */
17764
+ private pushLibraryStep;
17765
+ /**
17766
+ * Take pages and definitions out of the project, and return them as they stood.
17767
+ *
17768
+ * Empty when nothing left this copy of the document - ids it does not hold, or an operation sink
17769
+ * that took the gesture: inside a live session the removal arrives as an effect later, the
17770
+ * lifecycle sweep collects the blueprints then, and undo is the session's.
17771
+ */
17772
+ private takeLibraryRecords;
17773
+ /**
17774
+ * Put records {@link takeLibraryRecords} returned back where they stood.
17775
+ *
17776
+ * Blueprints first: the sweep that follows the document write gives a widget with no blueprint a
17777
+ * fresh, empty one, and it must find each record's own already in place.
17778
+ */
17779
+ private putLibraryRecords;
17780
+ /**
17781
+ * Leave the step that takes back pages and definitions an operation just added.
17782
+ *
17783
+ * Nothing is recorded when none of them is in this copy of the document, which is what an
17784
+ * operation sink taking the gesture looks like (the reasoning {@link reorderSurfaces} gives).
17785
+ */
17786
+ private recordLibraryAddition;
17459
17787
  private getElementSurfaceId;
17460
17788
  private getCommonSurfaceIdForElements;
17461
17789
  private filterLinkedComponentLayoutPatch;
17462
17790
  private migrateIfNeeded;
17791
+ /**
17792
+ * Every page's declared parameters, in the shape this build reads (`normalizeUIPageParams`).
17793
+ *
17794
+ * A normalizer for the reason {@link normalizeInputModel} is one: an empty list and no list mean
17795
+ * the same thing, so a page that declares none keeps its record as short as it was. A Game UI's
17796
+ * are dropped - the player mounts it with nothing, so nothing could ever fill them.
17797
+ */
17798
+ private normalizePageParams;
17463
17799
  /**
17464
17800
  * The v13 step, for the project's own document as it is opened (`textSourceMigration.ts`).
17465
17801
  *
@@ -17653,7 +17989,14 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17653
17989
  getComponent(componentId: string): UIComponentDefinition | undefined;
17654
17990
  getComponentUsageCount(componentId: string): number;
17655
17991
  createEmptyComponent(name?: string): UIComponentDefinition;
17992
+ /**
17993
+ * A new definition made of copies of elements on a page, with the logic they carry.
17994
+ *
17995
+ * The page is not changed, so the step that takes this back is the library's - the project's
17996
+ * stack, the one {@link createEmptyComponent} uses - rather than the page's.
17997
+ */
17656
17998
  createComponentFromElements(surfaceId: string, elementIds: string[], name?: string): UIComponentDefinition | null;
17999
+ /** Recorded in the definition's own undo stack, as a page's name is in the page's. */
17657
18000
  renameComponent(componentId: string, name: string): void;
17658
18001
  /**
17659
18002
  * Replace a component's declared params.
@@ -17661,9 +18004,25 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17661
18004
  * Instances keep values for ids that survive: a param is identified by `id`, so renaming one in
17662
18005
  * the inspector does not unset it anywhere. Values for ids that were removed are left on their
17663
18006
  * instances rather than swept - re-adding a param by the same id is how an author undoes a
17664
- * deletion, and sweeping would make that a data loss with no warning.
18007
+ * deletion, and sweeping would make that a data loss with no warning. That is also why undoing
18008
+ * this - one step in the definition's own stack - needs nothing from the instances: their values
18009
+ * were never touched, so the restored declaration finds them where it left them.
17665
18010
  */
17666
18011
  setComponentParams(componentId: string, params: UIComponentParam[]): void;
18012
+ /**
18013
+ * Replace the parameters a page declares.
18014
+ *
18015
+ * A parameter is identified by `id`, so the nodes that open the page and the `Get Page Param`
18016
+ * nodes that read it keep pointing at it through a rename. What reads it by name - the key its
18017
+ * value travels under - is followed in the same step where it lives on the page itself: a list on
18018
+ * the page bound to the old name is bound to the new one. Anything elsewhere that names it (a Page
18019
+ * widget on another page giving it a value, a script) is left alone, because this page's undo must
18020
+ * not reach into another page; the project check reports those.
18021
+ *
18022
+ * A removed parameter's values are not swept from anywhere, as a component's are not: re-adding it
18023
+ * is how an author takes a deletion back.
18024
+ */
18025
+ setPageParams(surfaceId: string, params: UIPageParam[]): void;
17667
18026
  /**
17668
18027
  * Set one param value on one instance. An empty string is a value, not a reset.
17669
18028
  *
@@ -17678,9 +18037,42 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17678
18037
  * and naming none leaves the parameter with neither, which falls back to the definition's default.
17679
18038
  */
17680
18039
  setComponentInstanceParamKey(elementId: string, paramId: string, keyName: string | null): void;
18040
+ /**
18041
+ * Remove definitions from the library, as one step on the project's undo stack.
18042
+ *
18043
+ * Placements of them on pages are left as they are, and draw as missing until the definition is
18044
+ * back or they are replaced. Undo puts each definition back at its place in the library with its
18045
+ * widgets' blueprints and the item shapes its lists name, and every placement draws it again.
18046
+ */
17681
18047
  deleteComponents(componentIds: string[]): void;
18048
+ /** One copy of a definition; see {@link duplicateComponents}. */
17682
18049
  duplicateComponent(componentId: string): UIComponentDefinition | null;
17683
- updateComponentElementLayout(componentId: string, elementId: string, layoutPatch: Partial<UILayout>): void;
18050
+ /**
18051
+ * A copy of each definition, added to the end of the library, as one step on the project's undo
18052
+ * stack. The copies' translations are written in the background and are not part of the step:
18053
+ * undoing leaves them unused, and redoing finds them again (`carryCopiedTranslations`).
18054
+ */
18055
+ duplicateComponents(componentIds: readonly string[]): UIComponentDefinition[];
18056
+ private copyComponent;
18057
+ /**
18058
+ * One element of a definition's layout, as `updateElementLayout` is one of a page's: an undo step
18059
+ * of its own, folded into the previous one when that wrote the same fields of the same element
18060
+ * within the merge window - so typing a number into the inspector is one step, not one a key.
18061
+ * `skipHistory` is for the write a gesture makes on its way to the one it records.
18062
+ */
18063
+ updateComponentElementLayout(componentId: string, elementId: string, layoutPatch: Partial<UILayout>, options?: {
18064
+ skipHistory?: boolean;
18065
+ }): void;
18066
+ /**
18067
+ * Several elements of one definition as one change: one `documentChanged` and one undo step, as
18068
+ * `updateElementLayouts` is on a page - a drag of three elements is undone by one Ctrl+Z.
18069
+ * `mergeKey` folds the step into the previous one when that carried the same key and was
18070
+ * recorded within the merge window, which is how a run of arrow-key nudges stays one undo.
18071
+ */
18072
+ updateComponentElementLayouts(componentId: string, layoutPatches: Record<string, Partial<UILayout>>, options?: {
18073
+ mergeKey?: string;
18074
+ }): void;
18075
+ private writeComponentElementLayout;
17684
18076
  /**
17685
18077
  * Bind one prop of one element of a component definition to a field of its list row or to a text
17686
18078
  * parameter of the component - the two value bindings that need no blueprint - or (`null`) unbind
@@ -17697,7 +18089,9 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17697
18089
  */
17698
18090
  setElementComponentParamBinding(elementId: string, propPath: string, paramId: string | null): void;
17699
18091
  updateComponentElementProps(componentId: string, elementId: string, propsPatch: Record<string, unknown>): void;
17700
- updateComponentElementAnimation(componentId: string, elementId: string, animation: UIPageAnimationSettings | null): void;
18092
+ updateComponentElementAnimation(componentId: string, elementId: string, animation: UIPageAnimationSettings | null, options?: {
18093
+ mergeKey?: string;
18094
+ }): void;
17701
18095
  updateComponentElementExtra(componentId: string, elementId: string, extraPatch: Record<string, unknown>): void;
17702
18096
  renameComponentElement(componentId: string, elementId: string, name: string): void;
17703
18097
  reorderComponentChildren(componentId: string, parentId: string, orderedChildIds: string[]): void;
@@ -18556,6 +18950,18 @@ type BlueprintNodeDeclaration = {
18556
18950
  saveSchemaPins?: {
18557
18951
  kind: "input" | "output";
18558
18952
  };
18953
+ /**
18954
+ * Grow one input per parameter the page this node opens declares (`UIPageParam`).
18955
+ *
18956
+ * The page is the one picked on the card, read from `params[surfaceParam]` - the key the node's
18957
+ * page picker writes. Like {@link saveSchemaPins} the list comes from a project document rather
18958
+ * than from the node, so every node that opens one page grows the same inputs, in the page's
18959
+ * order, and renaming a parameter relabels all of them. The inputs belong to the picked page: a
18960
+ * different page arriving on a wire is opened with the node's `props` input alone.
18961
+ */
18962
+ pageParamPins?: {
18963
+ surfaceParam: string;
18964
+ };
18559
18965
  inspectorParams?: BlueprintInspectorParamDef[];
18560
18966
  role?: BlueprintNodeRole;
18561
18967
  /**
@@ -19056,7 +19462,9 @@ interface IUIDocumentService extends IService {
19056
19462
  updateElementLayout(elementId: string, layoutPatch: Partial<UILayout>, options?: {
19057
19463
  skipHistory?: boolean;
19058
19464
  }): void;
19059
- updateElementLayouts(layoutPatches: Record<string, Partial<UILayout>>): void;
19465
+ updateElementLayouts(layoutPatches: Record<string, Partial<UILayout>>, options?: {
19466
+ mergeKey?: string;
19467
+ }): void;
19060
19468
  updateElementProps(elementId: string, propsPatch: Record<string, unknown>): void;
19061
19469
  ensureElementBlueprintValueBinding(elementId: string, propPath: string, input: {
19062
19470
  valueType: UIElementValueBindingValueType;
@@ -19090,7 +19498,13 @@ interface IUIDocumentService extends IService {
19090
19498
  renameComponent(componentId: string, name: string): void;
19091
19499
  deleteComponents(componentIds: string[]): void;
19092
19500
  duplicateComponent(componentId: string): UIComponentDefinition | null;
19093
- updateComponentElementLayout(componentId: string, elementId: string, layoutPatch: Partial<UILayout>): void;
19501
+ duplicateComponents(componentIds: readonly string[]): UIComponentDefinition[];
19502
+ updateComponentElementLayout(componentId: string, elementId: string, layoutPatch: Partial<UILayout>, options?: {
19503
+ skipHistory?: boolean;
19504
+ }): void;
19505
+ updateComponentElementLayouts(componentId: string, layoutPatches: Record<string, Partial<UILayout>>, options?: {
19506
+ mergeKey?: string;
19507
+ }): void;
19094
19508
  updateComponentElementProps(componentId: string, elementId: string, propsPatch: Record<string, unknown>): void;
19095
19509
  updateComponentElementExtra(componentId: string, elementId: string, extraPatch: Record<string, unknown>): void;
19096
19510
  renameComponentElement(componentId: string, elementId: string, name: string): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "narraleaf-studio",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "TypeScript declarations for the NarraLeaf Studio plugin API (narraleaf-studio/plugin and narraleaf-studio/runtime).",
5
5
  "license": "MPL-2.0",
6
6
  "type": "module",