@cardstack/choreo 0.0.0 → 0.1.0-unstable.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.
Files changed (165) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +55 -6
  4. package/addon-main.cjs +4 -0
  5. package/declarations/anchors.d.ts +26 -0
  6. package/declarations/anchors.d.ts.map +1 -0
  7. package/declarations/arming.d.ts +33 -0
  8. package/declarations/arming.d.ts.map +1 -0
  9. package/declarations/beacon.d.ts +9 -0
  10. package/declarations/beacon.d.ts.map +1 -0
  11. package/declarations/beacons.d.ts +23 -0
  12. package/declarations/beacons.d.ts.map +1 -0
  13. package/declarations/changeset.d.ts +46 -0
  14. package/declarations/changeset.d.ts.map +1 -0
  15. package/declarations/choreo.d.ts +261 -0
  16. package/declarations/choreo.d.ts.map +1 -0
  17. package/declarations/compile.d.ts +45 -0
  18. package/declarations/compile.d.ts.map +1 -0
  19. package/declarations/deliver.d.ts +44 -0
  20. package/declarations/deliver.d.ts.map +1 -0
  21. package/declarations/easings.d.ts +20 -0
  22. package/declarations/easings.d.ts.map +1 -0
  23. package/declarations/far.d.ts +33 -0
  24. package/declarations/far.d.ts.map +1 -0
  25. package/declarations/film/clip.d.ts +51 -0
  26. package/declarations/film/clip.d.ts.map +1 -0
  27. package/declarations/film/clips.d.ts +155 -0
  28. package/declarations/film/clips.d.ts.map +1 -0
  29. package/declarations/film/film.d.ts +1208 -0
  30. package/declarations/film/film.d.ts.map +1 -0
  31. package/declarations/film/graph/adjust.d.ts +112 -0
  32. package/declarations/film/graph/adjust.d.ts.map +1 -0
  33. package/declarations/film/graph/compile.d.ts +140 -0
  34. package/declarations/film/graph/compile.d.ts.map +1 -0
  35. package/declarations/film/graph/host.d.ts +67 -0
  36. package/declarations/film/graph/host.d.ts.map +1 -0
  37. package/declarations/film/graph/nodes.d.ts +287 -0
  38. package/declarations/film/graph/nodes.d.ts.map +1 -0
  39. package/declarations/film/index.d.ts +24 -0
  40. package/declarations/film/index.d.ts.map +1 -0
  41. package/declarations/film/joins.d.ts +143 -0
  42. package/declarations/film/joins.d.ts.map +1 -0
  43. package/declarations/film/math.d.ts +15 -0
  44. package/declarations/film/math.d.ts.map +1 -0
  45. package/declarations/film/overlays.d.ts +54 -0
  46. package/declarations/film/overlays.d.ts.map +1 -0
  47. package/declarations/film/picture.d.ts +104 -0
  48. package/declarations/film/picture.d.ts.map +1 -0
  49. package/declarations/film/plate.d.ts +37 -0
  50. package/declarations/film/plate.d.ts.map +1 -0
  51. package/declarations/film/player.d.ts +120 -0
  52. package/declarations/film/player.d.ts.map +1 -0
  53. package/declarations/film/rail.d.ts +40 -0
  54. package/declarations/film/rail.d.ts.map +1 -0
  55. package/declarations/film/schedule.d.ts +93 -0
  56. package/declarations/film/schedule.d.ts.map +1 -0
  57. package/declarations/film/seam.d.ts +38 -0
  58. package/declarations/film/seam.d.ts.map +1 -0
  59. package/declarations/film/titles.d.ts +37 -0
  60. package/declarations/film/titles.d.ts.map +1 -0
  61. package/declarations/film/types.d.ts +544 -0
  62. package/declarations/film/types.d.ts.map +1 -0
  63. package/declarations/film.d.ts +3 -0
  64. package/declarations/film.d.ts.map +1 -0
  65. package/declarations/gesture.d.ts +33 -0
  66. package/declarations/gesture.d.ts.map +1 -0
  67. package/declarations/index.d.ts +26 -0
  68. package/declarations/index.d.ts.map +1 -0
  69. package/declarations/measure.d.ts +29 -0
  70. package/declarations/measure.d.ts.map +1 -0
  71. package/declarations/path.d.ts +73 -0
  72. package/declarations/path.d.ts.map +1 -0
  73. package/declarations/registry.d.ts +46 -0
  74. package/declarations/registry.d.ts.map +1 -0
  75. package/declarations/run.d.ts +406 -0
  76. package/declarations/run.d.ts.map +1 -0
  77. package/declarations/space.d.ts +31 -0
  78. package/declarations/space.d.ts.map +1 -0
  79. package/declarations/steps.d.ts +479 -0
  80. package/declarations/steps.d.ts.map +1 -0
  81. package/declarations/test-support/index.d.ts +30 -0
  82. package/declarations/test-support/index.d.ts.map +1 -0
  83. package/declarations/types.d.ts +761 -0
  84. package/declarations/types.d.ts.map +1 -0
  85. package/dist/anchors.js +34 -0
  86. package/dist/anchors.js.map +1 -0
  87. package/dist/arming.js +120 -0
  88. package/dist/arming.js.map +1 -0
  89. package/dist/beacon.js +25 -0
  90. package/dist/beacon.js.map +1 -0
  91. package/dist/beacons.js +77 -0
  92. package/dist/beacons.js.map +1 -0
  93. package/dist/changeset.js +129 -0
  94. package/dist/changeset.js.map +1 -0
  95. package/dist/choreo.js +1026 -0
  96. package/dist/choreo.js.map +1 -0
  97. package/dist/compile.js +1403 -0
  98. package/dist/compile.js.map +1 -0
  99. package/dist/deliver.js +326 -0
  100. package/dist/deliver.js.map +1 -0
  101. package/dist/easings.js +39 -0
  102. package/dist/easings.js.map +1 -0
  103. package/dist/far.js +147 -0
  104. package/dist/far.js.map +1 -0
  105. package/dist/film/clip.js +100 -0
  106. package/dist/film/clip.js.map +1 -0
  107. package/dist/film/clips.js +147 -0
  108. package/dist/film/clips.js.map +1 -0
  109. package/dist/film/film.js +4424 -0
  110. package/dist/film/film.js.map +1 -0
  111. package/dist/film/graph/adjust.js +160 -0
  112. package/dist/film/graph/adjust.js.map +1 -0
  113. package/dist/film/graph/compile.js +225 -0
  114. package/dist/film/graph/compile.js.map +1 -0
  115. package/dist/film/graph/host.js +77 -0
  116. package/dist/film/graph/host.js.map +1 -0
  117. package/dist/film/graph/nodes.js +500 -0
  118. package/dist/film/graph/nodes.js.map +1 -0
  119. package/dist/film/index.js +18 -0
  120. package/dist/film/index.js.map +1 -0
  121. package/dist/film/joins.js +260 -0
  122. package/dist/film/joins.js.map +1 -0
  123. package/dist/film/math.js +49 -0
  124. package/dist/film/math.js.map +1 -0
  125. package/dist/film/overlays.js +66 -0
  126. package/dist/film/overlays.js.map +1 -0
  127. package/dist/film/picture.js +58 -0
  128. package/dist/film/picture.js.map +1 -0
  129. package/dist/film/plate.js +36 -0
  130. package/dist/film/plate.js.map +1 -0
  131. package/dist/film/player.js +79 -0
  132. package/dist/film/player.js.map +1 -0
  133. package/dist/film/rail.js +38 -0
  134. package/dist/film/rail.js.map +1 -0
  135. package/dist/film/schedule.js +238 -0
  136. package/dist/film/schedule.js.map +1 -0
  137. package/dist/film/seam.js +64 -0
  138. package/dist/film/seam.js.map +1 -0
  139. package/dist/film/titles.js +45 -0
  140. package/dist/film/titles.js.map +1 -0
  141. package/dist/film/types.js +2 -0
  142. package/dist/film/types.js.map +1 -0
  143. package/dist/film.js +18 -0
  144. package/dist/film.js.map +1 -0
  145. package/dist/gesture.js +111 -0
  146. package/dist/gesture.js.map +1 -0
  147. package/dist/index.js +9 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/measure.js +99 -0
  150. package/dist/measure.js.map +1 -0
  151. package/dist/path.js +272 -0
  152. package/dist/path.js.map +1 -0
  153. package/dist/registry.js +55 -0
  154. package/dist/registry.js.map +1 -0
  155. package/dist/run.js +2423 -0
  156. package/dist/run.js.map +1 -0
  157. package/dist/space.js +57 -0
  158. package/dist/space.js.map +1 -0
  159. package/dist/steps.js +831 -0
  160. package/dist/steps.js.map +1 -0
  161. package/dist/test-support/index.js +150 -0
  162. package/dist/test-support/index.js.map +1 -0
  163. package/dist/types.js +2 -0
  164. package/dist/types.js.map +1 -0
  165. package/package.json +202 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Anchors — "with / after build N", as typed helpers rather than a string
