narraleaf-studio 1.1.0 → 1.3.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
@@ -1679,6 +1707,17 @@ type BlueprintDiagnostic = {
1679
1707
  /** Source span or module location; M1 opaque */
1680
1708
  location?: Record<string, unknown>;
1681
1709
  };
1710
+ type LocaleCode = string;
1711
+ type LocalizationUnitStatus = "untranslated" | "machine" | "translated" | "reviewed";
1712
+ type LocalizationUnit = {
1713
+ /** Translated text; `{n}` placeholders map to the source segment's inline interpolations. */
1714
+ target: string;
1715
+ /** Hash of the source text at translation time (see shared/utils/localizationText). */
1716
+ sourceHash: string;
1717
+ status: LocalizationUnitStatus;
1718
+ /** Optional translator note. */
1719
+ note?: string;
1720
+ };
1682
1721
  type BlueprintAssetPinKind = "image" | "audio" | "font";
1683
1722
  type BlueprintAssetPinRef = {
1684
1723
  kind: BlueprintAssetPinKind;
@@ -2085,7 +2124,7 @@ type PluginBuildConfigFieldContribution = {
2085
2124
  /** A build that would ship without a value for this field is refused. */
2086
2125
  required?: boolean;
2087
2126
  };
2088
- type PluginContributes = {
2127
+ export type PluginContributes = {
2089
2128
  /** Blueprint node types this plugin provides (editor def + runtime execute). */
2090
2129
  blueprintNodes?: string[];
2091
2130
  /** Widget element types this plugin provides (editor module + runtime renderer). */
@@ -2191,6 +2230,40 @@ type PluginContributes = {
2191
2230
  * install - and the list shows them attributed to this plugin rather than quietly making room.
2192
2231
  */
2193
2232
  network?: string[];
2233
+ /**
2234
+ * The props of a contributed widget that hold words a player reads, by widget type.
2235
+ *
2236
+ * Each type named here must also be in {@link widgets}. A declared prop is treated as Studio's own
2237
+ * text and button labels are: the properties panel offers its words written directly or read
2238
+ * from a translation key, the canvas draws a key's words, the words go into the project's
2239
+ * translation table and exports, the project checks report a missing translation or key, and
2240
+ * the glyph check reads them. In the game the widget's renderer is handed the words already in
2241
+ * the player's language, in the prop it declared - it never resolves a key itself.
2242
+ *
2243
+ * Declared in the manifest rather than at registration because both entries need it - the
2244
+ * studio entry's widget is edited by it and the runtime entry's is drawn by it - and a
2245
+ * declaration only one of them made would be the half that drifts.
2246
+ */
2247
+ widgetText?: Record<string, PluginWidgetTextContribution[]>;
2248
+ };
2249
+ /**
2250
+ * One prop of a contributed widget whose value is words a player reads.
2251
+ *
2252
+ * `keyProp` is the prop the widget's translation key is kept in when the author reads the words from
2253
+ * one. It defaults to `<prop>LocalizationKey`, and it is the host's to write: the widget never reads it
2254
+ * to draw, because the words in `prop` already come from the key when there is one.
2255
+ */
2256
+ export type PluginWidgetTextContribution = {
2257
+ /** The prop holding the words. */
2258
+ prop: string;
2259
+ /** The prop the translation key is kept in; `<prop>LocalizationKey` when not declared. */
2260
+ keyProp?: string;
2261
+ /** What the properties panel calls the words. The prop name when not declared. */
2262
+ label?: string;
2263
+ /** `label` per editor locale, matched exactly as `localized` names are. */
2264
+ localized?: Record<string, string>;
2265
+ /** Whether the words may run over several lines; one line when not declared. */
2266
+ multiline?: boolean;
2194
2267
  };
2195
2268
  /**
2196
2269
  * The plugin's name and description in one editor language. Either may be left out, and the plain
@@ -2308,6 +2381,7 @@ export type RuntimePluginDescriptor = {
2308
2381
  type GameMenuLabel = {
2309
2382
  readonly key?: string | null;
2310
2383
  readonly text: string;
2384
+ readonly words?: string | null;
2311
2385
  };
2312
2386
  declare const GAME_MENU_DYNAMIC_SOURCES: readonly [
2313
2387
  "textLanguage",
@@ -2710,10 +2784,15 @@ type UIComponentParam = {
2710
2784
  id: string;
2711
2785
  /** What the author called it, shown in the instance's inspector. */
2712
2786
  name: string;
2713
- type: "string";
2714
- /** Used by an instance that has not overridden it, and by the definition's own preview. */
2787
+ type: UIComponentParamType;
2788
+ /**
2789
+ * Used by an instance that has not overridden it, and by the definition's own preview. For a
2790
+ * `text` parameter these are words written directly, translated through the definition's own unit
2791
+ * (`uiComponentParamUnitId(componentId, paramId)`).
2792
+ */
2715
2793
  defaultValue: string;
2716
2794
  };
2795
+ type UIComponentParamType = "string" | "text";
2717
2796
  type UIElement = {
2718
2797
  id: UIElementId;
2719
2798
  type: string;
@@ -2773,6 +2852,20 @@ type UIElementValueBinding = {
2773
2852
  | {
2774
2853
  kind: "listItemField";
2775
2854
  fieldId: string;
2855
+ }
2856
+ /**
2857
+ * Show the value one placement gives a text parameter of the component this element is part of.
2858
+ *
2859
+ * The component's counterpart of `listItemField`, and the same kind of read: no graph, nothing
2860
+ * kept alive - the value is taken from the placement being drawn (`resolveUIComponentTextParams`),
2861
+ * so the editing canvas draws each placement with its own words, and the game translates each
2862
+ * through the placement's own unit or reads the key it names. Only a text parameter answers one,
2863
+ * and only a widget's words take one; outside a placement (the component's own editor) the
2864
+ * element's own words are drawn, as sample text.
2865
+ */
2866
+ | {
2867
+ kind: "componentParam";
2868
+ paramId: string;
2776
2869
  };
2777
2870
  type UILayout = {
2778
2871
  x: number;
@@ -3821,7 +3914,7 @@ declare const en: {
3821
3914
  readonly table: {
3822
3915
  readonly storyLabel: "Source";
3823
3916
  readonly sourceUi: "Interface text";
3824
- readonly sourceKeys: "Named keys";
3917
+ readonly sourceKeys: "Translation keys";
3825
3918
  readonly modeTranslate: "Translate";
3826
3919
  readonly modeReview: "Review";
3827
3920
  readonly filterAll: "All";
@@ -3842,6 +3935,12 @@ declare const en: {
3842
3935
  readonly removeKey: "Remove key";
3843
3936
  readonly removeKeyConfirm: "Remove {name}?";
3844
3937
  readonly removeKeyConfirmDetail: "Existing translations of this key stay in the language files.";
3938
+ readonly removeKeyWidgets: "These widgets keep the key's words and translations as their own:";
3939
+ readonly removeKeyBlueprints: "Blueprints that use the key:";
3940
+ readonly removeKeyUsedByElement: "{owner} \u25B8 {element}";
3941
+ readonly removeKeyUsedByBlueprint: "Blueprint \u201C{name}\u201D";
3942
+ readonly removeKeyUsedByMore: "and {count} more";
3943
+ readonly removeKeyUsedByAfter: "Once the key is removed, the project check reports each of these blueprints.";
3845
3944
  readonly sourceColumn: "Source";
3846
3945
  readonly targetColumn: "Translation";
3847
3946
  readonly targetPlaceholder: "Translate\u2026";
@@ -3963,6 +4062,18 @@ declare const en: {
3963
4062
  readonly findPlaceholder: "Find in lines";
3964
4063
  };
3965
4064
  };
4065
+ readonly textSourceMigration: {
4066
+ readonly message: {
4067
+ readonly one: "Interface text was upgraded. The words of {count} widget now come from a different source.";
4068
+ readonly other: "Interface text was upgraded. The words of {count} widgets now come from a different source.";
4069
+ };
4070
+ readonly place: "{n}. {owner} \u25B8 {element}: {change}";
4071
+ readonly marksKept: "now Direct, keeping its marks, and no longer uses the key {key}";
4072
+ readonly bindingDropped: "a binding that never showed was removed, and the key {key} shows";
4073
+ readonly missingKey: "the key {key} does not exist, so it is now Direct, with the same words and translations";
4074
+ readonly keyDiffered: "now Direct, keeping the words it showed, and no longer uses the key {key}";
4075
+ readonly locate: "Locate {n}";
4076
+ };
3966
4077
  readonly recovery: {
3967
4078
  readonly enter: "Open in recovery mode";
3968
4079
  readonly enterFailed: "Could not open recovery mode: {error}";
@@ -4172,7 +4283,7 @@ declare const en: {
4172
4283
  readonly liveCheckpointNone: "There was nothing uncommitted to record.";
4173
4284
  readonly livePendingOne: "1 change is waiting for the host.";
4174
4285
  readonly livePendingMany: "{count} changes are waiting for the host.";
4175
- readonly liveFrozenWhat: "The stories, the cast, the translations, the whole asset library - files included - and the project's own tables (the dictionary, the audio tracks, the asset sets, the variables, the named strings, the build variants, the DLC and the palette) are saved. Everything else here is current and read-only until the session ends.";
4286
+ readonly liveFrozenWhat: "The stories, the cast, the translations, the whole asset library - files included - and the project's own tables (the dictionary, the audio tracks, the asset sets, the variables, the translation keys, the build variants, the DLC and the palette) are saved. Everything else here is current and read-only until the session ends.";
4176
4287
  readonly liveUnavailableHere: "Unavailable in a live session.";
4177
4288
  readonly liveClaimsLabel: "Lines being written";
4178
4289
  readonly liveClaimOne: "{name} is writing 1 line.";
@@ -4357,7 +4468,7 @@ declare const en: {
4357
4468
  readonly saveFailed: "Save failed";
4358
4469
  readonly retrySave: "Retry saving now";
4359
4470
  readonly resetZoom: "Reset zoom to 100%";
4360
- readonly shortcuts: "Keyboard shortcuts";
4471
+ readonly shortcuts: "Shortcuts and mouse actions";
4361
4472
  readonly words: {
4362
4473
  readonly one: "{count} word";
4363
4474
  readonly other: "{count} words";
@@ -4374,9 +4485,10 @@ declare const en: {
4374
4485
  readonly runStatus: "Run status";
4375
4486
  readonly projectTrust: "Project trust";
4376
4487
  readonly studioTasks: "Background work";
4488
+ readonly problems: "Problems";
4377
4489
  readonly unsavedChanges: "Unsaved changes";
4378
4490
  readonly wordCount: "Story stats";
4379
- readonly shortcuts: "Keyboard shortcuts";
4491
+ readonly shortcuts: "Shortcuts and mouse actions";
4380
4492
  readonly notifications: "Notifications";
4381
4493
  readonly theme: "Theme switcher";
4382
4494
  readonly zoom: "Zoom level";
@@ -4731,7 +4843,7 @@ declare const en: {
4731
4843
  readonly conflict: "Also bound to {name}";
4732
4844
  readonly empty: "No matching shortcuts";
4733
4845
  readonly openSettings: "Customize Keyboard Shortcuts";
4734
- readonly cheatSheetTitle: "Keyboard Shortcuts";
4846
+ readonly cheatSheetTitle: "Shortcuts and Mouse Actions";
4735
4847
  readonly cheatSheetCustomize: "Customize\u2026";
4736
4848
  readonly categories: {
4737
4849
  readonly general: "General";
@@ -4750,7 +4862,7 @@ declare const en: {
4750
4862
  readonly catalog: {
4751
4863
  readonly commandPalette: "Show and Run Commands";
4752
4864
  readonly quickOpen: "Quick Open";
4753
- readonly cheatSheet: "Show Keyboard Shortcuts";
4865
+ readonly cheatSheet: "Show Shortcuts and Mouse Actions";
4754
4866
  readonly contextHelp: "Help for What Is Focused";
4755
4867
  readonly reopenClosedTab: "Reopen Closed Tab";
4756
4868
  readonly localizationFind: "Find in Translations";
@@ -4805,12 +4917,110 @@ declare const en: {
4805
4917
  readonly playheadEnd: "Move Playhead to End";
4806
4918
  };
4807
4919
  };
4920
+ readonly gestures: {
4921
+ readonly withModifiers: "{keys}+{gesture}";
4922
+ readonly middleClickTab: "Middle-click a tab";
4923
+ readonly doubleClickTab: "Double-click a tab";
4924
+ readonly clickTab: "Click a tab";
4925
+ readonly doubleClickDivider: "Double-click the divider";
4926
+ readonly doubleClickRow: "Double-click a row";
4927
+ readonly clickRow: "Click a row";
4928
+ readonly dragAcrossRows: "Drag across rows";
4929
+ readonly dragRowHandle: "Drag a row's handle";
4930
+ readonly clickName: "Click a name";
4931
+ readonly dragHandle: "Drag a handle";
4932
+ readonly arrowKeys: "Arrow keys";
4933
+ readonly middleDrag: "Middle-drag";
4934
+ readonly scroll: "Scroll";
4935
+ readonly drag: "Drag";
4936
+ readonly clickElement: "Click an element";
4937
+ readonly doubleClickContainer: "Double-click a container";
4938
+ readonly doubleClickText: "Double-click text or a button";
4939
+ readonly doubleClickImage: "Double-click an image";
4940
+ readonly dragImageAsset: "Drag an image asset onto the canvas";
4941
+ readonly doubleClickOutlineItem: "Double-click an outline item";
4942
+ readonly dragOutlineItem: "Drag an outline item";
4943
+ readonly clickNode: "Click a node";
4944
+ readonly rightClickCanvas: "Right-click the canvas";
4945
+ readonly dragPinToCanvas: "Drag from a pin onto empty canvas";
4946
+ readonly doubleClickWire: "Double-click a wire";
4947
+ readonly doubleClickGroupTitle: "Double-click a group's title";
4948
+ readonly middleClickTitle: "Middle-click the title row";
4949
+ readonly doubleClickTrack: "Double-click a track";
4950
+ readonly clickAsset: "Click an asset";
4951
+ readonly doubleClick: "Double-click";
4952
+ readonly dragToEditorArea: "Drag into the editor area";
4953
+ readonly dragOntoGroup: "Drag onto a group";
4954
+ readonly dragWaveform: "Drag on the waveform";
4955
+ readonly doubleClickWaveform: "Double-click the waveform";
4956
+ readonly doubleClickMarker: "Double-click a marker";
4957
+ readonly doubleClickPicture: "Double-click the picture";
4958
+ readonly doubleClickTimeline: "Double-click the timeline";
4959
+ };
4960
+ readonly fixed: {
4961
+ readonly toggleSelection: "Add to or Remove from Selection";
4962
+ readonly addToSelection: "Add to Selection";
4963
+ readonly panCanvas: "Pan the Canvas";
4964
+ readonly zoomAtPointer: "Zoom at the Pointer";
4965
+ readonly easingSnap: "Snap an Easing Handle to the Grid";
4966
+ readonly easingNudge: "Nudge a Focused Easing Handle";
4967
+ readonly general: {
4968
+ readonly keepTabOpen: "Keep a Preview Tab Open";
4969
+ readonly selectTabs: "Select Several Tabs";
4970
+ readonly resetSplit: "Split the Editor Area Evenly";
4971
+ };
4972
+ readonly story: {
4973
+ readonly selectRowRange: "Select a Range of Rows";
4974
+ readonly moveRows: "Move Rows";
4975
+ readonly followReference: "Go to What a Name Refers To";
4976
+ readonly continueRow: "Commit and Continue With the Same Kind of Row";
4977
+ readonly blankRow: "Commit and Start a Blank Row";
4978
+ readonly finishEditing: "Finish Editing a Row";
4979
+ readonly pastePlain: "Paste Without Paste as Rows";
4980
+ };
4981
+ readonly uiEditor: {
4982
+ readonly selectInside: "Select Inside a Container";
4983
+ readonly editText: "Edit Text in Place";
4984
+ readonly discardText: "Discard the Text Being Edited";
4985
+ readonly crop: "Crop an Image";
4986
+ readonly suspendSnap: "Suspend Smart Snap";
4987
+ readonly dropImage: "Add an Image Element";
4988
+ readonly reorder: "Reorder or Move Into Another Element";
4989
+ };
4990
+ readonly blueprint: {
4991
+ readonly addNode: "Add a Node";
4992
+ readonly addConnectedNode: "Add a Connected Node";
4993
+ readonly deleteWire: "Delete a Wire";
4994
+ readonly deleteSelection: "Delete Selection";
4995
+ readonly renameGroup: "Rename a Group";
4996
+ };
4997
+ readonly storyMotion: {
4998
+ readonly noFrameSnap: "Drag Without Frame Snapping";
4999
+ readonly addKeyframe: "Add a Keyframe";
5000
+ readonly panPreview: "Pan the Preview";
5001
+ readonly zoom: "Zoom the Preview or Timeline";
5002
+ readonly scrollTimeline: "Scroll the Timeline Sideways";
5003
+ };
5004
+ readonly assets: {
5005
+ readonly selectAssetRange: "Select a Range of Assets";
5006
+ readonly open: "Open";
5007
+ readonly moveToGroup: "Move to a Group";
5008
+ readonly tileSize: "Resize Thumbnails";
5009
+ readonly audioScroll: "Scroll the Waveform Sideways";
5010
+ readonly audioZoomTime: "Zoom the Waveform in Time";
5011
+ readonly audioZoomAmplitude: "Magnify the Waveform Vertically";
5012
+ readonly selectAudioRange: "Select a Stretch of Audio";
5013
+ readonly clearMarker: "Clear a Marker";
5014
+ readonly videoZoom: "Zoom the Picture";
5015
+ readonly videoActualSize: "Switch Between Fit and Actual Pixels";
5016
+ };
5017
+ };
4808
5018
  };
4809
5019
  readonly search: {
4810
5020
  readonly placeholder: "Search project\u2026";
4811
5021
  readonly titleBarPlaceholder: "Search in {name}";
4812
5022
  readonly building: "Building search index\u2026";
4813
- readonly idle: "Search scenes, characters, story text, assets and blueprints.";
5023
+ readonly idle: "Search scenes, characters, story text, interface text, assets and blueprints.";
4814
5024
  readonly empty: "No results";
4815
5025
  readonly more: "{count} more";
4816
5026
  readonly caseSensitive: "Match case";
@@ -4830,8 +5040,9 @@ declare const en: {
4830
5040
  readonly blueprint: "Blueprints";
4831
5041
  readonly asset: "Assets";
4832
5042
  readonly storyText: "Story Text";
5043
+ readonly uiText: "Interface Text";
4833
5044
  readonly variable: "Variables";
4834
- readonly uiTextKey: "UI Text Keys";
5045
+ readonly uiTextKey: "Translation Keys";
4835
5046
  readonly blueprintNode: "Blueprint Nodes";
4836
5047
  };
4837
5048
  readonly occurrences: "\u00D7{count}";
@@ -4908,7 +5119,7 @@ declare const en: {
4908
5119
  readonly other: "Its {count} scenes are deleted with it.";
4909
5120
  };
4910
5121
  readonly deleteSceneConfirm: "Delete scene \"{name}\"?";
4911
- readonly deleteSceneDetail: "This removes the scene and its blocks. Jumps to it will stop resolving.";
5122
+ readonly deleteSceneDetail: "This removes the scene and all its rows. Jumps to it will stop resolving.";
4912
5123
  };
4913
5124
  readonly readFailed: {
4914
5125
  readonly missing: "This story is no longer in this project.";
@@ -5003,9 +5214,9 @@ declare const en: {
5003
5214
  readonly undoSceneRestored: "That scene is in the story again.";
5004
5215
  readonly undoChapterGone: "That chapter is gone.";
5005
5216
  readonly undoChapterRestored: "That chapter is in the story again.";
5006
- readonly undoContainerGone: "The block that line was in is gone.";
5217
+ readonly undoContainerGone: "The row that line was inside is gone.";
5007
5218
  readonly undoAnchorGone: "Where that line moved from is gone.";
5008
- readonly undoContainerFilled: "That block has lines in it now.";
5219
+ readonly undoContainerFilled: "That row has other lines inside it now.";
5009
5220
  readonly undoSubtreeLost: "The lines that were inside it cannot be put back.";
5010
5221
  readonly undoChaptersChanged: "The chapters are not the ones that step recorded.";
5011
5222
  readonly undoCharacterGone: "That character is gone.";
@@ -5450,6 +5661,7 @@ declare const en: {
5450
5661
  readonly mirrorState: "On / Off";
5451
5662
  readonly waitFor: "Seconds or click";
5452
5663
  readonly waitForEnd: "Wait for the clip";
5664
+ readonly hideOnEnd: "Hide when finished";
5453
5665
  readonly fade: "Fade Seconds";
5454
5666
  readonly loop: "Loop";
5455
5667
  readonly returnable: "Return";
@@ -5734,6 +5946,7 @@ declare const en: {
5734
5946
  readonly cutPointTitle: "The {name} build ends at this line. No other build contains this line.";
5735
5947
  readonly cutPointInactive: "variant deleted";
5736
5948
  readonly cutPointInactiveTitle: "The variant this line ended has been deleted, so it ends nothing.";
5949
+ readonly problem: "{message} ({rule})";
5737
5950
  readonly tempSpeaker: "name only";
5738
5951
  readonly createCharacter: "Create character \u201C{name}\u201D";
5739
5952
  readonly createCharacterUnavailable: "Unavailable in a live session. Choose an existing character.";
@@ -5894,7 +6107,7 @@ declare const en: {
5894
6107
  readonly image: "Image \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5895
6108
  readonly text: "Text \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5896
6109
  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.";
6110
+ readonly video: "Video \u201C{name}\u201D is not on stage; an earlier row has to play it.";
5898
6111
  readonly ambience: "Ambience effect \u201C{name}\u201D is not on stage; an earlier row has to create it.";
5899
6112
  readonly character: "Character \u201C{name}\u201D is not on stage; an earlier row has to bring it on stage.";
5900
6113
  readonly characterGone: "The character this row acts on is no longer in this project, so it is not on stage.";
@@ -6034,7 +6247,7 @@ declare const en: {
6034
6247
  };
6035
6248
  readonly show: {
6036
6249
  readonly label: "Show";
6037
- readonly detail: "Show a character, a stage object, or an image or video from the asset library";
6250
+ readonly detail: "Show a character, a stage object, or an image from the asset library";
6038
6251
  };
6039
6252
  readonly hide: {
6040
6253
  readonly label: "Hide";
@@ -6072,10 +6285,6 @@ declare const en: {
6072
6285
  readonly label: "Text";
6073
6286
  readonly detail: "Declare text on stage; /show reveals it";
6074
6287
  };
6075
- readonly video: {
6076
- readonly label: "Video";
6077
- readonly detail: "Declare a video on stage; /show reveals it";
6078
- };
6079
6288
  readonly vfx: {
6080
6289
  readonly label: "Ambience";
6081
6290
  readonly detail: "Declare a looping full-screen overlay: petals, rain, dust, light";
@@ -6090,7 +6299,7 @@ declare const en: {
6090
6299
  };
6091
6300
  readonly play: {
6092
6301
  readonly label: "Play";
6093
- readonly detail: "Play a video on stage, or a video from the asset library";
6302
+ readonly detail: "Play a video from the asset library, or play a video again";
6094
6303
  };
6095
6304
  readonly front: {
6096
6305
  readonly label: "Bring to Front";
@@ -6233,10 +6442,10 @@ declare const en: {
6233
6442
  readonly condition: "Condition";
6234
6443
  readonly if: "If";
6235
6444
  readonly elseIf: "Else if";
6236
- readonly else: "Otherwise";
6445
+ readonly else: "Else";
6237
6446
  readonly repeat: "Repeat";
6238
6447
  readonly repeatUntil: "Repeat until";
6239
- readonly parallel: "Run at the same time";
6448
+ readonly parallel: "Parallel";
6240
6449
  readonly race: "Race, first to finish";
6241
6450
  readonly sequence: "In order";
6242
6451
  readonly nvl: "NVL";
@@ -6247,7 +6456,7 @@ declare const en: {
6247
6456
  readonly declare: {
6248
6457
  readonly scene: "Local";
6249
6458
  readonly saved: "Var";
6250
- readonly persistent: "Global";
6459
+ readonly persistent: "Persistent";
6251
6460
  };
6252
6461
  readonly narration: "Narration";
6253
6462
  readonly dialogue: "Dialogue";
@@ -6518,7 +6727,7 @@ declare const en: {
6518
6727
  };
6519
6728
  };
6520
6729
  readonly storyInspector: {
6521
- readonly textId: "Localization key";
6730
+ readonly textId: "Unit ID";
6522
6731
  readonly advanced: "Advanced";
6523
6732
  readonly advancedParams: "Advanced params";
6524
6733
  readonly noVariablesDeclared: "No variables declared";
@@ -6877,7 +7086,7 @@ declare const en: {
6877
7086
  readonly setZIndex: "Set z-index";
6878
7087
  };
6879
7088
  readonly videoOperation: {
6880
- readonly play: "Play (wait for end)";
7089
+ readonly play: "Play";
6881
7090
  readonly pause: "Pause";
6882
7091
  readonly resume: "Resume";
6883
7092
  readonly stop: "Stop";
@@ -6957,6 +7166,10 @@ declare const en: {
6957
7166
  readonly videoName: "Video name";
6958
7167
  readonly videoAsset: "Video asset";
6959
7168
  readonly seekTime: "Seek to";
7169
+ readonly hideOnEnd: "Hide when finished";
7170
+ readonly leave: "Exit";
7171
+ readonly waitForEnd: "Wait for the video";
7172
+ readonly skipHint: "The player can end the video early by clicking or pressing the skip key.";
6960
7173
  };
6961
7174
  readonly nvl: {
6962
7175
  readonly hint: "Child rows run in NVL mode. The transform below animates the NVL layer as it enters.";
@@ -7022,8 +7235,8 @@ declare const en: {
7022
7235
  readonly conditionContainer: "Condition container. Add condition branches as children.";
7023
7236
  readonly control: "Control";
7024
7237
  readonly sequence: "Sequence";
7025
- readonly parallel: "Parallel all";
7026
- readonly race: "Race any";
7238
+ readonly parallel: "Parallel";
7239
+ readonly race: "Race";
7027
7240
  readonly repeat: "Repeat";
7028
7241
  readonly mode: {
7029
7242
  readonly do: "Do";
@@ -7187,6 +7400,7 @@ declare const en: {
7187
7400
  readonly list: "List view";
7188
7401
  readonly icons: "Icon view";
7189
7402
  readonly overview: "Overview";
7403
+ readonly details: "Details view";
7190
7404
  };
7191
7405
  readonly filter: {
7192
7406
  readonly label: "Filters";
@@ -7205,6 +7419,17 @@ declare const en: {
7205
7419
  readonly list: {
7206
7420
  readonly emptyFiltered: "No assets matched the current filters.";
7207
7421
  };
7422
+ readonly browser: {
7423
+ readonly results: {
7424
+ readonly one: "{count} result";
7425
+ readonly other: "{count} results";
7426
+ };
7427
+ readonly selected: {
7428
+ readonly one: "{count} selected";
7429
+ readonly other: "{count} selected";
7430
+ };
7431
+ readonly location: "Location";
7432
+ };
7208
7433
  readonly iconView: {
7209
7434
  readonly updating: "Updating\u2026";
7210
7435
  readonly assetCount: {
@@ -7354,13 +7579,13 @@ declare const en: {
7354
7579
  readonly locale: "Language";
7355
7580
  readonly release: "Variant";
7356
7581
  };
7357
- readonly deletedVariant: "Deleted variant";
7582
+ readonly deletedVariant: "Deleted value";
7358
7583
  readonly variantCount: {
7359
- readonly one: "{count} variant";
7360
- readonly other: "{count} variants";
7584
+ readonly one: "{count} value";
7585
+ readonly other: "{count} values";
7361
7586
  };
7362
- readonly variantsResolved: "{resolved} of {total} variants";
7363
- readonly unfinished: "No variants declared";
7587
+ readonly variantsResolved: "{resolved} of {total} values";
7588
+ readonly unfinished: "No values declared";
7364
7589
  readonly inUseTitle: "{name} is still in use";
7365
7590
  readonly inUseMessage: "The following places name it and will stop resolving:";
7366
7591
  readonly deleteConfirmMessage: "The files inside this set are deleted too.";
@@ -7375,7 +7600,7 @@ declare const en: {
7375
7600
  };
7376
7601
  readonly create: {
7377
7602
  readonly title: "New asset set";
7378
- readonly subTitle: "New set under this variant";
7603
+ readonly subTitle: "New set under this value";
7379
7604
  readonly no: {
7380
7605
  readonly locale: "This project declares one language.";
7381
7606
  readonly release: "This project has no variants.";
@@ -7388,8 +7613,8 @@ declare const en: {
7388
7613
  readonly filter: "Members carry";
7389
7614
  readonly residencyBlocked: "A set that varies by variant cannot sit under one that varies by language.";
7390
7615
  readonly fallback: "Falls back to";
7391
- readonly fallbackMissing: "This variant has no file, so nothing in this set resolves.";
7392
- readonly variants: "Variants";
7616
+ readonly fallbackMissing: "This value has no file, so nothing in this set resolves.";
7617
+ readonly variants: "Values";
7393
7618
  readonly variantInherited: "fallback";
7394
7619
  readonly variantMissing: "No file";
7395
7620
  readonly variantAmbiguous: "{count} files";
@@ -7679,7 +7904,7 @@ declare const en: {
7679
7904
  readonly tab: {
7680
7905
  readonly title: "Blueprint";
7681
7906
  readonly invalid: "Blueprint tab is invalid.";
7682
- readonly notFound: "Blueprint not found: {id}";
7907
+ readonly notFound: "Blueprint not found in this project";
7683
7908
  };
7684
7909
  readonly breakpoint: {
7685
7910
  readonly add: "Add breakpoint";
@@ -7713,6 +7938,15 @@ declare const en: {
7713
7938
  readonly other: "Deleted the unknown node and its {count} hidden connections. Undo to restore.";
7714
7939
  };
7715
7940
  };
7941
+ readonly wire: {
7942
+ readonly nodeDetail: "{node} ({detail})";
7943
+ readonly end: "{node} \u00B7 {pin}";
7944
+ readonly connectedTo: "Connected to {target}";
7945
+ readonly goTo: "Go to {target}";
7946
+ readonly goToNth: "Go to {target} ({n})";
7947
+ readonly goToConnected: "Go to connected node";
7948
+ readonly name: "Wire from {from} to {to}";
7949
+ };
7716
7950
  readonly crossProject: {
7717
7951
  readonly pasted: {
7718
7952
  readonly one: "{count} node pasted";
@@ -7813,7 +8047,7 @@ declare const en: {
7813
8047
  readonly noRuntime: "Node \"{node}\": no runtime for type \"{type}\".";
7814
8048
  readonly inputMissing: "\"{node}\" has nothing connected to \"{pin}\".";
7815
8049
  readonly stepLimit: "\"{head}\" stopped at \"{node}\" after {steps} steps without a wait.";
7816
- readonly stepLimitGlobal: "\"{head}\" in the global blueprint stopped at \"{node}\" after {steps} steps without a wait.";
8050
+ readonly stepLimitGlobal: "\"{head}\" in App logic stopped at \"{node}\" after {steps} steps without a wait.";
7817
8051
  readonly unknownType: "Node \"{node}\": unknown type \"{type}\". Its plugin may be uninstalled or disabled.";
7818
8052
  readonly variableIdInvalid: "Node \"{node}\": pick a variable.";
7819
8053
  readonly persistentVariableIdInvalid: "Node \"{node}\": pick a persistent variable.";
@@ -7975,6 +8209,7 @@ declare const en: {
7975
8209
  readonly keys: "Keys";
7976
8210
  readonly window: "Window";
7977
8211
  readonly display: "Display";
8212
+ readonly conditions: "Conditions";
7978
8213
  };
7979
8214
  };
7980
8215
  readonly owner: {
@@ -8894,6 +9129,7 @@ declare const en: {
8894
9129
  readonly getVisible: "Get Visible";
8895
9130
  readonly getWrapMode: "Get Wrap Mode";
8896
9131
  readonly goPage: "Go Page";
9132
+ readonly replacePage: "Replace Page";
8897
9133
  readonly goBack: "Go back";
8898
9134
  readonly showLayer: "Show Layer";
8899
9135
  readonly hideLayer: "Hide Layer";
@@ -9109,6 +9345,7 @@ declare const en: {
9109
9345
  readonly toggle: "Toggle";
9110
9346
  readonly toggleDialogDisplay: "Toggle Dialog Display";
9111
9347
  readonly toggleSwitch: "Toggle Switch";
9348
+ readonly translationKeyText: "Translation Key Text";
9112
9349
  readonly trim: "Trim";
9113
9350
  readonly trimEnd: "Trim End";
9114
9351
  readonly trimStart: "Trim Start";
@@ -9148,6 +9385,7 @@ declare const en: {
9148
9385
  readonly getTotalPlaytime: "Get Total Playtime";
9149
9386
  };
9150
9387
  readonly nodeDescription: {
9388
+ readonly getComponentParam: "The value this placement sets for the chosen parameter, or the parameter's default when it sets none. A Text parameter that reads from a translation key gives the key's name; Translation Key Text gives its words.";
9151
9389
  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.";
9152
9390
  readonly compareNotEqual: "True when A and B differ in value or in type. The number 1 and the text \"1\" count as different.";
9153
9391
  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.";
@@ -9161,6 +9399,12 @@ declare const en: {
9161
9399
  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
9400
  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
9401
  readonly goBack: "Closes the current page and returns to the page beneath it. On the bottom page it does nothing.";
9402
+ 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.";
9403
+ readonly isGameOverlay: "True when this page, layer or Game UI is shown over a running game. In App logic, true while a page or a modal layer covers the story.";
9404
+ readonly localizationGetText: "Gets a translation key's text in the player's current language, or its source text when that language has no translation. A key that does not exist gives its name. Translation Key Text gives the same text and can also be used in Blueprint Value and functions.";
9405
+ readonly translationKeyText: "A translation key's text in the player's current language, or its source text when that language has no translation. A key that does not exist gives its name. The same text as Get Text, and also usable in Blueprint Value and functions. A Blueprint Value that shows it updates when the player changes language.";
9406
+ readonly format: "Replaces the placeholders in Template with values: {0}, {1} and so on with the items of an array, {name} with the field of that name in an object. A placeholder with no value becomes empty. A translated template comes from Translation Key Text.";
9407
+ readonly formatText: "Replaces {0}, {1} and so on in Text with the items of Values. Format does the same, also fills {name} from an object, and can be used in Blueprint Value and functions.";
9164
9408
  };
9165
9409
  readonly live: {
9166
9410
  readonly nodeClaimed: "{name} is editing this node";
@@ -9265,7 +9509,7 @@ declare const en: {
9265
9509
  readonly describeOk: "Filled from the model";
9266
9510
  readonly describeNoModel: "No model to read";
9267
9511
  readonly describeNoBackend: "No runtime chosen";
9268
- readonly describeBackendMissing: "Runtime not installed here";
9512
+ readonly describeBackendMissing: "Runtime not installed in this project";
9269
9513
  readonly describeDistrusted: "Project not trusted";
9270
9514
  readonly describeNotSupported: "This runtime lists nothing";
9271
9515
  readonly describeFailed: "The model could not be read";
@@ -9423,10 +9667,10 @@ declare const en: {
9423
9667
  readonly editorTitle: "Character Properties";
9424
9668
  readonly thumbnail: "Thumbnail";
9425
9669
  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.";
9670
+ readonly defaultAvatar: "Default dialog avatar";
9671
+ readonly voiceTrack: "Voice track";
9672
+ readonly voiceTrackMissing: "Missing track";
9673
+ readonly voiceTrackEmpty: "Add a track under Voice in Project \u25B8 Game to give this character its own volume control.";
9430
9674
  readonly entrance: "Entrance defaults";
9431
9675
  readonly entranceEmpty: "Entrance rows use the stage's own values until this is set.";
9432
9676
  readonly entranceDrag: "Drag to place";
@@ -9565,6 +9809,12 @@ declare const en: {
9565
9809
  readonly remove: "Remove param";
9566
9810
  readonly namePlaceholder: "Name";
9567
9811
  readonly defaultPlaceholder: "Default";
9812
+ readonly type: "Type";
9813
+ readonly typeString: "String";
9814
+ readonly typeText: "Text";
9815
+ readonly bindLabel: "Parameter";
9816
+ readonly bindNone: "No parameter";
9817
+ readonly bindMissing: "Missing parameter";
9568
9818
  };
9569
9819
  readonly binding: {
9570
9820
  readonly notReady: "Blueprint not ready for this control.";
@@ -10028,7 +10278,7 @@ declare const en: {
10028
10278
  readonly hint: "Defined in the project; the value lives in the save file.";
10029
10279
  };
10030
10280
  readonly persistent: {
10031
- readonly title: "Global variables";
10281
+ readonly title: "Persistent variables";
10032
10282
  readonly hint: "Defined in the project; app-level, shared with blueprints.";
10033
10283
  };
10034
10284
  };
@@ -10057,8 +10307,8 @@ declare const en: {
10057
10307
  readonly ownerLabel: {
10058
10308
  readonly globalMain: "App logic";
10059
10309
  readonly surfaceMain: "Page logic";
10060
- readonly widgetMain: "Component logic";
10061
- readonly widgetValue: "Component value";
10310
+ readonly widgetMain: "Widget logic";
10311
+ readonly widgetValue: "Widget value";
10062
10312
  readonly storyAction: "Story action";
10063
10313
  };
10064
10314
  readonly stageSlot: {
@@ -10081,8 +10331,8 @@ declare const en: {
10081
10331
  readonly createGameUi: "Create Game UI";
10082
10332
  readonly globalSubtitle: "Global";
10083
10333
  readonly blueprintType: "Blueprint";
10084
- readonly openGlobalBlueprint: "Open global blueprint";
10085
- readonly globalBlueprintUnavailable: "Global blueprint unavailable";
10334
+ readonly openGlobalBlueprint: "Open App logic";
10335
+ readonly globalBlueprintUnavailable: "App logic unavailable";
10086
10336
  readonly openSurface: "Open {label}";
10087
10337
  readonly renameSurface: "Rename {label}";
10088
10338
  readonly duplicateSurface: "Duplicate {label}";
@@ -10097,6 +10347,10 @@ declare const en: {
10097
10347
  readonly pageValidationHint: "Check the page name and size before creating it.";
10098
10348
  readonly gameUiSlotHint: "Select an available Game UI slot before creating it.";
10099
10349
  readonly allSlotsUsed: "All Game UI slots already have a surface. Open an existing Game UI from the list.";
10350
+ readonly starterTitlePage: {
10351
+ readonly title: "Create Title Page";
10352
+ readonly description: "Includes Start and Continue buttons with their blueprints. Replaces the empty entry page.";
10353
+ };
10100
10354
  };
10101
10355
  readonly naming: {
10102
10356
  readonly page: "Page {index}";
@@ -10206,6 +10460,9 @@ declare const en: {
10206
10460
  readonly canvas: {
10207
10461
  readonly unknownWidget: "Unknown widget";
10208
10462
  readonly widgetRenderFailed: "Widget failed to draw";
10463
+ readonly wordsFromRowField: "These words come from the list row field \u201C{field}\u201D.";
10464
+ readonly wordsFromBlueprintValue: "These words come from the blueprint value \u201C{name}\u201D.";
10465
+ readonly wordsFromComponentParam: "These words come from the component parameter \u201C{param}\u201D, set on each placement.";
10209
10466
  };
10210
10467
  readonly editor: {
10211
10468
  readonly componentNotFound: "Component not found";
@@ -10256,7 +10513,7 @@ declare const en: {
10256
10513
  readonly showSelected: "Show selected";
10257
10514
  readonly hideSelected: "Hide selected";
10258
10515
  readonly addToComponentLibrary: "Add to Component Library";
10259
- readonly addToGroup: "Add to group";
10516
+ readonly group: "Group";
10260
10517
  readonly ungroup: "Ungroup";
10261
10518
  readonly addState: "Add state";
10262
10519
  readonly arrange: {
@@ -10373,7 +10630,7 @@ declare const en: {
10373
10630
  readonly interaction: "Interaction";
10374
10631
  };
10375
10632
  readonly blueprint: {
10376
- readonly controlLabel: "Component logic";
10633
+ readonly controlLabel: "Widget logic";
10377
10634
  };
10378
10635
  readonly appearance: {
10379
10636
  readonly title: "Appearance";
@@ -10431,12 +10688,27 @@ declare const en: {
10431
10688
  readonly enableItalic: "Enable italic";
10432
10689
  readonly disableItalic: "Disable italic";
10433
10690
  };
10691
+ readonly sampleText: {
10692
+ readonly label: "Sample text";
10693
+ readonly hint: "Shown in the editor only. The game shows the story's current line.";
10694
+ readonly bindingNoEffect: "This binding has no effect in the {slot} slot.";
10695
+ readonly removeBinding: "Remove";
10696
+ readonly hintBlueprintValue: "Shown in the editor only. The game shows the Blueprint Value's result.";
10697
+ readonly hintComponentParam: "Shown while editing the component only. Each placement shows the value it sets for the parameter.";
10698
+ };
10699
+ readonly textWriters: {
10700
+ readonly title: "Written in the game by";
10701
+ readonly entry: "{blueprint} \u203A {node}";
10702
+ readonly count: "\u00D7{count}";
10703
+ readonly defaultValue: "Default value";
10704
+ readonly defaultValueHint: "The game shows this text until one of the blueprints below writes to it.";
10705
+ };
10434
10706
  readonly localization: {
10707
+ readonly direct: "Direct";
10435
10708
  readonly translationKey: "Translation key";
10436
- readonly noSourceLanguage: "The project has no source language";
10437
10709
  readonly none: "None";
10438
10710
  readonly createKey: "Create new key\u2026";
10439
- readonly createKeyTitle: "New localization key";
10711
+ readonly createKeyTitle: "New translation key";
10440
10712
  readonly keyName: "Key name";
10441
10713
  readonly keyNamePlaceholder: "menu.start\u2026";
10442
10714
  readonly keyNameHint: "Letters, digits, and dots/underscores/hyphens between them.";
@@ -10450,7 +10722,7 @@ declare const en: {
10450
10722
  readonly title: "List";
10451
10723
  readonly sectionContent: "Content";
10452
10724
  readonly runtimeItems: "Runtime items";
10453
- readonly runtimePreviewOnly: "Preview only";
10725
+ readonly runtimeListContent: "List content";
10454
10726
  readonly runtimePageState: "Page state array";
10455
10727
  readonly runtimeAppState: "App state array";
10456
10728
  readonly runtimePageProps: "Page props array";
@@ -10528,8 +10800,6 @@ declare const en: {
10528
10800
  readonly value: "Value";
10529
10801
  readonly valueHint: "Starting text. What the player types is held by the running game, not by this document.";
10530
10802
  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
10803
  readonly sectionBehavior: "Behavior";
10534
10804
  readonly inputMode: "Input mode";
10535
10805
  readonly inputModeText: "Text";
@@ -10547,11 +10817,9 @@ declare const en: {
10547
10817
  readonly sectionColor: "Color";
10548
10818
  readonly sectionBehavior: "Behavior";
10549
10819
  readonly interactionDisabled: "Interaction disabled";
10550
- readonly localizeLabel: "Localize label";
10551
10820
  };
10552
10821
  readonly text: {
10553
10822
  readonly title: "Text";
10554
- readonly localizeText: "Localize text";
10555
10823
  };
10556
10824
  readonly textMarks: {
10557
10825
  readonly title: "Marks";
@@ -10588,7 +10856,6 @@ declare const en: {
10588
10856
  readonly start: "Start";
10589
10857
  readonly center: "Center";
10590
10858
  readonly end: "End";
10591
- readonly stretch: "Stretch";
10592
10859
  readonly spaceBetween: "Space between";
10593
10860
  readonly spaceAround: "Space around";
10594
10861
  readonly gapHint: "Gap between children";
@@ -10737,6 +11004,9 @@ declare const en: {
10737
11004
  readonly container: {
10738
11005
  readonly name: "Container";
10739
11006
  };
11007
+ readonly group: {
11008
+ readonly name: "Group";
11009
+ };
10740
11010
  readonly dialog: {
10741
11011
  readonly name: "Sentence";
10742
11012
  readonly text: "The current line will appear here.";
@@ -11493,15 +11763,15 @@ declare const en: {
11493
11763
  };
11494
11764
  readonly bgmVolume: {
11495
11765
  readonly title: "Music volume";
11496
- readonly description: "The Music bus.";
11766
+ readonly description: "The Music track.";
11497
11767
  };
11498
11768
  readonly soundVolume: {
11499
11769
  readonly title: "SFX volume";
11500
- readonly description: "The SFX bus.";
11770
+ readonly description: "The SFX track.";
11501
11771
  };
11502
11772
  readonly voiceVolume: {
11503
11773
  readonly title: "Voice volume";
11504
- readonly description: "The Voice bus.";
11774
+ readonly description: "The Voice track.";
11505
11775
  };
11506
11776
  readonly voiceEndMode: {
11507
11777
  readonly title: "When a voiced line ends";
@@ -11544,18 +11814,18 @@ declare const en: {
11544
11814
  };
11545
11815
  readonly deleteConfirm: "Delete \"{name}\"?";
11546
11816
  readonly deleteDetail: {
11547
- readonly one: "{count} reference falls back to its default bus.";
11548
- readonly other: "{count} references fall back to their default bus.";
11817
+ readonly one: "{count} reference falls back to its default track.";
11818
+ readonly other: "{count} references fall back to their default track.";
11549
11819
  };
11550
11820
  readonly deleteChildren: {
11551
11821
  readonly one: "{count} track under it moves to {parent}.";
11552
11822
  readonly other: "{count} tracks under it move to {parent}.";
11553
11823
  };
11554
11824
  readonly slider: {
11555
- readonly bgm: "BGM Volume";
11556
- readonly sound: "Sound Volume";
11557
- readonly voice: "Voice Volume";
11558
- readonly global: "Global Volume";
11825
+ readonly bgm: "Music volume";
11826
+ readonly sound: "SFX volume";
11827
+ readonly voice: "Voice volume";
11828
+ readonly global: "Master volume";
11559
11829
  };
11560
11830
  };
11561
11831
  readonly settings: {
@@ -11760,6 +12030,10 @@ declare const en: {
11760
12030
  readonly label: "Help";
11761
12031
  readonly description: "How the parts of Studio behave.";
11762
12032
  };
12033
+ readonly titlePage: {
12034
+ readonly label: "New Title Page";
12035
+ readonly description: "Start and Continue buttons included.";
12036
+ };
11763
12037
  };
11764
12038
  readonly reopenHint: {
11765
12039
  readonly menu: "Reopen this page from Help \u2192 Open Welcome.";
@@ -11984,6 +12258,7 @@ declare const en: {
11984
12258
  readonly voice: "Voice";
11985
12259
  readonly assets: "Assets";
11986
12260
  readonly console: "Console";
12261
+ readonly problems: "Problems";
11987
12262
  readonly storyMotion: "Story Motion";
11988
12263
  readonly dashboard: "Dashboard";
11989
12264
  readonly audioPreview: "Audio Preview";
@@ -12287,6 +12562,7 @@ declare const en: {
12287
12562
  readonly page: "Page";
12288
12563
  readonly layer: "Layer";
12289
12564
  readonly faded: "Faded out";
12565
+ readonly dialogHidden: "Hidden";
12290
12566
  readonly hiddenForGame: "Hidden while the game runs";
12291
12567
  readonly returnsOnBack: "Shown again on Go back";
12292
12568
  readonly onScreenCount: "{onScreen} of {total} on screen";
@@ -12631,6 +12907,7 @@ declare const en: {
12631
12907
  readonly createGroup: {
12632
12908
  readonly title: "Create Group";
12633
12909
  readonly prompt: "Please enter a name for the {type} group";
12910
+ readonly promptIn: "Please enter a name for the group in {parent}";
12634
12911
  readonly placeholder: "Enter group name\u2026";
12635
12912
  readonly empty: "Group name cannot be empty";
12636
12913
  };
@@ -12790,12 +13067,20 @@ declare const en: {
12790
13067
  };
12791
13068
  readonly unavailable: {
12792
13069
  readonly windows: "Cannot build Windows apps on this machine.";
12793
- readonly macos: "macOS apps can only be built on a Mac.";
13070
+ readonly macos: "Cannot build macOS apps on this machine.";
12794
13071
  readonly linux: "Cannot build Linux apps on this machine.";
12795
13072
  readonly web: "Web builds are available on every machine.";
12796
13073
  readonly android: "Android builds are available on every machine.";
12797
13074
  readonly ios: "iOS builds are available on every machine.";
12798
13075
  };
13076
+ readonly formatUnavailable: {
13077
+ readonly windows: "Not available on this machine.";
13078
+ readonly macos: "Requires a Mac.";
13079
+ readonly linux: "Not available on Windows.";
13080
+ readonly web: "Not available on this machine.";
13081
+ readonly android: "Not available on this machine.";
13082
+ readonly ios: "Not available on this machine.";
13083
+ };
12799
13084
  readonly format: {
12800
13085
  readonly zip: "Portable ZIP";
12801
13086
  readonly nsis: "Installer";
@@ -12847,15 +13132,15 @@ declare const en: {
12847
13132
  readonly appId: "App ID";
12848
13133
  readonly copyright: "Copyright";
12849
13134
  readonly icons: "Icons";
12850
- readonly iconsHint: "Click an icon to change it in project settings";
13135
+ readonly iconsHint: "Click an icon to change it in Project \u25B8 App";
12851
13136
  readonly iconUnset: "Not set";
12852
13137
  readonly notSet: "Not set";
12853
13138
  readonly editInProject: "Edit in Project \u25B8 App";
12854
13139
  };
12855
13140
  readonly content: {
12856
13141
  readonly protection: "Asset protection";
12857
- readonly protectionOn: "Assets and saves are encrypted in the packaged game.";
12858
- readonly protectionOff: "Assets and saves ship unencrypted.";
13142
+ readonly protectionOn: "Assets are encrypted in the packaged game.";
13143
+ readonly protectionOff: "Assets ship unencrypted.";
12859
13144
  readonly plugins: "Bundled plugins";
12860
13145
  readonly pluginsNone: "No plugins are bundled with this game.";
12861
13146
  readonly pluginsRescanUnavailable: "The plugin list cannot be rescanned in this window.";
@@ -12903,6 +13188,7 @@ declare const en: {
12903
13188
  readonly artifactReadVersioned: "{product} {version}, built {date}";
12904
13189
  readonly artifactVariantStated: "Read from the build folder.";
12905
13190
  readonly artifactVariantUnknown: "This build does not state its variant. Select it below.";
13191
+ readonly artifactNoKey: "This build was made without a distribution key. The game ignores any patch exported for it.";
12906
13192
  readonly artifactVariantMismatch: "This build is {build}. The DLC attaches to {variant}.";
12907
13193
  readonly artifactWholeGame: "The patch includes the whole game.";
12908
13194
  readonly contentLabel: "Variant the content comes from";
@@ -13010,10 +13296,13 @@ declare const en: {
13010
13296
  readonly mirror: {
13011
13297
  readonly official: "official source";
13012
13298
  readonly change: "Change";
13299
+ readonly downloadFailed: "A file the build needed could not be downloaded. If this network reaches github.com slowly or not at all, choose a mirror for the build's downloads in Settings \u203A {section} and build again.";
13300
+ readonly certificateFailed: "The download's certificate could not be verified. That usually means a proxy, network accelerator or antivirus program on this computer is intercepting HTTPS; turning it off may fix this without a mirror.";
13013
13301
  };
13014
13302
  readonly preflight: {
13015
13303
  readonly "no-targets": "Select at least one platform and format.";
13016
13304
  readonly "unbuildable-platform": "This machine cannot build for {platform}.";
13305
+ readonly "unbuildable-format": "This machine cannot build the {format} format for {platform}.";
13017
13306
  readonly "version-invalid": "Version {version} is not a valid semantic version; the build will fail.";
13018
13307
  readonly "version-missing": "No version set; the game builds as 0.0.0.";
13019
13308
  readonly "identifier-missing": "No project identifier; using the app id {appId}.";
@@ -13033,6 +13322,7 @@ declare const en: {
13033
13322
  readonly "sidecar-crossbuild-exec-bit": string;
13034
13323
  readonly "web-unprotected": "Asset protection does not apply to the web export; its files ship unprotected.";
13035
13324
  readonly "mobile-unprotected": "Asset protection does not apply to Android or iOS packages.";
13325
+ readonly "distribution-key-missing": "No distribution key. The game this build produces will not accept patches.";
13036
13326
  readonly "progress-carry-unsupported": string;
13037
13327
  readonly "lossy-images": "Images are re-encoded at quality {setting} and lose detail permanently.";
13038
13328
  readonly "lossy-audio": "Audio is re-encoded at {setting} kbit/s and loses detail permanently.";
@@ -13320,180 +13610,209 @@ declare const en: {
13320
13610
  readonly description: "Nothing in the project references this asset";
13321
13611
  readonly message: "{asset} is not used anywhere";
13322
13612
  readonly messageIndexUnresolved: "Unused assets not listed: {location} points at an asset that cannot be identified";
13323
- readonly messageIndexUnreadable: "Unused assets not listed: {location} could not be read";
13613
+ readonly messageIndexUnreadable: "Unused assets not listed: which assets {location} uses could not be determined";
13324
13614
  readonly messageIndexNotBuilt: "Unused assets not listed: the project could not be scanned";
13615
+ readonly help: string;
13325
13616
  };
13326
13617
  readonly assetsMissing: {
13327
13618
  readonly title: "Missing asset";
13328
13619
  readonly description: "A reference names an asset the library no longer has";
13329
13620
  readonly message: "{location} references a missing asset";
13621
+ readonly help: string;
13330
13622
  };
13331
13623
  readonly assetsUnreadable: {
13332
13624
  readonly title: "Unreadable asset";
13333
13625
  readonly description: "The file cannot be read or decoded";
13334
- readonly message: "{asset} cannot be decoded";
13626
+ readonly message: "{asset} is damaged or is not in a format Studio can open";
13335
13627
  readonly messageMissingBytes: "{asset} cannot be read from disk";
13628
+ readonly help: string;
13336
13629
  };
13337
13630
  readonly assetsOversized: {
13338
13631
  readonly title: "Large file";
13339
13632
  readonly description: "A file a build carries that is over the size this project allows";
13340
13633
  readonly message: "{asset} is {size}, over the {limit} a build should carry";
13634
+ readonly help: string;
13341
13635
  };
13342
13636
  readonly assetsGroupIncomplete: {
13343
13637
  readonly title: "Unfinished asset set";
13344
13638
  readonly description: "A set that does not resolve to exactly one file for every variant it declares";
13345
13639
  readonly message: "{set} has no file for {variant}";
13346
13640
  readonly messageAmbiguous: "{set} has {count} files for {variant}";
13347
- readonly messageResidency: "{set} resolves {axis} while the game runs, inside {outerAxis}, which the build resolves";
13348
- readonly messageDeclaration: "{set} declares no variants to resolve";
13349
- readonly messageFallback: "{set} does not say which variant the others fall back to";
13350
- };
13351
- readonly portabilityAssetName: {
13352
- readonly title: "Unsafe file name";
13353
- readonly description: "Characters or names some filesystems reject";
13354
- readonly message: "{asset} cannot be written on every platform";
13355
- };
13356
- readonly portabilityCaseCollision: {
13357
- readonly title: "Case collision";
13358
- readonly description: "Names that differ only by letter case";
13359
- readonly message: "{asset} collides with {other} on case-insensitive filesystems";
13641
+ readonly messageResidency: "{set} varies by variant and sits under a set that varies by language, which no build can resolve";
13642
+ readonly messageDeclaration: "{set} declares no values to resolve";
13643
+ readonly messageFallback: "{set} does not say which value the others fall back to";
13644
+ readonly help: string;
13360
13645
  };
13361
13646
  readonly portabilityMediaFormat: {
13362
13647
  readonly title: "Unplayable format";
13363
13648
  readonly description: "A codec some selected build targets cannot play";
13364
13649
  readonly message: "{asset} does not play on {platform}";
13650
+ readonly help: string;
13365
13651
  };
13366
13652
  readonly portabilityVfxAlpha: {
13367
13653
  readonly title: "Transparent overlay clip";
13368
13654
  readonly description: "An overlay clip whose transparency some selected build targets ignore";
13369
13655
  readonly message: "{asset} covers the stage on {platform}";
13656
+ readonly help: string;
13370
13657
  };
13371
13658
  readonly networkFetchNotAllowlisted: {
13372
13659
  readonly title: "Address not on the allowlist";
13373
13660
  readonly description: "A Fetch node aimed at an address this project does not allow";
13374
13661
  readonly message: "{url} is not on this project's network request allowlist";
13662
+ readonly help: string;
13375
13663
  };
13376
13664
  readonly networkFetchDisallowed: {
13377
13665
  readonly title: "Network node without network access";
13378
13666
  readonly description: "A network node in a project whose network policy is off";
13379
13667
  readonly message: "{blueprint} makes a network request, which this project does not allow";
13668
+ readonly help: string;
13380
13669
  };
13381
13670
  readonly storyUnreadable: {
13382
13671
  readonly title: "Unreadable story";
13383
13672
  readonly description: "A story document this Studio cannot open";
13673
+ readonly help: string;
13384
13674
  };
13385
13675
  readonly storyInvalidCommand: {
13386
13676
  readonly title: "Invalid command";
13387
13677
  readonly description: "A row the compiler refuses";
13388
13678
  readonly message: "This row does not compile";
13679
+ readonly help: string;
13389
13680
  };
13390
13681
  readonly storyGotoMissing: {
13391
13682
  readonly title: "Missing label";
13392
13683
  readonly description: "A goto naming a label the scene does not declare";
13393
13684
  readonly message: "Jumps to {label}, which this scene never declares";
13685
+ readonly messageEmpty: "Names no label to go to";
13686
+ readonly help: string;
13394
13687
  };
13395
13688
  readonly storyLabelDuplicate: {
13396
13689
  readonly title: "Duplicate label";
13397
13690
  readonly description: "Two declarations of one label; only the first is reached";
13398
- readonly message: "{label} is already declared above, so this one is never reached";
13691
+ readonly message: "{label} is already declared above, so every /goto to it lands there and not here";
13692
+ readonly help: string;
13399
13693
  };
13400
13694
  readonly storyLabelUnused: {
13401
13695
  readonly title: "Unused label";
13402
13696
  readonly description: "A label nothing jumps to";
13403
13697
  readonly message: "Nothing jumps to {label}";
13698
+ readonly help: string;
13404
13699
  };
13405
13700
  readonly storyJumpMissing: {
13406
13701
  readonly title: "Missing scene";
13407
13702
  readonly description: "A jump naming a scene the project does not have";
13408
- readonly message: "Jumps to a scene the story no longer has";
13703
+ readonly message: "The target scene is not set, or is not in this story";
13704
+ readonly help: string;
13409
13705
  };
13410
13706
  readonly storyEmptyChoice: {
13411
13707
  readonly title: "Empty choice";
13412
13708
  readonly description: "A choice with nothing the player can pick";
13413
13709
  readonly message: "This choice has no options";
13414
13710
  readonly messageEmptyOption: "This option has no text";
13711
+ readonly help: string;
13415
13712
  };
13416
13713
  readonly storyDeadEnd: {
13417
13714
  readonly title: "Dead end";
13418
13715
  readonly description: "A scene that leaves on some paths and reaches its end on another";
13419
13716
  readonly message: "Play runs off the end of the scene here";
13717
+ readonly help: string;
13420
13718
  };
13421
13719
  readonly storyCallCycle: {
13422
13720
  readonly title: "Circular call";
13423
13721
  readonly description: "A returnable jump reaching a scene that can call its own back";
13424
13722
  readonly message: "Calls a scene that can call this one back";
13723
+ readonly help: string;
13425
13724
  };
13426
13725
  readonly storyUnreachableScene: {
13427
13726
  readonly title: "Unreachable scene";
13428
13727
  readonly description: "A scene nothing can reach from the start";
13429
13728
  readonly message: "Nothing reaches this scene";
13729
+ readonly help: string;
13430
13730
  };
13431
13731
  readonly storyEmptyScene: {
13432
13732
  readonly title: "Empty scene";
13433
13733
  readonly description: "A scene with no content";
13434
- readonly message: "This scene has no rows";
13734
+ readonly message: "This scene has no enabled rows";
13735
+ readonly help: string;
13435
13736
  };
13436
13737
  readonly storyAppTagUnknown: {
13437
13738
  readonly title: "Unknown build variant";
13438
13739
  readonly description: "A row compared with a variant the project does not have";
13439
- readonly message: "No build variant is named \"{name}\", so this row is in no build";
13740
+ readonly message: "No build variant is named \"{name}\", so this comparison has the same result in every build";
13741
+ readonly help: string;
13440
13742
  };
13441
13743
  readonly storyRowsAfterEnding: {
13442
13744
  readonly title: "Rows after an ending";
13443
13745
  readonly description: "Rows written after an /ending row in the same list, which never play";
13444
13746
  readonly message: "This row comes after an ending and is never played. Move it before the ending, or delete it";
13747
+ readonly help: string;
13445
13748
  };
13446
13749
  readonly storyQuitPageMissing: {
13447
13750
  readonly title: "Quit with no page";
13448
13751
  readonly description: "A /quit row that names no page, or one the project no longer has";
13449
- readonly message: "This row names no page, so the playthrough ends with nothing on screen";
13450
- readonly deleted: "This project has no page \"{page}\", so the playthrough ends with nothing on screen";
13752
+ readonly message: "This row names no page, so no page opens and the rows after it in this list never play";
13753
+ readonly deleted: "The page this row names is no longer in the project, so the playthrough ends with nothing on screen";
13754
+ readonly help: string;
13451
13755
  };
13452
13756
  readonly storyEndingNameDuplicate: {
13453
13757
  readonly title: "Two endings with one name";
13454
13758
  readonly description: "More than one ending sharing a display name";
13455
13759
  readonly message: "Another ending is also called \"{name}\". A screen listing endings shows the name twice";
13760
+ readonly help: string;
13456
13761
  };
13457
13762
  readonly storyCutPointOrphan: {
13458
13763
  readonly title: "Cut point with no variant";
13459
13764
  readonly description: "A cut point written while the project has no build variant";
13460
13765
  readonly message: "This project has no build variant, so this cut point ends nothing. Add a variant, or delete the row";
13766
+ readonly help: string;
13461
13767
  };
13462
13768
  readonly storyCutPointUnreachable: {
13463
13769
  readonly title: "Cut point out of reach";
13464
13770
  readonly description: "A cut point in a scene nothing can get to";
13465
13771
  readonly message: "Nothing can reach this scene, so this cut point never ends a build";
13772
+ readonly help: string;
13466
13773
  };
13467
13774
  readonly storyStageObjectMissing: {
13468
13775
  readonly title: "Missing stage object";
13469
13776
  readonly description: "A row acting on an object no row in the scene creates";
13470
- readonly message: "Nothing creates {object}, so this row has nothing to act on";
13471
- readonly messageCharacter: "Nothing brings {object} on stage, so this row has nothing to act on";
13777
+ readonly message: "No row in this scene creates {object}, so this row has nothing to act on";
13778
+ readonly messageCharacter: "No row in this scene brings {object} on stage, so this row has nothing to act on";
13779
+ readonly help: string;
13472
13780
  };
13473
13781
  readonly storyDeclaredNeverShown: {
13474
13782
  readonly title: "Unshown stage object";
13475
13783
  readonly description: "A create row declares an object no row shows";
13476
13784
  readonly message: "{object} is declared here and no row shows it";
13785
+ readonly help: string;
13477
13786
  };
13478
13787
  readonly storyStageObjectDuplicate: {
13479
13788
  readonly title: "Duplicate stage object";
13480
13789
  readonly description: "Two rows creating one stage name; the second reuses the first";
13481
13790
  readonly message: "{object} is already created above, so this row acts on that one";
13791
+ readonly help: string;
13792
+ };
13793
+ readonly storyVideoControlAfterEnd: {
13794
+ readonly title: "Video already finished";
13795
+ readonly description: "A row pausing, resuming, seeking or stopping a video after a play that waits for its end";
13796
+ 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";
13797
+ readonly help: string;
13482
13798
  };
13483
13799
  readonly storyCharacterMissing: {
13484
13800
  readonly title: "Missing character";
13485
13801
  readonly description: "A row naming a character the project does not have";
13486
13802
  readonly message: "This row names a character the project does not have";
13803
+ readonly help: string;
13487
13804
  };
13488
13805
  readonly storyTransitionUnavailable: {
13489
13806
  readonly title: "Unavailable transition";
13490
13807
  readonly description: "A row naming a transition this version cannot play";
13491
13808
  readonly message: "The transition {transition} is not available, so this change plays as a cut";
13809
+ readonly help: string;
13492
13810
  };
13493
13811
  readonly storyBackgroundUnchanged: {
13494
13812
  readonly title: "Unchanged background";
13495
13813
  readonly description: "A row transitioning to the background already on screen";
13496
13814
  readonly message: "This background is already on screen, so the transition changes nothing";
13815
+ readonly help: string;
13497
13816
  };
13498
13817
  readonly blueprintReferenceMissing: {
13499
13818
  readonly title: "Missing target";
@@ -13505,40 +13824,47 @@ declare const en: {
13505
13824
  readonly messageChoice: "Names a choice that no longer exists";
13506
13825
  readonly messageEnding: "Names an ending that no longer exists";
13507
13826
  readonly messageCharacter: "Names a character that no longer exists";
13508
- readonly messageTextKey: "Names a text key the project does not declare";
13827
+ readonly messageTextKey: "Names a translation key the project does not declare";
13509
13828
  readonly messageDlc: "Names a DLC the project does not have";
13510
13829
  readonly messageInputAction: "Names an input action the project does not declare";
13830
+ readonly help: string;
13511
13831
  };
13512
13832
  readonly blueprintElementRefMissing: {
13513
13833
  readonly title: "Missing widget";
13514
13834
  readonly description: "A node bound to a widget the project no longer has";
13515
13835
  readonly message: "Bound to a widget that no longer exists";
13836
+ readonly help: string;
13516
13837
  };
13517
13838
  readonly blueprintFnTargetMissing: {
13518
13839
  readonly title: "Missing function";
13519
13840
  readonly description: "A Call Fn node whose function does not exist in its scope";
13520
13841
  readonly message: "Calls a function that does not exist in this scope";
13521
13842
  readonly messageNamed: "Calls {name}, which does not exist in this scope";
13843
+ readonly help: string;
13522
13844
  };
13523
13845
  readonly blueprintUnreachableNode: {
13524
13846
  readonly title: "Unreachable node";
13525
13847
  readonly description: "A node no entry point in its graph can reach";
13526
13848
  readonly message: "Nothing reaches this node, so it never runs";
13849
+ readonly help: string;
13527
13850
  };
13528
13851
  readonly blueprintDlcEntranceUnguarded: {
13529
13852
  readonly title: "Unguarded DLC entrance";
13530
- readonly description: "A Start Story into a DLC's story, with nothing asking whether the DLC is here";
13531
- readonly message: "Nothing in this graph asks whether the DLC is installed";
13853
+ readonly description: "A Start Game node starting a DLC's story, with nothing asking whether the DLC is installed";
13854
+ readonly message: "No Is DLC Installed in this layer asks about this story's DLC";
13855
+ readonly help: string;
13532
13856
  };
13533
13857
  readonly blueprintEmptyEvent: {
13534
13858
  readonly title: "Empty event";
13535
13859
  readonly description: "An event layer with nothing wired to run";
13536
13860
  readonly message: "This event runs nothing";
13861
+ readonly help: string;
13537
13862
  };
13538
13863
  readonly blueprintUnknownNode: {
13539
13864
  readonly title: "Unknown node type";
13540
13865
  readonly description: "A node whose type the project cannot load";
13541
13866
  readonly message: "{type} is not loaded, so this node will not run in the game";
13867
+ readonly help: string;
13542
13868
  };
13543
13869
  readonly blueprintAssembledAssetName: {
13544
13870
  readonly title: "Asset name assembled at run time";
@@ -13547,95 +13873,130 @@ declare const en: {
13547
13873
  readonly messageBinding: "\"{prop}\" on \"{element}\" is bound to an asset name assembled at run time (from \"{origin}\"). A game package carries only the assets whose names are written in the project, so nothing will be there in the released game. Choose the asset in the asset picker, or read one already chosen from a list row or a variable";
13548
13874
  readonly messageUnloadedNode: "\"{pin}\" on \"{node}\" receives an asset name from {origin}, which is not loaded, so the asset it names will not be in the released game. Install or switch on the plugin that provides this node type, then build again";
13549
13875
  readonly messageUnloadedNodeBinding: "\"{prop}\" on \"{element}\" is bound to an asset name from {origin}, which is not loaded, so the asset it names will not be in the released game. Install or switch on the plugin that provides this node type, then build again";
13550
- };
13551
- readonly uiUnlocalizedText: {
13552
- readonly title: "Unlocalized text";
13553
- readonly description: "Text written straight onto a widget in a project that has a second language";
13554
- readonly message: "{text} is not bound to a localization key";
13876
+ readonly help: string;
13555
13877
  };
13556
13878
  readonly uiPageUnreachable: {
13557
13879
  readonly title: "Unreachable page";
13558
13880
  readonly description: "A page nothing opens, embeds, or starts on";
13559
13881
  readonly message: "Nothing opens this page";
13882
+ readonly help: string;
13560
13883
  };
13561
13884
  readonly uiEmptyBehavior: {
13562
13885
  readonly title: "Button with no handler";
13563
13886
  readonly description: "A clickable widget nothing listens to";
13564
13887
  readonly message: "Nothing runs when this is clicked";
13888
+ readonly help: string;
13565
13889
  };
13566
13890
  readonly uiUnknownWidget: {
13567
13891
  readonly title: "Unknown widget type";
13568
13892
  readonly description: "A widget whose type the project cannot load";
13569
13893
  readonly message: "{type} is not loaded, so this widget will not be drawn in the game";
13894
+ readonly help: string;
13570
13895
  };
13571
13896
  readonly uiComponentMissing: {
13572
13897
  readonly title: "Missing component";
13573
13898
  readonly description: "An instance of a component the project does not have";
13574
13899
  readonly message: "This instance points at a component the project does not have";
13900
+ readonly help: string;
13575
13901
  };
13576
13902
  readonly uiFrameTargetMissing: {
13577
13903
  readonly title: "Missing embedded page";
13578
13904
  readonly description: "A Page widget embedding a page the project does not have";
13579
13905
  readonly message: "This Page widget embeds a page the project does not have";
13906
+ readonly help: string;
13580
13907
  };
13581
13908
  readonly uiFrameLoop: {
13582
13909
  readonly title: "Circular embedded page";
13583
13910
  readonly description: "A Page widget embedding a page that leads back to it";
13584
13911
  readonly message: "This Page widget embeds a page that leads back to it";
13912
+ readonly help: string;
13585
13913
  };
13586
13914
  readonly uiListItemFieldMissing: {
13587
13915
  readonly title: "Missing item field";
13588
13916
  readonly description: "A widget bound to an item field the list drawing it does not declare";
13589
13917
  readonly message: "This is bound to an item field the list does not declare, so every row shows the same value";
13918
+ readonly help: string;
13919
+ };
13920
+ readonly uiComponentParamMissing: {
13921
+ readonly title: "Missing text parameter";
13922
+ readonly description: "A widget in a component showing a parameter the component does not declare as text";
13923
+ readonly message: "This shows a parameter the component does not declare as text, so every placement shows no words here";
13924
+ readonly messageOutside: "This shows a component parameter but is not inside a component, so the game shows no words here";
13925
+ readonly help: string;
13926
+ };
13927
+ readonly uiListTextUntranslated: {
13928
+ readonly title: "Untranslated list content";
13929
+ readonly description: "Words written into a list's content in a project that has a second language";
13930
+ readonly message: "{text} and the rest of this list's content show as written in every language";
13931
+ readonly help: string;
13932
+ };
13933
+ readonly uiLocalizationKeyMissing: {
13934
+ readonly title: "Missing translation key";
13935
+ readonly description: "A widget reading its words from a key the project does not have";
13936
+ readonly message: "Reads its words from {key}, which the project does not have";
13937
+ readonly help: string;
13590
13938
  };
13591
13939
  readonly uiGestureAnsweredTwice: {
13592
13940
  readonly title: "Gesture answered twice";
13593
13941
  readonly description: "A widget with a pointer handler of its own, on a page whose action answers the same gesture";
13594
13942
  readonly message: "{action} on this page answers the same gesture this widget does, so both run";
13943
+ readonly help: string;
13595
13944
  };
13596
13945
  readonly blueprintSaveFieldEmpty: {
13597
13946
  readonly title: "Empty save field";
13598
13947
  readonly description: "A Save Game node that will run with a declared save field left empty";
13599
13948
  readonly message: "{field} is empty, so this save is written with its default instead";
13949
+ readonly help: string;
13600
13950
  };
13601
13951
  readonly blueprintRequiredInputUnwired: {
13602
13952
  readonly title: "Empty input";
13603
13953
  readonly description: "A node that will run with a required input left unconnected";
13604
13954
  readonly message: "{node} has nothing connected to {pin}";
13955
+ readonly help: string;
13605
13956
  };
13606
13957
  readonly blueprintStartSceneForeign: {
13607
13958
  readonly title: "Scene from another story";
13608
13959
  readonly description: "A Start Game node whose scene is not in the story it names";
13609
- readonly message: "This scene is in {owner}, not in {story}, so starting the game here stops it";
13960
+ readonly message: "This scene is in {owner}, not in {story}, so the game cannot start from it";
13961
+ readonly help: string;
13610
13962
  };
13611
13963
  readonly variablesUndeclared: {
13612
13964
  readonly title: "Undeclared variable";
13613
13965
  readonly description: "A variable used without a declaration";
13614
13966
  readonly message: "{variable} is used but never declared";
13967
+ readonly messageUnnamed: "This row uses a variable that is not declared anywhere";
13968
+ readonly help: string;
13615
13969
  };
13616
13970
  readonly variablesUnused: {
13617
13971
  readonly title: "Unused variable";
13618
13972
  readonly description: "A variable declared but never read or written";
13619
13973
  readonly message: "{variable} is declared but never used";
13974
+ readonly help: string;
13620
13975
  };
13621
13976
  readonly variablesNameCollision: {
13622
13977
  readonly title: "Variable name collision";
13623
13978
  readonly description: "One name declared in two places";
13624
13979
  readonly message: "{variable} is declared twice as a persistent variable";
13980
+ readonly messageSaved: "{variable} is declared twice as a saved variable";
13981
+ readonly help: string;
13625
13982
  };
13626
13983
  readonly variablesConditionNeverHolds: {
13627
13984
  readonly title: "Condition no path can satisfy";
13628
13985
  readonly description: "A condition whose variable can never reach the value it tests for";
13629
- readonly message: "{variable} is never more than {bound} here, so this condition cannot hold";
13986
+ readonly message: "{variable} is always within {bound} here, so this condition cannot hold";
13987
+ readonly messageUnnamed: "A variable with no declaration is always within {bound} here, so this condition cannot hold";
13988
+ readonly help: string;
13630
13989
  };
13631
13990
  readonly variablesReadNeverWritten: {
13632
13991
  readonly title: "Condition nothing can change";
13633
13992
  readonly description: "A variable a condition tests, that nothing in the project ever assigns";
13634
13993
  readonly message: "{variable} is tested by {conditions} but nothing ever sets it";
13994
+ readonly messageUnnamed: "A variable with no declaration is tested by {conditions} and nothing ever sets it";
13635
13995
  readonly conditionCount: {
13636
13996
  readonly one: "{count} condition";
13637
13997
  readonly other: "{count} conditions";
13638
13998
  };
13999
+ readonly help: string;
13639
14000
  };
13640
14001
  readonly variablesRandomOutsideAssignment: {
13641
14002
  readonly title: "Random outside an assignment";
@@ -13643,33 +14004,39 @@ declare const en: {
13643
14004
  readonly message: "{fn}() is re-rolled every time this condition is tested, so the branch can change between checks. Roll it once with /set, then test that variable";
13644
14005
  readonly messageChoiceOption: "{fn}() is re-rolled every time the menu draws, so this option flickers. Roll it once with /set, then test that variable";
13645
14006
  readonly messageInterpolation: "{fn}() is re-rolled every time this line draws, so the value changes on every redraw. Roll it once with /set, then show that variable";
14007
+ readonly help: string;
13646
14008
  };
13647
14009
  readonly textOverlong: {
13648
14010
  readonly title: "Overlong line";
13649
14011
  readonly description: "A line wider than the dialogue box holds";
13650
- readonly message: "{width} characters wide, over {max}";
14012
+ readonly message: "{width} columns wide, over {max}";
14013
+ readonly help: string;
13651
14014
  };
13652
14015
  readonly textEmpty: {
13653
14016
  readonly title: "Empty line";
13654
- readonly description: "A dialogue row with no text";
14017
+ readonly description: "A narration, dialogue or choice option row with no text";
13655
14018
  readonly message: "This line has no text";
14019
+ readonly help: string;
13656
14020
  };
13657
14021
  readonly localizationMissing: {
13658
14022
  readonly title: "Missing translation";
13659
14023
  readonly description: "A line or interface text with no translation in a target language";
13660
14024
  readonly message: "No {locale} translation";
13661
14025
  readonly messageInterface: "No {locale} translation of {text}";
14026
+ readonly help: string;
13662
14027
  };
13663
14028
  readonly localizationStale: {
13664
14029
  readonly title: "Stale translation";
13665
14030
  readonly description: "The source line changed after it was translated";
13666
14031
  readonly message: "{locale} translation is older than the line";
13667
14032
  readonly messageInterface: "{locale} translation of {text} is older than the text";
14033
+ readonly help: string;
13668
14034
  };
13669
14035
  readonly localizationMarkup: {
13670
14036
  readonly title: "Translation drops styling";
13671
- readonly description: "The line is styled and the translation renders it plainly";
13672
- readonly message: "{locale} translation does not carry this line's styling";
14037
+ readonly description: "The line has styling, pauses or inline events the translation does not carry";
14038
+ readonly message: "{locale} translation does not carry all of this line's styling, pauses and inline events";
14039
+ readonly help: string;
13673
14040
  };
13674
14041
  readonly localizationOrphan: {
13675
14042
  readonly title: "Orphan translation";
@@ -13679,16 +14046,19 @@ declare const en: {
13679
14046
  readonly one: "{count} {locale} translation";
13680
14047
  readonly other: "{count} {locale} translations";
13681
14048
  };
14049
+ readonly help: string;
13682
14050
  };
13683
14051
  readonly voiceMissing: {
13684
14052
  readonly title: "Missing voice";
13685
14053
  readonly description: "A line with no recording in a voiced language";
13686
14054
  readonly message: "No {locale} recording";
14055
+ readonly help: string;
13687
14056
  };
13688
14057
  readonly voiceStale: {
13689
14058
  readonly title: "Stale voice";
13690
14059
  readonly description: "The line changed after it was recorded";
13691
14060
  readonly message: "{locale} recording is older than the line";
14061
+ readonly help: string;
13692
14062
  };
13693
14063
  readonly voiceOrphan: {
13694
14064
  readonly title: "Orphan voice";
@@ -13698,13 +14068,15 @@ declare const en: {
13698
14068
  readonly one: "{count} {locale} recording";
13699
14069
  readonly other: "{count} {locale} recordings";
13700
14070
  };
14071
+ readonly help: string;
13701
14072
  };
13702
14073
  readonly brandBrokenLink: {
13703
14074
  readonly title: "Broken color link";
13704
14075
  readonly description: "A color pointing at a palette entry that resolves to nothing";
13705
- readonly message: "{where} uses {color}, which the palette does not have";
13706
- readonly messageChain: "{where} uses {color}, which links on to {missing}, a color the palette does not have";
14076
+ readonly message: "{where} uses a color the palette does not have";
14077
+ readonly messageChain: "{where} uses {color}, which follows a color the palette does not have";
13707
14078
  readonly messageCycle: "{where} uses {color}, whose links lead back to themselves";
14079
+ readonly help: string;
13708
14080
  };
13709
14081
  readonly typographyGlyphCoverage: {
13710
14082
  readonly title: "Missing glyphs";
@@ -13715,19 +14087,23 @@ declare const en: {
13715
14087
  readonly other: "{count} times";
13716
14088
  };
13717
14089
  readonly messageInLanguage: "No project font can draw \u201C{character}\u201D in {language} ({occurrences})";
14090
+ readonly messageInState: "No project font can draw \u201C{character}\u201D in the \u201C{state}\u201D state ({occurrences})";
14091
+ readonly messageInLanguageInState: "No project font can draw \u201C{character}\u201D in {language} in the \u201C{state}\u201D state ({occurrences})";
13718
14092
  readonly messageMore: "{characters} no project font can draw";
13719
14093
  readonly moreCharacterCount: {
13720
14094
  readonly one: "{count} more character";
13721
14095
  readonly other: "{count} more characters";
13722
14096
  };
13723
14097
  readonly messageMoreInLanguage: "{characters} no project font can draw in {language}";
13724
- readonly messageUnreadable: "{font} could not be read, so glyph coverage was not checked";
14098
+ readonly messageUnreadable: "{font} could not be read, so no character was checked";
13725
14099
  readonly messageUnloadable: "{font} is a .{format} font, which the game cannot draw with";
14100
+ readonly help: string;
13726
14101
  };
13727
14102
  readonly typographyLocaleNoFont: {
13728
14103
  readonly title: "Language with no font";
13729
14104
  readonly description: "A language every font of the project is restricted away from";
13730
- readonly message: "No project font is set for {language}";
14105
+ readonly message: "Every project font is limited to languages other than {language}";
14106
+ readonly help: string;
13731
14107
  };
13732
14108
  };
13733
14109
  readonly message: {
@@ -13773,6 +14149,22 @@ declare const en: {
13773
14149
  readonly showAll: "Show all {count}";
13774
14150
  readonly lineAria: "Line {line}";
13775
14151
  readonly findPlaceholder: "Find in problems";
14152
+ readonly scopeProject: "Whole project";
14153
+ readonly scopeOpenEditors: "Open editors";
14154
+ readonly scopeActiveEditor: "Current editor";
14155
+ readonly scopeAria: "Show problems from";
14156
+ readonly severityAria: "Severity";
14157
+ readonly groupAria: "Group";
14158
+ readonly emptyOpenEditors: "No problems in the open editors";
14159
+ readonly emptyActiveEditor: "No problems in the current editor";
14160
+ readonly emptyFiltered: "No problems at the selected severity";
14161
+ readonly explain: "About this rule";
14162
+ readonly settings: "Check settings";
14163
+ readonly rerunHint: "Check the whole project again, re-reading the asset files on disk";
14164
+ readonly jumpFailed: "This location can no longer be opened";
14165
+ };
14166
+ readonly statusBar: {
14167
+ readonly counts: "Problems: {errors}, {warnings}, {infos}";
13776
14168
  };
13777
14169
  readonly command: {
13778
14170
  readonly runProject: "Check project";
@@ -13795,6 +14187,7 @@ declare const en: {
13795
14187
  };
13796
14188
  readonly blockedHint: "Change this in Project \u25B8 Project \u25B8 Check before building";
13797
14189
  readonly skipped: "Project check skipped";
14190
+ readonly viewProblems: "View problems";
13798
14191
  };
13799
14192
  readonly settings: {
13800
14193
  readonly runOnBuild: "Check before building";
@@ -13804,6 +14197,8 @@ declare const en: {
13804
14197
  readonly failBuildOnWarning: "Warnings and errors";
13805
14198
  readonly optionMaxChars: "Maximum width";
13806
14199
  readonly optionCountMode: "Counting";
14200
+ readonly optionMaxMegabytes: "Largest file (MB)";
14201
+ readonly optionMaxCharacters: "Characters listed";
13807
14202
  readonly countModeEastAsianWidth: "Wide = 2 columns";
13808
14203
  readonly countModeCodePoints: "All = 1 column";
13809
14204
  };
@@ -13865,7 +14260,7 @@ declare const en: {
13865
14260
  readonly characters: "Characters";
13866
14261
  readonly dictionaryTerms: "Dictionary terms";
13867
14262
  readonly transformPresets: "Transform presets";
13868
- readonly localizationKeys: "Localization keys";
14263
+ readonly localizationKeys: "Translation keys";
13869
14264
  readonly projectLanguages: "Languages";
13870
14265
  readonly projectPlugins: "Plugins";
13871
14266
  readonly saveFields: "Save fields";
@@ -13964,9 +14359,9 @@ declare const en: {
13964
14359
  readonly statusReviewed: "Now reviewed";
13965
14360
  };
13966
14361
  readonly localizationKeys: {
13967
- readonly added: "Named string added";
13968
- readonly removed: "Named string removed";
13969
- readonly changed: "Named string changed";
14362
+ readonly added: "Translation key added";
14363
+ readonly removed: "Translation key removed";
14364
+ readonly changed: "Translation key changed";
13970
14365
  };
13971
14366
  readonly uiDocument: {
13972
14367
  readonly renamed: "Interface renamed";
@@ -14062,7 +14457,7 @@ declare const en: {
14062
14457
  readonly added: "Track added";
14063
14458
  readonly removed: "Track removed";
14064
14459
  readonly renamed: "Renamed";
14065
- readonly rerouted: "Routes into a different bus";
14460
+ readonly rerouted: "Routes into a different track";
14066
14461
  readonly reroutedToMaster: "Routes into the master output";
14067
14462
  readonly volume: "Volume changed";
14068
14463
  readonly loopOn: "Loops by default";
@@ -14077,7 +14472,7 @@ declare const en: {
14077
14472
  readonly defaultValue: "Default value changed";
14078
14473
  readonly valueType: "Type changed";
14079
14474
  readonly scopeSaved: "Now a saved variable";
14080
- readonly scopeGlobal: "Now a global variable";
14475
+ readonly scopeGlobal: "Now a persistent variable";
14081
14476
  readonly storageKey: "Values already saved are no longer found";
14082
14477
  readonly description: "Note changed";
14083
14478
  readonly changed: "Variable changed";
@@ -14639,6 +15034,7 @@ declare const en: {
14639
15034
  readonly quality: "Checks";
14640
15035
  readonly version: "Versions";
14641
15036
  readonly ship: "Shipping";
15037
+ readonly checks: "Check rules";
14642
15038
  };
14643
15039
  readonly ui: {
14644
15040
  readonly title: "Help";
@@ -14675,7 +15071,7 @@ declare const en: {
14675
15071
  readonly body: string;
14676
15072
  };
14677
15073
  readonly keyboard: {
14678
- readonly title: "Keyboard";
15074
+ readonly title: "Keyboard and Mouse";
14679
15075
  readonly body: string;
14680
15076
  };
14681
15077
  readonly search: {
@@ -14718,6 +15114,10 @@ declare const en: {
14718
15114
  readonly title: "Editing outside Studio";
14719
15115
  readonly body: string;
14720
15116
  };
15117
+ readonly storyPaste: {
15118
+ readonly title: "Paste as Rows";
15119
+ readonly body: string;
15120
+ };
14721
15121
  readonly sceneSnapshot: {
14722
15122
  readonly title: "Playing from a row";
14723
15123
  readonly body: string;
@@ -14731,7 +15131,7 @@ declare const en: {
14731
15131
  readonly body: string;
14732
15132
  };
14733
15133
  readonly storyMotion: {
14734
- readonly title: "Motion";
15134
+ readonly title: "Story Motion";
14735
15135
  readonly body: string;
14736
15136
  };
14737
15137
  readonly assets: {
@@ -15086,6 +15486,8 @@ declare const en: {
15086
15486
  readonly storyStarted: "Load Save: \"{id}\" was written in another of the project's stories, which was started to receive it.";
15087
15487
  readonly relaunchedRow: "Load Save: \"{id}\" was written by another build. The story was started again on the line the save records.";
15088
15488
  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.";
15489
+ 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.";
15490
+ 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
15491
  readonly detail: {
15090
15492
  readonly unreadable: "The save could not be read. {error}";
15091
15493
  readonly missing: "No save is stored under that id.";
@@ -15436,14 +15838,25 @@ export type SearchJumpTarget = {
15436
15838
  } | {
15437
15839
  kind: "character";
15438
15840
  characterId: string;
15439
- } | {
15841
+ }
15842
+ /**
15843
+ * A page or a stage layer. With `elementId`, the widget on it to select once its editor opens - an
15844
+ * optional field rather than a variant of its own, so every consumer that opens the page keeps
15845
+ * opening it and only the ones that can say which widget say so.
15846
+ */
15847
+ | {
15440
15848
  kind: "uiSurface";
15441
15849
  surfaceId: string;
15850
+ elementId?: string;
15442
15851
  }
15443
- /** A component definition: its own editor tab, the one the component library opens. */
15852
+ /**
15853
+ * A component definition: its own editor tab, the one the component library opens. With
15854
+ * `elementId`, the widget inside the definition to select, as for a page.
15855
+ */
15444
15856
  | {
15445
15857
  kind: "uiComponent";
15446
15858
  componentId: string;
15859
+ elementId?: string;
15447
15860
  } | {
15448
15861
  kind: "asset";
15449
15862
  assetId: string;
@@ -15469,21 +15882,72 @@ export type SearchJumpTarget = {
15469
15882
  focusEventId?: string;
15470
15883
  focusFunctionId?: string;
15471
15884
  focusNodeId?: string;
15472
- } | {
15885
+ }
15886
+ /**
15887
+ * A named string: its row in a translation table, which is the one place its words are edited.
15888
+ * Opens the table of the project's first translated language; a project with none has no table,
15889
+ * and the jump shows the Localization panel instead, where a language is added.
15890
+ */
15891
+ | {
15473
15892
  kind: "localizationKey";
15474
15893
  keyName: string;
15475
15894
  }
15476
15895
  /**
15477
- * A project-level story variable — the panel that owns it, since no row declares one.
15478
- *
15479
- * Carries the identity even though the jump can only reveal the panel today, for the reason
15480
- * `localizationKey` carries its key: the target says what it points at, and the day the panel can
15481
- * be told which row to reveal, nothing that produces one of these has to change.
15896
+ * A project-level story variable: its row in the Variables panel, selected and scrolled into view.
15897
+ * `variableId` is the registry entry's id, or the declaration row's for one a story declares.
15482
15898
  */
15483
15899
  | {
15484
15900
  kind: "storyVariable";
15485
15901
  scope: "saved" | "persistent";
15486
15902
  variableId: string;
15903
+ }
15904
+ /**
15905
+ * A translation table - one language's - and, with `unitId`, the row of one translation unit in
15906
+ * it, scrolled into view and marked.
15907
+ *
15908
+ * The table lists one source at a time, so a row is found under the source it belongs to:
15909
+ * `storyId` for a story's lines and scene names, absent for the interface's words, the named keys
15910
+ * and the plugins' words. A character's name heads every story's rows and needs neither.
15911
+ */
15912
+ | {
15913
+ kind: "translation";
15914
+ locale: string;
15915
+ unitId?: string;
15916
+ storyId?: string;
15917
+ }
15918
+ /**
15919
+ * A voice table - one voiced language's - and, with `unitId` (a line's text id), that line's row,
15920
+ * where its take is linked. `storyId` names the story the line is in; without it the table looks
15921
+ * the line up itself.
15922
+ */
15923
+ | {
15924
+ kind: "voiceLine";
15925
+ locale: string;
15926
+ unitId?: string;
15927
+ storyId?: string;
15928
+ }
15929
+ /** A story motion, open in its own editor. */
15930
+ | {
15931
+ kind: "storyMotion";
15932
+ animationId: string;
15933
+ }
15934
+ /**
15935
+ * A page of Project settings - the panel's sub-pages - and, with `part`, the part of it to scroll
15936
+ * into view: `fonts` is the project's font stack on the Design page.
15937
+ */
15938
+ | {
15939
+ kind: "projectPage";
15940
+ page: "app" | "game" | "design" | "project" | "runtimes" | "settings";
15941
+ part?: "fonts";
15942
+ }
15943
+ /**
15944
+ * A story's own row in the Story panel's list, selected and scrolled into view - the place a story
15945
+ * is renamed or deleted, and the one way into a story whose document cannot be opened.
15946
+ */
15947
+ | {
15948
+ kind: "storyEntry";
15949
+ storyId: string;
15950
+ storyName: string;
15487
15951
  };
15488
15952
  type ModelBundleFormat = "live2d-cubism4" | "live2d-cubism2" | "spine-binary" | "spine-json" | "unknown";
15489
15953
  export declare enum AssetType {
@@ -16519,6 +16983,23 @@ type SelectionState = {
16519
16983
  type: "storyBlock";
16520
16984
  data: StoryBlockSelection;
16521
16985
  };
16986
+ type UITextMigrationChangeKind = "marksKept" | "bindingDropped" | "missingKey" | "keyDiffered";
16987
+ type UITextMigrationChange = {
16988
+ kind: UITextMigrationChangeKind;
16989
+ elementId: string;
16990
+ /** The prop the words are in (`text`, `label`, `placeholder`). */
16991
+ prop: string;
16992
+ /** The key the element named. */
16993
+ keyName: string;
16994
+ /** Where the element is: a page, or a component definition. Absent for an element on neither. */
16995
+ surfaceId?: string;
16996
+ componentId?: string;
16997
+ };
16998
+ type UITextCarriedKeys = Record<string, {
16999
+ words: string;
17000
+ translations?: Record<string, LocalizationUnit>;
17001
+ }>;
17002
+ type CarriedTranslations = Record<LocaleCode, Record<string, LocalizationUnit>>;
16522
17003
  type LiveUIComponentShell = Omit<UIComponentDefinition, "elements">;
16523
17004
  type LiveUIParts = {
16524
17005
  /** Records of the shared element map. */
@@ -16604,6 +17085,20 @@ type UIEditorClipboardPayload = {
16604
17085
  source?: UIEditorClipboardSource;
16605
17086
  /** Absent when the copied selection references no importable file. */
16606
17087
  assets?: UIEditorClipboardAssets;
17088
+ /**
17089
+ * The words and translations of the translation keys the copied widgets name, filled when the copy
17090
+ * is published for other windows. A project that lacks one of the keys receives its words on the
17091
+ * widgets instead (`settleIncomingUITextSources`); absent on an in-window copy, whose project
17092
+ * has every key it names.
17093
+ */
17094
+ textKeys?: UITextCarriedKeys;
17095
+ /**
17096
+ * What every language of the copying project says about the words the copied widgets write
17097
+ * directly, by unit id under the originals' ids (`listUITextOwnUnits`). Filled when the copy is
17098
+ * published; the paste writes them under the copies' ids. A paste without them - an in-window copy
17099
+ * not yet published, a duplicate - reads the originals' translations from the project itself.
17100
+ */
17101
+ translations?: CarriedTranslations;
16607
17102
  sourceSurfaceId: string;
16608
17103
  /** Top-level roots in the copied selection (original ids). */
16609
17104
  topLevelElementIds: UIElementId[];
@@ -16644,6 +17139,18 @@ type ImportTemplateBundleInput = {
16644
17139
  graphs: unknown;
16645
17140
  placement: ImportTemplatePlacement;
16646
17141
  assetIdMap?: Record<string, string>;
17142
+ /**
17143
+ * The words, and translations, of the keys the document's widgets name - for the ones this
17144
+ * project lacks, which arrive holding those words themselves (`settleIncomingUITextSources`).
17145
+ */
17146
+ textKeys?: UITextCarriedKeys;
17147
+ /**
17148
+ * What every language says about the words the document's widgets write directly, by unit id
17149
+ * under the ids the widgets have in `document` - a page copied in another window brings them.
17150
+ * Without it, widgets whose ids this project already translates (a page copied in this window)
17151
+ * take those translations.
17152
+ */
17153
+ translations?: CarriedTranslations;
16647
17154
  };
16648
17155
  declare class UIDocumentService extends Service<UIDocumentService> implements IUIDocumentService {
16649
17156
  private document;
@@ -16657,6 +17164,8 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16657
17164
  private opSink;
16658
17165
  private historySuppressionDepth;
16659
17166
  private readonly contentRevisions;
17167
+ /** What the v13 step changed that an author can see, until the workspace has said so. */
17168
+ private textSourceMigrationChanges;
16660
17169
  protected init(ctx: WorkspaceContext, depend: (services: Service[]) => Promise<void>): Promise<void>;
16661
17170
  getDocument(): UIDocument;
16662
17171
  /**
@@ -16739,6 +17248,60 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16739
17248
  }): void;
16740
17249
  updateElementLayouts(layoutPatches: Record<string, Partial<UILayout>>): void;
16741
17250
  updateElementProps(elementId: string, propsPatch: Record<string, unknown>): void;
17251
+ /**
17252
+ * Every widget that reads its words from `keyName`, turned into one that holds `words` itself.
17253
+ *
17254
+ * What removing a key does to the widgets that use it: each keeps showing what it showed, and none
17255
+ * is left naming a key the project no longer has. Component definitions' widgets are included; an
17256
+ * instance holds none of its definition's words, but a text parameter's value it reads from the key
17257
+ * becomes the key's words, given directly (prop `param.<paramId>`). One change to the document,
17258
+ * outside any page's undo history, like the removal of the key it goes with. Returns each site it
17259
+ * converted, for the translations that go with the words (`ui:<elementId>.<prop>`).
17260
+ */
17261
+ giveKeyedWidgetsTheirWords(keyName: string, words: string): {
17262
+ elementId: string;
17263
+ prop: string;
17264
+ }[];
17265
+ /**
17266
+ * Whether this project has a named key, for settling elements that arrive from elsewhere. A key
17267
+ * registry that has not been read answers yes for every key, so nothing is converted on a guess.
17268
+ */
17269
+ private readonly hasTextKey;
17270
+ /**
17271
+ * The translations of the keys arriving widgets were turned away from, filed under the widgets'
17272
+ * own units in this project's languages. `converted` carries the widgets' ids in this document.
17273
+ *
17274
+ * In the background: a language's library may still have to be read, and the elements have
17275
+ * arrived already. A language the keys came with no translation for gets none.
17276
+ */
17277
+ private adoptArrivingTranslations;
17278
+ /**
17279
+ * Give copied widgets the translations their originals' own words have, under the copies' ids.
17280
+ *
17281
+ * A widget's own words are translated through a unit named after the widget, so a copy - pasted,
17282
+ * duplicated, inside a duplicated page or component - would otherwise arrive translated in no
17283
+ * language. `table` is the arriving elements under their old ids, `idMap` what each became; `skip`
17284
+ * are the sites whose words came from a key this project lacks, which bring the key's translations
17285
+ * instead (`adoptArrivingTranslations`). `extra` are units owned by something other than an element
17286
+ * - a copied component's parameter defaults - already re-keyed, old id to new.
17287
+ *
17288
+ * `carried` is what a clipboard brought with it, which is what a paste from another project has
17289
+ * to go on, and a copy as it was when it was made. Without it the originals are this project's own
17290
+ * and their translations are read from its documents. Either way only languages this project
17291
+ * declares are written, a review is not inherited, and the write is not part of the paste's undo
17292
+ * step (`carriedTranslations.ts`).
17293
+ */
17294
+ private carryCopiedTranslations;
17295
+ /**
17296
+ * The changes the v13 step made on opening this document that an author can see, handed over
17297
+ * once: the workspace tells the author about them in one notice, and a second ask is empty.
17298
+ */
17299
+ takeTextSourceMigrationChanges(): UITextMigrationChange[];
17300
+ /**
17301
+ * The words a widget inserted into this project is given: in the project's source language, the
17302
+ * language its game is written in (`widgetDefaultWordsFor`).
17303
+ */
17304
+ private widgetDefaultWords;
16742
17305
  /** A fresh id for something this document will own. */
16743
17306
  generateId(): string;
16744
17307
  /**
@@ -16812,6 +17375,17 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16812
17375
  blueprintId: string;
16813
17376
  };
16814
17377
  clearElementBlueprintValueBinding(elementId: string, propPath: string): void;
17378
+ /**
17379
+ * Close the editor tabs showing a value blueprint that clearing its binding has just removed.
17380
+ *
17381
+ * The blueprint is the binding's own - minted for this element's prop and named for it - but the
17382
+ * author writes their logic into it, so its removal is one step on the page's undo history above,
17383
+ * blueprint included. A tab left open on it said only that the blueprint could not be found, and
17384
+ * while it stayed the active editor the inspector's Ctrl+Z went to its stack instead of the page's,
17385
+ * so the step that would bring the logic back was out of reach from where the author was. Closed,
17386
+ * the page the binding belongs to is the editor the inspector edits again.
17387
+ */
17388
+ private closeTabsShowingBlueprint;
16815
17389
  /**
16816
17390
  * How this element arrives and leaves. `null` clears it.
16817
17391
  *
@@ -16834,6 +17408,22 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16834
17408
  * reparents an inner one that may be in the same batch.
16835
17409
  */
16836
17410
  ungroupContainers(surfaceId: string, containerIds: string[]): string[];
17411
+ /**
17412
+ * Wrap elements in a new group - an invisible container that takes their place - and return the
17413
+ * group's id, or null when they cannot be wrapped (see `planGroupElements` for which can, and
17414
+ * for why nothing on screen moves).
17415
+ *
17416
+ * One mutation, so Undo puts the tree back as it was in one step.
17417
+ */
17418
+ groupElements(surfaceId: string, elementIds: readonly string[]): string | null;
17419
+ /**
17420
+ * Rename one layer.
17421
+ *
17422
+ * A linked component instance renames like any other layer: its name is copied from the
17423
+ * definition once, when the instance is placed, and is the instance's own from then on - it is
17424
+ * how the outline tells "save slot 1" from "save slot 2". Props and shape are what the definition
17425
+ * owns, and their own setters still refuse them on an instance.
17426
+ */
16837
17427
  renameElement(elementId: string, name: string): void;
16838
17428
  deleteElements(elementIds: string[]): void;
16839
17429
  /**
@@ -16870,6 +17460,22 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
16870
17460
  private getCommonSurfaceIdForElements;
16871
17461
  private filterLinkedComponentLayoutPatch;
16872
17462
  private migrateIfNeeded;
17463
+ /**
17464
+ * The v13 step, for the project's own document as it is opened (`textSourceMigration.ts`).
17465
+ *
17466
+ * Not part of {@link migrateIfNeeded}, which is also how a template or a page copied from another
17467
+ * project comes in: this step reads the project's key registry and translation files, and the
17468
+ * translation edits it makes are written here, through the localization service, before the
17469
+ * document itself is saved by `load`. Written first so that a document still at v12 on disk -
17470
+ * its own save failed - is migrated again on the next open, and the edits are such that applying
17471
+ * them twice changes nothing.
17472
+ *
17473
+ * A key registry or a language file that cannot be read stops the open rather than being read
17474
+ * as empty: an element whose key could not be found is turned into one that holds its own words,
17475
+ * and a registry that is merely unreadable today would turn every keyed element in the project
17476
+ * into one, for good.
17477
+ */
17478
+ private migrateTextSources;
16873
17479
  /**
16874
17480
  * Every `nl.image` written in the shape that came before `imageFill`, rewritten into it.
16875
17481
  *
@@ -17058,11 +17664,38 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17058
17664
  * deletion, and sweeping would make that a data loss with no warning.
17059
17665
  */
17060
17666
  setComponentParams(componentId: string, params: UIComponentParam[]): void;
17061
- /** Set one param value on one instance. An empty string is a value, not a reset. */
17667
+ /**
17668
+ * Set one param value on one instance. An empty string is a value, not a reset.
17669
+ *
17670
+ * Words written for a text parameter replace a key the instance named for it: a value holds one
17671
+ * or the other (`UIComponentLink.paramKeys`).
17672
+ */
17062
17673
  setComponentInstanceParam(elementId: string, paramId: string, value: string): void;
17674
+ /**
17675
+ * Name the translation key one instance's text parameter is read from, or (`null`) name none.
17676
+ *
17677
+ * Naming a key removes the words the instance held for the parameter - a value holds one source -
17678
+ * and naming none leaves the parameter with neither, which falls back to the definition's default.
17679
+ */
17680
+ setComponentInstanceParamKey(elementId: string, paramId: string, keyName: string | null): void;
17063
17681
  deleteComponents(componentIds: string[]): void;
17064
17682
  duplicateComponent(componentId: string): UIComponentDefinition | null;
17065
17683
  updateComponentElementLayout(componentId: string, elementId: string, layoutPatch: Partial<UILayout>): void;
17684
+ /**
17685
+ * Bind one prop of one element of a component definition to a field of its list row or to a text
17686
+ * parameter of the component - the two value bindings that need no blueprint - or (`null`) unbind
17687
+ * it. A definition's elements take no Blueprint Value (`ComponentDocumentServiceAdapter`), so there
17688
+ * is no blueprint to clear on the way.
17689
+ */
17690
+ setComponentElementValueBinding(componentId: string, elementId: string, propPath: string, binding: Extract<UIElementValueBinding, {
17691
+ kind: "listItemField" | "componentParam";
17692
+ }> | null): void;
17693
+ /**
17694
+ * Show one of a component's text parameters in the words of an element of its definition, or
17695
+ * (`null`) stop showing one. The component is the one whose definition holds the element; an
17696
+ * element on a page has no parameters to show and is left alone.
17697
+ */
17698
+ setElementComponentParamBinding(elementId: string, propPath: string, paramId: string | null): void;
17066
17699
  updateComponentElementProps(componentId: string, elementId: string, propsPatch: Record<string, unknown>): void;
17067
17700
  updateComponentElementAnimation(componentId: string, elementId: string, animation: UIPageAnimationSettings | null): void;
17068
17701
  updateComponentElementExtra(componentId: string, elementId: string, extraPatch: Record<string, unknown>): void;
@@ -17070,8 +17703,18 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17070
17703
  reorderComponentChildren(componentId: string, parentId: string, orderedChildIds: string[]): void;
17071
17704
  deleteComponentElements(componentId: string, elementIds: string[]): void;
17072
17705
  moveComponentElements(componentId: string, elementIds: string[], targetParentId: string, beforeChildId: string | null): MoveUiElementsResult;
17706
+ /**
17707
+ * `ungroupContainers` for a component definition's elements, over a document made of the
17708
+ * component alone. Returns the ids that were lifted out.
17709
+ */
17710
+ ungroupComponentContainers(componentId: string, containerIds: readonly string[]): string[];
17711
+ /**
17712
+ * `groupElements` for a component definition's elements: the same plan, read and applied over a
17713
+ * document made of the component alone, as `moveComponentElements` does.
17714
+ */
17715
+ groupComponentElements(componentId: string, elementIds: readonly string[]): string | null;
17073
17716
  createComponentElement(componentId: string, parentId: string, type: string, layoutPatch?: Partial<UILayout>): UIElement | null;
17074
- pasteComponentClipboardPayload(componentId: string, targetParentId: string, beforeChildId: string | null, payload: UIEditorClipboardPayload): {
17717
+ pasteComponentClipboardPayload(componentId: string, targetParentId: string, beforeChildId: string | null, incoming: UIEditorClipboardPayload): {
17075
17718
  ok: true;
17076
17719
  newRootIds: string[];
17077
17720
  } | {
@@ -17081,7 +17724,7 @@ declare class UIDocumentService extends Service<UIDocumentService> implements IU
17081
17724
  createComponentInstance(parentId: string, componentId: string, layoutPatch?: Partial<UILayout>): UIElement;
17082
17725
  unlinkComponentInstance(elementId: string): string[];
17083
17726
  createElement(parentId: string, type: string, layoutPatch?: Partial<UILayout>): UIElement;
17084
- pasteClipboardPayload(surfaceId: string, targetParentId: string, beforeChildId: string | null, payload: UIEditorClipboardPayload): {
17727
+ pasteClipboardPayload(surfaceId: string, targetParentId: string, beforeChildId: string | null, incoming: UIEditorClipboardPayload): {
17085
17728
  ok: true;
17086
17729
  newRootIds: string[];
17087
17730
  } | {
@@ -17182,18 +17825,29 @@ type WidgetLogicWritablePropDef = {
17182
17825
  export type WidgetLogicApi = {
17183
17826
  supportsPrivateBlueprint: boolean;
17184
17827
  blueprintLabel?: string;
17828
+ /**
17829
+ * The events a private blueprint on this widget can be started by. Every entry is load-bearing:
17830
+ * the node palette, graph validation, the dispatcher and `ui.js widget` all read this list, so an
17831
+ * event belongs here only once the runtime raises it and a head node for it is registered.
17832
+ */
17185
17833
  events: readonly WidgetLogicEventDef[];
17834
+ /**
17835
+ * `commands`, `readableState` and `writableProps` describe the widget to a reader - `ui.js
17836
+ * widget` prints them - and nothing executes them: no blueprint node looks a widget up in these
17837
+ * lists. What a graph can actually do to a widget is in the node catalogue.
17838
+ */
17186
17839
  commands: readonly WidgetLogicCommandDef[];
17187
17840
  readableState: readonly WidgetLogicReadableStateDef[];
17188
17841
  writableProps: readonly WidgetLogicWritablePropDef[];
17189
17842
  /**
17190
17843
  * Whether the player operates this widget directly - a Button, a Switch, a Slider, a Text Input,
17191
17844
  * a list they pick a row from. Scenery (Container, Text, Image, Video, Model, the page host)
17192
- * leaves it unset.
17845
+ * leaves it unset. A Video with its native controls showing is operable too, but that is a prop
17846
+ * on the instance, so `isOperableHitElement` in `surfaceInputActions.ts` answers it there.
17193
17847
  *
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
17848
+ * Declared rather than derived, and the retreat is deliberate. A panel-wide gesture stands down
17849
+ * over a control (`pointerInputClaimedByControl` in `surfaceInputActions.ts`), so something has
17850
+ * to answer "is this a control", and the tempting derivation - "declares an interaction event beyond the
17197
17851
  * shared displayable set" - is wrong at both ends: `nl.button` declares exactly the displayable
17198
17852
  * set, and `nl.frame` declares `pageEvent`. Nothing else in an entry separates a Button from a
17199
17853
  * Container, because what makes a Button a control is how the runtime draws and handles it, not
@@ -17216,6 +17870,12 @@ export interface ContextMenuItemDef {
17216
17870
  * than in the label keeps a disabled menu a menu instead of a paragraph.
17217
17871
  */
17218
17872
  tooltip?: string;
17873
+ /**
17874
+ * The chord that runs the same command, already formatted for this platform (callers resolve it
17875
+ * through `useShortcutLabels`, so a rebound key shows rebound). Printed at the right of the row:
17876
+ * a menu that names a command without its key is the reason the key stays undiscovered.
17877
+ */
17878
+ shortcut?: string;
17219
17879
  onClick?: () => void;
17220
17880
  submenu?: ContextMenuItemDef[];
17221
17881
  /**
@@ -18474,6 +19134,12 @@ export type StoryPluginActionRegistration = {
18474
19134
  detail?: string;
18475
19135
  group?: string;
18476
19136
  createBlock: (input: StoryPluginActionCreateInput) => StoryBlock;
19137
+ /**
19138
+ * The text a committed row of this action reads as, from the params the row carries; `label`
19139
+ * when absent, or when it returns nothing. A row's params are otherwise invisible in the scene
19140
+ * editor, so an action whose params change what the row does says what they are here.
19141
+ */
19142
+ describe?: (params: Record<string, unknown>) => string | null | undefined;
18477
19143
  };
18478
19144
  declare const HELP_TOPIC_IDS: readonly [
18479
19145
  "gettingHelp",
@@ -18490,6 +19156,7 @@ declare const HELP_TOPIC_IDS: readonly [
18490
19156
  "storyExpressions",
18491
19157
  "storyFlow",
18492
19158
  "storyScript",
19159
+ "storyPaste",
18493
19160
  "sceneSnapshot",
18494
19161
  "storyMotion",
18495
19162
  "dictionary",
@@ -18547,7 +19214,9 @@ declare const HELP_TOPIC_IDS: readonly [
18547
19214
  "screenEffects",
18548
19215
  "plugins"
18549
19216
  ];
18550
- type HelpTopicId = (typeof HELP_TOPIC_IDS)[number];
19217
+ type StaticHelpTopicId = (typeof HELP_TOPIC_IDS)[number];
19218
+ type LintRuleHelpTopicId = `lintRule.${string}`;
19219
+ type HelpTopicId = StaticHelpTopicId | LintRuleHelpTopicId;
18551
19220
  interface PanelComponentProps<TPayload = any> {
18552
19221
  panelId: string;
18553
19222
  payload?: TPayload;
@@ -18927,6 +19596,31 @@ export interface StoryCompilePass {
18927
19596
  /** Called once per scene, before that scene's rows are compiled. */
18928
19597
  scene(ctx: SceneCompileContext): void;
18929
19598
  }
19599
+ /** What a plugin story action's `run` receives. */
19600
+ export type RuntimeStoryActionContext = {
19601
+ /** The params the row carries: whatever the studio entry's `createBlock` wrote. */
19602
+ params: Record<string, unknown>;
19603
+ /**
19604
+ * Aborted when the row is cancelled: the player rolls back past it, or loads a save, while it is
19605
+ * still running. Tear down whatever `run` put on screen and stop; nothing it does after this
19606
+ * reaches the story.
19607
+ */
19608
+ signal: AbortSignal;
19609
+ /** The very same object `setup(app)` received as `app.game`. */
19610
+ game: RuntimePluginGame;
19611
+ };
19612
+ /**
19613
+ * The game-side half of a plugin story action.
19614
+ *
19615
+ * `run` may be async, and the story waits for it: the next row starts once the promise settles. A
19616
+ * save taken while it runs replays the row on load, so `run` must be able to start again from
19617
+ * nothing. A throw is logged and the story carries on.
19618
+ */
19619
+ export type RuntimeStoryActionDef = {
19620
+ /** The same id the studio entry registered the action under, prefixed with the plugin id. */
19621
+ id: string;
19622
+ run(ctx: RuntimeStoryActionContext): void | Promise<void>;
19623
+ };
18930
19624
  /**
18931
19625
  * The detail on `nl.launch`: where this page sits on the launch's own timeline.
18932
19626
  *
@@ -19385,6 +20079,13 @@ export type RuntimePluginLocale = {
19385
20079
  * added after the plugin was installed. `null` when the project declares no such key.
19386
20080
  */
19387
20081
  text(key: string): string | null;
20082
+ /**
20083
+ * Words this plugin wrote directly and offered for translation from its studio entry
20084
+ * (`app.services.localization.registerWords`), in the language the game is running in: the
20085
+ * translation of the unit `id` names along the language's fallback chain, else `text` - the words
20086
+ * as written, which the plugin passes because the game carries translations and not source words.
20087
+ */
20088
+ words(id: string, text: string): string;
19388
20089
  };
19389
20090
  /**
19390
20091
  * `menu` - the whole menu bar above the game, declared at once.
@@ -19521,7 +20222,7 @@ export type RuntimePluginStory = {
19521
20222
  /**
19522
20223
  * The game-side plugin surface.
19523
20224
  *
19524
- * Everything below the always-present five is **capability-gated**: a domain the
20225
+ * Everything below the always-present six is **capability-gated**: a domain the
19525
20226
  * manifest did not declare is *absent from this object*, not a method that
19526
20227
  * throws. That is the whole contract — the install prompt lists exactly the
19527
20228
  * domains present here, so what the user approved and what the plugin can do are
@@ -19536,6 +20237,18 @@ export type RuntimePluginGame = {
19536
20237
  register(def: RuntimeWidgetRendererDef): void;
19537
20238
  registerMany(defs: RuntimeWidgetRendererDef[]): void;
19538
20239
  };
20240
+ /**
20241
+ * What runs when the story reaches a row one of this plugin's story actions inserted. The id is
20242
+ * the one the studio entry registered the action under; the story waits on the row until `run`
20243
+ * settles. See {@link RuntimeStoryActionDef}.
20244
+ *
20245
+ * Always present, like `blueprintNodes`: a runner only ever runs on a row the author placed, and
20246
+ * only on this plugin's own rows, so it grants nothing an install prompt would have to name.
20247
+ */
20248
+ storyActions: {
20249
+ register(def: RuntimeStoryActionDef): void;
20250
+ registerMany(defs: RuntimeStoryActionDef[]): void;
20251
+ };
19539
20252
  /**
19540
20253
  * Read-only access to plugin storage published with the game, for the
19541
20254
  * namespaces declared in `contributes.runtimeData`. Synchronous: the
@@ -20267,6 +20980,22 @@ export type FreezeGuard = {
20267
20980
  run<A extends unknown[], R>(handler: (...args: A) => R): (...args: A) => R | undefined;
20268
20981
  };
20269
20982
  declare function useFreezeGuard(scope?: string | readonly string[]): FreezeGuard;
20983
+ type WordsSourceValue = {
20984
+ /** The words written directly; with a key, what shows if the key is not in the running game. */
20985
+ text: string;
20986
+ /** The translation key the words are read from, or null for words written directly. */
20987
+ key: string | null;
20988
+ };
20989
+ type WordsSourceFieldProps = {
20990
+ value: WordsSourceValue;
20991
+ onChange: (next: WordsSourceValue) => void;
20992
+ /** Words over several lines; one line when absent. */
20993
+ multiline?: boolean;
20994
+ disabled?: boolean;
20995
+ /** Resets the box's draft when it changes - the id of whatever the words belong to. */
20996
+ draftResetKey?: string;
20997
+ };
20998
+ declare function WordsSourceField({ value, onChange, multiline, disabled, draftResetKey }: WordsSourceFieldProps): React$1.ReactElement;
20270
20999
  type DivProps = React$1.HTMLAttributes<HTMLDivElement>;
20271
21000
  declare function PluginAssetSelector(props: AssetSelectorProps): React$1.JSX.Element | null;
20272
21001
  export type PluginPanelRootProps = DivProps & {
@@ -20355,6 +21084,14 @@ declare const pluginUi: Readonly<{
20355
21084
  CardFooter: typeof CardFooter;
20356
21085
  InteractiveCard: typeof InteractiveCard;
20357
21086
  AssetSelector: typeof PluginAssetSelector;
21087
+ /**
21088
+ * Words a player reads, written directly or read from one of the project's translation keys - the
21089
+ * same choice, key list and in-place key editing as Studio's own text and button labels. Controlled:
21090
+ * `value` is `{ text, key }` with `key` null for words written directly, and `onChange` is
21091
+ * handed the next one. Words written directly are translated when the plugin offers them with
21092
+ * `app.services.localization.registerWords`; words read from a key are translated as the key.
21093
+ */
21094
+ WordsField: typeof WordsSourceField;
20358
21095
  Panel: Readonly<{
20359
21096
  Root: typeof PluginPanelRoot;
20360
21097
  Header: typeof PluginPanelHeader;
@@ -20453,6 +21190,7 @@ export declare const ui: Readonly<{
20453
21190
  CardFooter: typeof CardFooter;
20454
21191
  InteractiveCard: typeof InteractiveCard;
20455
21192
  AssetSelector: typeof PluginAssetSelector;
21193
+ WordsField: typeof WordsSourceField;
20456
21194
  Panel: Readonly<{
20457
21195
  Root: typeof PluginPanelRoot;
20458
21196
  Header: typeof PluginPanelHeader;
@@ -20634,7 +21372,7 @@ export type PluginAssetsService = {
20634
21372
  revokeObjectUrl(url: string): void;
20635
21373
  };
20636
21374
  /** An active editor locale code (built-in like "en"/"zh", or a plugin-provided locale). */
20637
- export type LocaleCode = string;
21375
+ type LocaleCode$1 = string;
20638
21376
  /**
20639
21377
  * A plugin's own message tables: `locale code -> (message key -> string)`. This
20640
21378
  * is the plugin's private catalog, unrelated to Studio's own translations.
@@ -20654,7 +21392,7 @@ export type PluginMessageBundle = {
20654
21392
  * {@link PluginI18n.onLocaleChange} to re-render on a language switch.
20655
21393
  */
20656
21394
  export type PluginTranslator = {
20657
- readonly locale: LocaleCode;
21395
+ readonly locale: LocaleCode$1;
20658
21396
  t(key: string, params?: Record<string, string | number>): string;
20659
21397
  };
20660
21398
  /**
@@ -20664,14 +21402,14 @@ export type PluginTranslator = {
20664
21402
  */
20665
21403
  export type PluginI18n = {
20666
21404
  /** The editor's active locale code. */
20667
- readonly locale: LocaleCode;
21405
+ readonly locale: LocaleCode$1;
20668
21406
  /**
20669
21407
  * Subscribe to editor-language changes. The listener fires with the new
20670
21408
  * locale code whenever the active editor language changes. Returns a
20671
21409
  * {@link PluginCleanup} (also tracked by the host, so it is reclaimed on
20672
21410
  * unload even if you forget to call it).
20673
21411
  */
20674
- onLocaleChange(listener: (locale: LocaleCode) => void): PluginCleanup;
21412
+ onLocaleChange(listener: (locale: LocaleCode$1) => void): PluginCleanup;
20675
21413
  /** Locale-aware number formatting bound to the editor's active locale. */
20676
21414
  formatNumber(value: number, options?: Intl.NumberFormatOptions): string;
20677
21415
  /** Locale-aware date formatting bound to the editor's active locale. */
@@ -20751,15 +21489,45 @@ export type PluginInterfaceService = {
20751
21489
  listGlobalFns(): PluginBlueprintFnEntry[];
20752
21490
  };
20753
21491
  /**
20754
- * The project's own localization keys, read-only.
21492
+ * One of the words a plugin puts in front of a player, offered for translation.
20755
21493
  *
20756
- * A plugin that puts words in front of a player writes them as keys through this list rather than
20757
- * as literals, so they travel with everything else the project translates. Empty before the keys
20758
- * document has loaded, which is a moment rather than a state - subscribe through
20759
- * `services.workspace.registerReloader` if a panel has to re-read it.
21494
+ * `id` is the plugin's own (letters, digits, and `.` `_` `-` between them) and has to stay the same
21495
+ * while the words are the same thing - a translation is kept against it, so an id made from the words
21496
+ * themselves would lose every translation the moment the author corrected a letter. The translation
21497
+ * unit is `plugin:<pluginId>/<id>`, scoped to the plugin by the host.
21498
+ */
21499
+ export type PluginWordsEntry = {
21500
+ id: string;
21501
+ /** The words, in the project's source language. */
21502
+ text: string;
21503
+ /** Where a player meets them, for a translator: "File › Save". The plugin's name when absent. */
21504
+ context?: string;
21505
+ };
21506
+ /** A plugin's words as they are now, and a way for the host to hear that they changed. */
21507
+ export type PluginWordsSource = {
21508
+ list(): readonly PluginWordsEntry[];
21509
+ subscribe?(listener: () => void): () => void;
21510
+ };
21511
+ /**
21512
+ * The project's own localization keys, read-only, and a place to offer the plugin's own words.
21513
+ *
21514
+ * A plugin that puts words in front of a player either names a key from this list - one of the
21515
+ * project's shared words - or writes them directly and offers them with `registerWords`, so they
21516
+ * travel with everything else the project translates. Empty before the keys document has loaded,
21517
+ * which is a moment rather than a state - subscribe through `services.workspace.registerReloader` if
21518
+ * a panel has to re-read it.
20760
21519
  */
20761
21520
  export type PluginLocalizationService = {
20762
21521
  listKeys(): PluginLocalizationKeyEntry[];
21522
+ /**
21523
+ * Offer the plugin's own words to the project's translation table and exports.
21524
+ *
21525
+ * Each listed entry with a letter in it gets a row under the plugin's name; the runtime entry
21526
+ * reads a word back in the player's language with `app.game.locale.words(id, text)`. List what
21527
+ * the author wrote directly; words read from a key are translated as the key and need no entry.
21528
+ * Call `subscribe`'s listener whenever the list would answer differently.
21529
+ */
21530
+ registerWords(source: PluginWordsSource): PluginCleanup;
20763
21531
  };
20764
21532
  export type PluginServices = {
20765
21533
  storage: PluginStorageService;
@@ -20877,6 +21645,7 @@ export {
20877
21645
  GameSurfaceMountDetail as RuntimePluginSurfaceMountTimelineDetail,
20878
21646
  GameTimelineSpanDetails as RuntimePluginTimelineSpanDetails,
20879
21647
  GameTimelineSpanName as RuntimePluginTimelineSpanName,
21648
+ LocaleCode$1 as LocaleCode,
20880
21649
  SelectOption$1 as SelectOption,
20881
21650
  };
20882
21651