@kgdiff/scene 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +50 -2
- package/dist/build.d.ts +23 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +407 -0
- package/dist/build.js.map +1 -0
- package/dist/choreography.d.ts +98 -0
- package/dist/choreography.d.ts.map +1 -0
- package/dist/choreography.js +271 -0
- package/dist/choreography.js.map +1 -0
- package/dist/color.d.ts +42 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +169 -0
- package/dist/color.js.map +1 -0
- package/dist/constants.d.ts +89 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +89 -0
- package/dist/constants.js.map +1 -0
- package/dist/easing.d.ts +28 -0
- package/dist/easing.d.ts.map +1 -0
- package/dist/easing.js +103 -0
- package/dist/easing.js.map +1 -0
- package/dist/focus.d.ts +45 -0
- package/dist/focus.d.ts.map +1 -0
- package/dist/focus.js +317 -0
- package/dist/focus.js.map +1 -0
- package/dist/frame.d.ts +13 -0
- package/dist/frame.d.ts.map +1 -0
- package/dist/frame.js +32 -0
- package/dist/frame.js.map +1 -0
- package/dist/geometry.d.ts +61 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +122 -0
- package/dist/geometry.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/resolver.d.ts +9 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +1621 -0
- package/dist/resolver.js.map +1 -0
- package/dist/roles.d.ts +46 -0
- package/dist/roles.d.ts.map +1 -0
- package/dist/roles.js +197 -0
- package/dist/roles.js.map +1 -0
- package/dist/styles.d.ts +116 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +391 -0
- package/dist/styles.js.map +1 -0
- package/dist/theme.d.ts +14 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +154 -0
- package/dist/theme.js.map +1 -0
- package/dist/timeline.d.ts +69 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +362 -0
- package/dist/timeline.js.map +1 -0
- package/dist/types.d.ts +493 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/view.d.ts +11 -0
- package/dist/view.d.ts.map +1 -0
- package/dist/view.js +22 -0
- package/dist/view.js.map +1 -0
- package/package.json +46 -3
- package/src/build.ts +450 -0
- package/src/choreography.ts +342 -0
- package/src/color.ts +194 -0
- package/src/constants.ts +97 -0
- package/src/easing.ts +104 -0
- package/src/focus.ts +335 -0
- package/src/frame.ts +37 -0
- package/src/geometry.ts +162 -0
- package/src/index.ts +15 -0
- package/src/resolver.ts +1710 -0
- package/src/roles.ts +203 -0
- package/src/styles.ts +513 -0
- package/src/theme.ts +185 -0
- package/src/timeline.ts +391 -0
- package/src/types.ts +544 -0
- package/src/view.ts +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,KAAK,EAAE,QAAQ,EAAmC,MAAM,YAAY,CAAC;AAE5E,eAAO,MAAM,WAAW,EAAE,SAAS,WAAW,EAA+C,CAAC;AAE9F,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAwKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,EAAE,CAwD9D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,GACtF,UAAU,CAaZ;AAcD,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAQD,eAAO,MAAM,YAAY,cAAe,MAAM,oBAAoB,MAAM,KAAG,QAAQ,CAAC,MAAM,CACrC,CAAC;AAEtD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GACvB,QAAQ,CAmDV"}
|
package/dist/timeline.js
ADDED
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { TIMELINE } from './constants.js';
|
|
2
|
+
import { BoundsBuilder } from './geometry.js';
|
|
3
|
+
export const PHASE_ORDER = ['remove', 'restructure', 'modify', 'add'];
|
|
4
|
+
/** Lexicographic (squared distance, default order) comparison: true when a beats b. */
|
|
5
|
+
const better = (d2a, oa, d2b, ob) => d2a < d2b || (d2a === d2b && oa < ob);
|
|
6
|
+
/**
|
|
7
|
+
* Uniform grid over a set of points supporting "nearest eligible point" queries. Points start
|
|
8
|
+
* ineligible; `activate` makes one eligible (its requirements are placed), `take` removes it.
|
|
9
|
+
* Ties are broken by `order`. Expected O(1) cells per query for spread points.
|
|
10
|
+
*/
|
|
11
|
+
class NearestGrid {
|
|
12
|
+
items;
|
|
13
|
+
members;
|
|
14
|
+
minX;
|
|
15
|
+
minY;
|
|
16
|
+
cw;
|
|
17
|
+
ch;
|
|
18
|
+
gw;
|
|
19
|
+
gh;
|
|
20
|
+
cellStart;
|
|
21
|
+
cellItems;
|
|
22
|
+
cellAlive;
|
|
23
|
+
alive;
|
|
24
|
+
remaining;
|
|
25
|
+
constructor(items, members) {
|
|
26
|
+
this.items = items;
|
|
27
|
+
this.members = members;
|
|
28
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
29
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
30
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
31
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
32
|
+
for (const m of members) {
|
|
33
|
+
const it = items[m];
|
|
34
|
+
minX = Math.min(minX, it.x);
|
|
35
|
+
minY = Math.min(minY, it.y);
|
|
36
|
+
maxX = Math.max(maxX, it.x);
|
|
37
|
+
maxY = Math.max(maxY, it.y);
|
|
38
|
+
}
|
|
39
|
+
const side = Math.max(1, Math.ceil(Math.sqrt(members.length)));
|
|
40
|
+
this.gw = side;
|
|
41
|
+
this.gh = side;
|
|
42
|
+
this.minX = minX;
|
|
43
|
+
this.minY = minY;
|
|
44
|
+
// Guard against zero / underflowing extents (e.g. coordinates a denormal apart).
|
|
45
|
+
const cw = (maxX - minX) / side;
|
|
46
|
+
const ch = (maxY - minY) / side;
|
|
47
|
+
this.cw = cw > 0 && Number.isFinite(cw) ? cw : 1;
|
|
48
|
+
this.ch = ch > 0 && Number.isFinite(ch) ? ch : 1;
|
|
49
|
+
const cells = this.gw * this.gh;
|
|
50
|
+
const counts = new Int32Array(cells + 1);
|
|
51
|
+
const cellOf = new Int32Array(members.length);
|
|
52
|
+
for (let k = 0; k < members.length; k++) {
|
|
53
|
+
const it = items[members[k]];
|
|
54
|
+
const c = this.cellIndex(it.x, it.y);
|
|
55
|
+
cellOf[k] = c;
|
|
56
|
+
counts[c + 1] = counts[c + 1] + 1;
|
|
57
|
+
}
|
|
58
|
+
for (let c = 0; c < cells; c++)
|
|
59
|
+
counts[c + 1] = counts[c + 1] + counts[c];
|
|
60
|
+
this.cellStart = counts;
|
|
61
|
+
const fill = counts.slice(0, cells);
|
|
62
|
+
this.cellItems = new Int32Array(members.length);
|
|
63
|
+
for (let k = 0; k < members.length; k++) {
|
|
64
|
+
const c = cellOf[k];
|
|
65
|
+
this.cellItems[fill[c]] = k;
|
|
66
|
+
fill[c] = fill[c] + 1;
|
|
67
|
+
}
|
|
68
|
+
this.cellAlive = new Int32Array(cells);
|
|
69
|
+
this.alive = new Uint8Array(members.length);
|
|
70
|
+
this.remaining = 0;
|
|
71
|
+
}
|
|
72
|
+
cellX(x) {
|
|
73
|
+
const c = Math.floor((x - this.minX) / this.cw);
|
|
74
|
+
return c >= 0 ? (c >= this.gw ? this.gw - 1 : c) : 0;
|
|
75
|
+
}
|
|
76
|
+
cellY(y) {
|
|
77
|
+
const c = Math.floor((y - this.minY) / this.ch);
|
|
78
|
+
return c >= 0 ? (c >= this.gh ? this.gh - 1 : c) : 0;
|
|
79
|
+
}
|
|
80
|
+
cellIndex(x, y) {
|
|
81
|
+
return this.cellY(y) * this.gw + this.cellX(x);
|
|
82
|
+
}
|
|
83
|
+
get size() {
|
|
84
|
+
return this.remaining;
|
|
85
|
+
}
|
|
86
|
+
/** Make member slot `k` (index into `members`) eligible. */
|
|
87
|
+
activate(k) {
|
|
88
|
+
if (this.alive[k] === 1)
|
|
89
|
+
return;
|
|
90
|
+
this.alive[k] = 1;
|
|
91
|
+
this.remaining++;
|
|
92
|
+
const it = this.items[this.members[k]];
|
|
93
|
+
const c = this.cellIndex(it.x, it.y);
|
|
94
|
+
this.cellAlive[c] = this.cellAlive[c] + 1;
|
|
95
|
+
}
|
|
96
|
+
/** Remove eligible member slot `k`. */
|
|
97
|
+
take(k) {
|
|
98
|
+
if (this.alive[k] === 0)
|
|
99
|
+
return;
|
|
100
|
+
this.alive[k] = 0;
|
|
101
|
+
this.remaining--;
|
|
102
|
+
const it = this.items[this.members[k]];
|
|
103
|
+
const c = this.cellIndex(it.x, it.y);
|
|
104
|
+
this.cellAlive[c] = this.cellAlive[c] - 1;
|
|
105
|
+
}
|
|
106
|
+
/** Eligible member slot with the largest size (ties → lowest order), or -1. O(members). */
|
|
107
|
+
largest() {
|
|
108
|
+
let best = -1;
|
|
109
|
+
for (let k = 0; k < this.members.length; k++) {
|
|
110
|
+
if (this.alive[k] === 0)
|
|
111
|
+
continue;
|
|
112
|
+
const a = this.items[this.members[k]];
|
|
113
|
+
const b = best < 0 ? undefined : this.items[this.members[best]];
|
|
114
|
+
if (b === undefined || a.size > b.size || (a.size === b.size && a.order < b.order))
|
|
115
|
+
best = k;
|
|
116
|
+
}
|
|
117
|
+
return best;
|
|
118
|
+
}
|
|
119
|
+
/** Member slot of the nearest remaining point (ties → lowest order), or -1. */
|
|
120
|
+
nearest(x, y) {
|
|
121
|
+
if (this.remaining === 0)
|
|
122
|
+
return -1;
|
|
123
|
+
const qx = this.cellX(x);
|
|
124
|
+
const qy = this.cellY(y);
|
|
125
|
+
const minCell = Math.min(this.cw, this.ch);
|
|
126
|
+
let best = -1;
|
|
127
|
+
let bestD2 = Number.POSITIVE_INFINITY;
|
|
128
|
+
let bestOrder = Number.POSITIVE_INFINITY;
|
|
129
|
+
const maxRing = Math.max(this.gw, this.gh);
|
|
130
|
+
for (let ring = 0; ring <= maxRing; ring++) {
|
|
131
|
+
const x0 = qx - ring;
|
|
132
|
+
const x1 = qx + ring;
|
|
133
|
+
const y0 = qy - ring;
|
|
134
|
+
const y1 = qy + ring;
|
|
135
|
+
for (let cy = y0; cy <= y1; cy++) {
|
|
136
|
+
if (cy < 0 || cy >= this.gh)
|
|
137
|
+
continue;
|
|
138
|
+
const edgeRow = cy === y0 || cy === y1;
|
|
139
|
+
for (let cx = x0; cx <= x1; cx += edgeRow ? 1 : x1 - x0 || 1) {
|
|
140
|
+
if (cx < 0 || cx >= this.gw)
|
|
141
|
+
continue;
|
|
142
|
+
const c = cy * this.gw + cx;
|
|
143
|
+
if (this.cellAlive[c] === 0)
|
|
144
|
+
continue;
|
|
145
|
+
for (let p = this.cellStart[c]; p < this.cellStart[c + 1]; p++) {
|
|
146
|
+
const k = this.cellItems[p];
|
|
147
|
+
if (this.alive[k] === 0)
|
|
148
|
+
continue;
|
|
149
|
+
const it = this.items[this.members[k]];
|
|
150
|
+
const dx = it.x - x;
|
|
151
|
+
const dy = it.y - y;
|
|
152
|
+
const d2 = dx * dx + dy * dy;
|
|
153
|
+
if (better(d2, it.order, bestD2, bestOrder)) {
|
|
154
|
+
best = k;
|
|
155
|
+
bestD2 = d2;
|
|
156
|
+
bestOrder = it.order;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Every cell at ring ≥ ring + 1 is at least ring·minCell away; strict so ties keep searching.
|
|
162
|
+
const bound = ring * minCell;
|
|
163
|
+
if (best >= 0 && bestD2 < bound * bound)
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
return best;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Order hunks as a short spatial tour (docs/algorithms.md §10) that respects `requires`:
|
|
171
|
+
*
|
|
172
|
+
* - Only *ready* hunks (every requirement already placed) are candidates.
|
|
173
|
+
* - Phase is a preference, not a barrier: the candidates are the ready hunks of the earliest
|
|
174
|
+
* phase that has any, so a hunk may follow a later-phase hunk it requires.
|
|
175
|
+
* - The very first hunk is the largest candidate; every next one is the candidate nearest the
|
|
176
|
+
* previous anchor (greedy nearest neighbour), which also starts each phase near where the
|
|
177
|
+
* previous one ended.
|
|
178
|
+
* - Ties are broken by the default `order`. Unknown or self requirements are ignored; a cycle
|
|
179
|
+
* (never produced by core) is broken by releasing its lowest-`order` hunk.
|
|
180
|
+
*
|
|
181
|
+
* Returns indices into `hunks`. ~O((H + R) √H) worst case, near-linear typically.
|
|
182
|
+
*/
|
|
183
|
+
export function tourOrder(hunks) {
|
|
184
|
+
const H = hunks.length;
|
|
185
|
+
const phaseRank = (p) => PHASE_ORDER.indexOf(p);
|
|
186
|
+
// Per-phase grids over all hunks of the phase; slots activate once their hunk is ready.
|
|
187
|
+
const members = PHASE_ORDER.map(() => []);
|
|
188
|
+
for (let i = 0; i < H; i++)
|
|
189
|
+
members[phaseRank(hunks[i].phase)]?.push(i);
|
|
190
|
+
for (const m of members)
|
|
191
|
+
m.sort((a, b) => hunks[a].order - hunks[b].order);
|
|
192
|
+
const grids = members.map((m) => new NearestGrid(hunks, m));
|
|
193
|
+
const slotOf = new Int32Array(H);
|
|
194
|
+
for (const m of members)
|
|
195
|
+
for (let k = 0; k < m.length; k++)
|
|
196
|
+
slotOf[m[k]] = k;
|
|
197
|
+
// Pending requirement counts and reverse edges (deduplicated).
|
|
198
|
+
const pending = new Int32Array(H);
|
|
199
|
+
const dependents = Array.from({ length: H }, () => []);
|
|
200
|
+
for (let i = 0; i < H; i++) {
|
|
201
|
+
for (const r of new Set(hunks[i].requires)) {
|
|
202
|
+
if (r === i || r < 0 || r >= H)
|
|
203
|
+
continue;
|
|
204
|
+
pending[i] = pending[i] + 1;
|
|
205
|
+
dependents[r].push(i);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const placed = new Uint8Array(H);
|
|
209
|
+
const activate = (i) => {
|
|
210
|
+
grids[phaseRank(hunks[i].phase)]?.activate(slotOf[i]);
|
|
211
|
+
};
|
|
212
|
+
for (let i = 0; i < H; i++)
|
|
213
|
+
if (pending[i] === 0)
|
|
214
|
+
activate(i);
|
|
215
|
+
const result = [];
|
|
216
|
+
let last = null;
|
|
217
|
+
while (result.length < H) {
|
|
218
|
+
let g = grids.findIndex((grid) => grid.size > 0);
|
|
219
|
+
if (g < 0) {
|
|
220
|
+
// A requirement cycle: release the unplaced hunk with the lowest default order.
|
|
221
|
+
let pick = -1;
|
|
222
|
+
for (let i = 0; i < H; i++) {
|
|
223
|
+
if (placed[i] === 1)
|
|
224
|
+
continue;
|
|
225
|
+
if (pick < 0 || hunks[i].order < hunks[pick].order)
|
|
226
|
+
pick = i;
|
|
227
|
+
}
|
|
228
|
+
pending[pick] = 0;
|
|
229
|
+
activate(pick);
|
|
230
|
+
g = phaseRank(hunks[pick].phase);
|
|
231
|
+
}
|
|
232
|
+
const grid = grids[g];
|
|
233
|
+
const slot = last === null ? grid.largest() : grid.nearest(last.x, last.y);
|
|
234
|
+
grid.take(slot);
|
|
235
|
+
const idx = members[g][slot];
|
|
236
|
+
placed[idx] = 1;
|
|
237
|
+
result.push(idx);
|
|
238
|
+
last = hunks[idx];
|
|
239
|
+
for (const d of dependents[idx]) {
|
|
240
|
+
if (placed[d] === 1)
|
|
241
|
+
continue;
|
|
242
|
+
pending[d] = pending[d] - 1;
|
|
243
|
+
if (pending[d] === 0)
|
|
244
|
+
activate(d);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Chapter of each hunk (hunks in a requirement-respecting order, e.g. the tour) for `chapters`
|
|
251
|
+
* mode: one chapter per phase present, in replay order; a hunk that requires a hunk of a later
|
|
252
|
+
* chapter moves to that chapter (the earliest chapter not before any requirement). O(H + R).
|
|
253
|
+
*/
|
|
254
|
+
export function chapterPlan(hunks) {
|
|
255
|
+
const present = PHASE_ORDER.filter((p) => hunks.some((h) => h.phase === p));
|
|
256
|
+
const chapter = new Int32Array(hunks.length);
|
|
257
|
+
for (let i = 0; i < hunks.length; i++) {
|
|
258
|
+
const h = hunks[i];
|
|
259
|
+
let c = present.indexOf(h.phase);
|
|
260
|
+
for (const r of h.requires) {
|
|
261
|
+
// Requirements placed earlier in the order have their chapter already.
|
|
262
|
+
if (r >= 0 && r < i)
|
|
263
|
+
c = Math.max(c, chapter[r]);
|
|
264
|
+
}
|
|
265
|
+
chapter[i] = c;
|
|
266
|
+
}
|
|
267
|
+
return chapter;
|
|
268
|
+
}
|
|
269
|
+
const KIND_FACTOR = {
|
|
270
|
+
add: 0.85,
|
|
271
|
+
remove: 0.85,
|
|
272
|
+
modify: 0.8,
|
|
273
|
+
relations: 0.95,
|
|
274
|
+
merge: 1.3,
|
|
275
|
+
split: 1.3,
|
|
276
|
+
};
|
|
277
|
+
/** Times are rounded to µs so results do not depend on last-ulp differences between engines. */
|
|
278
|
+
const roundMs = (ms) => Math.round(ms * 1000) / 1000;
|
|
279
|
+
/** Play time of one hunk in `hunks` mode: `pace · kindFactor · clamp(√size, 1, 2.2)`. */
|
|
280
|
+
export function hunkDuration(kind, size, pace) {
|
|
281
|
+
return roundMs(pace * KIND_FACTOR[kind] * Math.min(2.2, Math.max(1, Math.sqrt(size))));
|
|
282
|
+
}
|
|
283
|
+
/** Length of a chapter of `n` hunks in `chapters` mode: `pace · clamp(1.2 + log₂ n, 1.2, 4)`. */
|
|
284
|
+
export function chapterDuration(n, pace) {
|
|
285
|
+
return roundMs(pace * Math.min(4, Math.max(1.2, 1.2 + Math.log2(Math.max(1, n)))));
|
|
286
|
+
}
|
|
287
|
+
function chapterBounds(hunks, members) {
|
|
288
|
+
const b = new BoundsBuilder();
|
|
289
|
+
for (const h of members)
|
|
290
|
+
b.addRect(hunks[h].bounds);
|
|
291
|
+
return b.rect();
|
|
292
|
+
}
|
|
293
|
+
export const timelineMode = (hunkCount, chapterThreshold) => hunkCount > chapterThreshold ? 'chapters' : 'hunks';
|
|
294
|
+
/**
|
|
295
|
+
* Replay schedule for hunks already in play order (docs/algorithms.md §10). The order must
|
|
296
|
+
* respect `requires` (the tour does; in `chapters` mode, stable-sort the tour by `chapterPlan`).
|
|
297
|
+
*
|
|
298
|
+
* - `hunks` mode (≤ `chapterThreshold` hunks): one hunk at a time, 160 ms apart, so every hunk
|
|
299
|
+
* starts after its requirements end. Chapters are the consecutive runs of one phase, reported
|
|
300
|
+
* for scrubber grouping.
|
|
301
|
+
* - `chapters` mode: one chapter per `chapterPlan` value, of length
|
|
302
|
+
* `pace · clamp(1.2 + log₂ n, 1.2, 4)`; its hunks play together, staggered in play order over
|
|
303
|
+
* `35% · (n − 1) / n` of the chapter, so a hunk requiring another of its chapter starts later.
|
|
304
|
+
* A chapter's `phase` is the phase it was planned for. Chapters are 160 ms apart.
|
|
305
|
+
*/
|
|
306
|
+
export function buildTimeline(hunks, pace, chapterThreshold) {
|
|
307
|
+
const mode = timelineMode(hunks.length, chapterThreshold);
|
|
308
|
+
const windows = [];
|
|
309
|
+
const chapters = [];
|
|
310
|
+
const plan = mode === 'chapters' ? chapterPlan(hunks) : null;
|
|
311
|
+
const present = PHASE_ORDER.filter((p) => hunks.some((h) => h.phase === p));
|
|
312
|
+
// Runs of consecutive hunks sharing a phase (hunks mode) or a planned chapter (chapters mode).
|
|
313
|
+
const runs = [];
|
|
314
|
+
for (let h = 0; h < hunks.length; h++) {
|
|
315
|
+
const hunk = hunks[h];
|
|
316
|
+
const key = plan === null ? PHASE_ORDER.indexOf(hunk.phase) : plan[h];
|
|
317
|
+
const run = runs[runs.length - 1];
|
|
318
|
+
if (run !== undefined && run.key === key)
|
|
319
|
+
run.members.push(h);
|
|
320
|
+
else {
|
|
321
|
+
const phase = plan === null ? hunk.phase : (present[key] ?? hunk.phase);
|
|
322
|
+
runs.push({ key, phase, members: [h] });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
let cursor = 0;
|
|
326
|
+
for (let c = 0; c < runs.length; c++) {
|
|
327
|
+
const { phase, members: run } = runs[c];
|
|
328
|
+
if (c > 0)
|
|
329
|
+
cursor = roundMs(cursor + TIMELINE.gap);
|
|
330
|
+
const start = cursor;
|
|
331
|
+
if (mode === 'hunks') {
|
|
332
|
+
for (let k = 0; k < run.length; k++) {
|
|
333
|
+
if (k > 0)
|
|
334
|
+
cursor = roundMs(cursor + TIMELINE.gap);
|
|
335
|
+
const h = hunks[run[k]];
|
|
336
|
+
const end = roundMs(cursor + hunkDuration(h.kind, h.size, pace));
|
|
337
|
+
windows.push({ hunk: run[k], start: cursor, end, chapter: c });
|
|
338
|
+
cursor = end;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
const n = run.length;
|
|
343
|
+
const length = chapterDuration(n, pace);
|
|
344
|
+
const span = (TIMELINE.maxStagger * length * (n - 1)) / n;
|
|
345
|
+
const step = n > 1 ? span / (n - 1) : 0;
|
|
346
|
+
const windowLength = length - span;
|
|
347
|
+
for (let k = 0; k < n; k++) {
|
|
348
|
+
const ws = roundMs(start + k * step);
|
|
349
|
+
windows.push({
|
|
350
|
+
hunk: run[k],
|
|
351
|
+
start: ws,
|
|
352
|
+
end: roundMs(ws + windowLength),
|
|
353
|
+
chapter: c,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
cursor = roundMs(start + length);
|
|
357
|
+
}
|
|
358
|
+
chapters.push({ phase, start, end: cursor, hunks: run, bounds: chapterBounds(hunks, run) });
|
|
359
|
+
}
|
|
360
|
+
return { duration: cursor, windows, chapters, mode };
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
|