3
+ * micro-DSL (docs/choreo-constructs.md §4.2). A step names itself with
4
+ * `@name`; any later step may start against it with `@at`:
5
+ *
6
+ * <c.Tween @name='head' … />
7
+ * <c.Tween @at={{at 'head' 0.4}} … /> start at 40% of head
8
+ * <c.Tween @at={{after 'head' 0.2}} … /> start 0.2s after head ends
9
+ *
10
+ * `at name 1` and `after name` are the same moment. Anchors point up the
11
+ * score, the way Keynote's build list does; a forward reference is a
12
+ * compile error, as is a duplicate name.
13
+ */
14
+
15
+ /** start at the named step's start, plus `progress` (0–1) of its length */
16
+ function at(name, progress = 0) {
17
+ return {
18
+ anchor: name,
19
+ edge: 'start',
20
+ progress
21
+ };
22
+ }
23
+
24
+ /** start at the named step's end, plus `delay` seconds */
25
+ function after(name, delay = 0) {
26
+ return {
27
+ anchor: name,
28
+ delay,
29
+ edge: 'end'
30
+ };
31
+ }
32
+
33
+ export { after, at };
34
+ //# sourceMappingURL=anchors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchors.js","sources":["../src/anchors.ts"],"sourcesContent":["/**\n * Anchors — \"with / after build N\", as typed helpers rather than a string\n * micro-DSL (docs/choreo-constructs.md §4.2). A step names itself with\n * `@name`; any later step may start against it with `@at`:\n *\n * <c.Tween @name='head' … />\n * <c.Tween @at={{at 'head' 0.4}} … /> start at 40% of head\n * <c.Tween @at={{after 'head' 0.2}} … /> start 0.2s after head ends\n *\n * `at name 1` and `after name` are the same moment. Anchors point up the\n * score, the way Keynote's build list does; a forward reference is a\n * compile error, as is a duplicate name.\n */\n\nexport interface AnchorRef {\n anchor: string;\n /** seconds past the named step's end (`after`) */\n delay?: number;\n edge: 'end' | 'start';\n /** 0..1 of the named step's own length (`at`) */\n progress?: number;\n}\n\n/** start at the named step's start, plus `progress` (0–1) of its length */\nexport function at(name: string, progress = 0): AnchorRef {\n return { anchor: name, edge: 'start', progress };\n}\n\n/** start at the named step's end, plus `delay` seconds */\nexport function after(name: string, delay = 0): AnchorRef {\n return { anchor: name, delay, edge: 'end' };\n}\n"],"names":["at","name","progress","anchor","edge","after","delay"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA;AACO,SAASA,EAAEA,CAACC,IAAY,EAAEC,QAAQ,GAAG,CAAC,EAAa;EACxD,OAAO;AAAEC,IAAAA,MAAM,EAAEF,IAAI;AAAEG,IAAAA,IAAI,EAAE,OAAO;AAAEF,IAAAA;GAAU;AAClD;;AAEA;AACO,SAASG,KAAKA,CAACJ,IAAY,EAAEK,KAAK,GAAG,CAAC,EAAa;EACxD,OAAO;AAAEH,IAAAA,MAAM,EAAEF,IAAI;IAAEK,KAAK;AAAEF,IAAAA,IAAI,EAAE;GAAO;AAC7C;;;;"}
package/dist/arming.js ADDED
@@ -0,0 +1,120 @@
1
+ import { tracked } from '@glimmer/tracking';
2
+ import { g, i } from 'decorator-transforms/runtime';
3
+
4
+ /**
5
+ * Arming — "a scene change is under way", as a value a host can read.
6
+ *
7
+ * A region is router-agnostic by design (§9): it discovers a crossing by
8
+ * rendering one, and it says nothing about it to anybody. But the host around
9
+ * it usually has to KNOW — to skip the entrance animations of cards mounting
10
+ * mid-flight, to hold a heavy mount back until the landing, to gate anything
11
+ * that would otherwise fire twenty springs into the middle of a move.
12
+ *
13
+ * Knowing turns out to be four subtleties, and two apps in a row hand-copied
14
+ * all four before this became a library part:
15
+ *
16
+ * - **The run does not exist yet.** The decision to cross is made in a route
17
+ * hook; the run is born after the swap renders. So the flag stands up
18
+ * first and the watch latches the first live run the region produces.
19
+ * - **A run can be REPLACED mid-flight.** A real interruption recompiles the
20
+ * score, and the old run's `finished` resolves as its successor takes off.
21
+ * Standing down there ends the crossing while it is still visibly moving,
22
+ * so the watch hands over to the successor instead.
23
+ * - **A stale settle must not stand down a newer crossing.** Generations.
24
+ * - **Some crossings never produce a pass at all** — aborted, or rendered
25
+ * identically. A deadline is the backstop, and without it the flag is a
26
+ * latch that never opens.
27
+ *
28
+ * Host-blind on purpose: no router, no owner, no framework beyond the one
29
+ * tracked flag the templates need in order to re-render when it changes.
30
+ */
31
+ class Armed {
32
+ static {
33
+ g(this.prototype, "on", [tracked], function () {
34
+ return false;
35
+ });
36
+ }
37
+ #on = (i(this, "on"), void 0);
38
+ }
39
+
40
+ /**
41
+ * A run that is genuinely still working. A parked run is a still and a
42
+ * STANDING run is an annotation that is simply on (a score of nothing but
43
+ * open steps has no end to wait for) — waiting for either to finish would
44
+ * wait forever.
45
+ */
46
+ const busy = run => Boolean(run) && !run.isDone() && !run.standing;
47
+ function createArming(options = {}) {
48
+ const {
49
+ deadline = 4000,
50
+ onStandDown
51
+ } = options;
52
+ const state = new Armed();
53
+ /** which crossing is current — a stale run's settle must not end a newer one */
54
+ let generation = 0;
55
+ const settlers = [];
56
+ const standDown = () => {
57
+ // guarded: writing the same value still dirties a tracked field, and a
58
+ // host that stands an unarmed crossing down (a test reset) must not
59
+ // invalidate everything reading the flag
60
+ if (state.on) {
61
+ state.on = false;
62
+ }
63
+ onStandDown?.();
64
+ settlers.splice(0).forEach(resolve => resolve());
65
+ };
66
+ const watch = (gen, region) => {
67
+ const started = performance.now();
68
+ const latch = run => {
69
+ void run.finished.then(() => {
70
+ if (gen !== generation) {
71
+ return;
72
+ }
73
+ const current = region.run;
74
+ if (current && current !== run && busy(current)) {
75
+ // replaced mid-flight: the crossing is still on screen, and it is
76
+ // the successor's landing that ends it
77
+ latch(current);
78
+ return;
79
+ }
80
+ standDown();
81
+ });
82
+ };
83
+ const look = () => {
84
+ if (!state.on || gen !== generation) {
85
+ return;
86
+ }
87
+ const run = region.run;
88
+ if (busy(run)) {
89
+ latch(run);
90
+ return;
91
+ }
92
+ if (performance.now() - started > deadline) {
93
+ standDown();
94
+ return;
95
+ }
96
+ requestAnimationFrame(look);
97
+ };
98
+ requestAnimationFrame(look);
99
+ };
100
+ return {
101
+ active: () => state.on,
102
+ begin(region) {
103
+ state.on = true;
104
+ watch(++generation, region);
105
+ },
106
+ end() {
107
+ generation++;
108
+ standDown();
109
+ },
110
+ settled() {
111
+ if (!state.on) {
112
+ return Promise.resolve();
113
+ }
114
+ return new Promise(resolve => settlers.push(resolve));
115
+ }
116
+ };
117
+ }
118
+
119
+ export { createArming };
120
+ //# sourceMappingURL=arming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arming.js","sources":["../src/arming.ts"],"sourcesContent":["/**\n * Arming — \"a scene change is under way\", as a value a host can read.\n *\n * A region is router-agnostic by design (§9): it discovers a crossing by\n * rendering one, and it says nothing about it to anybody. But the host around\n * it usually has to KNOW — to skip the entrance animations of cards mounting\n * mid-flight, to hold a heavy mount back until the landing, to gate anything\n * that would otherwise fire twenty springs into the middle of a move.\n *\n * Knowing turns out to be four subtleties, and two apps in a row hand-copied\n * all four before this became a library part:\n *\n * - **The run does not exist yet.** The decision to cross is made in a route\n * hook; the run is born after the swap renders. So the flag stands up\n * first and the watch latches the first live run the region produces.\n * - **A run can be REPLACED mid-flight.** A real interruption recompiles the\n * score, and the old run's `finished` resolves as its successor takes off.\n * Standing down there ends the crossing while it is still visibly moving,\n * so the watch hands over to the successor instead.\n * - **A stale settle must not stand down a newer crossing.** Generations.\n * - **Some crossings never produce a pass at all** — aborted, or rendered\n * identically. A deadline is the backstop, and without it the flag is a\n * latch that never opens.\n *\n * Host-blind on purpose: no router, no owner, no framework beyond the one\n * tracked flag the templates need in order to re-render when it changes.\n */\nimport { tracked } from '@glimmer/tracking';\n\nimport type { Run } from './run.ts';\n\n/** the sliver of a region a watch needs: the run it is playing right now */\nexport interface ArmingRegion {\n readonly run: Run | null | undefined;\n}\n\nexport interface Arming {\n /** tracked: a crossing this arming is watching is under way */\n active(): boolean;\n /**\n * Arm now, and watch `region` until the run that survives has settled (or\n * the deadline passes). Called again while armed, it re-arms: the earlier\n * watch is abandoned rather than allowed to stand the new one down.\n */\n begin(region: ArmingRegion): void;\n /** stand down by hand — a test reset, or a host that knows the pass is off */\n end(): void;\n /**\n * Resolves when this arming stands down, immediately when nothing is armed.\n * What a host waits on before paying for an expensive mount.\n */\n settled(): Promise<void>;\n}\n\nexport interface ArmingOptions {\n /**\n * How long to wait for a run to appear before standing down anyway, in ms\n * (default 4000). The backstop for a crossing that never produced a pass.\n */\n deadline?: number;\n /** run whenever the arming stands down — where a host clears its own flags */\n onStandDown?: () => void;\n}\n\nclass Armed {\n @tracked on = false;\n}\n\n/**\n * A run that is genuinely still working. A parked run is a still and a\n * STANDING run is an annotation that is simply on (a score of nothing but\n * open steps has no end to wait for) — waiting for either to finish would\n * wait forever.\n */\nconst busy = (run: Run | null | undefined): run is Run =>\n Boolean(run) && !run!.isDone() && !run!.standing;\n\nexport function createArming(options: ArmingOptions = {}): Arming {\n const { deadline = 4000, onStandDown } = options;\n const state = new Armed();\n /** which crossing is current — a stale run's settle must not end a newer one */\n let generation = 0;\n const settlers: (() => void)[] = [];\n\n const standDown = () => {\n // guarded: writing the same value still dirties a tracked field, and a\n // host that stands an unarmed crossing down (a test reset) must not\n // invalidate everything reading the flag\n if (state.on) {\n state.on = false;\n }\n onStandDown?.();\n settlers.splice(0).forEach((resolve) => resolve());\n };\n\n const watch = (gen: number, region: ArmingRegion) => {\n const started = performance.now();\n const latch = (run: Run) => {\n void run.finished.then(() => {\n if (gen !== generation) {\n return;\n }\n const current = region.run;\n if (current && current !== run && busy(current)) {\n // replaced mid-flight: the crossing is still on screen, and it is\n // the successor's landing that ends it\n latch(current);\n return;\n }\n standDown();\n });\n };\n const look = () => {\n if (!state.on || gen !== generation) {\n return;\n }\n const run = region.run;\n if (busy(run)) {\n latch(run);\n return;\n }\n if (performance.now() - started > deadline) {\n standDown();\n return;\n }\n requestAnimationFrame(look);\n };\n requestAnimationFrame(look);\n };\n\n return {\n active: () => state.on,\n begin(region) {\n state.on = true;\n watch(++generation, region);\n },\n end() {\n generation++;\n standDown();\n },\n settled() {\n if (!state.on) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => settlers.push(resolve));\n },\n };\n}\n"],"names":["Armed","g","prototype","tracked","i","busy","run","Boolean","isDone","standing","createArming","options","deadline","onStandDown","state","generation","settlers","standDown","on","splice","forEach","resolve","watch","gen","region","started","performance","now","latch","finished","then","current","look","requestAnimationFrame","active","begin","end","settled","Promise","push"],"mappings":"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"}
package/dist/beacon.js ADDED
@@ -0,0 +1,25 @@
1
+ import { modifier } from 'ember-modifier';
2
+ import { registerBeacon } from './beacons.js';
3
+
4
+ /**
5
+ * `{{beacon 'trash'}}` — claim a name for this element's box.
6
+ *
7
+ * The element takes no part in any changeset and is never animated. A <Choreo>
8
+ * step reads its measurement to give another sprite a fake start or a fake end:
9
+ *
10
+ * <button type='button' {{beacon 'trash'}}>Trash</button>
11
+ * <c.Move @of={{c.removed 'row'}} @to={{c.beacon 'trash'}} />
12
+ *
13
+ * See ./beacons.ts for why the registry is global, and why this is not
14
+ * `layoutId`.
15
+ */
16
+ const beacon = modifier((element, positional) => {
17
+ const name = positional[0];
18
+ if (!name) {
19
+ return;
20
+ }
21
+ return registerBeacon(name, element);
22
+ });
23
+
24
+ export { beacon, beacon as default };
25
+ //# sourceMappingURL=beacon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beacon.js","sources":["../src/beacon.ts"],"sourcesContent":["/**\n * `{{beacon 'trash'}}` — claim a name for this element's box.\n *\n * The element takes no part in any changeset and is never animated. A <Choreo>\n * step reads its measurement to give another sprite a fake start or a fake end:\n *\n * <button type='button' {{beacon 'trash'}}>Trash</button>\n * <c.Move @of={{c.removed 'row'}} @to={{c.beacon 'trash'}} />\n *\n * See ./beacons.ts for why the registry is global, and why this is not\n * `layoutId`.\n */\nimport { modifier } from 'ember-modifier';\n\nimport { registerBeacon } from './beacons.ts';\n\nexport const beacon = modifier((element: Element, positional: [string]) => {\n const name = positional[0];\n if (!name) {\n return;\n }\n return registerBeacon(name, element);\n});\n\nexport default beacon;\n"],"names":["beacon","modifier","element","positional","name","registerBeacon"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKO,MAAMA,MAAM,GAAGC,QAAQ,CAAC,CAACC,OAAgB,EAAEC,UAAoB,KAAK;AACzE,EAAA,MAAMC,IAAI,GAAGD,UAAU,CAAC,CAAC,CAAC;EAC1B,IAAI,CAACC,IAAI,EAAE;AACT,IAAA;AACF,EAAA;AACA,EAAA,OAAOC,cAAc,CAACD,IAAI,EAAEF,OAAO,CAAC;AACtC,CAAC;;;;"}
@@ -0,0 +1,77 @@
1
+ import { measureBounds } from './measure.js';
2
+
3
+ /**
4
+ * Beacons — a named box that does not animate.
5
+ *
6
+ * Ember Animated's primitive: `<AnimatedBeacon>` measures its child when a
7
+ * transition starts, stores a sprite on the motion service, and a generator
8
+ * reads `context.beacons` to say "start here" or "end there". The beacon
9
+ * itself never moves.
10
+ *
11
+ * <button {{beacon 'trash'}}>Trash</button>
12
+ *
13
+ * <Choreo as |c|>
14
+ * …
15
+ * <c.Move @of={{c.removed 'row'}} @to={{c.beacon 'trash'}} />
16
+ * </Choreo>
17
+ *
18
+ * This is deliberately NOT `layoutId`. `layoutId` pairs two real elements that
19
+ * share an identity and morphs one into the other — putting it on a leaving row
20
+ * and on the bin would make the bin a shared element, and it would stretch. A
21
+ * beacon has no identity in the changeset: it is not inserted, kept or removed,
22
+ * it is a point other sprites may borrow. A beacon moving on its own never
23
+ * starts a run.
24
+ *
25
+ * The registry is document-global on purpose. The case that wants beacons is an
26
+ * inbox — the trash lives in the chrome, the list lives in the outlet, and they
27
+ * are different regions precisely so their changesets stay apart. A region-local
28
+ * registry could not see across that boundary, which is the whole point.
29
+ * docs/nested-choreo.md has the reasoning.
30
+ */
31
+ /** name → the element claiming it. First registration this pass wins, as Ember Animated's `hasBeacon` does. */
32
+ const registry = new Map();
33
+ function registerBeacon(name, element) {
34
+ if (!registry.has(name)) {
35
+ registry.set(name, element);
36
+ }
37
+ return () => {
38
+ if (registry.get(name) === element) {
39
+ registry.delete(name);
40
+ }
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Measure every live beacon, in the same window the region measures `final`.
46
+ *
47
+ * Re-measured every pass, never cached: the trash can move without the list
48
+ * rendering at all — a header that hides, a column that resizes, a scroll.
49
+ */
50
+ function measureBeacons(root) {
51
+ const out = new Map();
52
+ for (const [name, el] of registry) {
53
+ if (!el.isConnected) {
54
+ continue;
55
+ }
56
+ out.set(name, measureBounds(el, root));
57
+ }
58
+ return out;
59
+ }
60
+
61
+ /**
62
+ * Forget every claimed name. The registry outlives any one owner, so a test
63
+ * that tore down mid-flight would otherwise leave a dead element holding a
64
+ * name the next test wants — first-wins turns into first-test-wins.
65
+ * `setupChoreo(hooks)` runs this before and after every test; nothing in an
66
+ * app should.
67
+ */
68
+ function resetBeacons() {
69
+ registry.clear();
70
+ }
71
+
72
+ /** `{{c.beacon 'trash'}}` — a named point, not a sprite query */
73
+
74
+ const isBeaconRef = v => typeof v === 'object' && v !== null && typeof v.beacon === 'string';
75
+
76
+ export { isBeaconRef, measureBeacons, registerBeacon, resetBeacons };
77
+ //# sourceMappingURL=beacons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beacons.js","sources":["../src/beacons.ts"],"sourcesContent":["/**\n * Beacons — a named box that does not animate.\n *\n * Ember Animated's primitive: `<AnimatedBeacon>` measures its child when a\n * transition starts, stores a sprite on the motion service, and a generator\n * reads `context.beacons` to say \"start here\" or \"end there\". The beacon\n * itself never moves.\n *\n * <button {{beacon 'trash'}}>Trash</button>\n *\n * <Choreo as |c|>\n * …\n * <c.Move @of={{c.removed 'row'}} @to={{c.beacon 'trash'}} />\n * </Choreo>\n *\n * This is deliberately NOT `layoutId`. `layoutId` pairs two real elements that\n * share an identity and morphs one into the other — putting it on a leaving row\n * and on the bin would make the bin a shared element, and it would stretch. A\n * beacon has no identity in the changeset: it is not inserted, kept or removed,\n * it is a point other sprites may borrow. A beacon moving on its own never\n * starts a run.\n *\n * The registry is document-global on purpose. The case that wants beacons is an\n * inbox — the trash lives in the chrome, the list lives in the outlet, and they\n * are different regions precisely so their changesets stay apart. A region-local\n * registry could not see across that boundary, which is the whole point.\n * docs/nested-choreo.md has the reasoning.\n */\nimport { measureBounds } from './measure.ts';\nimport type { Bounds } from './types.ts';\n\n/** name → the element claiming it. First registration this pass wins, as Ember Animated's `hasBeacon` does. */\nconst registry = new Map<string, Element>();\n\nexport function registerBeacon(name: string, element: Element): () => void {\n if (!registry.has(name)) {\n registry.set(name, element);\n }\n return () => {\n if (registry.get(name) === element) {\n registry.delete(name);\n }\n };\n}\n\n/**\n * Measure every live beacon, in the same window the region measures `final`.\n *\n * Re-measured every pass, never cached: the trash can move without the list\n * rendering at all — a header that hides, a column that resizes, a scroll.\n */\nexport function measureBeacons(root: DOMRect): Map<string, Bounds> {\n const out = new Map<string, Bounds>();\n for (const [name, el] of registry) {\n if (!el.isConnected) {\n continue;\n }\n out.set(name, measureBounds(el, root));\n }\n return out;\n}\n\n/**\n * Forget every claimed name. The registry outlives any one owner, so a test\n * that tore down mid-flight would otherwise leave a dead element holding a\n * name the next test wants — first-wins turns into first-test-wins.\n * `setupChoreo(hooks)` runs this before and after every test; nothing in an\n * app should.\n */\nexport function resetBeacons() {\n registry.clear();\n}\n\n/** `{{c.beacon 'trash'}}` — a named point, not a sprite query */\nexport interface BeaconRef {\n beacon: string;\n}\n\nexport const isBeaconRef = (v: unknown): v is BeaconRef =>\n typeof v === 'object' &&\n v !== null &&\n typeof (v as BeaconRef).beacon === 'string';\n"],"names":["registry","Map","registerBeacon","name","element","has","set","get","delete","measureBeacons","root","out","el","isConnected","measureBounds","resetBeacons","clear","isBeaconRef","v","beacon"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA,MAAMA,QAAQ,GAAG,IAAIC,GAAG,EAAmB;AAEpC,SAASC,cAAcA,CAACC,IAAY,EAAEC,OAAgB,EAAc;AACzE,EAAA,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAI,CAAC,EAAE;AACvBH,IAAAA,QAAQ,CAACM,GAAG,CAACH,IAAI,EAAEC,OAAO,CAAC;AAC7B,EAAA;AACA,EAAA,OAAO,MAAM;IACX,IAAIJ,QAAQ,CAACO,GAAG,CAACJ,IAAI,CAAC,KAAKC,OAAO,EAAE;AAClCJ,MAAAA,QAAQ,CAACQ,MAAM,CAACL,IAAI,CAAC;AACvB,IAAA;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASM,cAAcA,CAACC,IAAa,EAAuB;AACjE,EAAA,MAAMC,GAAG,GAAG,IAAIV,GAAG,EAAkB;EACrC,KAAK,MAAM,CAACE,IAAI,EAAES,EAAE,CAAC,IAAIZ,QAAQ,EAAE;AACjC,IAAA,IAAI,CAACY,EAAE,CAACC,WAAW,EAAE;AACnB,MAAA;AACF,IAAA;IACAF,GAAG,CAACL,GAAG,CAACH,IAAI,EAAEW,aAAa,CAACF,EAAE,EAAEF,IAAI,CAAC,CAAC;AACxC,EAAA;AACA,EAAA,OAAOC,GAAG;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASI,YAAYA,GAAG;EAC7Bf,QAAQ,CAACgB,KAAK,EAAE;AAClB;;AAEA;;MAKaC,WAAW,GAAIC,CAAU,IACpC,OAAOA,CAAC,KAAK,QAAQ,IACrBA,CAAC,KAAK,IAAI,IACV,OAAQA,CAAC,CAAeC,MAAM,KAAK;;;;"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * boxel-motion's Changeset: the sprites one render pass produced, and the
3
+ * spritesFor / spriteFor queries its transitions selected them with.
4
+ */
5
+
6
+ /**
7
+ * Is any part of this sprite inside the window (Query.onstage)?
8
+ *
9
+ * A removed sprite is judged where the OLD scene showed it — its initial box,
10
+ * captured before the crossing scrolled the window — and everything else where
11
+ * the new scene will show it. Both boxes are client-space measurements taken
12
+ * on their own side of the scroll, so each is compared against the viewport
13
+ * that was (or will be) actually on screen with it.
14
+ */
15
+ function onstage(s) {
16
+ const box = (s.type === 'removed' ? s.initial : s.final ?? s.initial)?.page;
17
+ if (!box) {
18
+ return true;
19
+ }
20
+ return box.x < window.innerWidth && box.y < window.innerHeight && box.x + box.width > 0 && box.y + box.height > 0;
21
+ }
22
+ const isStill = s => !s.delta || s.delta.x === 0 && s.delta.y === 0 && s.delta.width === 0 && s.delta.height === 0;
23
+ class Changeset {
24
+ inserted;
25
+ kept;
26
+ removed;
27
+
28
+ /**
29
+ * The box a `{{beacon}}` claimed this pass, or null if nothing claimed that
30
+ * name. It is a measurement, not a sprite: a beacon is never inserted, kept
31
+ * or removed, and a missing one is a no-op for whatever wanted to borrow it.
32
+ *
33
+ * Closed over rather than stored as a field, so this class stays structurally
34
+ * identical to ChangesetLike — a property function written against the
35
+ * concrete Changeset must still accept the interface it is handed.
36
+ */
37
+ beacon;
38
+
39
+ /**
40
+ * The camera zoom the world was measured under (§6.3). Every box in this
41
+ * changeset is a page-space measurement taken through the region's frame
42
+ * transform, but a step's values are written in the sprite's own local
43
+ * space — so geometry that becomes inline pixels must be divided back by
44
+ * this before it is animated. 1 when the frame is at rest.
45
+ */
46
+ measureZoom;
47
+
48
+ /** the frame's own size in local pixels, from the same final layout */
49
+ frame;
50
+
51
+ /** what the page shows behind this region — see ChangesetLike.ground */
52
+ ground;
53
+ constructor(inserted, removed, kept, beacons = new Map(), measureZoom = 1, frame, ground) {
54
+ this.inserted = inserted;
55
+ this.removed = removed;
56
+ this.kept = kept;
57
+ this.beacon = name => beacons.get(name) ?? null;
58
+ this.measureZoom = measureZoom;
59
+ this.frame = frame;
60
+ this.ground = ground;
61
+ }
62
+ get all() {
63
+ return [...this.kept, ...this.inserted, ...this.removed];
64
+ }
65
+
66
+ /** something happened this pass that a choreography could animate */
67
+ get dirty() {
68
+ return this.inserted.length > 0 || this.removed.length > 0 || this.kept.some(s => !isStill(s));
69
+ }
70
+ sprites(query) {
71
+ if (Array.isArray(query)) {
72
+ const out = [];
73
+ for (const q of query) {
74
+ for (const s of this.sprites(q)) {
75
+ if (!out.includes(s)) {
76
+ out.push(s);
77
+ }
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+ let pool;
83
+ switch (query.type) {
84
+ case 'inserted':
85
+ pool = this.inserted;
86
+ break;
87
+ case 'removed':
88
+ pool = this.removed;
89
+ break;
90
+ case 'kept':
91
+ pool = this.kept;
92
+ break;
93
+ case 'still':
94
+ pool = this.kept.filter(isStill);
95
+ break;
96
+ case 'moved':
97
+ pool = this.kept.filter(s => !isStill(s));
98
+ break;
99
+ case 'received':
100
+ // the receiving half of a counterpart / far match: kept, but only
101
+ // because an arriving element claimed a leaving one's identity
102
+ pool = this.kept.filter(s => s.counterpart);
103
+ break;
104
+ case 'counterpart':
105
+ // the removed half that was claimed — the old element, orphaned so a
106
+ // step can cross-fade it while its replacement flies
107
+ pool = this.removed.filter(s => s.claimed);
108
+ break;
109
+ case 'departed':
110
+ // what only the old scene had: removed, claimed by nobody, not
111
+ // carried on by another region — the crossing's LEAVES
112
+ pool = this.removed.filter(s => !s.claimed && !s.sent);
113
+ break;
114
+ default:
115
+ pool = this.all;
116
+ }
117
+ return pool.filter(s => (query.id === undefined || s.id === query.id) && (query.role === undefined || s.role === query.role) && (!query.onstage || onstage(s)));
118
+ }
119
+ sprite(query) {
120
+ const found = this.sprites(query);
121
+ if (found.length > 1) {
122
+ throw new Error(`choreo: more than one sprite matches ${JSON.stringify(query)}`);
123
+ }
124
+ return found[0] ?? null;
125
+ }
126
+ }
127
+
128
+ export { Changeset, Changeset as default };
129
+ //# sourceMappingURL=changeset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeset.js","sources":["../src/changeset.ts"],"sourcesContent":["/**\n * boxel-motion's Changeset: the sprites one render pass produced, and the\n * spritesFor / spriteFor queries its transitions selected them with.\n */\nimport type { Bounds, ChangesetLike, Query, Sprite } from './types.ts';\n\n/**\n * Is any part of this sprite inside the window (Query.onstage)?\n *\n * A removed sprite is judged where the OLD scene showed it — its initial box,\n * captured before the crossing scrolled the window — and everything else where\n * the new scene will show it. Both boxes are client-space measurements taken\n * on their own side of the scroll, so each is compared against the viewport\n * that was (or will be) actually on screen with it.\n */\nfunction onstage(s: Sprite): boolean {\n const box = (s.type === 'removed' ? s.initial : (s.final ?? s.initial))?.page;\n if (!box) {\n return true;\n }\n return (\n box.x < window.innerWidth &&\n box.y < window.innerHeight &&\n box.x + box.width > 0 &&\n box.y + box.height > 0\n );\n}\n\nconst isStill = (s: Sprite) =>\n !s.delta ||\n (s.delta.x === 0 &&\n s.delta.y === 0 &&\n s.delta.width === 0 &&\n s.delta.height === 0);\n\nexport class Changeset implements ChangesetLike {\n readonly inserted: Sprite[];\n readonly kept: Sprite[];\n readonly removed: Sprite[];\n\n /**\n * The box a `{{beacon}}` claimed this pass, or null if nothing claimed that\n * name. It is a measurement, not a sprite: a beacon is never inserted, kept\n * or removed, and a missing one is a no-op for whatever wanted to borrow it.\n *\n * Closed over rather than stored as a field, so this class stays structurally\n * identical to ChangesetLike — a property function written against the\n * concrete Changeset must still accept the interface it is handed.\n */\n readonly beacon: (name: string) => Bounds | null;\n\n /**\n * The camera zoom the world was measured under (§6.3). Every box in this\n * changeset is a page-space measurement taken through the region's frame\n * transform, but a step's values are written in the sprite's own local\n * space — so geometry that becomes inline pixels must be divided back by\n * this before it is animated. 1 when the frame is at rest.\n */\n readonly measureZoom: number;\n\n /** the frame's own size in local pixels, from the same final layout */\n readonly frame?: { height: number; width: number };\n\n /** what the page shows behind this region — see ChangesetLike.ground */\n readonly ground?: string;\n\n constructor(\n inserted: Sprite[],\n removed: Sprite[],\n kept: Sprite[],\n beacons: Map<string, Bounds> = new Map(),\n measureZoom = 1,\n frame?: { height: number; width: number },\n ground?: string,\n ) {\n this.inserted = inserted;\n this.removed = removed;\n this.kept = kept;\n this.beacon = (name) => beacons.get(name) ?? null;\n this.measureZoom = measureZoom;\n this.frame = frame;\n this.ground = ground;\n }\n\n get all(): Sprite[] {\n return [...this.kept, ...this.inserted, ...this.removed];\n }\n\n /** something happened this pass that a choreography could animate */\n get dirty(): boolean {\n return (\n this.inserted.length > 0 ||\n this.removed.length > 0 ||\n this.kept.some((s) => !isStill(s))\n );\n }\n\n sprites(query: Query | Query[]): Sprite[] {\n if (Array.isArray(query)) {\n const out: Sprite[] = [];\n for (const q of query) {\n for (const s of this.sprites(q)) {\n if (!out.includes(s)) {\n out.push(s);\n }\n }\n }\n return out;\n }\n let pool: Sprite[];\n switch (query.type) {\n case 'inserted':\n pool = this.inserted;\n break;\n case 'removed':\n pool = this.removed;\n break;\n case 'kept':\n pool = this.kept;\n break;\n case 'still':\n pool = this.kept.filter(isStill);\n break;\n case 'moved':\n pool = this.kept.filter((s) => !isStill(s));\n break;\n case 'received':\n // the receiving half of a counterpart / far match: kept, but only\n // because an arriving element claimed a leaving one's identity\n pool = this.kept.filter((s) => s.counterpart);\n break;\n case 'counterpart':\n // the removed half that was claimed — the old element, orphaned so a\n // step can cross-fade it while its replacement flies\n pool = this.removed.filter((s) => s.claimed);\n break;\n case 'departed':\n // what only the old scene had: removed, claimed by nobody, not\n // carried on by another region — the crossing's LEAVES\n pool = this.removed.filter((s) => !s.claimed && !s.sent);\n break;\n default:\n pool = this.all;\n }\n return pool.filter(\n (s) =>\n (query.id === undefined || s.id === query.id) &&\n (query.role === undefined || s.role === query.role) &&\n (!query.onstage || onstage(s)),\n );\n }\n\n sprite(query: Query | Query[]): Sprite | null {\n const found = this.sprites(query);\n if (found.length > 1) {\n throw new Error(\n `choreo: more than one sprite matches ${JSON.stringify(query)}`,\n );\n }\n return found[0] ?? null;\n }\n}\n\nexport default Changeset;\n"],"names":["onstage","s","box","type","initial","final","page","x","window","innerWidth","y","innerHeight","width","height","isStill","delta","Changeset","inserted","kept","removed","beacon","measureZoom","frame","ground","constructor","beacons","Map","name","get","all","dirty","length","some","sprites","query","Array","isArray","out","q","includes","push","pool","filter","counterpart","claimed","sent","id","undefined","role","sprite","found","Error","JSON","stringify"],"mappings":"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"}