@vestra-player/sdk 1.6.12 → 1.6.14
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/CHANGELOG.md +14 -1
- package/dist/commands.js +21 -12
- package/dist/docs-tree.json.gz +0 -0
- package/dist/plugin/testing.d.ts +3 -2
- package/dist/plugin/testing.js +33 -14
- package/dist/plugin/types.d.ts +11 -8
- package/dist/plugin/ui.js +13 -7
- package/dist/wire.d.ts +7 -0
- package/llms.txt +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.6.14
|
|
4
|
+
|
|
5
|
+
**Who must change: nobody.** A data refresh: `BUILTIN_COMMANDS` lists the built-in capture plugin's commands as the player registers them since its capture tab; no API change, `apiVersion` stays `vestra/1`.
|
|
6
|
+
|
|
7
|
+
- **`BUILTIN_COMMANDS`**: `vestra.capture` has **Video ▸ Snapshot ▸ Capture…** (Alt+S), which opens its sidebar tab; Save/Copy Rendered Frame, Save Current Frame As…, Export Tasks…, the capture formats, Snapshot Settings…, Snapshot Folder… and Open Snapshot Folder left the menu for the command palette, and new palette commands came: Export Clip Range (Ctrl+Shift+E), Save and Copy Video Frame Only, Show Last Capture in Folder, Copy Last Snapshot, Set Clip Start, Set Clip End and Export Last 30 Seconds (Ctrl+Shift+R). A plugin that checks a key or menu path against the table (`vestra-plugin check`, `TestHost`) sees the player's current ones.
|
|
8
|
+
## 1.6.13
|
|
9
|
+
|
|
10
|
+
**Who must change: plugin tests that toggle a column in fullscreen.** In fullscreen `toggle()` now only switches the column on or off (user ruling 2026-11-08); a test that asserted `effective: true` after toggling a column on in fullscreen now sees `effective: false`, `reason: "fullscreen"` (on, revealed by the right edge). Plugin code needs no change; `apiVersion` stays `vestra/1`, and the wire gains one optional field.
|
|
11
|
+
|
|
12
|
+
- **`Panel.toggle` and `PanelSlot.toggle` are a switch, the same in every mode.** Compared with 1.6.11 and older, where turning a column on in fullscreen popped it out, it now only switches it on; 1.6.12's rule (a toggle on a collapsed column popped it out instead of turning it off) is withdrawn. No released player shipped 1.6.12: player 0.7.6, the first with the adjust column, is not released yet. On a column that is on, the toggle turns it off; on one that is off, it turns it on. In fullscreen "on" means the pointer at the right edge reveals the column; the toggle never pops it out (player 0.7.6), and a column switched off while it is out slides in at once. The player's own Adjust and Sidebar buttons, Toggle Sidebar and Alt+1…4 behave the same. `Panel.show` and `PanelSlot.setVisible(true)` still pop a column out in fullscreen, as documented.
|
|
13
|
+
- **Wire**: `layout.set` takes an optional `reveal` (with `visible: true`, `false` switches on without popping out; absent, it reveals as before). `toggle` sends `reveal: false`; older players ignore it and pop the column out as before.
|
|
14
|
+
- **`TestHost`**: `setMainWindow({ fullscreen: true })` collapses the adjust column too, `popSidebar` pops out or collapses both columns (those switched on), and `layout.set` with `reveal: false` in fullscreen leaves a column switched on but collapsed.
|
|
15
|
+
|
|
3
16
|
## 1.6.12
|
|
4
17
|
|
|
5
|
-
**Who must change: nobody.** A behaviour fix of `toggle` in fullscreen, an example fix and a development warning; no new API, `apiVersion` stays `vestra/1`.
|
|
18
|
+
**Who must change: nobody.** Superseded by 1.6.13 for `toggle` in fullscreen: this release's rule is withdrawn, and no released player shipped it. A behaviour fix of `toggle` in fullscreen, an example fix and a development warning; no new API, `apiVersion` stays `vestra/1`.
|
|
6
19
|
|
|
7
20
|
- **`Panel.toggle` and `PanelSlot.toggle` slide a collapsed column out.** In fullscreen a sidebar or adjust column the user wants shown is collapsed at the right edge (`reason: "fullscreen"`). Toggling it then turned it off; it now shows it, which player 0.7.6 answers by sliding the column out, as its own Adjust button and Alt+1…4 do. Toggling a column that is on screen still turns it off. With players before 0.7.6 a show of a collapsed column changes nothing on screen, as before.
|
|
8
21
|
- **[adjust-panel](docs/examples/adjust-panel.md)** declares `events`: without it `plugin.player.state` changes only after the plugin's own calls, so a panel activated before a file was opened stayed disabled at 1×. A new test opens the file after activation. Its presets are four (0.5×, 1×, 1.5×, 2×), which fit the adjust column at its least width. No other example reads `player.state` without `events`.
|
package/dist/commands.js
CHANGED
|
@@ -498,21 +498,10 @@ vestra.video | video.rotate.90 | Video ▸ Rotation ▸ 90°
|
|
|
498
498
|
vestra.video | video.rotate.180 | Video ▸ Rotation ▸ 180°
|
|
499
499
|
vestra.video | video.rotate.270 | Video ▸ Rotation ▸ 270°
|
|
500
500
|
vestra.capture | capture.save | Video ▸ Snapshot ▸ Save Current Frame | Ctrl+E
|
|
501
|
-
vestra.capture | capture.
|
|
501
|
+
vestra.capture | capture.panel | Video ▸ Snapshot ▸ Capture… | Alt+S
|
|
502
502
|
vestra.capture | capture.copy | Video ▸ Snapshot ▸ Copy Current Frame | Ctrl+C
|
|
503
|
-
vestra.capture | capture.saveScreen | Video ▸ Snapshot ▸ Save Rendered Frame | Ctrl+Alt+E
|
|
504
|
-
vestra.capture | capture.saveScreenAs | Video ▸ Snapshot ▸ Save Rendered Frame As…
|
|
505
|
-
vestra.capture | capture.copyScreen | Video ▸ Snapshot ▸ Copy Rendered Frame | Ctrl+Alt+C
|
|
506
503
|
vestra.capture | capture.burst | Video ▸ Snapshot ▸ Burst… | Ctrl+G
|
|
507
504
|
vestra.capture | capture.clip | Video ▸ Snapshot ▸ Export Clip…
|
|
508
|
-
vestra.capture | capture.tasks | Video ▸ Snapshot ▸ Export Tasks…
|
|
509
|
-
vestra.capture | capture.format.png | Video ▸ Snapshot ▸ Capture as PNG
|
|
510
|
-
vestra.capture | capture.format.jpeg | Video ▸ Snapshot ▸ Capture as JPEG
|
|
511
|
-
vestra.capture | capture.format.bmp | Video ▸ Snapshot ▸ Capture as BMP
|
|
512
|
-
vestra.capture | capture.screenSubtitles | Video ▸ Snapshot ▸ Include Subtitles in Rendered Frame
|
|
513
|
-
vestra.capture | capture.settings | Video ▸ Snapshot ▸ Snapshot Settings…
|
|
514
|
-
vestra.capture | capture.folder | Video ▸ Snapshot ▸ Snapshot Folder…
|
|
515
|
-
vestra.capture | capture.openFolder | Video ▸ Snapshot ▸ Open Snapshot Folder
|
|
516
505
|
vestra.video | video.picture | Video ▸ Picture Adjustments…
|
|
517
506
|
vestra.video | video.brightness.down | Video ▸ Brightness -1% | W
|
|
518
507
|
vestra.video | video.brightness.up | Video ▸ Brightness +1% | E
|
|
@@ -605,6 +594,26 @@ host | exit-fullscreen | (Leave Fullscreen)
|
|
|
605
594
|
host | sidebar | (Toggle Sidebar)
|
|
606
595
|
host | palette | (Command Palette) | Ctrl+Shift+P
|
|
607
596
|
host | adjust | (Adjust)
|
|
597
|
+
vestra.capture | capture.clipExport | (Export Clip Range) | Ctrl+Shift+E
|
|
598
|
+
vestra.capture | capture.saveAs | (Save Current Frame As…)
|
|
599
|
+
vestra.capture | capture.saveScreen | (Save Rendered Frame) | Ctrl+Alt+E
|
|
600
|
+
vestra.capture | capture.saveScreenAs | (Save Rendered Frame As…)
|
|
601
|
+
vestra.capture | capture.copyScreen | (Copy Rendered Frame) | Ctrl+Alt+C
|
|
602
|
+
vestra.capture | capture.saveVideo | (Save Video Frame Only)
|
|
603
|
+
vestra.capture | capture.copyVideo | (Copy Video Frame Only)
|
|
604
|
+
vestra.capture | capture.tasks | (Export Tasks…)
|
|
605
|
+
vestra.capture | capture.format.png | (Capture as PNG)
|
|
606
|
+
vestra.capture | capture.format.jpeg | (Capture as JPEG)
|
|
607
|
+
vestra.capture | capture.format.bmp | (Capture as BMP)
|
|
608
|
+
vestra.capture | capture.screenSubtitles | (Include Subtitles in Rendered Frame)
|
|
609
|
+
vestra.capture | capture.settings | (Snapshot Settings…)
|
|
610
|
+
vestra.capture | capture.folder | (Snapshot Folder…)
|
|
611
|
+
vestra.capture | capture.openFolder | (Open Snapshot Folder)
|
|
612
|
+
vestra.capture | capture.revealLast | (Show Last Capture in Folder)
|
|
613
|
+
vestra.capture | capture.copyLast | (Copy Last Snapshot)
|
|
614
|
+
vestra.capture | capture.clipStart | (Set Clip Start)
|
|
615
|
+
vestra.capture | capture.clipEnd | (Set Clip End)
|
|
616
|
+
vestra.capture | capture.last30 | (Export Last 30 Seconds) | Ctrl+Shift+R
|
|
608
617
|
vestra.info | info.brief | (Brief Info) | Shift+Tab
|
|
609
618
|
vestra.playlist | playlist.play | (Play) | Enter, P | panel
|
|
610
619
|
vestra.playlist | playlist.list-add | (Add Files…) | Ctrl+I | panel
|
package/dist/docs-tree.json.gz
CHANGED
|
Binary file
|
package/dist/plugin/testing.d.ts
CHANGED
|
@@ -2396,8 +2396,9 @@ export declare class TestHost implements Transport {
|
|
|
2396
2396
|
}>): void;
|
|
2397
2397
|
/**
|
|
2398
2398
|
* The pointer reached the right edge in fullscreen (`true`) or left the
|
|
2399
|
-
* popped-out
|
|
2400
|
-
* (
|
|
2399
|
+
* popped-out columns (`false`): the attached sidebar and the adjust column
|
|
2400
|
+
* (SDK 1.6.13), those switched on, pop out or collapse (reference §6.3). No
|
|
2401
|
+
* effect outside fullscreen, or on a column switched off or floating.
|
|
2401
2402
|
*
|
|
2402
2403
|
* @capability None.
|
|
2403
2404
|
*
|
package/dist/plugin/testing.js
CHANGED
|
@@ -3005,19 +3005,22 @@ export class TestHost {
|
|
|
3005
3005
|
const entering = patch.fullscreen !== undefined &&
|
|
3006
3006
|
patch.fullscreen !== this.mainWindow.fullscreen;
|
|
3007
3007
|
Object.assign(this.mainWindow, patch);
|
|
3008
|
-
// Like the player (reference §6.3): in fullscreen the attached
|
|
3009
|
-
//
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3008
|
+
// Like the player (reference §6.3): in fullscreen the attached columns
|
|
3009
|
+
// (the sidebar, the adjust column) start collapsed at the right edge;
|
|
3010
|
+
// leaving fullscreen docks them again.
|
|
3011
|
+
for (const column of [this.layout.sidebar, this.layout.adjust]) {
|
|
3012
|
+
if (entering && column && column.preferred && !column.detached) {
|
|
3013
|
+
column.effective = !this.mainWindow.fullscreen;
|
|
3014
|
+
column.reason = this.mainWindow.fullscreen ? "fullscreen" : null;
|
|
3015
|
+
}
|
|
3014
3016
|
}
|
|
3015
3017
|
this.emit("window.state", this.#windowFacts());
|
|
3016
3018
|
}
|
|
3017
3019
|
/**
|
|
3018
3020
|
* The pointer reached the right edge in fullscreen (`true`) or left the
|
|
3019
|
-
* popped-out
|
|
3020
|
-
* (
|
|
3021
|
+
* popped-out columns (`false`): the attached sidebar and the adjust column
|
|
3022
|
+
* (SDK 1.6.13), those switched on, pop out or collapse (reference §6.3). No
|
|
3023
|
+
* effect outside fullscreen, or on a column switched off or floating.
|
|
3021
3024
|
*
|
|
3022
3025
|
* @capability None.
|
|
3023
3026
|
*
|
|
@@ -3036,11 +3039,14 @@ export class TestHost {
|
|
|
3036
3039
|
* @since 1.0.0
|
|
3037
3040
|
*/
|
|
3038
3041
|
popSidebar(popped) {
|
|
3039
|
-
|
|
3040
|
-
if (!this.mainWindow.fullscreen || !sidebar?.preferred || sidebar.detached)
|
|
3042
|
+
if (!this.mainWindow.fullscreen)
|
|
3041
3043
|
return;
|
|
3042
|
-
sidebar.
|
|
3043
|
-
|
|
3044
|
+
for (const column of [this.layout.sidebar, this.layout.adjust]) {
|
|
3045
|
+
if (!column?.preferred || column.detached)
|
|
3046
|
+
continue;
|
|
3047
|
+
column.effective = popped;
|
|
3048
|
+
column.reason = popped ? null : "fullscreen";
|
|
3049
|
+
}
|
|
3044
3050
|
this.emit("window.state", this.#windowFacts());
|
|
3045
3051
|
}
|
|
3046
3052
|
#windowFacts() {
|
|
@@ -4591,9 +4597,22 @@ export class TestHost {
|
|
|
4591
4597
|
state.owner = panel.owner;
|
|
4592
4598
|
}
|
|
4593
4599
|
if (typeof p.visible === "boolean") {
|
|
4600
|
+
const out = state.preferred && state.effective;
|
|
4594
4601
|
state.preferred = p.visible;
|
|
4595
|
-
|
|
4596
|
-
|
|
4602
|
+
// In fullscreen a column switched on by a toggle (`reveal: false`)
|
|
4603
|
+
// stays collapsed at the edge; `show()` and `setVisible` pop it out.
|
|
4604
|
+
const collapsed = p.visible &&
|
|
4605
|
+
p.reveal === false &&
|
|
4606
|
+
slot !== "bottom" &&
|
|
4607
|
+
this.mainWindow.fullscreen &&
|
|
4608
|
+
!state.detached &&
|
|
4609
|
+
!out;
|
|
4610
|
+
state.effective = p.visible && !collapsed;
|
|
4611
|
+
state.reason = !p.visible
|
|
4612
|
+
? "userHidden"
|
|
4613
|
+
: collapsed
|
|
4614
|
+
? "fullscreen"
|
|
4615
|
+
: null;
|
|
4597
4616
|
if (this.panel?.slot === slot)
|
|
4598
4617
|
this.panel.visible = p.visible;
|
|
4599
4618
|
}
|
package/dist/plugin/types.d.ts
CHANGED
|
@@ -2705,9 +2705,10 @@ export interface PanelSlot {
|
|
|
2705
2705
|
*
|
|
2706
2706
|
* @remarks
|
|
2707
2707
|
* Reads the state from the player first, so it is right even without
|
|
2708
|
-
* `events`.
|
|
2709
|
-
*
|
|
2710
|
-
*
|
|
2708
|
+
* `events`. It is a switch, the same in every mode: in fullscreen a column
|
|
2709
|
+
* switched on is revealed by the pointer at the right edge, and is not
|
|
2710
|
+
* popped out by the toggle (SDK 1.6.13, player 0.7.6; `setVisible(true)`
|
|
2711
|
+
* pops it out). Switching it off while it is out slides it in at once.
|
|
2711
2712
|
*
|
|
2712
2713
|
* @capability ui.mount
|
|
2713
2714
|
*
|
|
@@ -3011,11 +3012,13 @@ export interface Panel extends View, Disposable {
|
|
|
3011
3012
|
* @remarks
|
|
3012
3013
|
* Reads the state from the player first. When the position is shown
|
|
3013
3014
|
* (`preferred`) and this panel's tab is the current one, it hides the
|
|
3014
|
-
* position; otherwise it
|
|
3015
|
-
* tab comes to the front instead of the sidebar
|
|
3016
|
-
*
|
|
3017
|
-
*
|
|
3018
|
-
*
|
|
3015
|
+
* position; otherwise it switches the position on at this panel's tab: a
|
|
3016
|
+
* panel in a background tab comes to the front instead of the sidebar
|
|
3017
|
+
* closing. It is a switch, the same in every mode, like the player's own
|
|
3018
|
+
* Alt+1…4 and Adjust button: in fullscreen a column switched on is revealed
|
|
3019
|
+
* by the pointer at the right edge, not popped out (SDK 1.6.13, player
|
|
3020
|
+
* 0.7.6; {@link Panel.show} pops it out), and one switched off while out
|
|
3021
|
+
* slides in at once. A "Show list"
|
|
3019
3022
|
* command checked by `state.preferred && state.active` matches it. Waits
|
|
3020
3023
|
* for {@link Panel.ready} first.
|
|
3021
3024
|
*
|
package/dist/plugin/ui.js
CHANGED
|
@@ -917,12 +917,18 @@ class PanelHandle extends ViewBase {
|
|
|
917
917
|
throw failure("invalid", "the player shows the backdrop by itself");
|
|
918
918
|
await layoutOf(this.scope.runtime).read();
|
|
919
919
|
const state = this.state;
|
|
920
|
-
//
|
|
921
|
-
//
|
|
922
|
-
|
|
920
|
+
// A switch, the same in every mode (user ruling 2026-11-08): off when
|
|
921
|
+
// on and current, else on at this tab. `reveal: false`: in fullscreen
|
|
922
|
+
// nothing pops out, the right edge reveals it (player 0.7.6; older
|
|
923
|
+
// players ignore it and pop it out).
|
|
924
|
+
if (state?.preferred && state.active)
|
|
923
925
|
await layoutOf(this.scope.runtime).set(this.#slot, { visible: false });
|
|
924
926
|
else
|
|
925
|
-
await this.
|
|
927
|
+
await layoutOf(this.scope.runtime).set(this.#slot, {
|
|
928
|
+
active: this.scope.runtime.manifest.id,
|
|
929
|
+
visible: true,
|
|
930
|
+
reveal: false,
|
|
931
|
+
});
|
|
926
932
|
}
|
|
927
933
|
async showMenu(items, at) {
|
|
928
934
|
await this.ready;
|
|
@@ -1119,10 +1125,10 @@ function slot(scope, name) {
|
|
|
1119
1125
|
async toggle() {
|
|
1120
1126
|
await service().read();
|
|
1121
1127
|
const current = service().state[name];
|
|
1122
|
-
//
|
|
1123
|
-
const collapsed = current?.reason === "fullscreen";
|
|
1128
|
+
// A switch (see Panel.toggle): nothing pops out in fullscreen.
|
|
1124
1129
|
await service().set(name, {
|
|
1125
|
-
visible:
|
|
1130
|
+
visible: !(current?.preferred ?? true),
|
|
1131
|
+
reveal: false,
|
|
1126
1132
|
});
|
|
1127
1133
|
},
|
|
1128
1134
|
setDetached: (detached) => service().set(name, { detached }),
|
package/dist/wire.d.ts
CHANGED
|
@@ -710,6 +710,13 @@ export declare function createWire(transport: Transport): {
|
|
|
710
710
|
detached?: boolean;
|
|
711
711
|
/** The plugin id of the panel whose tab becomes the current one. */
|
|
712
712
|
active?: string;
|
|
713
|
+
/**
|
|
714
|
+
* With `visible: true`: `false` switches the position on without
|
|
715
|
+
* popping a column out in fullscreen (`toggle()`, SDK 1.6.13; player
|
|
716
|
+
* 0.7.6). Absent: reveal, as `show()` and `setVisible` do. Older
|
|
717
|
+
* players ignore it.
|
|
718
|
+
*/
|
|
719
|
+
reveal?: boolean;
|
|
713
720
|
}) => Promise<void>;
|
|
714
721
|
};
|
|
715
722
|
events: {
|
package/llms.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Vestra Player SDK
|
|
2
2
|
|
|
3
|
-
> @vestra-player/sdk 1.6.
|
|
3
|
+
> @vestra-player/sdk 1.6.14: write plugins for Vestra Player in TypeScript (plugin API `vestra/1`). A plugin is a folder with `manifest.json` and an entry module whose default export `activate(plugin)` the player calls. The documentation is a tree of short pages read by path, like `go doc`: the same pages and API as https://vestrasys.github.io/vestra-player-sdk/.
|
|
4
4
|
|
|
5
5
|
## Read the documentation
|
|
6
6
|
|