narraleaf-studio 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/_api.d.ts CHANGED
@@ -665,27 +665,60 @@ type StoryActionPayload = {
665
665
  } | {
666
666
  /**
667
667
  * A `Video` — an Actionable, not a Displayable, which is why it has its own verb set rather
668
- * than sharing `displayable`'s. `play` waits for the clip to finish; `resume` does not.
668
+ * than sharing `displayable`'s.
669
669
  *
670
- * `create` declares, like the `image` arm's: it compiles to `Video.preload()`, which puts a
671
- * hidden element on stage so the clip starts buffering, and `show` is what reveals it.
670
+ * **`play` is the only row that puts a clip on the stage** (v27). It carries the file
671
+ * ({@link assetId}) and defines the clip under {@link objectName}: it reveals the clip, runs
672
+ * it, and - unless {@link hideOnEnd} says otherwise - takes it off the stage when it ends. A
673
+ * second `play` of the same name and file runs that clip again.
672
674
  *
673
- * A `show` carrying {@link assetId} is the one-row form, on the same terms as the `image`
674
- * arm's - it builds the clip, names it and reveals it. Revealing is still not playing: the
675
- * element is on screen holding its first frame, and `/play` is what runs it.
676
- *
677
- * Additive: the four transport operations and `timeMs` are new in A3, and no document
678
- * written before them carries either, so no schema bump.
675
+ * Every other operation names a clip a `play` defined: `pause`, `resume`, `seek`, `stop`
676
+ * (end it now, as though it had reached its end - the defining play then hides it or holds
677
+ * its frame, as it says) and `hide`. A video is a cutscene the story plays, not an object it
678
+ * stages, so there is no row that declares or reveals a clip without running it; v27
679
+ * folded the `create` and `show` rows that used to into the plays that followed them.
679
680
  */
680
681
  action: "video";
681
- operation: "create" | "show" | "hide" | "play" | "pause" | "resume" | "stop" | "seek";
682
+ operation: "hide" | "play" | "pause" | "resume" | "stop" | "seek";
682
683
  objectName: string;
683
- /** Which clip a non-`create` op addresses. Same rule as the `image` arm's `target`. */
684
+ /**
685
+ * Which clip a control operation addresses, bound to the `play` that defines it. Same rule
686
+ * as the `image` arm's `target`. A `play` carries none: it defines its clip itself.
687
+ */
684
688
  target?: StoryActionableTargetRef;
689
+ /** `play` — the clip it plays. Required: a play with no file plays nothing. */
685
690
  assetId?: string;
691
+ /** `play` — whether the clip plays without sound. */
686
692
  muted?: boolean;
687
693
  /** `seek` — where to jump to, in milliseconds. The engine's `seek` takes seconds; the compiler converts. */
688
694
  timeMs?: number;
695
+ /**
696
+ * `play` — whether the story waits for the clip to end before it moves on.
697
+ *
698
+ * Absent means it waits, which is what every `play` written before this field did. `false`
699
+ * lets the next row run at once while the clip plays on; the clip still leaves the stage
700
+ * when it ends, as {@link hideOnEnd} says. `videoPlayWaits` is the one reading of this field.
701
+ *
702
+ * Added with v27; a v26 document cannot carry it.
703
+ */
704
+ waitForEnd?: boolean;
705
+ /**
706
+ * `play` — whether the clip leaves the stage once it has played to the end.
707
+ *
708
+ * Absent means it does: a clip that ends holds its last frame above every scene, across a
709
+ * jump too, so clearing itself away is what a cutscene is expected to do. `false` holds that
710
+ * last frame until a `hide` row takes it away. `videoPlayHidesOnEnd` is the one reading of
711
+ * this field.
712
+ */
713
+ hideOnEnd?: boolean;
714
+ /**
715
+ * How long the clip takes to fade out, in milliseconds - on a `hide`, and on a `play` that
716
+ * hides its clip when it ends. `0` is a cut.
717
+ *
718
+ * Unset, a `hide` cuts, as it always did, and a hiding `play` fades over the default every
719
+ * other hide row is seeded with. `videoLeaveFadeMs` is the one reading of this field.
720
+ */
721
+ durationMs?: number;
689
722
  } | {
690
723
  /**
691
724
  * The story's stage camera (`story.camera`) — a Displayable like any other in the engine, but
@@ -2109,6 +2142,21 @@ type PluginContributes = {
2109
2142
  * capability to consent to at install time.
2110
2143
  */
2111
2144
  tests?: string[];
2145
+ /**
2146
+ * Save ids the plugin keeps for its own bookkeeping - a quick-save slot, a checkpoint - rather
2147
+ * than slots a player chose.
2148
+ *
2149
+ * The game leaves them out of `List Saves`, and so out of every save screen built on it, the way
2150
+ * it leaves out its own autosave ring. Nothing else changes for them: the plugin still writes,
2151
+ * loads and finds them through `app.game.saves` (whose `listIds` is the raw store listing and
2152
+ * still includes them), and the explicit-id save nodes - `Load Save`, `Delete Save`, the
2153
+ * `Get Save` readers - take them like any other id.
2154
+ *
2155
+ * Prefixed with the plugin id like the type lists above, so a plugin can only reserve ids in its
2156
+ * own namespace and can never hide a slot the author's own `Save Game` wrote. That is also why it
2157
+ * derives no install permission: it reaches nothing the plugin did not already own.
2158
+ */
2159
+ reservedSaveIds?: string[];
2112
2160
  /**
2113
2161
  * Capability domains the `runtime` entry may use. Each maps 1:1 onto a
2114
2162
  * namespace on `app.game`, and an undeclared domain is absent from that
@@ -2172,9 +2220,29 @@ type PluginContributes = {
2172
2220
  */
2173
2221
  network?: string[];
2174
2222
  };
2223
+ /**
2224
+ * The plugin's name and description in one editor language. Either may be left out, and the plain
2225
+ * manifest field is shown in its place.
2226
+ */
2227
+ export type PluginManifestLocalizedText = {
2228
+ name?: string;
2229
+ description?: string;
2230
+ };
2231
+ /**
2232
+ * `name` and `description` per editor locale, keyed by the exact code Studio's language setting
2233
+ * stores (`zh`, `ja`, or a code a language pack adds). There is no region matching: an entry under
2234
+ * `zh-CN` is never shown, because no Studio locale is called that.
2235
+ */
2236
+ export type PluginManifestLocalized = Record<string, PluginManifestLocalizedText>;
2175
2237
  export type PluginManifestV2 = Omit<PluginIdentity, "id" | "name" | "version"> & Required<Pick<PluginIdentity, "id" | "name" | "version">> & {
2176
2238
  manifestVersion: typeof PluginManifestVersion;
2177
2239
  description?: string;
2240
+ /**
2241
+ * Translations of `name` and `description`, shown wherever Studio names the plugin to an author
2242
+ * whose editor is set to that language. The plain fields stay the plugin's identity: command
2243
+ * lines, project files and built games name it by them.
2244
+ */
2245
+ localized?: PluginManifestLocalized;
2178
2246
  /**
2179
2247
  * Package-relative path to the thumbnail shown beside the plugin's name in
2180
2248
  * the Launcher list. Square, at most 512x512, and one of the extensions in
@@ -2565,6 +2633,21 @@ type UIDocument = {
2565
2633
  * `inputAction.ts`.
2566
2634
  */
2567
2635
  actions?: Record<string, UIInputActionDef>;
2636
+ /**
2637
+ * The page the game starts on, by id.
2638
+ *
2639
+ * Absent means the page carrying `MAIN_APP_SURFACE_ID` - the id a new document gives its first
2640
+ * page, and the only entry a document had before this field existed - so a document whose author
2641
+ * never moved the entry stays exactly as short as it was. Read only through `resolveEntrySurface`
2642
+ * (`entrySurface.ts`), which also says what a pointer that has lost its page falls back to.
2643
+ *
2644
+ * A pointer rather than an id swap: a page's id is what its blueprints are filed under and what
2645
+ * every `Go Page` names, so making another page the entry must not change which id it has.
2646
+ *
2647
+ * Carries no schema bump, for the reason `actions` and `structs` did not: absence already means a
2648
+ * defined answer, so a document written before this field reads correctly without one.
2649
+ */
2650
+ entrySurfaceId?: UISurfaceId;
2568
2651
  meta?: UIDocumentMeta;
2569
2652
  };
2570
2653
  type UIDocumentMeta = {
@@ -3006,6 +3089,7 @@ declare const en: {
3006
3089
  readonly welcome: "Open Welcome";
3007
3090
  readonly docs: "Documentation";
3008
3091
  readonly feedback: "Send Feedback";
3092
+ readonly exportLogs: "Export Logs\u2026";
3009
3093
  readonly about: "About {name}";
3010
3094
  };
3011
3095
  };
@@ -3786,6 +3870,11 @@ declare const en: {
3786
3870
  readonly removeKey: "Remove key";
3787
3871
  readonly removeKeyConfirm: "Remove {name}?";
3788
3872
  readonly removeKeyConfirmDetail: "Existing translations of this key stay in the language files.";
3873
+ readonly removeKeyUsedBy: "Used by:";
3874
+ readonly removeKeyUsedByElement: "{owner} \u25B8 {element}";
3875
+ readonly removeKeyUsedByBlueprint: "Blueprint \u201C{name}\u201D";
3876
+ readonly removeKeyUsedByMore: "and {count} more";
3877
+ readonly removeKeyUsedByAfter: "Once the key is removed, the project check reports each of them.";
3789
3878
  readonly sourceColumn: "Source";
3790
3879
  readonly targetColumn: "Translation";
3791
3880
  readonly targetPlaceholder: "Translate\u2026";
@@ -4228,6 +4317,10 @@ declare const en: {
4228
4317
  readonly one: "{count} more waiting";
4229
4318
  readonly other: "{count} more waiting";
4230
4319
  };
4320
+ readonly repeated: {
4321
+ readonly one: "{count} time";
4322
+ readonly other: "{count} times";
4323
+ };
4231
4324
  };
