@glissade/player 0.10.1 → 0.11.0-pre.1

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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Marker, Playhead, Timeline } from "@glissade/core";
1
+ import { Marker, Playhead, ReadonlySignal, Timeline } from "@glissade/core";
2
2
  import { Scene } from "@glissade/scene";
3
3
  import { Canvas2DBackend } from "@glissade/backend-canvas2d";
4
4
 
@@ -116,6 +116,9 @@ interface Player {
116
116
  readonly playhead: Playhead;
117
117
  readonly duration: number;
118
118
  readonly playing: boolean;
119
+ /** Reactive `playing` — observers re-render on a play/pause/settle transition
120
+ * (the playhead doesn't move on pause, so the `playing` getter alone goes stale). */
121
+ readonly playingSignal: ReadonlySignal<boolean>;
119
122
  rate: number;
120
123
  play(opts?: {
121
124
  range?: [number, number];
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { buildFontRegistry, compileTimeline } from "@glissade/core";
1
+ import { buildFontRegistry, compileTimeline, signal } from "@glissade/core";
2
2
  import { evaluate, validateSceneFonts } from "@glissade/scene";
3
3
  import { Canvas2DBackend } from "@glissade/backend-canvas2d";
4
4
  //#region src/driver.ts
@@ -61,6 +61,12 @@ function scrollDriver(opts) {
61
61
  }
62
62
  //#endregion
63
63
  //#region src/player.ts
64
+ /**
65
+ * The Player (DESIGN.md §4.2): composes a clock Driver with playback policy.
66
+ * The only stateful object in the runtime; its state is rate, loop mode, and
67
+ * a base-time offset. Time-based, never frame-counted — a dropped frame skips
68
+ * ahead, it never drifts.
69
+ */
64
70
  /** §A.1: machine and Player track-target sets must be statically disjoint. */
65
71
  var TargetOverlapError = class extends Error {
66
72
  constructor(overlaps) {
@@ -80,6 +86,11 @@ function createPlayer(init, opts = {}) {
80
86
  const cueCallbacks = /* @__PURE__ */ new Map();
81
87
  let rate = opts.rate ?? 1;
82
88
  let playing = false;
89
+ const playingSig = signal(false);
90
+ const setPlaying = (v) => {
91
+ playing = v;
92
+ playingSig.set(v);
93
+ };
83
94
  let driverRunning = false;
84
95
  let ownTargets = new Set(init.targets ?? []);
85
96
  const machines = [];
@@ -100,7 +111,7 @@ function createPlayer(init, opts = {}) {
100
111
  }
101
112
  }
102
113
  function settle(completed) {
103
- playing = false;
114
+ setPlaying(false);
104
115
  elapsedOrigin = null;
105
116
  const resolve = resolveFinished;
106
117
  resolveFinished = null;
@@ -163,6 +174,7 @@ function createPlayer(init, opts = {}) {
163
174
  get playing() {
164
175
  return playing;
165
176
  },
177
+ playingSignal: playingSig,
166
178
  get rate() {
167
179
  return rate;
168
180
  },
@@ -180,7 +192,7 @@ function createPlayer(init, opts = {}) {
180
192
  playhead.set(base);
181
193
  elapsedOrigin = null;
182
194
  loopsDone = 0;
183
- playing = true;
195
+ setPlaying(true);
184
196
  ensureDriver();
185
197
  return { finished: new Promise((resolve) => {
186
198
  resolveFinished = resolve;
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@glissade/player",
3
- "version": "0.10.1",
3
+ "version": "0.11.0-pre.1",
4
4
  "description": "glissade embed runtime: Player, Drivers (clock, scroll), mount().",
5
5
  "license": "Apache-2.0",
6
+ "engines": {
7
+ "node": ">=20.19"
8
+ },
6
9
  "type": "module",
7
10
  "sideEffects": false,
8
11
  "exports": {
@@ -15,9 +18,9 @@
15
18
  "dist"
16
19
  ],
17
20
  "dependencies": {
18
- "@glissade/backend-canvas2d": "0.10.1",
19
- "@glissade/core": "0.10.1",
20
- "@glissade/scene": "0.10.1"
21
+ "@glissade/backend-canvas2d": "0.11.0-pre.1",
22
+ "@glissade/core": "0.11.0-pre.1",
23
+ "@glissade/scene": "0.11.0-pre.1"
21
24
  },
22
25
  "repository": {
23
26
  "type": "git",