narraleaf-studio 1.1.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,32 +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
- * A `play` carrying {@link assetId} is the one-row cutscene: it builds the clip, names it,
678
- * reveals it and runs it to the end. Without one, `play` runs a clip an earlier row put on
679
- * stage and leaves its visibility alone. No document needs migrating for this: a `play` row
680
- * could always hold an asset, and one that did now does what it says.
681
- *
682
- * Additive: the four transport operations and `timeMs` are new in A3, and no document
683
- * 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.
684
680
  */
685
681
  action: "video";
686
- operation: "create" | "show" | "hide" | "play" | "pause" | "resume" | "stop" | "seek";
682
+ operation: "hide" | "play" | "pause" | "resume" | "stop" | "seek";
687
683
  objectName: string;
688
- /** 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
+ */
689
688
  target?: StoryActionableTargetRef;
689
+ /** `play` — the clip it plays. Required: a play with no file plays nothing. */
690
690
  assetId?: string;
691
+ /** `play` — whether the clip plays without sound. */
691
692
  muted?: boolean;
692
693
  /** `seek` — where to jump to, in milliseconds. The engine's `seek` takes seconds; the compiler converts. */
693
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;
694
722
  } | {
695
723
  /**
696
724
  * The story's stage camera (`story.camera`) — a Displayable like any other in the engine, but
@@ -3842,6 +3870,11 @@ declare const en: {
3842
3870
  readonly removeKey: "Remove key";
3843
3871
  readonly removeKeyConfirm: "Remove {name}?";
3844
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.";
3845
3878
  readonly sourceColumn: "Source";
3846
3879
  readonly targetColumn: "Translation";
3847
3880
  readonly targetPlaceholder: "Translate\u2026";
@@ -4357,7 +4390,7 @@ declare const en: {
4357
4390
  readonly saveFailed: "Save failed";
4358
4391
  readonly retrySave: "Retry saving now";
4359
4392
  readonly resetZoom: "Reset zoom to 100%";
4360
- readonly shortcuts: "Keyboard shortcuts";
4393
+ readonly shortcuts: "Shortcuts and mouse actions";
4361
4394
  readonly words: {
4362
4395
  readonly one: "{count} word";
4363
4396
  readonly other: "{count} words";
@@ -4376,7 +4409,7 @@ declare const en: {
4376
4409
  readonly studioTasks: "Background work";
4377
4410
  readonly unsavedChanges: "Unsaved changes";
4378
4411
  readonly wordCount: "Story stats";
4379
- readonly shortcuts: "Keyboard shortcuts";
4412
+ readonly shortcuts: "Shortcuts and mouse actions";
4380
4413
  readonly notifications: "Notifications";
4381
4414
  readonly theme: "Theme switcher";
4382
4415
  readonly zoom: "Zoom level";
@@ -4731,7 +4764,7 @@ declare const en: {
4731
4764
  readonly conflict: "Also bound to {name}";
4732
4765
  readonly empty: "No matching shortcuts";
4733
4766
  readonly openSettings: "Customize Keyboard Shortcuts";
4734
- readonly cheatSheetTitle: "Keyboard Shortcuts";
4767
+ readonly cheatSheetTitle: "Shortcuts and Mouse Actions";
4735
4768
  readonly cheatSheetCustomize: "Customize\u2026";
4736
4769
  readonly categories: {
4737
4770
  readonly general: "General";
@@ -4750,7 +4783,7 @@ declare const en: {
4750
4783
  readonly catalog: {
4751
4784
  readonly commandPalette: "Show and Run Commands";
4752
4785
  readonly quickOpen: "Quick Open";
4753
- readonly cheatSheet: "Show Keyboard Shortcuts";
4786
+ readonly cheatSheet: "Show Shortcuts and Mouse Actions";
4754
4787
  readonly contextHelp: "Help for What Is Focused";
4755
4788
  readonly reopenClosedTab: "Reopen Closed Tab";
4756
4789
  readonly localizationFind: "Find in Translations";
@@ -4805,6 +4838,104 @@ declare const en: {
4805
4838
  readonly playheadEnd: "Move Playhead to End";
4806
4839
  };
4807
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
+ };
4808
4939
  };
4809
4940
  readonly search: {
4810
4941
  readonly placeholder: "Search project\u2026";
@@ -4908,7 +5039,7 @@ declare const en: {
4908
5039
  readonly other: "Its {count} scenes are deleted with it.";
4909
5040
  };
4910
5041
  readonly deleteSceneConfirm: "Delete scene \"{name}\"?";
4911
- 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.";
4912
5043
  };
4913
5044
  readonly readFailed: {
4914
5045
  readonly missing: "This story is no longer in this project.";
@@ -5003,9 +5134,9 @@ declare const en: {
5003
5134
  readonly undoSceneRestored: "That scene is in the story again.";
5004
5135
  readonly undoChapterGone: "That chapter is gone.";
5005
5136
  readonly undoChapterRestored: "That chapter is in the story again.";
5006
- readonly undoContainerGone: "The block that line was in is gone.";
5137
+ readonly undoContainerGone: "The row that line was inside is gone.";
5007
5138
  readonly undoAnchorGone: "Where that line moved from is gone.";
5008
- readonly undoContainerFilled: "That block has lines in it now.";
5139
+ readonly undoContainerFilled: "That row has other lines inside it now.";
5009
5140
  readonly undoSubtreeLost: "The lines that were inside it cannot be put back.";
5010
5141
  readonly undoChaptersChanged: "The chapters are not the ones that step recorded.";
5011
5142
  readonly undoCharacterGone: "That character is gone.";
@@ -5450,6 +5581,7 @@ declare const en: {
5450
5581
  readonly mirrorState: "On / Off";
5451
5582
  readonly waitFor: "Seconds or click";
5452
5583
  readonly waitForEnd: "Wait for the clip";
5584
+ readonly hideOnEnd: "Hide when finished";
5453
5585
  readonly fade: "Fade Seconds";
5454
5586
  readonly loop: "Loop";
5455
5587
  readonly returnable: "Return";
@@ -5894,7 +6026,7 @@ declare const en: {
5894
6026
  readonly image: "Image \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5895
6027
  readonly text: "Text \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5896
6028
  readonly layer: "Layer \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5897
- 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.";
5898
6030
  readonly ambience: "Ambience effect \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5899
6031
  readonly character: "Character \u201C{name}\u201D is not on stage; an earlier row has to bring it on stage.";
5900
6032
  readonly characterGone: "The character this row acts on is no longer in this project, so it is not on stage.";
@@ -6034,7 +6166,7 @@ declare const en: {
6034
6166
  };
6035
6167
  readonly show: {
6036
6168
  readonly label: "Show";
6037
- 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";
6038
6170
  };
6039
6171
  readonly hide: {
6040
6172
  readonly label: "Hide";
@@ -6072,10 +6204,6 @@ declare const en: {
6072
6204
  readonly label: "Text";
6073
6205
  readonly detail: "Declare text on stage; /show reveals it";
6074
6206
  };
6075
- readonly video: {
6076
- readonly label: "Video";
6077
- readonly detail: "Declare a video on stage; /show reveals it";
6078
- };
6079
6207
  readonly vfx: {
6080
6208
  readonly label: "Ambience";
6081
6209
  readonly detail: "Declare a looping full-screen overlay: petals, rain, dust, light";
@@ -6090,7 +6218,7 @@ declare const en: {
6090
6218
  };
6091
6219
  readonly play: {
6092
6220
  readonly label: "Play";
6093
- readonly detail: "Play a video on stage, or a video from the asset library";
6221
+ readonly detail: "Play a video from the asset library, or play a video again";
6094
6222
  };
6095
6223
  readonly front: {
6096
6224
  readonly label: "Bring to Front";
@@ -6233,10 +6361,10 @@ declare const en: {
6233
6361
  readonly condition: "Condition";
6234
6362
  readonly if: "If";
6235
6363
  readonly elseIf: "Else if";
6236
- readonly else: "Otherwise";
6364
+ readonly else: "Else";
6237
6365
  readonly repeat: "Repeat";
6238
6366
  readonly repeatUntil: "Repeat until";
6239
- readonly parallel: "Run at the same time";
6367
+ readonly parallel: "Parallel";
6240
6368
  readonly race: "Race, first to finish";
6241
6369
  readonly sequence: "In order";
6242
6370
  readonly nvl: "NVL";
@@ -6247,7 +6375,7 @@ declare const en: {
6247
6375
  readonly declare: {
6248
6376
  readonly scene: "Local";
6249
6377
  readonly saved: "Var";
6250
- readonly persistent: "Global";
6378
+ readonly persistent: "Persistent";
6251
6379
  };
6252
6380
  readonly narration: "Narration";
6253
6381
  readonly dialogue: "Dialogue";
@@ -6877,7 +7005,7 @@ declare const en: {
6877
7005
  readonly setZIndex: "Set z-index";
6878
7006
  };
6879
7007
  readonly videoOperation: {
6880
- readonly play: "Play (wait for end)";
7008
+ readonly play: "Play";
6881
7009
  readonly pause: "Pause";
6882
7010
  readonly resume: "Resume";
6883
7011
  readonly stop: "Stop";
@@ -6957,6 +7085,10 @@ declare const en: {
6957
7085
  readonly videoName: "Video name";
6958
7086
  readonly videoAsset: "Video asset";
6959
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.";
6960
7092
  };
6961
7093
  readonly nvl: {
6962
7094
  readonly hint: "Child rows run in NVL mode. The transform below animates the NVL layer as it enters.";
@@ -7022,8 +7154,8 @@ declare const en: {
7022
7154
  readonly conditionContainer: "Condition container. Add condition branches as children.";
7023
7155
  readonly control: "Control";
7024
7156
  readonly sequence: "Sequence";
7025
- readonly parallel: "Parallel all";
7026
- readonly race: "Race any";
7157
+ readonly parallel: "Parallel";
7158
+ readonly race: "Race";
7027
7159
  readonly repeat: "Repeat";
7028
7160
  readonly mode: {
7029
7161
  readonly do: "Do";
@@ -7187,6 +7319,7 @@ declare const en: {
7187
7319
  readonly list: "List view";
7188
7320
  readonly icons: "Icon view";
7189
7321
  readonly overview: "Overview";
7322
+ readonly details: "Details view";
7190
7323
  };
7191
7324
  readonly filter: {
7192
7325
  readonly label: "Filters";
@@ -7205,6 +7338,17 @@ declare const en: {
7205
7338
  readonly list: {
7206
7339
  readonly emptyFiltered: "No assets matched the current filters.";
7207
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
+ };
7208
7352
  readonly iconView: {
7209
7353
  readonly updating: "Updating\u2026";
7210
7354
  readonly assetCount: {
@@ -7354,13 +7498,13 @@ declare const en: {
7354
7498
  readonly locale: "Language";
7355
7499
  readonly release: "Variant";
7356
7500
  };
7357
- readonly deletedVariant: "Deleted variant";
7501
+ readonly deletedVariant: "Deleted value";
7358
7502
  readonly variantCount: {
7359
- readonly one: "{count} variant";
7360
- readonly other: "{count} variants";
7503
+ readonly one: "{count} value";
7504
+ readonly other: "{count} values";
7361
7505
  };
7362
- readonly variantsResolved: "{resolved} of {total} variants";
7363
- readonly unfinished: "No variants declared";
7506
+ readonly variantsResolved: "{resolved} of {total} values";
7507
+ readonly unfinished: "No values declared";
7364
7508
  readonly inUseTitle: "{name} is still in use";
7365
7509
  readonly inUseMessage: "The following places name it and will stop resolving:";
7366
7510
  readonly deleteConfirmMessage: "The files inside this set are deleted too.";
@@ -7375,7 +7519,7 @@ declare const en: {
7375
7519
  };
7376
7520
  readonly create: {
7377
7521
  readonly title: "New asset set";
7378
- readonly subTitle: "New set under this variant";
7522
+ readonly subTitle: "New set under this value";
7379
7523
  readonly no: {
7380
7524
  readonly locale: "This project declares one language.";
7381
7525
  readonly release: "This project has no variants.";
@@ -7388,8 +7532,8 @@ declare const en: {
7388
7532
  readonly filter: "Members carry";
7389
7533
  readonly residencyBlocked: "A set that varies by variant cannot sit under one that varies by language.";
7390
7534
  readonly fallback: "Falls back to";
7391
- readonly fallbackMissing: "This variant has no file, so nothing in this set resolves.";
7392
- readonly variants: "Variants";
7535
+ readonly fallbackMissing: "This value has no file, so nothing in this set resolves.";
7536
+ readonly variants: "Values";
7393
7537
  readonly variantInherited: "fallback";
7394
7538
  readonly variantMissing: "No file";
7395
7539
  readonly variantAmbiguous: "{count} files";
@@ -7679,7 +7823,7 @@ declare const en: {
7679
7823
  readonly tab: {
7680
7824
  readonly title: "Blueprint";
7681
7825
  readonly invalid: "Blueprint tab is invalid.";
7682
- readonly notFound: "Blueprint not found: {id}";
7826
+ readonly notFound: "Blueprint not found in this project";
7683
7827
  };
7684
7828
  readonly breakpoint: {
7685
7829
  readonly add: "Add breakpoint";
@@ -7713,6 +7857,14 @@ declare const en: {
7713
7857
  readonly other: "Deleted the unknown node and its {count} hidden connections. Undo to restore.";
7714
7858
  };
7715
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
+ };
7716
7868
  readonly crossProject: {
7717
7869
  readonly pasted: {
7718
7870
  readonly one: "{count} node pasted";
@@ -7975,6 +8127,7 @@ declare const en: {
7975
8127
  readonly keys: "Keys";
7976
8128
  readonly window: "Window";
7977
8129
  readonly display: "Display";
8130
+ readonly conditions: "Conditions";
7978
8131
  };
7979
8132
  };
7980
8133
  readonly owner: {
@@ -8894,6 +9047,7 @@ declare const en: {
8894
9047
  readonly getVisible: "Get Visible";
8895
9048
  readonly getWrapMode: "Get Wrap Mode";
8896
9049
  readonly goPage: "Go Page";
9050
+ readonly replacePage: "Replace Page";
8897
9051
  readonly goBack: "Go back";
8898
9052
  readonly showLayer: "Show Layer";
8899
9053
  readonly hideLayer: "Hide Layer";
@@ -9161,6 +9315,8 @@ declare const en: {
9161
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.";
9162
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.";
9163
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.";
9164
9320
  };
9165
9321
  readonly live: {
9166
9322
  readonly nodeClaimed: "{name} is editing this node";
@@ -9265,7 +9421,7 @@ declare const en: {
9265
9421
  readonly describeOk: "Filled from the model";
9266
9422
  readonly describeNoModel: "No model to read";
9267
9423
  readonly describeNoBackend: "No runtime chosen";
9268
- readonly describeBackendMissing: "Runtime not installed here";
9424
+ readonly describeBackendMissing: "Runtime not installed in this project";
9269
9425
  readonly describeDistrusted: "Project not trusted";
9270
9426
  readonly describeNotSupported: "This runtime lists nothing";
9271
9427
  readonly describeFailed: "The model could not be read";
@@ -9423,10 +9579,10 @@ declare const en: {
9423
9579
  readonly editorTitle: "Character Properties";
9424
9580
  readonly thumbnail: "Thumbnail";
9425
9581
  readonly preview: "Preview";
9426
- readonly defaultAvatar: "Dialog avatar";
9427
- readonly voiceTrack: "Voice bus";
9428
- readonly voiceTrackMissing: "Missing bus";
9429
- 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.";
9430
9586
  readonly entrance: "Entrance defaults";
9431
9587
  readonly entranceEmpty: "Entrance rows use the stage's own values until this is set.";
9432
9588
  readonly entranceDrag: "Drag to place";
@@ -10028,7 +10184,7 @@ declare const en: {
10028
10184
  readonly hint: "Defined in the project; the value lives in the save file.";
10029
10185
  };
10030
10186
  readonly persistent: {
10031
- readonly title: "Global variables";
10187
+ readonly title: "Persistent variables";
10032
10188
  readonly hint: "Defined in the project; app-level, shared with blueprints.";
10033
10189
  };
10034
10190
  };
@@ -10057,8 +10213,8 @@ declare const en: {
10057
10213
  readonly ownerLabel: {
10058
10214
  readonly globalMain: "App logic";
10059
10215
  readonly surfaceMain: "Page logic";
10060
- readonly widgetMain: "Component logic";
10061
- readonly widgetValue: "Component value";
10216
+ readonly widgetMain: "Widget logic";
10217
+ readonly widgetValue: "Widget value";
10062
10218
  readonly storyAction: "Story action";
10063
10219
  };
10064
10220
  readonly stageSlot: {
@@ -10097,6 +10253,10 @@ declare const en: {
10097
10253
  readonly pageValidationHint: "Check the page name and size before creating it.";
10098
10254
  readonly gameUiSlotHint: "Select an available Game UI slot before creating it.";
10099
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
+ };
10100
10260
  };
10101
10261
  readonly naming: {
10102
10262
  readonly page: "Page {index}";
@@ -10206,6 +10366,8 @@ declare const en: {
10206
10366
  readonly canvas: {
10207
10367
  readonly unknownWidget: "Unknown widget";
10208
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.";
10209
10371
  };
10210
10372
  readonly editor: {
10211
10373
  readonly componentNotFound: "Component not found";
@@ -10256,7 +10418,7 @@ declare const en: {
10256
10418
  readonly showSelected: "Show selected";
10257
10419
  readonly hideSelected: "Hide selected";
10258
10420
  readonly addToComponentLibrary: "Add to Component Library";
10259
- readonly addToGroup: "Add to group";
10421
+ readonly group: "Group";
10260
10422
  readonly ungroup: "Ungroup";
10261
10423
  readonly addState: "Add state";
10262
10424
  readonly arrange: {
@@ -10373,7 +10535,7 @@ declare const en: {
10373
10535
  readonly interaction: "Interaction";
10374
10536
  };
10375
10537
  readonly blueprint: {
10376
- readonly controlLabel: "Component logic";
10538
+ readonly controlLabel: "Widget logic";
10377
10539
  };
10378
10540
  readonly appearance: {
10379
10541
  readonly title: "Appearance";
@@ -10431,7 +10593,14 @@ declare const en: {
10431
10593
  readonly enableItalic: "Enable italic";
10432
10594
  readonly disableItalic: "Disable italic";
10433
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
+ };
10434
10602
  readonly localization: {
10603
+ readonly direct: "Direct";
10435
10604
  readonly translationKey: "Translation key";
10436
10605
  readonly noSourceLanguage: "The project has no source language";
10437
10606
  readonly none: "None";
@@ -10450,7 +10619,7 @@ declare const en: {
10450
10619
  readonly title: "List";
10451
10620
  readonly sectionContent: "Content";
10452
10621
  readonly runtimeItems: "Runtime items";
10453
- readonly runtimePreviewOnly: "Preview only";
10622
+ readonly runtimeListContent: "List content";
10454
10623
  readonly runtimePageState: "Page state array";
10455
10624
  readonly runtimeAppState: "App state array";
10456
10625
  readonly runtimePageProps: "Page props array";
@@ -10528,8 +10697,6 @@ declare const en: {
10528
10697
  readonly value: "Value";
10529
10698
  readonly valueHint: "Starting text. What the player types is held by the running game, not by this document.";
10530
10699
  readonly placeholder: "Placeholder";
10531
- readonly placeholderKey: "Placeholder key";
10532
- readonly placeholderKeyHint: "The placeholder is shown to the player: attach a key to translate it.";
10533
10700
  readonly sectionBehavior: "Behavior";
10534
10701
  readonly inputMode: "Input mode";
10535
10702
  readonly inputModeText: "Text";
@@ -10588,7 +10755,6 @@ declare const en: {
10588
10755
  readonly start: "Start";
10589
10756
  readonly center: "Center";
10590
10757
  readonly end: "End";
10591
- readonly stretch: "Stretch";
10592
10758
  readonly spaceBetween: "Space between";
10593
10759
  readonly spaceAround: "Space around";
10594
10760
  readonly gapHint: "Gap between children";
@@ -10737,6 +10903,9 @@ declare const en: {
10737
10903
  readonly container: {
10738
10904
  readonly name: "Container";
10739
10905
  };
10906
+ readonly group: {
10907
+ readonly name: "Group";
10908
+ };
10740
10909
  readonly dialog: {
10741
10910
  readonly name: "Sentence";
10742
10911
  readonly text: "The current line will appear here.";
@@ -11493,15 +11662,15 @@ declare const en: {
11493
11662
  };
11494
11663
  readonly bgmVolume: {
11495
11664
  readonly title: "Music volume";
11496
- readonly description: "The Music bus.";
11665
+ readonly description: "The Music track.";
11497
11666
  };
11498
11667
  readonly soundVolume: {
11499
11668
  readonly title: "SFX volume";
11500
- readonly description: "The SFX bus.";
11669
+ readonly description: "The SFX track.";
11501
11670
  };
11502
11671
  readonly voiceVolume: {
11503
11672
  readonly title: "Voice volume";
11504
- readonly description: "The Voice bus.";
11673
+ readonly description: "The Voice track.";
11505
11674
  };
11506
11675
  readonly voiceEndMode: {
11507
11676
  readonly title: "When a voiced line ends";
@@ -11544,18 +11713,18 @@ declare const en: {
11544
11713
  };
11545
11714
  readonly deleteConfirm: "Delete \"{name}\"?";
11546
11715
  readonly deleteDetail: {
11547
- readonly one: "{count} reference falls back to its default bus.";
11548
- 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.";
11549
11718
  };
11550
11719
  readonly deleteChildren: {
11551
11720
  readonly one: "{count} track under it moves to {parent}.";
11552
11721
  readonly other: "{count} tracks under it move to {parent}.";
11553
11722
  };
11554
11723
  readonly slider: {
11555
- readonly bgm: "BGM Volume";
11556
- readonly sound: "Sound Volume";
11557
- readonly voice: "Voice Volume";
11558
- readonly global: "Global Volume";
11724
+ readonly bgm: "Music volume";
11725
+ readonly sound: "SFX volume";
11726
+ readonly voice: "Voice volume";
11727
+ readonly global: "Master volume";
11559
11728
  };
11560
11729
  };
11561
11730
  readonly settings: {
@@ -11760,6 +11929,10 @@ declare const en: {
11760
11929
  readonly label: "Help";
11761
11930
  readonly description: "How the parts of Studio behave.";
11762
11931
  };
11932
+ readonly titlePage: {
11933
+ readonly label: "New Title Page";
11934
+ readonly description: "Start and Continue buttons included.";
11935
+ };
11763
11936
  };
11764
11937
  readonly reopenHint: {
11765
11938
  readonly menu: "Reopen this page from Help \u2192 Open Welcome.";
@@ -12287,6 +12460,7 @@ declare const en: {
12287
12460
  readonly page: "Page";
12288
12461
  readonly layer: "Layer";
12289
12462
  readonly faded: "Faded out";
12463
+ readonly dialogHidden: "Hidden";
12290
12464
  readonly hiddenForGame: "Hidden while the game runs";
12291
12465
  readonly returnsOnBack: "Shown again on Go back";
12292
12466
  readonly onScreenCount: "{onScreen} of {total} on screen";
@@ -12631,6 +12805,7 @@ declare const en: {
12631
12805
  readonly createGroup: {
12632
12806
  readonly title: "Create Group";
12633
12807
  readonly prompt: "Please enter a name for the {type} group";
12808
+ readonly promptIn: "Please enter a name for the group in {parent}";
12634
12809
  readonly placeholder: "Enter group name\u2026";
12635
12810
  readonly empty: "Group name cannot be empty";
12636
12811
  };
@@ -12790,12 +12965,20 @@ declare const en: {
12790
12965
  };
12791
12966
  readonly unavailable: {
12792
12967
  readonly windows: "Cannot build Windows apps on this machine.";
12793
- readonly macos: "macOS apps can only be built on a Mac.";
12968
+ readonly macos: "Cannot build macOS apps on this machine.";
12794
12969
  readonly linux: "Cannot build Linux apps on this machine.";
12795
12970
  readonly web: "Web builds are available on every machine.";
12796
12971
  readonly android: "Android builds are available on every machine.";
12797
12972
  readonly ios: "iOS builds are available on every machine.";
12798
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
+ };
12799
12982
  readonly format: {
12800
12983
  readonly zip: "Portable ZIP";
12801
12984
  readonly nsis: "Installer";
@@ -12847,15 +13030,15 @@ declare const en: {
12847
13030
  readonly appId: "App ID";
12848
13031
  readonly copyright: "Copyright";
12849
13032
  readonly icons: "Icons";
12850
- readonly iconsHint: "Click an icon to change it in project settings";
13033
+ readonly iconsHint: "Click an icon to change it in Project \u25B8 App";
12851
13034
  readonly iconUnset: "Not set";
12852
13035
  readonly notSet: "Not set";
12853
13036
  readonly editInProject: "Edit in Project \u25B8 App";
12854
13037
  };
12855
13038
  readonly content: {
12856
13039
  readonly protection: "Asset protection";
12857
- readonly protectionOn: "Assets and saves are encrypted in the packaged game.";
12858
- readonly protectionOff: "Assets and saves ship unencrypted.";
13040
+ readonly protectionOn: "Assets are encrypted in the packaged game.";
13041
+ readonly protectionOff: "Assets ship unencrypted.";
12859
13042
  readonly plugins: "Bundled plugins";
12860
13043
  readonly pluginsNone: "No plugins are bundled with this game.";
12861
13044
  readonly pluginsRescanUnavailable: "The plugin list cannot be rescanned in this window.";
@@ -12903,6 +13086,7 @@ declare const en: {
12903
13086
  readonly artifactReadVersioned: "{product} {version}, built {date}";
12904
13087
  readonly artifactVariantStated: "Read from the build folder.";
12905
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.";
12906
13090
  readonly artifactVariantMismatch: "This build is {build}. The DLC attaches to {variant}.";
12907
13091
  readonly artifactWholeGame: "The patch includes the whole game.";
12908
13092
  readonly contentLabel: "Variant the content comes from";
@@ -13014,6 +13198,7 @@ declare const en: {
13014
13198
  readonly preflight: {
13015
13199
  readonly "no-targets": "Select at least one platform and format.";
13016
13200
  readonly "unbuildable-platform": "This machine cannot build for {platform}.";
13201
+ readonly "unbuildable-format": "This machine cannot build the {format} format for {platform}.";
13017
13202
  readonly "version-invalid": "Version {version} is not a valid semantic version; the build will fail.";
13018
13203
  readonly "version-missing": "No version set; the game builds as 0.0.0.";
13019
13204
  readonly "identifier-missing": "No project identifier; using the app id {appId}.";
@@ -13033,6 +13218,7 @@ declare const en: {
13033
13218
  readonly "sidecar-crossbuild-exec-bit": string;
13034
13219
  readonly "web-unprotected": "Asset protection does not apply to the web export; its files ship unprotected.";
13035
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.";
13036
13222
  readonly "progress-carry-unsupported": string;
13037
13223
  readonly "lossy-images": "Images are re-encoded at quality {setting} and lose detail permanently.";
13038
13224
  readonly "lossy-audio": "Audio is re-encoded at {setting} kbit/s and loses detail permanently.";
@@ -13480,6 +13666,11 @@ declare const en: {
13480
13666
  readonly description: "Two rows creating one stage name; the second reuses the first";
13481
13667
  readonly message: "{object} is already created above, so this row acts on that one";
13482
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
+ };
13483
13674
  readonly storyCharacterMissing: {
13484
13675
  readonly title: "Missing character";
13485
13676
  readonly description: "A row naming a character the project does not have";
@@ -13588,6 +13779,16 @@ declare const en: {
13588
13779
  readonly description: "A widget bound to an item field the list drawing it does not declare";
13589
13780
  readonly message: "This is bound to an item field the list does not declare, so every row shows the same value";
13590
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
+ };
13591
13792
  readonly uiGestureAnsweredTwice: {
13592
13793
  readonly title: "Gesture answered twice";
13593
13794
  readonly description: "A widget with a pointer handler of its own, on a page whose action answers the same gesture";
@@ -14062,7 +14263,7 @@ declare const en: {
14062
14263
  readonly added: "Track added";
14063
14264
  readonly removed: "Track removed";
14064
14265
  readonly renamed: "Renamed";
14065
- readonly rerouted: "Routes into a different bus";
14266
+ readonly rerouted: "Routes into a different track";
14066
14267
  readonly reroutedToMaster: "Routes into the master output";
14067
14268
  readonly volume: "Volume changed";
14068
14269
  readonly loopOn: "Loops by default";
@@ -14077,7 +14278,7 @@ declare const en: {
14077
14278
  readonly defaultValue: "Default value changed";
14078
14279
  readonly valueType: "Type changed";
14079
14280
  readonly scopeSaved: "Now a saved variable";
14080
- readonly scopeGlobal: "Now a global variable";
14281
+ readonly scopeGlobal: "Now a persistent variable";
14081
14282
  readonly storageKey: "Values already saved are no longer found";
14082
14283
  readonly description: "Note changed";
14083
14284
  readonly changed: "Variable changed";
@@ -14675,7 +14876,7 @@ declare const en: {
14675
14876
  readonly body: string;
14676
14877
  };
14677
14878
  readonly keyboard: {
14678
- readonly title: "Keyboard";
14879
+ readonly title: "Keyboard and Mouse";
14679
14880
  readonly body: string;
14680
14881
  };
14681
14882
  readonly search: {
@@ -14718,6 +14919,10 @@ declare const en: {
14718
14919
  readonly title: "Editing outside Studio";
14719
14920
  readonly body: string;
14720
14921
  };
14922
+ readonly storyPaste: {
14923
+ readonly title: "Paste as Rows";
14924
+ readonly body: string;
14925
+ };
14721
14926
  readonly sceneSnapshot: {
14722
14927
  readonly title: "Playing from a row";
14723
14928
  readonly body: string;
@@ -14731,7 +14936,7 @@ declare const en: {
14731
14936
  readonly body: string;
14732
14937
  };
14733
14938
  readonly storyMotion: {
14734
- readonly title: "Motion";
14939
+ readonly title: "Story Motion";
14735
14940
  readonly body: string;
14736
14941
  };
14737
14942
  readonly assets: {
@@ -15086,6 +15291,8 @@ declare const en: {
15086
15291
  readonly storyStarted: "Load Save: \"{id}\" was written in another of the project's stories, which was started to receive it.";
15087
15292
  readonly relaunchedRow: "Load Save: \"{id}\" was written by another build. The story was started again on the line the save records.";
15088
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.";
15089
15296
  readonly detail: {
15090
15297
  readonly unreadable: "The save could not be read. {error}";
15091
15298
  readonly missing: "No save is stored under that id.";
@@ -16812,6 +17019,17 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16812
17019
  blueprintId: string;
16813
17020
  };
16814
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;
16815
17033
  /**
16816
17034
  * How this element arrives and leaves. `null` clears it.
16817
17035
  *
@@ -16834,6 +17052,22 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16834
17052
  * reparents an inner one that may be in the same batch.
16835
17053
  */
16836
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
+ */
16837
17071
  renameElement(elementId: string, name: string): void;
16838
17072
  deleteElements(elementIds: string[]): void;
16839
17073
  /**
@@ -17070,6 +17304,16 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17070
17304
  reorderComponentChildren(componentId: string, parentId: string, orderedChildIds: string[]): void;
17071
17305
  deleteComponentElements(componentId: string, elementIds: string[]): void;
17072
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;
17073
17317
  createComponentElement(componentId: string, parentId: string, type: string, layoutPatch?: Partial<UILayout>): UIElement | null;
17074
17318
  pasteComponentClipboardPayload(componentId: string, targetParentId: string, beforeChildId: string | null, payload: UIEditorClipboardPayload): {
17075
17319
  ok: true;
@@ -17182,18 +17426,29 @@ type WidgetLogicWritablePropDef = {
17182
17426
  export type WidgetLogicApi = {
17183
17427
  supportsPrivateBlueprint: boolean;
17184
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
+ */
17185
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
+ */
17186
17440
  commands: readonly WidgetLogicCommandDef[];
17187
17441
  readableState: readonly WidgetLogicReadableStateDef[];
17188
17442
  writableProps: readonly WidgetLogicWritablePropDef[];
17189
17443
  /**
17190
17444
  * Whether the player operates this widget directly - a Button, a Switch, a Slider, a Text Input,
17191
17445
  * a list they pick a row from. Scenery (Container, Text, Image, Video, Model, the page host)
17192
- * 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.
17193
17448
  *
17194
- * Declared rather than derived, and the retreat is deliberate. A panel-wide gesture has to stand
17195
- * down over a control (`overControls: "skip"` in `inputAction.ts`), so something has to answer
17196
- * "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
17197
17452
  * shared displayable set" - is wrong at both ends: `nl.button` declares exactly the displayable
17198
17453
  * set, and `nl.frame` declares `pageEvent`. Nothing else in an entry separates a Button from a
17199
17454
  * Container, because what makes a Button a control is how the runtime draws and handles it, not
@@ -17216,6 +17471,12 @@ export interface ContextMenuItemDef {
17216
17471
  * than in the label keeps a disabled menu a menu instead of a paragraph.
17217
17472
  */
17218
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;
17219
17480
  onClick?: () => void;
17220
17481
  submenu?: ContextMenuItemDef[];
17221
17482
  /**
@@ -18474,6 +18735,12 @@ export type StoryPluginActionRegistration = {
18474
18735
  detail?: string;
18475
18736
  group?: string;
18476
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;
18477
18744
  };
18478
18745
  declare const HELP_TOPIC_IDS: readonly [
18479
18746
  "gettingHelp",
@@ -18490,6 +18757,7 @@ declare const HELP_TOPIC_IDS: readonly [
18490
18757
  "storyExpressions",
18491
18758
  "storyFlow",
18492
18759
  "storyScript",
18760
+ "storyPaste",
18493
18761
  "sceneSnapshot",
18494
18762
  "storyMotion",
18495
18763
  "dictionary",
@@ -18927,6 +19195,31 @@ export interface StoryCompilePass {
18927
19195
  /** Called once per scene, before that scene's rows are compiled. */
18928
19196
  scene(ctx: SceneCompileContext): void;
18929
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
+ };
18930
19223
  /**
18931
19224
  * The detail on `nl.launch`: where this page sits on the launch's own timeline.
18932
19225
  *
@@ -19521,7 +19814,7 @@ export type RuntimePluginStory = {
19521
19814
  /**
19522
19815
  * The game-side plugin surface.
19523
19816
  *
19524
- * 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
19525
19818
  * manifest did not declare is *absent from this object*, not a method that
19526
19819
  * throws. That is the whole contract — the install prompt lists exactly the
19527
19820
  * domains present here, so what the user approved and what the plugin can do are
@@ -19536,6 +19829,18 @@ export type RuntimePluginGame = {
19536
19829
  register(def: RuntimeWidgetRendererDef): void;
19537
19830
  registerMany(defs: RuntimeWidgetRendererDef[]): void;
19538
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
+ };
19539
19844
  /**
19540
19845
  * Read-only access to plugin storage published with the game, for the
19541
19846
  * namespaces declared in `contributes.runtimeData`. Synchronous: the
package/dist/runtime.d.ts CHANGED
@@ -56,6 +56,8 @@ export {
56
56
  RuntimePluginTimelineName,
57
57
  RuntimePluginTimelineSpanDetails,
58
58
  RuntimePluginTimelineSpanName,
59
+ RuntimeStoryActionContext,
60
+ RuntimeStoryActionDef,
59
61
  RuntimeWidgetRendererDef,
60
62
  RuntimeWidgetRendererProps,
61
63
  SceneCompileContext,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "narraleaf-studio",
3
- "version": "1.1.0",
3
+ "version": "1.2.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",