4232
4325
  readonly background: {
4233
4326
  readonly command: "Set background image\u2026";
@@ -4297,7 +4390,7 @@ declare const en: {
4297
4390
  readonly saveFailed: "Save failed";
4298
4391
  readonly retrySave: "Retry saving now";
4299
4392
  readonly resetZoom: "Reset zoom to 100%";
4300
- readonly shortcuts: "Keyboard shortcuts";
4393
+ readonly shortcuts: "Shortcuts and mouse actions";
4301
4394
  readonly words: {
4302
4395
  readonly one: "{count} word";
4303
4396
  readonly other: "{count} words";
@@ -4316,7 +4409,7 @@ declare const en: {
4316
4409
  readonly studioTasks: "Background work";
4317
4410
  readonly unsavedChanges: "Unsaved changes";
4318
4411
  readonly wordCount: "Story stats";
4319
- readonly shortcuts: "Keyboard shortcuts";
4412
+ readonly shortcuts: "Shortcuts and mouse actions";
4320
4413
  readonly notifications: "Notifications";
4321
4414
  readonly theme: "Theme switcher";
4322
4415
  readonly zoom: "Zoom level";
@@ -4671,7 +4764,7 @@ declare const en: {
4671
4764
  readonly conflict: "Also bound to {name}";
4672
4765
  readonly empty: "No matching shortcuts";
4673
4766
  readonly openSettings: "Customize Keyboard Shortcuts";
4674
- readonly cheatSheetTitle: "Keyboard Shortcuts";
4767
+ readonly cheatSheetTitle: "Shortcuts and Mouse Actions";
4675
4768
  readonly cheatSheetCustomize: "Customize\u2026";
4676
4769
  readonly categories: {
4677
4770
  readonly general: "General";
@@ -4690,12 +4783,13 @@ declare const en: {
4690
4783
  readonly catalog: {
4691
4784
  readonly commandPalette: "Show and Run Commands";
4692
4785
  readonly quickOpen: "Quick Open";
4693
- readonly cheatSheet: "Show Keyboard Shortcuts";
4786
+ readonly cheatSheet: "Show Shortcuts and Mouse Actions";
4694
4787
  readonly contextHelp: "Help for What Is Focused";
4695
4788
  readonly reopenClosedTab: "Reopen Closed Tab";
4696
4789
  readonly localizationFind: "Find in Translations";
4697
4790
  readonly voiceFind: "Find in Voice-over";
4698
4791
  readonly lintFind: "Find in Problems";
4792
+ readonly blueprintOverviewFind: "Find in Blueprint Overview";
4699
4793
  readonly run: {
4700
4794
  readonly stop: "Stop the Run";
4701
4795
  };
@@ -4744,6 +4838,104 @@ declare const en: {
4744
4838
  readonly playheadEnd: "Move Playhead to End";
4745
4839
  };
4746
4840
  };
4841
+ readonly gestures: {
4842
+ readonly withModifiers: "{keys}+{gesture}";
4843
+ readonly middleClickTab: "Middle-click a tab";
4844
+ readonly doubleClickTab: "Double-click a tab";
4845
+ readonly clickTab: "Click a tab";
4846
+ readonly doubleClickDivider: "Double-click the divider";
4847
+ readonly doubleClickRow: "Double-click a row";
4848
+ readonly clickRow: "Click a row";
4849
+ readonly dragAcrossRows: "Drag across rows";
4850
+ readonly dragRowHandle: "Drag a row's handle";
4851
+ readonly clickName: "Click a name";
4852
+ readonly dragHandle: "Drag a handle";
4853
+ readonly arrowKeys: "Arrow keys";
4854
+ readonly middleDrag: "Middle-drag";
4855
+ readonly scroll: "Scroll";
4856
+ readonly drag: "Drag";
4857
+ readonly clickElement: "Click an element";
4858
+ readonly doubleClickContainer: "Double-click a container";
4859
+ readonly doubleClickText: "Double-click text or a button";
4860
+ readonly doubleClickImage: "Double-click an image";
4861
+ readonly dragImageAsset: "Drag an image asset onto the canvas";
4862
+ readonly doubleClickOutlineItem: "Double-click an outline item";
4863
+ readonly dragOutlineItem: "Drag an outline item";
4864
+ readonly clickNode: "Click a node";
4865
+ readonly rightClickCanvas: "Right-click the canvas";
4866
+ readonly dragPinToCanvas: "Drag from a pin onto empty canvas";
4867
+ readonly doubleClickWire: "Double-click a wire";
4868
+ readonly doubleClickGroupTitle: "Double-click a group's title";
4869
+ readonly middleClickTitle: "Middle-click the title row";
4870
+ readonly doubleClickTrack: "Double-click a track";
4871
+ readonly clickAsset: "Click an asset";
4872
+ readonly doubleClick: "Double-click";
4873
+ readonly dragToEditorArea: "Drag into the editor area";
4874
+ readonly dragOntoGroup: "Drag onto a group";
4875
+ readonly dragWaveform: "Drag on the waveform";
4876
+ readonly doubleClickWaveform: "Double-click the waveform";
4877
+ readonly doubleClickMarker: "Double-click a marker";
4878
+ readonly doubleClickPicture: "Double-click the picture";
4879
+ readonly doubleClickTimeline: "Double-click the timeline";
4880
+ };
4881
+ readonly fixed: {
4882
+ readonly toggleSelection: "Add to or Remove from Selection";
4883
+ readonly addToSelection: "Add to Selection";
4884
+ readonly panCanvas: "Pan the Canvas";
4885
+ readonly zoomAtPointer: "Zoom at the Pointer";
4886
+ readonly easingSnap: "Snap an Easing Handle to the Grid";
4887
+ readonly easingNudge: "Nudge a Focused Easing Handle";
4888
+ readonly general: {
4889
+ readonly keepTabOpen: "Keep a Preview Tab Open";
4890
+ readonly selectTabs: "Select Several Tabs";
4891
+ readonly resetSplit: "Split the Editor Area Evenly";
4892
+ };
4893
+ readonly story: {
4894
+ readonly selectRowRange: "Select a Range of Rows";
4895
+ readonly moveRows: "Move Rows";
4896
+ readonly followReference: "Go to What a Name Refers To";
4897
+ readonly continueRow: "Commit and Continue With the Same Kind of Row";
4898
+ readonly blankRow: "Commit and Start a Blank Row";
4899
+ readonly finishEditing: "Finish Editing a Row";
4900
+ readonly pastePlain: "Paste Without Paste as Rows";
4901
+ };
4902
+ readonly uiEditor: {
4903
+ readonly selectInside: "Select Inside a Container";
4904
+ readonly editText: "Edit Text in Place";
4905
+ readonly discardText: "Discard the Text Being Edited";
4906
+ readonly crop: "Crop an Image";
4907
+ readonly suspendSnap: "Suspend Smart Snap";
4908
+ readonly dropImage: "Add an Image Element";
4909
+ readonly reorder: "Reorder or Move Into Another Element";
4910
+ };
4911
+ readonly blueprint: {
4912
+ readonly addNode: "Add a Node";
4913
+ readonly addConnectedNode: "Add a Connected Node";
4914
+ readonly deleteWire: "Delete a Wire";
4915
+ readonly deleteSelection: "Delete Selection";
4916
+ readonly renameGroup: "Rename a Group";
4917
+ };
4918
+ readonly storyMotion: {
4919
+ readonly noFrameSnap: "Drag Without Frame Snapping";
4920
+ readonly addKeyframe: "Add a Keyframe";
4921
+ readonly panPreview: "Pan the Preview";
4922
+ readonly zoom: "Zoom the Preview or Timeline";
4923
+ readonly scrollTimeline: "Scroll the Timeline Sideways";
4924
+ };
4925
+ readonly assets: {
4926
+ readonly selectAssetRange: "Select a Range of Assets";
4927
+ readonly open: "Open";
4928
+ readonly moveToGroup: "Move to a Group";
4929
+ readonly tileSize: "Resize Thumbnails";
4930
+ readonly audioScroll: "Scroll the Waveform Sideways";
4931
+ readonly audioZoomTime: "Zoom the Waveform in Time";
4932
+ readonly audioZoomAmplitude: "Magnify the Waveform Vertically";
4933
+ readonly selectAudioRange: "Select a Stretch of Audio";
4934
+ readonly clearMarker: "Clear a Marker";
4935
+ readonly videoZoom: "Zoom the Picture";
4936
+ readonly videoActualSize: "Switch Between Fit and Actual Pixels";
4937
+ };
4938
+ };
4747
4939
  };
4748
4940
  readonly search: {
4749
4941
  readonly placeholder: "Search project\u2026";
@@ -4847,7 +5039,7 @@ declare const en: {
4847
5039
  readonly other: "Its {count} scenes are deleted with it.";
4848
5040
  };
4849
5041
  readonly deleteSceneConfirm: "Delete scene \"{name}\"?";
4850
- readonly deleteSceneDetail: "This removes the scene and its blocks. Jumps to it will stop resolving.";
5042
+ readonly deleteSceneDetail: "This removes the scene and all its rows. Jumps to it will stop resolving.";
4851
5043
  };
4852
5044
  readonly readFailed: {
4853
5045
  readonly missing: "This story is no longer in this project.";
@@ -4942,9 +5134,9 @@ declare const en: {
4942
5134
  readonly undoSceneRestored: "That scene is in the story again.";
4943
5135
  readonly undoChapterGone: "That chapter is gone.";
4944
5136
  readonly undoChapterRestored: "That chapter is in the story again.";
4945
- readonly undoContainerGone: "The block that line was in is gone.";
5137
+ readonly undoContainerGone: "The row that line was inside is gone.";
4946
5138
  readonly undoAnchorGone: "Where that line moved from is gone.";
4947
- readonly undoContainerFilled: "That block has lines in it now.";
5139
+ readonly undoContainerFilled: "That row has other lines inside it now.";
4948
5140
  readonly undoSubtreeLost: "The lines that were inside it cannot be put back.";
4949
5141
  readonly undoChaptersChanged: "The chapters are not the ones that step recorded.";
4950
5142
  readonly undoCharacterGone: "That character is gone.";
@@ -5335,6 +5527,7 @@ declare const en: {
5335
5527
  readonly scopedTo: "Actions for {name}";
5336
5528
  readonly addStarred: "Add to starred";
5337
5529
  readonly removeStarred: "Remove from starred";
5530
+ readonly starredEmpty: "Starred commands are listed first in the \u201C/\u201D menu.";
5338
5531
  };
5339
5532
  readonly music: {
5340
5533
  readonly missingAudio: "Missing audio";
@@ -5388,6 +5581,7 @@ declare const en: {
5388
5581
  readonly mirrorState: "On / Off";
5389
5582
  readonly waitFor: "Seconds or click";
5390
5583
  readonly waitForEnd: "Wait for the clip";
5584
+ readonly hideOnEnd: "Hide when finished";
5391
5585
  readonly fade: "Fade Seconds";
5392
5586
  readonly loop: "Loop";
5393
5587
  readonly returnable: "Return";
@@ -5832,7 +6026,7 @@ declare const en: {
5832
6026
  readonly image: "Image \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5833
6027
  readonly text: "Text \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5834
6028
  readonly layer: "Layer \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5835
- readonly video: "Video \u201C{name}\u201D is not on stage; an earlier row has to create it.";
6029
+ readonly video: "Video \u201C{name}\u201D is not on stage; an earlier row has to play it.";
5836
6030
  readonly ambience: "Ambience effect \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5837
6031
  readonly character: "Character \u201C{name}\u201D is not on stage; an earlier row has to bring it on stage.";
5838
6032
  readonly characterGone: "The character this row acts on is no longer in this project, so it is not on stage.";
@@ -5899,8 +6093,8 @@ declare const en: {
5899
6093
  readonly kindExpression: "Expression";
5900
6094
  readonly expressionPlaceholder: "gold >= 100 && !met";
5901
6095
  readonly expressionVariables: "In scope: {names}";
5902
- readonly opIsOn: "is on";
5903
- readonly opIsOff: "is off";
6096
+ readonly opIsTrue: "is true";
6097
+ readonly opIsFalse: "is false";
5904
6098
  readonly opEquals: "equals";
5905
6099
  readonly opNotEquals: "does not equal";
5906
6100
  readonly opGreaterThan: "is greater than";
@@ -5972,7 +6166,7 @@ declare const en: {
5972
6166
  };
5973
6167
  readonly show: {
5974
6168
  readonly label: "Show";
5975
- readonly detail: "Show a character, a stage object, or an image or video from the asset library";
6169
+ readonly detail: "Show a character, a stage object, or an image from the asset library";
5976
6170
  };
5977
6171
  readonly hide: {
5978
6172
  readonly label: "Hide";
@@ -6010,10 +6204,6 @@ declare const en: {
6010
6204
  readonly label: "Text";
6011
6205
  readonly detail: "Declare text on stage; /show reveals it";
6012
6206
  };
6013
- readonly video: {
6014
- readonly label: "Video";
6015
- readonly detail: "Declare a video on stage; /show reveals it";
6016
- };
6017
6207
  readonly vfx: {
6018
6208
  readonly label: "Ambience";
6019
6209
  readonly detail: "Declare a looping full-screen overlay: petals, rain, dust, light";
@@ -6028,7 +6218,7 @@ declare const en: {
6028
6218
  };
6029
6219
  readonly play: {
6030
6220
  readonly label: "Play";
6031
- readonly detail: "Play a video";
6221
+ readonly detail: "Play a video from the asset library, or play a video again";
6032
6222
  };
6033
6223
  readonly front: {
6034
6224
  readonly label: "Bring to Front";
@@ -6171,10 +6361,10 @@ declare const en: {
6171
6361
  readonly condition: "Condition";
6172
6362
  readonly if: "If";
6173
6363
  readonly elseIf: "Else if";
6174
- readonly else: "Otherwise";
6364
+ readonly else: "Else";
6175
6365
  readonly repeat: "Repeat";
6176
6366
  readonly repeatUntil: "Repeat until";
6177
- readonly parallel: "Run at the same time";
6367
+ readonly parallel: "Parallel";
6178
6368
  readonly race: "Race, first to finish";
6179
6369
  readonly sequence: "In order";
6180
6370
  readonly nvl: "NVL";
@@ -6185,7 +6375,7 @@ declare const en: {
6185
6375
  readonly declare: {
6186
6376
  readonly scene: "Local";
6187
6377
  readonly saved: "Var";
6188
- readonly persistent: "Global";
6378
+ readonly persistent: "Persistent";
6189
6379
  };
6190
6380
  readonly narration: "Narration";
6191
6381
  readonly dialogue: "Dialogue";
@@ -6815,7 +7005,7 @@ declare const en: {
6815
7005
  readonly setZIndex: "Set z-index";
6816
7006
  };
6817
7007
  readonly videoOperation: {
6818
- readonly play: "Play (wait for end)";
7008
+ readonly play: "Play";
6819
7009
  readonly pause: "Pause";
6820
7010
  readonly resume: "Resume";
6821
7011
  readonly stop: "Stop";
@@ -6895,6 +7085,10 @@ declare const en: {
6895
7085
  readonly videoName: "Video name";
6896
7086
  readonly videoAsset: "Video asset";
6897
7087
  readonly seekTime: "Seek to";
7088
+ readonly hideOnEnd: "Hide when finished";
7089
+ readonly leave: "Exit";
7090
+ readonly waitForEnd: "Wait for the video";
7091
+ readonly skipHint: "The player can end the video early by clicking or pressing the skip key.";
6898
7092
  };
6899
7093
  readonly nvl: {
6900
7094
  readonly hint: "Child rows run in NVL mode. The transform below animates the NVL layer as it enters.";
@@ -6960,8 +7154,8 @@ declare const en: {
6960
7154
  readonly conditionContainer: "Condition container. Add condition branches as children.";
6961
7155
  readonly control: "Control";
6962
7156
  readonly sequence: "Sequence";
6963
- readonly parallel: "Parallel all";
6964
- readonly race: "Race any";
7157
+ readonly parallel: "Parallel";
7158
+ readonly race: "Race";
6965
7159
  readonly repeat: "Repeat";
6966
7160
  readonly mode: {
6967
7161
  readonly do: "Do";
@@ -7125,6 +7319,7 @@ declare const en: {
7125
7319
  readonly list: "List view";
7126
7320
  readonly icons: "Icon view";
7127
7321
  readonly overview: "Overview";
7322
+ readonly details: "Details view";
7128
7323
  };
7129
7324
  readonly filter: {
7130
7325
  readonly label: "Filters";
@@ -7143,6 +7338,17 @@ declare const en: {
7143
7338
  readonly list: {
7144
7339
  readonly emptyFiltered: "No assets matched the current filters.";
7145
7340
  };
7341
+ readonly browser: {
7342
+ readonly results: {
7343
+ readonly one: "{count} result";
7344
+ readonly other: "{count} results";
7345
+ };
7346
+ readonly selected: {
7347
+ readonly one: "{count} selected";
7348
+ readonly other: "{count} selected";
7349
+ };
7350
+ readonly location: "Location";
7351
+ };
7146
7352
  readonly iconView: {
7147
7353
  readonly updating: "Updating\u2026";
7148
7354
  readonly assetCount: {
@@ -7292,13 +7498,13 @@ declare const en: {
7292
7498
  readonly locale: "Language";
7293
7499
  readonly release: "Variant";
7294
7500
  };
7295
- readonly deletedVariant: "Deleted variant";
7501
+ readonly deletedVariant: "Deleted value";
7296
7502
  readonly variantCount: {
7297
- readonly one: "{count} variant";
7298
- readonly other: "{count} variants";
7503
+ readonly one: "{count} value";
7504
+ readonly other: "{count} values";
7299
7505
  };
7300
- readonly variantsResolved: "{resolved} of {total} variants";
7301
- readonly unfinished: "No variants declared";
7506
+ readonly variantsResolved: "{resolved} of {total} values";
7507
+ readonly unfinished: "No values declared";
7302
7508
  readonly inUseTitle: "{name} is still in use";
7303
7509
  readonly inUseMessage: "The following places name it and will stop resolving:";
7304
7510
  readonly deleteConfirmMessage: "The files inside this set are deleted too.";
@@ -7313,7 +7519,7 @@ declare const en: {
7313
7519
  };
7314
7520
  readonly create: {
7315
7521
  readonly title: "New asset set";
7316
- readonly subTitle: "New set under this variant";
7522
+ readonly subTitle: "New set under this value";
7317
7523
  readonly no: {
7318
7524
  readonly locale: "This project declares one language.";
7319
7525
  readonly release: "This project has no variants.";
@@ -7326,8 +7532,8 @@ declare const en: {
7326
7532
  readonly filter: "Members carry";
7327
7533
  readonly residencyBlocked: "A set that varies by variant cannot sit under one that varies by language.";
7328
7534
  readonly fallback: "Falls back to";
7329
- readonly fallbackMissing: "This variant has no file, so nothing in this set resolves.";
7330
- readonly variants: "Variants";
7535
+ readonly fallbackMissing: "This value has no file, so nothing in this set resolves.";
7536
+ readonly variants: "Values";
7331
7537
  readonly variantInherited: "fallback";
7332
7538
  readonly variantMissing: "No file";
7333
7539
  readonly variantAmbiguous: "{count} files";
@@ -7617,7 +7823,7 @@ declare const en: {
7617
7823
  readonly tab: {
7618
7824
  readonly title: "Blueprint";
7619
7825
  readonly invalid: "Blueprint tab is invalid.";
7620
- readonly notFound: "Blueprint not found: {id}";
7826
+ readonly notFound: "Blueprint not found in this project";
7621
7827
  };
7622
7828
  readonly breakpoint: {
7623
7829
  readonly add: "Add breakpoint";
@@ -7643,7 +7849,6 @@ declare const en: {
7643
7849
  readonly collapse: "Collapse side panel";
7644
7850
  };
7645
7851
  readonly canvas: {
7646
- readonly addLayer: "Add layer";
7647
7852
  readonly selectLayer: "Select a layer on the left.";
7648
7853
  readonly previewUnavailable: "Preview unavailable";
7649
7854
  readonly unknownNode: "Unknown node";
@@ -7652,6 +7857,14 @@ declare const en: {
7652
7857
  readonly other: "Deleted the unknown node and its {count} hidden connections. Undo to restore.";
7653
7858
  };
7654
7859
  };
7860
+ readonly wire: {
7861
+ readonly nodeDetail: "{node} ({detail})";
7862
+ readonly end: "{node} \u00B7 {pin}";
7863
+ readonly connectedTo: "Connected to {target}";
7864
+ readonly goTo: "Go to {target}";
7865
+ readonly goToNth: "Go to {target} ({n})";
7866
+ readonly goToConnected: "Go to connected node";
7867
+ };
7655
7868
  readonly crossProject: {
7656
7869
  readonly pasted: {
7657
7870
  readonly one: "{count} node pasted";
@@ -7877,6 +8090,46 @@ declare const en: {
7877
8090
  readonly other: "Already run by {count} layers";
7878
8091
  };
7879
8092
  };
8093
+ readonly layerTemplates: {
8094
+ readonly heading: "New layer";
8095
+ readonly description: "Start from a template or from a blank layer.";
8096
+ readonly listLabel: "Layer templates";
8097
+ readonly blank: {
8098
+ readonly title: "Blank layer";
8099
+ readonly description: "An empty canvas, or one of your own scripts.";
8100
+ };
8101
+ readonly library: {
8102
+ readonly title: "More templates";
8103
+ readonly description: "Browse every template for this blueprint by category.";
8104
+ };
8105
+ };
8106
+ readonly templateLibrary: {
8107
+ readonly title: "Template library";
8108
+ readonly open: "Add from template library";
8109
+ readonly all: "All";
8110
+ readonly categoriesLabel: "Categories";
8111
+ readonly search: "Search templates";
8112
+ readonly emptyFiltered: "No templates match.";
8113
+ readonly empty: "No templates suit this blueprint.";
8114
+ readonly add: "Add";
8115
+ readonly back: "Back";
8116
+ readonly openDetail: "Show details";
8117
+ readonly choicesHeading: "To choose after adding";
8118
+ readonly choicesNone: "Runs as it is once added.";
8119
+ readonly previewLabel: "Graph preview";
8120
+ readonly category: {
8121
+ readonly pageFlow: "Page flow";
8122
+ readonly navigation: "Navigation";
8123
+ readonly game: "Game";
8124
+ readonly settings: "Settings";
8125
+ readonly audio: "Audio";
8126
+ readonly motion: "Motion";
8127
+ readonly keys: "Keys";
8128
+ readonly window: "Window";
8129
+ readonly display: "Display";
8130
+ readonly conditions: "Conditions";
8131
+ };
8132
+ };
7880
8133
  readonly owner: {
7881
8134
  readonly global: "Global";
7882
8135
  readonly storyAction: "Story Action";
@@ -7980,6 +8233,7 @@ declare const en: {
7980
8233
  readonly select: "Select element";
7981
8234
  readonly selectNamed: "Select element {name}";
7982
8235
  readonly unbound: "Unbound";
8236
+ readonly missing: "Missing element";
7983
8237
  };
7984
8238
  readonly pin: {
7985
8239
  readonly addInput: "Add input pin";
@@ -8793,6 +9047,7 @@ declare const en: {
8793
9047
  readonly getVisible: "Get Visible";
8794
9048
  readonly getWrapMode: "Get Wrap Mode";
8795
9049
  readonly goPage: "Go Page";
9050
+ readonly replacePage: "Replace Page";
8796
9051
  readonly goBack: "Go back";
8797
9052
  readonly showLayer: "Show Layer";
8798
9053
  readonly hideLayer: "Hide Layer";
@@ -9046,9 +9301,45 @@ declare const en: {
9046
9301
  readonly getPlaytime: "Get Playtime";
9047
9302
  readonly getTotalPlaytime: "Get Total Playtime";
9048
9303
  };
9304
+ readonly nodeDescription: {
9305
+ 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.";
9306
+ readonly compareNotEqual: "True when A and B differ in value or in type. The number 1 and the text \"1\" count as different.";
9307
+ 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.";
9308
+ readonly compareGreaterThanOrEqual: "True when A is greater than or equal to B. Both sides are compared as numbers; a side that cannot be read as a number gives false.";
9309
+ readonly compareLessThan: "True when A is less than B. Both sides are compared as numbers; a side that cannot be read as a number gives false.";
9310
+ readonly compareLessThanOrEqual: "True when A is less than or equal to B. Both sides are compared as numbers; a side that cannot be read as a number gives false.";
9311
+ readonly mathEqual: "True when A and B are the same number. Both sides are read as numbers first, so the text \"1\" equals the number 1.";
9312
+ readonly mathNotEqual: "True when A and B are different numbers. Both sides are read as numbers first, so the text \"1\" and the number 1 count as equal.";
9313
+ readonly flowReturn: "Stops the current run here. Nothing after it runs, including the remaining outputs of a Sequence. Gives back no value; to give one back, use Return Value, or Fn Return inside a function.";
9314
+ readonly returnValue: "Gives the value back as the result and ends the run. Used where a blueprint has to produce a value, such as a Blueprint Value.";
9315
+ readonly appBoot: "Runs once each time the game starts, after the first screen is showing, and does not hold that screen back. On Game Ready has already run by then. In Dev Mode it runs again after every reload.";
9316
+ readonly gameReady: "Runs when the game is ready, before any story starts and before the first screen shows; the screen waits for it to finish. Runs before App Boot, and can run again when a game is started or loaded.";
9317
+ readonly goBack: "Closes the current page and returns to the page beneath it. On the bottom page it does nothing.";
9318
+ readonly replacePage: "Opens a page in place of the current page, and closes the current page. Go back and Go Page set to None do not return to it.";
9319
+ readonly isGameOverlay: "True when this page, layer or Game UI is shown over a running game. In the global blueprint, true while a page or a modal layer covers the story.";
9320
+ };
9049
9321
  readonly live: {
9050
9322
  readonly nodeClaimed: "{name} is editing this node";
9051
9323
  };
9324
+ readonly overview: {
9325
+ readonly title: "Blueprint Overview";
9326
+ readonly count: {
9327
+ readonly one: "{count} blueprint";
9328
+ readonly other: "{count} blueprints";
9329
+ };
9330
+ readonly noBlueprints: "No blueprints";
9331
+ readonly search: "Search blueprints";
9332
+ readonly noMatches: "No blueprints match \u201C{query}\u201D.";
9333
+ readonly nodes: {
9334
+ readonly one: "{count} node";
9335
+ readonly other: "{count} nodes";
9336
+ };
9337
+ readonly group: {
9338
+ readonly project: "Project";
9339
+ readonly componentCaption: "Component";
9340
+ readonly storyCaption: "Story";
9341
+ };
9342
+ };
9052
9343
  };
9053
9344
  readonly characters: {
9054
9345
  readonly errors: {
@@ -9130,7 +9421,7 @@ declare const en: {
9130
9421
  readonly describeOk: "Filled from the model";
9131
9422
  readonly describeNoModel: "No model to read";
9132
9423
  readonly describeNoBackend: "No runtime chosen";
9133
- readonly describeBackendMissing: "Runtime not installed here";
9424
+ readonly describeBackendMissing: "Runtime not installed in this project";
9134
9425
  readonly describeDistrusted: "Project not trusted";
9135
9426
  readonly describeNotSupported: "This runtime lists nothing";
9136
9427
  readonly describeFailed: "The model could not be read";
@@ -9288,10 +9579,10 @@ declare const en: {
9288
9579
  readonly editorTitle: "Character Properties";
9289
9580
  readonly thumbnail: "Thumbnail";
9290
9581
  readonly preview: "Preview";
9291
- readonly defaultAvatar: "Dialog avatar";
9292
- readonly voiceTrack: "Voice bus";
9293
- readonly voiceTrackMissing: "Missing bus";
9294
- readonly voiceTrackEmpty: "Add a bus under Voice in Project \u25B8 Game to give this character its own volume control.";
9582
+ readonly defaultAvatar: "Default dialog avatar";
9583
+ readonly voiceTrack: "Voice track";
9584
+ readonly voiceTrackMissing: "Missing track";
9585
+ readonly voiceTrackEmpty: "Add a track under Voice in Project \u25B8 Game to give this character its own volume control.";
9295
9586
  readonly entrance: "Entrance defaults";
9296
9587
  readonly entranceEmpty: "Entrance rows use the stage's own values until this is set.";
9297
9588
  readonly entranceDrag: "Drag to place";
@@ -9376,6 +9667,7 @@ declare const en: {
9376
9667
  readonly addCreate: "Create action";
9377
9668
  readonly removeAction: "Stop answering {name}";
9378
9669
  readonly answer: "Answer {name}";
9670
+ readonly reveal: "Show {name} in Input Actions";
9379
9671
  readonly bubble: "After it fires";
9380
9672
  readonly bubbleStop: "Intercept";
9381
9673
  readonly bubbleContinue: "Continue";
@@ -9402,9 +9694,25 @@ declare const en: {
9402
9694
  readonly uiElement: "UI Element";
9403
9695
  readonly linkedComponent: "Linked Component";
9404
9696
  };
9697
+ readonly interactionSound: {
9698
+ readonly title: "Sound";
9699
+ readonly hover: "Hover";
9700
+ readonly hoverTip: "Plays when the pointer moves onto the element, on the SFX track unless its options name another. Of nested elements with a hover sound, only the innermost one plays.";
9701
+ readonly click: "Click";
9702
+ readonly clickTip: "Plays when the element is clicked, on the SFX track unless its options name another. Of nested elements with a click sound, only the innermost one plays.";
9703
+ readonly none: "No sound";
9704
+ readonly options: "Playback options";
9705
+ readonly summary: "Volume {volume} \u00B7 {track}";
9706
+ readonly volume: "Volume";
9707
+ readonly track: "Track";
9708
+ readonly chooseHover: "Choose hover sound";
9709
+ readonly chooseClick: "Choose click sound";
9710
+ readonly missing: "Missing sound";
9711
+ };
9405
9712
  readonly linkedComponent: {
9406
9713
  readonly missing: "Missing component";
9407
9714
  readonly info: "Linked instance. Only its params and its position, size and rotation can be changed before unlinking.";
9715
+ readonly reveal: "Show in Component Library";
9408
9716
  };
9409
9717
  readonly componentParams: {
9410
9718
  readonly title: "Params";
@@ -9853,6 +10161,10 @@ declare const en: {
9853
10161
  readonly string: "String";
9854
10162
  readonly json: "JSON";
9855
10163
  };
10164
+ readonly value: {
10165
+ readonly true: "True";
10166
+ readonly false: "False";
10167
+ };
9856
10168
  readonly row: {
9857
10169
  readonly nameAria: "Variable name";
9858
10170
  readonly defaultPlaceholder: "default";
@@ -9872,7 +10184,7 @@ declare const en: {
9872
10184
  readonly hint: "Defined in the project; the value lives in the save file.";
9873
10185
  };
9874
10186
  readonly persistent: {
9875
- readonly title: "Global variables";
10187
+ readonly title: "Persistent variables";
9876
10188
  readonly hint: "Defined in the project; app-level, shared with blueprints.";
9877
10189
  };
9878
10190
  };
@@ -9901,8 +10213,8 @@ declare const en: {
9901
10213
  readonly ownerLabel: {
9902
10214
  readonly globalMain: "App logic";
9903
10215
  readonly surfaceMain: "Page logic";
9904
- readonly widgetMain: "Component logic";
9905
- readonly widgetValue: "Component value";
10216
+ readonly widgetMain: "Widget logic";
10217
+ readonly widgetValue: "Widget value";
9906
10218
  readonly storyAction: "Story action";
9907
10219
  };
9908
10220
  readonly stageSlot: {
@@ -9932,6 +10244,7 @@ declare const en: {
9932
10244
  readonly duplicateSurface: "Duplicate {label}";
9933
10245
  readonly copySurface: "Copy {label}";
9934
10246
  readonly pasteSurface: "Paste interface";
10247
+ readonly setEntryPage: "Set as Entry Page";
9935
10248
  readonly deleteSurface: "Delete {label}";
9936
10249
  readonly surfaceActions: "{label} actions";
9937
10250
  readonly deleteConfirm: "Delete {label}?";
@@ -9940,6 +10253,10 @@ declare const en: {
9940
10253
  readonly pageValidationHint: "Check the page name and size before creating it.";
9941
10254
  readonly gameUiSlotHint: "Select an available Game UI slot before creating it.";
9942
10255
  readonly allSlotsUsed: "All Game UI slots already have a surface. Open an existing Game UI from the list.";
10256
+ readonly starterTitlePage: {
10257
+ readonly title: "Create Title Page";
10258
+ readonly description: "Includes Start and Continue buttons with their blueprints. Replaces the empty entry page.";
10259
+ };
9943
10260
  };
9944
10261
  readonly naming: {
9945
10262
  readonly page: "Page {index}";
@@ -9949,6 +10266,7 @@ declare const en: {
9949
10266
  };
9950
10267
  readonly history: {
9951
10268
  readonly moveSurface: "move interface {name}";
10269
+ readonly setEntryPage: "set entry page {name}";
9952
10270
  };
9953
10271
  readonly inputActions: {
9954
10272
  readonly title: "Input Actions";
@@ -10048,6 +10366,8 @@ declare const en: {
10048
10366
  readonly canvas: {
10049
10367
  readonly unknownWidget: "Unknown widget";
10050
10368
  readonly widgetRenderFailed: "Widget failed to draw";
10369
+ readonly wordsFromRowField: "These words come from the list row field \u201C{field}\u201D.";
10370
+ readonly wordsFromBlueprintValue: "These words come from the blueprint value \u201C{name}\u201D.";
10051
10371
  };
10052
10372
  readonly editor: {
10053
10373
  readonly componentNotFound: "Component not found";
@@ -10067,6 +10387,8 @@ declare const en: {
10067
10387
  readonly layerFallback: "Layer";
10068
10388
  readonly openComponent: "Open component";
10069
10389
  readonly unlinkComponent: "Unlink component";
10390
+ readonly openComponentNamed: "Open component {name}";
10391
+ readonly openPageNamed: "Open page {name}";
10070
10392
  };
10071
10393
  readonly zoom: {
10072
10394
  readonly label: "Zoom";
@@ -10096,7 +10418,7 @@ declare const en: {
10096
10418
  readonly showSelected: "Show selected";
10097
10419
  readonly hideSelected: "Hide selected";
10098
10420
  readonly addToComponentLibrary: "Add to Component Library";
10099
- readonly addToGroup: "Add to group";
10421
+ readonly group: "Group";
10100
10422
  readonly ungroup: "Ungroup";
10101
10423
  readonly addState: "Add state";
10102
10424
  readonly arrange: {
@@ -10213,7 +10535,7 @@ declare const en: {
10213
10535
  readonly interaction: "Interaction";
10214
10536
  };
10215
10537
  readonly blueprint: {
10216
- readonly controlLabel: "Component logic";
10538
+ readonly controlLabel: "Widget logic";
10217
10539
  };
10218
10540
  readonly appearance: {
10219
10541
  readonly title: "Appearance";
@@ -10271,9 +10593,16 @@ declare const en: {
10271
10593
  readonly enableItalic: "Enable italic";
10272
10594
  readonly disableItalic: "Disable italic";
10273
10595
  };
10596
+ readonly sampleText: {
10597
+ readonly label: "Sample text";
10598
+ readonly hint: "Shown in the editor only. The game shows the story's current line.";
10599
+ readonly bindingNoEffect: "This binding has no effect in the {slot} slot.";
10600
+ readonly removeBinding: "Remove";
10601
+ };
10274
10602
  readonly localization: {
10275
- readonly title: "Localization";
10276
- readonly textKey: "Text key";
10603
+ readonly direct: "Direct";
10604
+ readonly translationKey: "Translation key";
10605
+ readonly noSourceLanguage: "The project has no source language";
10277
10606
  readonly none: "None";
10278
10607
  readonly createKey: "Create new key\u2026";
10279
10608
  readonly createKeyTitle: "New localization key";
@@ -10290,7 +10619,7 @@ declare const en: {
10290
10619
  readonly title: "List";
10291
10620
  readonly sectionContent: "Content";
10292
10621
  readonly runtimeItems: "Runtime items";
10293
- readonly runtimePreviewOnly: "Preview only";
10622
+ readonly runtimeListContent: "List content";
10294
10623
  readonly runtimePageState: "Page state array";
10295
10624
  readonly runtimeAppState: "App state array";
10296
10625
  readonly runtimePageProps: "Page props array";
@@ -10368,8 +10697,6 @@ declare const en: {
10368
10697
  readonly value: "Value";
10369
10698
  readonly valueHint: "Starting text. What the player types is held by the running game, not by this document.";
10370
10699
  readonly placeholder: "Placeholder";
10371
- readonly placeholderKey: "Placeholder key";
10372
- readonly placeholderKeyHint: "The placeholder is shown to the player: attach a key to translate it.";
10373
10700
  readonly sectionBehavior: "Behavior";
10374
10701
  readonly inputMode: "Input mode";
10375
10702
  readonly inputModeText: "Text";
@@ -10428,7 +10755,6 @@ declare const en: {
10428
10755
  readonly start: "Start";
10429
10756
  readonly center: "Center";
10430
10757
  readonly end: "End";
10431
- readonly stretch: "Stretch";
10432
10758
  readonly spaceBetween: "Space between";
10433
10759
  readonly spaceAround: "Space around";
10434
10760
  readonly gapHint: "Gap between children";
@@ -10577,6 +10903,9 @@ declare const en: {
10577
10903
  readonly container: {
10578
10904
  readonly name: "Container";
10579
10905
  };
10906
+ readonly group: {
10907
+ readonly name: "Group";
10908
+ };
10580
10909
  readonly dialog: {
10581
10910
  readonly name: "Sentence";
10582
10911
  readonly text: "The current line will appear here.";
@@ -11333,15 +11662,15 @@ declare const en: {
11333
11662
  };
11334
11663
  readonly bgmVolume: {
11335
11664
  readonly title: "Music volume";
11336
- readonly description: "The Music bus.";
11665
+ readonly description: "The Music track.";
11337
11666
  };
11338
11667
  readonly soundVolume: {
11339
11668
  readonly title: "SFX volume";
11340
- readonly description: "The SFX bus.";
11669
+ readonly description: "The SFX track.";
11341
11670
  };
11342
11671
  readonly voiceVolume: {
11343
11672
  readonly title: "Voice volume";
11344
- readonly description: "The Voice bus.";
11673
+ readonly description: "The Voice track.";
11345
11674
  };
11346
11675
  readonly voiceEndMode: {
11347
11676
  readonly title: "When a voiced line ends";
@@ -11384,18 +11713,18 @@ declare const en: {
11384
11713
  };
11385
11714
  readonly deleteConfirm: "Delete \"{name}\"?";
11386
11715
  readonly deleteDetail: {
11387
- readonly one: "{count} reference falls back to its default bus.";
11388
- readonly other: "{count} references fall back to their default bus.";
11716
+ readonly one: "{count} reference falls back to its default track.";
11717
+ readonly other: "{count} references fall back to their default track.";
11389
11718
  };
11390
11719
  readonly deleteChildren: {
11391
11720
  readonly one: "{count} track under it moves to {parent}.";
11392
11721
  readonly other: "{count} tracks under it move to {parent}.";
11393
11722
  };
11394
11723
  readonly slider: {
11395
- readonly bgm: "BGM Volume";
11396
- readonly sound: "Sound Volume";
11397
- readonly voice: "Voice Volume";
11398
- readonly global: "Global Volume";
11724
+ readonly bgm: "Music volume";
11725
+ readonly sound: "SFX volume";
11726
+ readonly voice: "Voice volume";
11727
+ readonly global: "Master volume";
11399
11728
  };
11400
11729
  };
11401
11730
  readonly settings: {
@@ -11600,6 +11929,10 @@ declare const en: {
11600
11929
  readonly label: "Help";
11601
11930
  readonly description: "How the parts of Studio behave.";
11602
11931
  };
11932
+ readonly titlePage: {
11933
+ readonly label: "New Title Page";
11934
+ readonly description: "Start and Continue buttons included.";
11935
+ };
11603
11936
  };
11604
11937
  readonly reopenHint: {
11605
11938
  readonly menu: "Reopen this page from Help \u2192 Open Welcome.";
@@ -11779,6 +12112,12 @@ declare const en: {
11779
12112
  readonly label: "About";
11780
12113
  readonly tooltip: "About NarraLeaf Studio";
11781
12114
  };
12115
+ readonly exportLogs: {
12116
+ readonly label: "Export Logs\u2026";
12117
+ readonly tooltip: "Save all Studio logs as a zip archive";
12118
+ readonly done: "Logs saved to {path}";
12119
+ readonly failed: "The logs could not be exported.";
12120
+ };
11782
12121
  };
11783
12122
  readonly export: {
11784
12123
  readonly chooseFolder: "Choose a folder for the exported project package.";
@@ -12116,7 +12455,14 @@ declare const en: {
12116
12455
  readonly title: "Layers";
12117
12456
  readonly empty: "Nothing is on screen";
12118
12457
  readonly stack: "Stack, bottom to top";
12458
+ readonly stage: "Stage";
12459
+ readonly gameUi: "Game UI";
12119
12460
  readonly page: "Page";
12461
+ readonly layer: "Layer";
12462
+ readonly faded: "Faded out";
12463
+ readonly dialogHidden: "Hidden";
12464
+ readonly hiddenForGame: "Hidden while the game runs";
12465
+ readonly returnsOnBack: "Shown again on Go back";
12120
12466
  readonly onScreenCount: "{onScreen} of {total} on screen";
12121
12467
  readonly offScreen: "Not on screen";
12122
12468
  readonly offScreenNote: "A layer stays off screen while this project has no surface with its id.";
@@ -12124,6 +12470,7 @@ declare const en: {
12124
12470
  readonly queued: "Waiting for a group";
12125
12471
  readonly takesClicks: "Takes clicks";
12126
12472
  readonly takesNoClicks: "Takes no clicks";
12473
+ readonly takesNoInput: "Takes no clicks or keys";
12127
12474
  readonly keyboard: "Keyboard";
12128
12475
  readonly modal: "Modal";
12129
12476
  readonly dismissible: "Go back closes it";
@@ -12458,6 +12805,7 @@ declare const en: {
12458
12805
  readonly createGroup: {
12459
12806
  readonly title: "Create Group";
12460
12807
  readonly prompt: "Please enter a name for the {type} group";
12808
+ readonly promptIn: "Please enter a name for the group in {parent}";
12461
12809
  readonly placeholder: "Enter group name\u2026";
12462
12810
  readonly empty: "Group name cannot be empty";
12463
12811
  };
@@ -12495,6 +12843,7 @@ declare const en: {
12495
12843
  readonly inputAction: "input action";
12496
12844
  readonly asset: "asset";
12497
12845
  readonly page: "Page";
12846
+ readonly entryPage: "Entry Page";
12498
12847
  readonly gameUi: "Game UI";
12499
12848
  readonly image: "Image";
12500
12849
  readonly audio: "Audio";
@@ -12543,6 +12892,7 @@ declare const en: {
12543
12892
  readonly supported: "Supported files";
12544
12893
  readonly images: "Images";
12545
12894
  readonly log: "Log";
12895
+ readonly zip: "Zip archive";
12546
12896
  readonly text: "Text";
12547
12897
  readonly json: "JSON";
12548
12898
  readonly patch: "Patch";
@@ -12615,12 +12965,20 @@ declare const en: {
12615
12965
  };
12616
12966
  readonly unavailable: {
12617
12967
  readonly windows: "Cannot build Windows apps on this machine.";
12618
- readonly macos: "macOS apps can only be built on a Mac.";
12968
+ readonly macos: "Cannot build macOS apps on this machine.";
12619
12969
  readonly linux: "Cannot build Linux apps on this machine.";
12620
12970
  readonly web: "Web builds are available on every machine.";
12621
12971
  readonly android: "Android builds are available on every machine.";
12622
12972
  readonly ios: "iOS builds are available on every machine.";
12623
12973
  };
12974
+ readonly formatUnavailable: {
12975
+ readonly windows: "Not available on this machine.";
12976
+ readonly macos: "Requires a Mac.";
12977
+ readonly linux: "Not available on Windows.";
12978
+ readonly web: "Not available on this machine.";
12979
+ readonly android: "Not available on this machine.";
12980
+ readonly ios: "Not available on this machine.";
12981
+ };
12624
12982
  readonly format: {
12625
12983
  readonly zip: "Portable ZIP";
12626
12984
  readonly nsis: "Installer";
@@ -12672,15 +13030,15 @@ declare const en: {
12672
13030
  readonly appId: "App ID";
12673
13031
  readonly copyright: "Copyright";
12674
13032
  readonly icons: "Icons";
12675
- readonly iconsHint: "Click an icon to change it in project settings";
13033
+ readonly iconsHint: "Click an icon to change it in Project \u25B8 App";
12676
13034
  readonly iconUnset: "Not set";
12677
13035
  readonly notSet: "Not set";
12678
13036
  readonly editInProject: "Edit in Project \u25B8 App";
12679
13037
  };
12680
13038
  readonly content: {
12681
13039
  readonly protection: "Asset protection";
12682
- readonly protectionOn: "Assets and saves are encrypted in the packaged game.";
12683
- readonly protectionOff: "Assets and saves ship unencrypted.";
13040
+ readonly protectionOn: "Assets are encrypted in the packaged game.";
13041
+ readonly protectionOff: "Assets ship unencrypted.";
12684
13042
  readonly plugins: "Bundled plugins";
12685
13043
  readonly pluginsNone: "No plugins are bundled with this game.";
12686
13044
  readonly pluginsRescanUnavailable: "The plugin list cannot be rescanned in this window.";
@@ -12728,6 +13086,7 @@ declare const en: {
12728
13086
  readonly artifactReadVersioned: "{product} {version}, built {date}";
12729
13087
  readonly artifactVariantStated: "Read from the build folder.";
12730
13088
  readonly artifactVariantUnknown: "This build does not state its variant. Select it below.";
13089
+ readonly artifactNoKey: "This build was made without a distribution key. The game ignores any patch exported for it.";
12731
13090
  readonly artifactVariantMismatch: "This build is {build}. The DLC attaches to {variant}.";
12732
13091
  readonly artifactWholeGame: "The patch includes the whole game.";
12733
13092
  readonly contentLabel: "Variant the content comes from";
@@ -12839,6 +13198,7 @@ declare const en: {
12839
13198
  readonly preflight: {
12840
13199
  readonly "no-targets": "Select at least one platform and format.";
12841
13200
  readonly "unbuildable-platform": "This machine cannot build for {platform}.";
13201
+ readonly "unbuildable-format": "This machine cannot build the {format} format for {platform}.";
12842
13202
  readonly "version-invalid": "Version {version} is not a valid semantic version; the build will fail.";
12843
13203
  readonly "version-missing": "No version set; the game builds as 0.0.0.";
12844
13204
  readonly "identifier-missing": "No project identifier; using the app id {appId}.";
@@ -12858,6 +13218,7 @@ declare const en: {
12858
13218
  readonly "sidecar-crossbuild-exec-bit": string;
12859
13219
  readonly "web-unprotected": "Asset protection does not apply to the web export; its files ship unprotected.";
12860
13220
  readonly "mobile-unprotected": "Asset protection does not apply to Android or iOS packages.";
13221
+ readonly "distribution-key-missing": "No distribution key. The game this build produces will not accept patches.";
12861
13222
  readonly "progress-carry-unsupported": string;
12862
13223
  readonly "lossy-images": "Images are re-encoded at quality {setting} and lose detail permanently.";
12863
13224
  readonly "lossy-audio": "Audio is re-encoded at {setting} kbit/s and loses detail permanently.";
@@ -13305,6 +13666,11 @@ declare const en: {
13305
13666
  readonly description: "Two rows creating one stage name; the second reuses the first";
13306
13667
  readonly message: "{object} is already created above, so this row acts on that one";
13307
13668
  };
13669
+ readonly storyVideoControlAfterEnd: {
13670
+ readonly title: "Video already finished";
13671
+ readonly description: "A row pausing, resuming, seeking or stopping a video after a play that waits for its end";
13672
+ readonly message: "{object} has already finished playing at this line; to continue while it plays, turn off \u201CWait for the video\u201D on its play row";
13673
+ };
13308
13674
  readonly storyCharacterMissing: {
13309
13675
  readonly title: "Missing character";
13310
13676
  readonly description: "A row naming a character the project does not have";
@@ -13413,6 +13779,16 @@ declare const en: {
13413
13779
  readonly description: "A widget bound to an item field the list drawing it does not declare";
13414
13780
  readonly message: "This is bound to an item field the list does not declare, so every row shows the same value";
13415
13781
  };
13782
+ readonly uiListTextUntranslated: {
13783
+ readonly title: "Untranslated list content";
13784
+ readonly description: "Words written into a list's content in a project that has a second language";
13785
+ readonly message: "{text} and the rest of this list's content show as written in every language";
13786
+ };
13787
+ readonly uiLocalizationKeyMissing: {
13788
+ readonly title: "Missing localization key";
13789
+ readonly description: "A widget reading its words from a key the project does not have";
13790
+ readonly message: "Reads its words from {key}, which the project does not have";
13791
+ };
13416
13792
  readonly uiGestureAnsweredTwice: {
13417
13793
  readonly title: "Gesture answered twice";
13418
13794
  readonly description: "A widget with a pointer handler of its own, on a page whose action answers the same gesture";
@@ -13481,13 +13857,15 @@ declare const en: {
13481
13857
  };
13482
13858
  readonly localizationMissing: {
13483
13859
  readonly title: "Missing translation";
13484
- readonly description: "A line with no translation in a target language";
13860
+ readonly description: "A line or interface text with no translation in a target language";
13485
13861
  readonly message: "No {locale} translation";
13862
+ readonly messageInterface: "No {locale} translation of {text}";
13486
13863
  };
13487
13864
  readonly localizationStale: {
13488
13865
  readonly title: "Stale translation";
13489
13866
  readonly description: "The source line changed after it was translated";
13490
13867
  readonly message: "{locale} translation is older than the line";
13868
+ readonly messageInterface: "{locale} translation of {text} is older than the text";
13491
13869
  };
13492
13870
  readonly localizationMarkup: {
13493
13871
  readonly title: "Translation drops styling";
@@ -13793,6 +14171,7 @@ declare const en: {
13793
14171
  };
13794
14172
  readonly uiDocument: {
13795
14173
  readonly renamed: "Interface renamed";
14174
+ readonly entryPage: "Entry page changed";
13796
14175
  readonly surfaceAdded: "Surface added ({elementCount})";
13797
14176
  readonly surfaceRemoved: "Surface removed ({elementCount})";
13798
14177
  readonly surfaceChanged: "Surface changed";
@@ -13855,6 +14234,10 @@ declare const en: {
13855
14234
  readonly content: "File contents replaced";
13856
14235
  readonly field: "{field} changed";
13857
14236
  readonly orphanContent: "File with no asset record";
14237
+ readonly fields: {
14238
+ readonly group: "Group";
14239
+ readonly missingGroup: "Missing group";
14240
+ };
13858
14241
  };
13859
14242
  readonly brand: {
13860
14243
  readonly added: "Color added";
@@ -13880,7 +14263,7 @@ declare const en: {
13880
14263
  readonly added: "Track added";
13881
14264
  readonly removed: "Track removed";
13882
14265
  readonly renamed: "Renamed";
13883
- readonly rerouted: "Routes into a different bus";
14266
+ readonly rerouted: "Routes into a different track";
13884
14267
  readonly reroutedToMaster: "Routes into the master output";
13885
14268
  readonly volume: "Volume changed";
13886
14269
  readonly loopOn: "Loops by default";
@@ -13895,7 +14278,7 @@ declare const en: {
13895
14278
  readonly defaultValue: "Default value changed";
13896
14279
  readonly valueType: "Type changed";
13897
14280
  readonly scopeSaved: "Now a saved variable";
13898
- readonly scopeGlobal: "Now a global variable";
14281
+ readonly scopeGlobal: "Now a persistent variable";
13899
14282
  readonly storageKey: "Values already saved are no longer found";
13900
14283
  readonly description: "Note changed";
13901
14284
  readonly changed: "Variable changed";
@@ -14493,7 +14876,7 @@ declare const en: {
14493
14876
  readonly body: string;
14494
14877
  };
14495
14878
  readonly keyboard: {
14496
- readonly title: "Keyboard";
14879
+ readonly title: "Keyboard and Mouse";
14497
14880
  readonly body: string;
14498
14881
  };
14499
14882
  readonly search: {
@@ -14536,6 +14919,10 @@ declare const en: {
14536
14919
  readonly title: "Editing outside Studio";
14537
14920
  readonly body: string;
14538
14921
  };
14922
+ readonly storyPaste: {
14923
+ readonly title: "Paste as Rows";
14924
+ readonly body: string;
14925
+ };
14539
14926
  readonly sceneSnapshot: {
14540
14927
  readonly title: "Playing from a row";
14541
14928
  readonly body: string;
@@ -14549,7 +14936,7 @@ declare const en: {
14549
14936
  readonly body: string;
14550
14937
  };
14551
14938
  readonly storyMotion: {
14552
- readonly title: "Motion";
14939
+ readonly title: "Story Motion";
14553
14940
  readonly body: string;
14554
14941
  };
14555
14942
  readonly assets: {
@@ -14904,6 +15291,8 @@ declare const en: {
14904
15291
  readonly storyStarted: "Load Save: \"{id}\" was written in another of the project's stories, which was started to receive it.";
14905
15292
  readonly relaunchedRow: "Load Save: \"{id}\" was written by another build. The story was started again on the line the save records.";
14906
15293
  readonly relaunchedScene: "Load Save: \"{id}\" was written by another build and the line it records is no longer present. The story was started again at the start of that scene.";
15294
+ readonly rowLaunchRelaunchedRow: "Load Save: \"{id}\" was written in a run started with Play from this row. The story was started again on the line the save records.";
15295
+ readonly rowLaunchRelaunchedScene: "Load Save: \"{id}\" was written in a run started with Play from this row, and the line it records is no longer present. The story was started again at the start of that scene.";
14907
15296
  readonly detail: {
14908
15297
  readonly unreadable: "The save could not be read. {error}";
14909
15298
  readonly missing: "No save is stored under that id.";
@@ -16357,6 +16746,11 @@ type LiveUIParts = {
16357
16746
  actions?: Readonly<Record<string, UIInputActionDef | null>>;
16358
16747
  /** The document's own name, when it changed. */
16359
16748
  name?: string;
16749
+ /**
16750
+ * Which page the game starts on, when that changed. `null` is the document naming none - which
16751
+ * is a value of its own (the main page is the entry), not "unchanged".
16752
+ */
16753
+ entrySurfaceId?: UISurfaceId | null;
16360
16754
  };
16361
16755
  type LiveUIElementRef = {
16362
16756
  componentId: UIComponentId | null;
@@ -16625,6 +17019,17 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16625
17019
  blueprintId: string;
16626
17020
  };
16627
17021
  clearElementBlueprintValueBinding(elementId: string, propPath: string): void;
17022
+ /**
17023
+ * Close the editor tabs showing a value blueprint that clearing its binding has just removed.
17024
+ *
17025
+ * The blueprint is the binding's own - minted for this element's prop and named for it - but the
17026
+ * author writes their logic into it, so its removal is one step on the page's undo history above,
17027
+ * blueprint included. A tab left open on it said only that the blueprint could not be found, and
17028
+ * while it stayed the active editor the inspector's Ctrl+Z went to its stack instead of the page's,
17029
+ * so the step that would bring the logic back was out of reach from where the author was. Closed,
17030
+ * the page the binding belongs to is the editor the inspector edits again.
17031
+ */
17032
+ private closeTabsShowingBlueprint;
16628
17033
  /**
16629
17034
  * How this element arrives and leaves. `null` clears it.
16630
17035
  *
@@ -16647,6 +17052,22 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16647
17052
  * reparents an inner one that may be in the same batch.
16648
17053
  */
16649
17054
  ungroupContainers(surfaceId: string, containerIds: string[]): string[];
17055
+ /**
17056
+ * Wrap elements in a new group - an invisible container that takes their place - and return the
17057
+ * group's id, or null when they cannot be wrapped (see `planGroupElements` for which can, and
17058
+ * for why nothing on screen moves).
17059
+ *
17060
+ * One mutation, so Undo puts the tree back as it was in one step.
17061
+ */
17062
+ groupElements(surfaceId: string, elementIds: readonly string[]): string | null;
17063
+ /**
17064
+ * Rename one layer.
17065
+ *
17066
+ * A linked component instance renames like any other layer: its name is copied from the
17067
+ * definition once, when the instance is placed, and is the instance's own from then on - it is
17068
+ * how the outline tells "save slot 1" from "save slot 2". Props and shape are what the definition
17069
+ * owns, and their own setters still refuse them on an instance.
17070
+ */
16650
17071
  renameElement(elementId: string, name: string): void;
16651
17072
  deleteElements(elementIds: string[]): void;
16652
17073
  /**
@@ -16747,6 +17168,10 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16747
17168
  private normalizeSpecialChildSlots;
16748
17169
  private createEmptyDocument;
16749
17170
  createSurface(input: CreateSurfaceInput): UISurface;
17171
+ /**
17172
+ * Remove a surface and its tree. The entry page is refused: a game has to start somewhere, and
17173
+ * the way to delete the page it starts on is to make another page the entry first.
17174
+ */
16750
17175
  deleteSurface(surfaceId: string): void;
16751
17176
  /**
16752
17177
  * Put the surfaces in the order given.
@@ -16769,6 +17194,21 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16769
17194
  * the entry.
16770
17195
  */
16771
17196
  reorderSurfaces(orderedSurfaceIds: readonly string[], movedSurfaceId?: string): void;
17197
+ /**
17198
+ * Make this page the one the game starts on.
17199
+ *
17200
+ * Only a page can be the entry - a Game UI has nothing to show before a story runs - and asking
17201
+ * for the page that already is changes nothing and records nothing. The pages keep their ids:
17202
+ * the document stores which one is the entry (`UIDocument.entrySurfaceId`), so every blueprint
17203
+ * and every `Go Page` that names either page still names the same page afterwards.
17204
+ *
17205
+ * On the project stack, for the reason {@link reorderSurfaces} gives: it is an edit to no one
17206
+ * surface, made from the panel. The entry restores to what the file stored rather than to the
17207
+ * page that was resolved, so taking this back leaves a document that never named an entry as
17208
+ * short as it was.
17209
+ */
17210
+ setEntrySurface(surfaceId: string): void;
17211
+ private applyEntrySurface;
16772
17212
  private applySurfaceOrder;
16773
17213
  renameSurface(surfaceId: string, name: string): void;
16774
17214
  /**
@@ -16864,6 +17304,16 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16864
17304
  reorderComponentChildren(componentId: string, parentId: string, orderedChildIds: string[]): void;
16865
17305
  deleteComponentElements(componentId: string, elementIds: string[]): void;
16866
17306
  moveComponentElements(componentId: string, elementIds: string[], targetParentId: string, beforeChildId: string | null): MoveUiElementsResult;
17307
+ /**
17308
+ * `ungroupContainers` for a component definition's elements, over a document made of the
17309
+ * component alone. Returns the ids that were lifted out.
17310
+ */
17311
+ ungroupComponentContainers(componentId: string, containerIds: readonly string[]): string[];
17312
+ /**
17313
+ * `groupElements` for a component definition's elements: the same plan, read and applied over a
17314
+ * document made of the component alone, as `moveComponentElements` does.
17315
+ */
17316
+ groupComponentElements(componentId: string, elementIds: readonly string[]): string | null;
16867
17317
  createComponentElement(componentId: string, parentId: string, type: string, layoutPatch?: Partial<UILayout>): UIElement | null;
16868
17318
  pasteComponentClipboardPayload(componentId: string, targetParentId: string, beforeChildId: string | null, payload: UIEditorClipboardPayload): {
16869
17319
  ok: true;
@@ -16921,7 +17371,25 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16921
17371
  private configureDefaultNotificationBlueprints;
16922
17372
  private configureDefaultChoiceBlueprints;
16923
17373
  private configureDefaultNvlBlueprints;
16924
- private ensureMainSurface;
17374
+ /**
17375
+ * A page for the game to start on, whatever the file said. True when the document had to change.
17376
+ *
17377
+ * Three repairs, each for a document that arrived broken - by a merge, a hand edit, or an older
17378
+ * tool - and none of which a document Studio wrote ever needs:
17379
+ *
17380
+ * - **no page at all**: one is made, under the main id when nothing holds it, so a project
17381
+ * always has somewhere to start;
17382
+ * - **an entry page whose root element is missing**: it gets an empty one, so it can be opened;
17383
+ * - **a stored entry that names no page**: the pointer is dropped, and the entry is the page the
17384
+ * document would name without it (`resolveEntrySurface` already reads it that way - this only
17385
+ * stops the file from saying something it does not mean).
17386
+ *
17387
+ * ⚠ **It never changes a page's id.** This used to give the first page the main id when no page
17388
+ * had it, which was harmless only while the main page could not be deleted. Now that the entry is
17389
+ * a pointer and the old main page can be deleted like any other, doing that would quietly re-file
17390
+ * every blueprint and every `Go Page` that named the page by the id it had.
17391
+ */
17392
+ private ensureEntrySurface;
16925
17393
  private getDocumentPath;
16926
17394
  private ensureDocumentDir;
16927
17395
  }
@@ -16958,18 +17426,29 @@ type WidgetLogicWritablePropDef = {
16958
17426
  export type WidgetLogicApi = {
16959
17427
  supportsPrivateBlueprint: boolean;
16960
17428
  blueprintLabel?: string;
17429
+ /**
17430
+ * The events a private blueprint on this widget can be started by. Every entry is load-bearing:
17431
+ * the node palette, graph validation, the dispatcher and `ui.js widget` all read this list, so an
17432
+ * event belongs here only once the runtime raises it and a head node for it is registered.
17433
+ */
16961
17434
  events: readonly WidgetLogicEventDef[];
17435
+ /**
17436
+ * `commands`, `readableState` and `writableProps` describe the widget to a reader - `ui.js
17437
+ * widget` prints them - and nothing executes them: no blueprint node looks a widget up in these
17438
+ * lists. What a graph can actually do to a widget is in the node catalogue.
17439
+ */
16962
17440
  commands: readonly WidgetLogicCommandDef[];
16963
17441
  readableState: readonly WidgetLogicReadableStateDef[];
16964
17442
  writableProps: readonly WidgetLogicWritablePropDef[];
16965
17443
  /**
16966
17444
  * Whether the player operates this widget directly - a Button, a Switch, a Slider, a Text Input,
16967
17445
  * a list they pick a row from. Scenery (Container, Text, Image, Video, Model, the page host)
16968
- * leaves it unset.
17446
+ * leaves it unset. A Video with its native controls showing is operable too, but that is a prop
17447
+ * on the instance, so `isOperableHitElement` in `surfaceInputActions.ts` answers it there.
16969
17448
  *
16970
- * Declared rather than derived, and the retreat is deliberate. A panel-wide gesture has to stand
16971
- * down over a control (`overControls: "skip"` in `inputAction.ts`), so something has to answer
16972
- * "is this a control", and the tempting derivation - "declares an interaction event beyond the
17449
+ * Declared rather than derived, and the retreat is deliberate. A panel-wide gesture stands down
17450
+ * over a control (`pointerInputClaimedByControl` in `surfaceInputActions.ts`), so something has
17451
+ * to answer "is this a control", and the tempting derivation - "declares an interaction event beyond the
16973
17452
  * shared displayable set" - is wrong at both ends: `nl.button` declares exactly the displayable
16974
17453
  * set, and `nl.frame` declares `pageEvent`. Nothing else in an entry separates a Button from a
16975
17454
  * Container, because what makes a Button a control is how the runtime draws and handles it, not
@@ -16992,6 +17471,12 @@ export interface ContextMenuItemDef {
16992
17471
  * than in the label keeps a disabled menu a menu instead of a paragraph.
16993
17472
  */
16994
17473
  tooltip?: string;
17474
+ /**
17475
+ * The chord that runs the same command, already formatted for this platform (callers resolve it
17476
+ * through `useShortcutLabels`, so a rebound key shows rebound). Printed at the right of the row:
17477
+ * a menu that names a command without its key is the reason the key stays undiscovered.
17478
+ */
17479
+ shortcut?: string;
16995
17480
  onClick?: () => void;
16996
17481
  submenu?: ContextMenuItemDef[];
16997
17482
  /**
@@ -17186,6 +17671,8 @@ interface IconButtonGroupOption {
17186
17671
  icon: React$1.ReactNode;
17187
17672
  label?: string;
17188
17673
  disabled?: boolean;
17674
+ /** Hover text when it should say more than the label - why an option is unavailable, say. */
17675
+ tip?: string;
17189
17676
  }
17190
17677
  type IconButtonSelection = string | string[] | null;
17191
17678
  type IconButtonSegGroupDensity = "default" | "compact";
@@ -17672,6 +18159,20 @@ type BlueprintNodeDeclaration = {
17672
18159
  };
17673
18160
  inspectorParams?: BlueprintInspectorParamDef[];
17674
18161
  role?: BlueprintNodeRole;
18162
+ /**
18163
+ * The node's own words in other languages, for a node the host did not define.
18164
+ *
18165
+ * Keyed by locale code, then by the English text exactly as this declaration writes it: the
18166
+ * title, the category, a pin label, an inspector label, an option label or an empty-option
18167
+ * label. That is how the host's own catalogue is keyed (see `blueprintNodeI18n`), because the
18168
+ * canvas, the palette and the issue list all hold a title or a label rather than the node that
18169
+ * declared it. A string the host already translates keeps the host's wording, so one English
18170
+ * word reads the same on every node; a string with no entry for the active locale is drawn in
18171
+ * English.
18172
+ *
18173
+ * Built-in nodes leave this unset: their words live in Studio's catalogue.
18174
+ */
18175
+ translations?: Readonly<Record<string, Readonly<Record<string, string>>>>;
17675
18176
  };
17676
18177
  interface ProjectProps {
17677
18178
  projectPath: string;
@@ -18234,6 +18735,12 @@ export type StoryPluginActionRegistration = {
18234
18735
  detail?: string;
18235
18736
  group?: string;
18236
18737
  createBlock: (input: StoryPluginActionCreateInput) => StoryBlock;
18738
+ /**
18739
+ * The text a committed row of this action reads as, from the params the row carries; `label`
18740
+ * when absent, or when it returns nothing. A row's params are otherwise invisible in the scene
18741
+ * editor, so an action whose params change what the row does says what they are here.
18742
+ */
18743
+ describe?: (params: Record<string, unknown>) => string | null | undefined;
18237
18744
  };
18238
18745
  declare const HELP_TOPIC_IDS: readonly [
18239
18746
  "gettingHelp",
@@ -18250,6 +18757,7 @@ declare const HELP_TOPIC_IDS: readonly [
18250
18757
  "storyExpressions",
18251
18758
  "storyFlow",
18252
18759
  "storyScript",
18760
+ "storyPaste",
18253
18761
  "sceneSnapshot",
18254
18762
  "storyMotion",
18255
18763
  "dictionary",
@@ -18687,6 +19195,31 @@ export interface StoryCompilePass {
18687
19195
  /** Called once per scene, before that scene's rows are compiled. */
18688
19196
  scene(ctx: SceneCompileContext): void;
18689
19197
  }
19198
+ /** What a plugin story action's `run` receives. */
19199
+ export type RuntimeStoryActionContext = {
19200
+ /** The params the row carries: whatever the studio entry's `createBlock` wrote. */
19201
+ params: Record<string, unknown>;
19202
+ /**
19203
+ * Aborted when the row is cancelled: the player rolls back past it, or loads a save, while it is
19204
+ * still running. Tear down whatever `run` put on screen and stop; nothing it does after this
19205
+ * reaches the story.
19206
+ */
19207
+ signal: AbortSignal;
19208
+ /** The very same object `setup(app)` received as `app.game`. */
19209
+ game: RuntimePluginGame;
19210
+ };
19211
+ /**
19212
+ * The game-side half of a plugin story action.
19213
+ *
19214
+ * `run` may be async, and the story waits for it: the next row starts once the promise settles. A
19215
+ * save taken while it runs replays the row on load, so `run` must be able to start again from
19216
+ * nothing. A throw is logged and the story carries on.
19217
+ */
19218
+ export type RuntimeStoryActionDef = {
19219
+ /** The same id the studio entry registered the action under, prefixed with the plugin id. */
19220
+ id: string;
19221
+ run(ctx: RuntimeStoryActionContext): void | Promise<void>;
19222
+ };
18690
19223
  /**
18691
19224
  * The detail on `nl.launch`: where this page sits on the launch's own timeline.
18692
19225
  *
@@ -19101,6 +19634,12 @@ export type RuntimePluginSaveMetadata = {
19101
19634
  * heavier capability.
19102
19635
  */
19103
19636
  export type RuntimePluginSaves = {
19637
+ /**
19638
+ * Every slot in the store, reserved ones included: the autosave ring, and any slot a plugin
19639
+ * keeps for itself (`contributes.reservedSaveIds`). This is direct store access, not the
19640
+ * player's view - `List Saves` is the one that leaves bookkeeping out - so a plugin can find its
19641
+ * own reserved slot here.
19642
+ */
19104
19643
  listIds(): Promise<string[]>;
19105
19644
  readMetadata(id: string): Promise<RuntimePluginSaveMetadata | null>;
19106
19645
  /** Present only with `saves.write`. Overwrites the slot. */
@@ -19275,7 +19814,7 @@ export type RuntimePluginStory = {
19275
19814
  /**
19276
19815
  * The game-side plugin surface.
19277
19816
  *
19278
- * Everything below the always-present five is **capability-gated**: a domain the
19817
+ * Everything below the always-present six is **capability-gated**: a domain the
19279
19818
  * manifest did not declare is *absent from this object*, not a method that
19280
19819
  * throws. That is the whole contract — the install prompt lists exactly the
19281
19820
  * domains present here, so what the user approved and what the plugin can do are
@@ -19290,6 +19829,18 @@ export type RuntimePluginGame = {
19290
19829
  register(def: RuntimeWidgetRendererDef): void;
19291
19830
  registerMany(defs: RuntimeWidgetRendererDef[]): void;
19292
19831
  };
19832
+ /**
19833
+ * What runs when the story reaches a row one of this plugin's story actions inserted. The id is
19834
+ * the one the studio entry registered the action under; the story waits on the row until `run`
19835
+ * settles. See {@link RuntimeStoryActionDef}.
19836
+ *
19837
+ * Always present, like `blueprintNodes`: a runner only ever runs on a row the author placed, and
19838
+ * only on this plugin's own rows, so it grants nothing an install prompt would have to name.
19839
+ */
19840
+ storyActions: {
19841
+ register(def: RuntimeStoryActionDef): void;
19842
+ registerMany(defs: RuntimeStoryActionDef[]): void;
19843
+ };
19293
19844
  /**
19294
19845
  * Read-only access to plugin storage published with the game, for the
19295
19846
  * namespaces declared in `contributes.runtimeData`. Synchronous: the
@@ -19618,10 +20169,15 @@ type DropEdge = "before" | "after";
19618
20169
  interface DropIndicatorProps {
19619
20170
  /** Which edge of the positioned parent the line sits on. */
19620
20171
  edge: DropEdge;
20172
+ /**
20173
+ * Which way the rows run. A list (the default) puts "before" on the top edge and draws the line
20174
+ * across; a grid that reads left to right puts it on the left edge and draws the line down.
20175
+ */
20176
+ axis?: "vertical" | "horizontal";
19621
20177
  /** Extra classes for the rare caller that has to nudge it; the line itself is not negotiable. */
19622
20178
  className?: string;
19623
20179
  }
19624
- declare function DropIndicator({ edge, className }: DropIndicatorProps): React$1.ReactElement;
20180
+ declare function DropIndicator({ edge, axis, className }: DropIndicatorProps): React$1.ReactElement;
19625
20181
  export interface AccordionProps {
19626
20182
  children: React$1.ReactNode;
19627
20183
  /** Default open item IDs */