@kieransimkin/dancemoves 3.0.2 → 3.0.4

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/README.md CHANGED
@@ -3,8 +3,9 @@
3
3
  **DanceFlow musical motion by Kieran Simkin.** One JavaScript runtime for plain
4
4
  websites, React, Next.js and the separately packaged WordPress adapter.
5
5
 
6
- **3.0.0 source candidate** based on the published 2.9.0 release. Applying this
7
- patch neither publishes npm nor updates a WordPress installation.
6
+ **3.0.4 release candidate** based on the published 3.0.3 shared-library release.
7
+ It adds the shared three-slot lyric stage used by existing WordPress EPKs without
8
+ restoring the duplicate raw-script layout removed in 3.0.
8
9
 
9
10
  ## Shared JavaScript library and WordPress
10
11
 
@@ -587,7 +588,7 @@ than treating historical release notes as the current API contract.
587
588
  | Reference | Contents |
588
589
  | --- | --- |
589
590
  | [Core JavaScript](docs/api/javascript.md) | All clock, interval, parser, cue, lyric, animation-scope and diagnostic methods; exact cue landings; immediate-next and next-visible lyric payloads. |
590
- | [Shared effects](docs/api/effects.md) | `pointer`, `playbackPulse`, `cueClass`, `cueTimeline`, `quality`; all options, callbacks, returned handles and registry methods. |
591
+ | [Shared effects](docs/api/effects.md) | `pointer`, `playbackPulse`, `cueClass`, `cueTimeline`, `lyricStage`, `quality`; all options, callbacks, returned handles and registry methods. |
591
592
  | [WordPress, PHP and REST](docs/api/wordpress.md) | Page metadata, helpers, editor validation, asset dependencies, hooks and full motion-capture request/response contract. |
592
593
  | [Signed MP3 downloads](docs/api/downloads.md) | All eight download helpers, anchor rewriting, signed GET/HEAD endpoint, response headers, errors and security limits. |
593
594
  | [Paper planes](docs/api/paper-planes.md) | Ambient-effect selection, hero markup, configuration, snapshot/teardown, compact mode and accessibility behaviour. |
package/docs/README.md CHANGED
@@ -23,7 +23,7 @@ not a hypothetical 2.9. See [source provenance](source-audit.md).
23
23
  | Task | Reference |
24
24
  | --- | --- |
25
25
  | Install, configure a Page, prepare timing files, enable lyrics | [User and integration guide](guide.md) |
26
- | Mount pointer, pulse, cue-class, cue-timeline or quality effects | [Shared effect API](api/effects.md) |
26
+ | Mount pointer, pulse, cue-class, cue-timeline, lyric-stage or quality effects | [Shared effect API](api/effects.md) |
27
27
  | Enable or integrate the paper-plane renderer | [Paper-plane API](api/paper-planes.md) |
28
28
  | Create reliable MP3 download links and understand the HTTP endpoint | [Download API](api/downloads.md) |
29
29
  | Call the musical clock, schedule work, subscribe to cues/lyrics | [JavaScript API](api/javascript.md) |
@@ -40,8 +40,8 @@ not a hypothetical 2.9. See [source provenance](source-audit.md).
40
40
  | Page properties | BPM, lyric attachment, cue attachment, lyric-pop-up opt-in, ambient-effect selection; hidden master duration | Attachment content validation on the editor save path is stronger than REST metadata sanitisation. |
41
41
  | Musical clock | 16 ticks per beat, duration quantisation, page and audio clocks, beat/bar helpers | A bar helper means four beats; this is not a meter or tempo-map engine. |
42
42
  | Cue timing | LRC-style timed labels, named/wildcard handlers, scoped animation resets, legacy event alias | `.cue` means the plugin's timestamped text format, not a CD cuesheet. |
43
- | Timed lyrics | One neutral visual layer, blank clears, playback/seek following, immediate-next and next-visible previews, callbacks and DOM events | Off by default; a release-specific design review is required before adoption. |
44
- | Shared effects | `pointer`, `playbackPulse`, `cueClass`, `cueTimeline`, `quality`; stable-ID instance management | Page code owns appearance; callback, transport and accessibility contracts differ between primitives. |
43
+ | Timed lyrics | Neutral popover or shared three-slot stage, blank clears, playback/seek following, previous/next visible neighbours, callbacks and DOM events | Off by default; a release-specific design review is required before adoption. |
44
+ | Shared effects | `pointer`, `playbackPulse`, `cueClass`, `cueTimeline`, `lyricStage`, `quality`; stable-ID instance management | Page code owns appearance; callback, transport and accessibility contracts differ between primitives. |
45
45
  | Signed MP3 downloads | Attachment-only GET/HEAD endpoint and rewriting of explicit upload download links | HMAC is not user authorisation or an expiring URL; players keep their original URLs. |
46
46
  | Paper planes | Page-configured hero effect, atlas sprites, compact mode, offscreen/hidden pause | DOM structure, CSS containment and count limits must be preserved; no user-facing tuning panel. |
47
47
  | Catalogue timing | EPK-owned stylesheet, inline, computed and pseudo-element timing conversion | It cannot rewrite canvas/WebGL phase logic or supply an arbitrary new root registration API. |
@@ -4,12 +4,13 @@
4
4
  [Release adapters](adapters.md) · [CSS/HTML](styling.md)
5
5
 
6
6
  Source: [assets/dance-moves-effects.js](../../assets/dance-moves-effects.js).
7
- Baseline: **2.8.0 / `4cb6a71f60459b5579be87d7e55ac8b1426c578e`**.
7
+ Current shared-library baseline: **3.0.4**. Historical 2.7/2.8 notes below
8
+ identify when the earlier primitives were introduced.
8
9
 
9
10
  This is the reusable, page-independent layer introduced in 2.7 and extended with
10
- `cueTimeline()` in 2.8. It supplies mechanisms rather than artwork. It does not
11
+ `cueTimeline()` in 2.8 and `lyricStage()` in 3.0.4. It supplies mechanisms rather than artwork. It does not
11
12
  replace the core's LRC parser, audio discovery, named cue subscriptions or clock.
12
- It contains five factories and four registry methods. Every factory returns a
13
+ It contains six factories and four registry methods. Every factory returns a
13
14
  frozen handle with `id`, `type`, `snapshot()` and `teardown()` plus the methods
14
15
  specified below. The returned object is frozen; its internal state is mutable.
15
16
 
@@ -18,7 +19,7 @@ specified below. The returned object is frozen; its internal state is mutable.
18
19
  WordPress enqueues `dance-moves-effects` after `dance-moves-core`, before the
19
20
  catalogue adopter. The module installs only if `window.DanceMoves` already exists
20
21
  and `window.DanceMovesEffects` does not. It does not retry a missing dependency.
21
- Its `version` property copies `DanceMoves.version`, normally `"2.8.0"`.
22
+ Its `version` property copies `DanceMoves.version`.
22
23
 
23
24
  After installation it dispatches **`dance-moves-effects-ready`** on **`document`**
24
25
  with `detail: { api: window.DanceMovesEffects, version: string }`. It is a native
@@ -393,6 +394,38 @@ The example's timestamps are illustrative, not actual song data. Keep meaningful
393
394
  section styling readable when motion is stopped, and add explicit reduced-motion
394
395
  and forced-colour CSS for any animated treatment.
395
396
 
397
+ ## lyricStage(options)
398
+
399
+ Returns `{ id, type: "lyric-stage", restore, snapshot, teardown }`, or a
400
+ temporary `lyric-stage-pending` handle while the core lyric popover is being
401
+ created. It upgrades the neutral popover into previous/current/next visible
402
+ slots without parsing the LRC again or adding a page-owned playback clock.
403
+
404
+ | Option | Default | Meaning |
405
+ | --- | --- | --- |
406
+ | `root`, `id` | Shared options | Release root and stable registry identity. |
407
+ | `audio` | First root `audio` | Required playback element or selector. |
408
+ | `popover` | `.dance-moves-lyric-popover` | Existing core popover. When absent, mounting waits for `dance-moves-lyric-ready`. |
409
+ | `travelTicks` | `32` | Positive integer duration of the approach to the next visible line. |
410
+ | `cueDurationTicks` | `32` | Default finite lifetime for `renderCue` output. |
411
+ | `render(state)` | Unset | State callback for phase, progress, resize and lifecycle reconciliation. |
412
+ | `renderLyric(state)` | Unset | Release-owned finite lyric treatment. May return a cleanup function or `{durationTicks, cleanup}`. |
413
+ | `renderCue(state)` | Unset | Release-owned bounded cue treatment with the same cleanup forms. |
414
+
415
+ The slots are `{previous,current,next,viewport,track}`. Lyric detail includes the
416
+ core `previousVisible*` and `nextVisible*` fields, so blank clear entries remain
417
+ part of the canonical timeline while the visual stage shows meaningful neighbours.
418
+ Phases include `waiting`, `travelling`, `arrived`, `paused`, `ended` and
419
+ `inactive`. Progress is clamped to `0..1` and published as
420
+ `--dance-moves-lyric-progress`.
421
+
422
+ DanceMoves owns lyric/cue subscriptions, media events, the animation frame,
423
+ wake-up timers, visibility, resize, reduced motion, forced colours and teardown.
424
+ Page callbacks may style or animate a bounded release-specific subject; they
425
+ must not attach a second LRC parser, media listener or clock. Teardown cancels
426
+ finite callback work, restores the original current-text node and removes the
427
+ stage wrapper and public stage attributes.
428
+
396
429
  ## quality(options)
397
430
 
398
431
  Returns `{ id, type: "quality", setTier, snapshot, teardown }`. This reusable
@@ -456,6 +489,8 @@ primitive. Keep cheaper tiers visually acceptable and benchmark the whole page.
456
489
  The shipped [cue-timeline contract](../../tests/cue-timeline.test.cjs) exercises
457
490
  crossing deduplication, pause/resume, forward/backward seeks, active-interval and
458
491
  visibility reconstruction, and registry removal. The
492
+ [lyric-stage contract](../../tests/lyric-stage.test.cjs) exercises neighbour
493
+ selection, travel progress, cue/lyric cleanup, preferences and teardown. The
459
494
  [primitive contract](../../tests/effects-primitives.test.cjs) is mostly static
460
495
  source assertions. Neither establishes physical-device frame performance or
461
496
  complete callback-error, duplicate-ID, accessibility or post-teardown coverage.
@@ -350,6 +350,9 @@ LyricDetail = {
350
350
  time: number, // entry seconds; 0 if no entry
351
351
  text: string, normalisedText: string,
352
352
  index: number, // zero-based; -1 before the first entry
353
+ previousVisibleTime: number | null,
354
+ previousVisibleText: string, previousVisibleNormalisedText: string,
355
+ previousVisibleIndex: number,
353
356
  nextTime: number | null,
354
357
  nextText: string, nextNormalisedText: string, nextIndex: number,
355
358
  nextVisibleTime: number | null,
@@ -359,7 +362,8 @@ LyricDetail = {
359
362
  }
360
363
  ```
361
364
 
362
- `next*` describes the **immediately following LRC entry**, including a blank
365
+ `previousVisible*` scans backwards to the first nonblank trimmed lyric. `next*`
366
+ describes the **immediately following LRC entry**, including a blank
363
367
  clear. `nextVisible*` scans forward to the first nonblank trimmed lyric, skipping
364
368
  all blank clears. Missing next entries use `null` time, `""` text/normalised text
365
369
  and `-1` index. Before the first entry, look-ahead starts at entry zero. Repeated
@@ -369,8 +373,9 @@ cue-name normalisation, not a translation or Unicode-preserving identifier.
369
373
  For `[00:01]A`, `[00:02]`, `[00:03]B`, the A event has `nextTime: 2`,
370
374
  `nextText: ""`, `nextVisibleTime: 3`, and `nextVisibleText: "B"`. A preview should
371
375
  use those timestamps with `detail.audio.currentTime`; do not parse the LRC twice
372
- or assume the next visible line starts at the blank clear. Fields were added by
373
- the 2.4.1/2.5.1 changes and are included in 2.8.0.
376
+ or assume the next visible line starts at the blank clear. The forward fields
377
+ were added by the 2.4.1/2.5.1 changes; the previous-visible fields were added
378
+ with the shared lyric stage in 3.0.4.
374
379
 
375
380
  After callbacks, the core dispatches bubbling `dance-moves-lyric` on `document`
376
381
  with the same detail. It then updates the built-in visual layer when enabled.
@@ -3,8 +3,7 @@
3
3
  [Documentation index](../README.md) · [JavaScript](javascript.md) ·
4
4
  [Adapters](adapters.md)
5
5
 
6
- Baseline: DanceMoves 2.8.0, commit
7
- `4cb6a71f60459b5579be87d7e55ac8b1426c578e`.
6
+ Current shared-library baseline: DanceMoves 3.0.4.
8
7
  Sources: [core JavaScript](../../assets/dance-moves-core.js),
9
8
  [core stylesheet](../../assets/dance-moves-core.css),
10
9
  [catalogue adopter](../../assets/dance-moves-catalogue-timing.js),
@@ -128,6 +127,28 @@ these properties on a matching component selector, not only on an ancestor.
128
127
  | `data-dance-moves-lyric-pulse="true"` | Removed and re-added on index changes to restart the text arrival animation. |
129
128
  | `dance-moves-lyric-arrive` | Neutral six-tick arrival keyframe animation, attached to the text span while the pulse marker is present. |
130
129
 
130
+ Calling `DanceMovesEffects.lyricStage()` changes the interior to a shared
131
+ three-line structure while preserving the same popover:
132
+
133
+ ```html
134
+ <div class="dance-moves-lyric-popover" data-dance-moves-lyric-stage="ready">
135
+ <div class="dance-moves-lyric-stage__viewport">
136
+ <div class="dance-moves-lyric-stage__track">
137
+ <span class="dance-moves-lyric-stage__line dance-moves-lyric-stage__line--previous"></span>
138
+ <span class="dance-moves-lyric-popover__text dance-moves-lyric-stage__line dance-moves-lyric-stage__line--current"></span>
139
+ <span class="dance-moves-lyric-stage__line dance-moves-lyric-stage__line--next"></span>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ ```
144
+
145
+ The stage publishes `data-dance-moves-lyric-phase`, per-line
146
+ `data-dance-moves-lyric-slot` and `data-dance-moves-lyric-index`, plus the
147
+ `--dance-moves-lyric-progress` and `--dance-moves-lyric-stage-step` properties.
148
+ The neutral track moves only within the bounded lyric viewport. Reduced motion
149
+ and forced colours remove the travel transform while keeping the current text
150
+ readable; release CSS may change appearance but must preserve that fallback.
151
+
131
152
  The default text block has a maximum width of `min(44rem, 100%)`, balanced centred
132
153
  text and responsive font sizing. Reduced motion removes component animation,
133
154
  transitions and transforms but keeps the words. Forced colours use `Canvas`,
package/docs/guide.md CHANGED
@@ -225,13 +225,19 @@ Custom lyric consumers must handle audio `pause`/`ended` themselves when they ne
225
225
  to hide: `onLyric()` does not emit a synthetic blank on those events. It also does
226
226
  not immediately replay the last value to a newly registered handler.
227
227
 
228
+ For a previous/current/next presentation, use `DanceMovesEffects.lyricStage()`.
229
+ It consumes the core's previous/next visible neighbours and owns media, seek,
230
+ visibility, preference, resize, timer and teardown lifecycle. A release adapter
231
+ should supply only its scoped visual callbacks and CSS, not another parser or clock.
232
+
228
233
  ## Use the shared effects API
229
234
 
230
235
  Load after `dance-moves-effects`, or mount once in response to the document's
231
236
  `dance-moves-effects-ready` event. Select the smallest matching primitive:
232
237
  `pointer()` for bounded input, `playbackPulse()` for phase-aligned CSS,
233
238
  `cueClass()` for a short cue-triggered class, `cueTimeline()` for reconstructable
234
- playback state, and `quality()` for a reusable quality controller. Stable IDs
239
+ playback state, `lyricStage()` for the shared three-line lyric lifecycle, and
240
+ `quality()` for a reusable quality controller. Stable IDs
235
241
  identify instances for `get()`, `snapshot()` and teardown. Each has explicit
236
242
  options, callback payloads and disposal semantics in the [shared API](api/effects.md).
237
243
  These are APIs, not auto-enabled visual presets. In particular, a cue timeline
@@ -1,6 +1,6 @@
1
1
  # Shared JavaScript API
2
2
 
3
- Package: `@kieransimkin/dancemoves`, source candidate 3.0.0.
3
+ Package: `@kieransimkin/dancemoves`, release candidate 3.0.4.
4
4
  This guide describes the public shared module; [WordPress](wordpress-shared-runtime.md)
5
5
  loads the same runtime through its adapter.
6
6
 
@@ -151,8 +151,9 @@ Lyric example with an explicit gap:
151
151
  ```
152
152
 
153
153
  The lyric callback contains `pageId`, `time`, `text`, `normalisedText`, `index`,
154
- `nextTime`, `nextText`, `nextNormalisedText`, `nextIndex`, `nextVisibleTime`,
155
- `nextVisibleText`, `nextVisibleNormalisedText`, `nextVisibleIndex`, and `audio`.
154
+ the `previousVisible*` fields, `nextTime`, `nextText`, `nextNormalisedText`,
155
+ `nextIndex`, the `nextVisible*` fields, and `audio`. The visible neighbours skip
156
+ blank clear entries; their missing sentinel is `null`, an empty string and `-1`.
156
157
  Immediate-next fields can describe a blank clear; next-visible fields skip
157
158
  blanks. Absent times are null, text empty and indices -1.
158
159
 
@@ -176,6 +177,7 @@ Pass Elements or scoped selector strings for roots/targets.
176
177
  | `playbackPulse(options)` | `id`, `root`, `audio`, `ticks` (16), `className` (`dance-moves-playing`), `propertyPrefix` (`--dance-moves-pulse`), optional render. Publishes duration/delay in seconds. Controller `sync()`. |
177
178
  | `cueClass(options)` | `id`, `root`, `cue` (`*`), `className`, **`durationTicks`** (16), optional render. Class is applied to root, not a separate `target`. Controller `fire(detail)`, `clear(reason?)`. Its finite duration is wall-clock based. |
178
179
  | `cueTimeline(options)` | `id`, `root`, `audio`, `cues:[{id,time,end?,...}]`, optional `render` and `onCue`. Controller `restore(reason?)`, `start(reason?)`, `stop(reason?)`. |
180
+ | `lyricStage(options)` | Shared previous/current/next lyric stage. DanceMoves owns audio, lyric, cue, visibility, preference, resize and teardown lifecycle; release code supplies scoped appearance callbacks. |
179
181
  | `quality(options)` | `id`, `root`, `tiers`, `initial`, sample/window ratios and cooldowns, optional render. Controller `setTier(index,reason?)`. |
180
182
 
181
183
  Pulse render receives `{root,audio,duration,delay,ticks}`. Cue-class render
@@ -5,11 +5,12 @@ The same repository now produces:
5
5
  | Distribution | Output |
6
6
  |---|---|
7
7
  | npm | `@kieransimkin/dancemoves` tarball, with ESM, CJS, React/Node entrypoints, declarations and styles |
8
- | Plain browser | `DanceMoves-web-VERSION.zip` with minified `dancemoves.min.js`, styles and static assets |
9
- | WordPress | `DanceMoves-VERSION.zip` preserving `kieran-epk-device-orientation/` |
8
+ | Plain browser | `DanceMoves-browser-VERSION.zip` with minified `dancemoves.min.js`, styles and static assets |
9
+ | WordPress | `DanceMoves-wordpress-VERSION.zip` preserving `kieran-epk-device-orientation/` |
10
10
 
11
- The source candidate is 3.0.0. The already-published 2.9.0 tag and artifacts must
12
- not be overwritten. Package publishing is not WordPress deployment.
11
+ The current source candidate version is read from `package.json`; never hard-code
12
+ an earlier release name into a deployment instruction. Published tags and assets
13
+ must not be overwritten. Package publishing is not WordPress deployment.
13
14
 
14
15
  ## First checkout: dependency lock is required before a release
15
16
 
@@ -109,9 +110,9 @@ After the migration, tests and setup are committed:
109
110
  ```sh
110
111
  git status --short
111
112
  npm run check:release
112
- git tag -a v3.0.0 -m "DanceMoves 3.0.0: shared JavaScript runtime"
113
+ git tag -a vVERSION -m "DanceMoves VERSION"
113
114
  git push origin HEAD
114
- git push origin refs/tags/v3.0.0
115
+ git push origin refs/tags/vVERSION
115
116
  ```
116
117
 
117
118
  The release workflow triggers on `v*` tag pushes, also supports an existing
@@ -10,8 +10,8 @@ physical tests were executed in a restricted development environment.
10
10
  | BPM, ticks, duration quantization, boundaries | Main factory/core methods | Existing clock/scheduling/interval gallery; original core tests |
11
11
  | CSS timing/control/lyric disclosure | Core properties + CSS | WordPress-style clock/shared timing demos; original CSS contracts |
12
12
  | Named cues, intervals, DOM events, animation ownership | Core methods | React cue panel; original 23-page gallery and core contracts |
13
- | Lyrics, clear entries, both look-aheads, master matching | Core + React useLyric | Canonical Arcadians player in both React apps; old lyrics/master demos |
14
- | Pointer, playbackPulse, cueClass, cueTimeline, quality | `runtime.effects` | Five React panels, actual transformed-registry tests, original effects/timeline tests |
13
+ | Lyrics, clear entries, previous/next visible neighbours, master matching | Core + React useLyric | Canonical Arcadians player in both React apps; lyric payload and master demos |
14
+ | Pointer, playbackPulse, cueClass, cueTimeline, lyricStage, quality | `runtime.effects` | React panels, actual transformed-registry tests, original effects/timeline tests and lyric-stage lifecycle contract |
15
15
  | Catalogue CSS adoption | `catalogue:true` | Original catalogue demo now imports the module; original source test |
16
16
  | All nine named orientation adapters | `orientation.adapter`, orientationCore | All nine original gallery layouts retained; original adapter/scheduler tests |
17
17
  | Generic orientation and recorder | `createOrientation`, `createRecorder` | React permission/capture panels; lifecycle/server tests; real-device permission still manual |
@@ -1,6 +1,6 @@
1
1
  # DanceMoves 3: one source, three distributions
2
2
 
3
- This is the 3.0.0 **source candidate**, based on DanceMoves 2.9.0 commit
3
+ This records the historical 3.0.0 **source migration**, based on DanceMoves 2.9.0 commit
4
4
  `3a6e67652a1bf6968b9ac0715ee5d5eff1e74c98`. Applying the patch does not publish
5
5
  anything or change an installed WordPress site. The npm package name is
6
6
  `@kieransimkin/dancemoves`; package registration and trusted publishing require
@@ -24,7 +24,7 @@ if ($LASTEXITCODE -ne 0) { throw "WordPress build failed" }
24
24
  ```
25
25
 
26
26
  The build machine needs Node, npm and Python. The WordPress server needs neither
27
- Node, npm, a C++ compiler nor an external CDN. Install `dist/DanceMoves-3.0.0.zip`
27
+ Node, npm, a C++ compiler nor an external CDN. Install `dist/DanceMoves-wordpress-3.0.4.zip`
28
28
  through Plugins → Add New → Upload Plugin, preserving a backup and the prior
29
29
  working archive. Do not upload the npm tarball, web ZIP, repository source ZIP
30
30
  or a downloaded patch bundle.
@@ -66,6 +66,11 @@ Existing `window.DanceMoves`, `window.DanceMovesEffects`, native and orientation
66
66
  aliases remain available. Enqueue page code with dependencies on the existing
67
67
  handles rather than loading a second library or hand-writing asset URLs:
68
68
 
69
+ The 3.0.4 WordPress adapter also exposes `DanceMovesEffects.lyricStage()`. It is
70
+ the compatibility path for existing three-line lyric treatments: the plugin owns
71
+ the LRC/audio clock and all lifecycle listeners while page code owns only the
72
+ release-scoped render callbacks and CSS.
73
+
69
74
  ```php
70
75
  add_action('wp_enqueue_scripts', function () {
71
76
  if (!is_page(260)) { return; } // Your actual Arcadians Page ID.
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "schema": "dancemoves-library-build/v1",
3
3
  "name": "@kieransimkin/dancemoves",
4
- "version": "3.0.2",
4
+ "version": "3.0.4",
5
+ "homepage": "https://kieransimkin.co.uk/my-songs/",
5
6
  "files": [
6
7
  {
7
8
  "path": "admin.min.js",
@@ -25,28 +26,28 @@
25
26
  },
26
27
  {
27
28
  "path": "dancemoves.css",
28
- "bytes": 31223,
29
- "sha256": "0d768de1eda07c1981719b87fb6cc87c3e9278efd47d2d8e820cb4e3ba09e3c5"
29
+ "bytes": 32457,
30
+ "sha256": "0b920fbe168a3f10767d4d31ea969a211c78382b882abb63ef9bb5eaf3cbd8ac"
30
31
  },
31
32
  {
32
33
  "path": "dancemoves.min.js",
33
- "bytes": 160870,
34
- "sha256": "0ff2f5899a4b6e4d203fa56b294fdf041c968bb59c13a9fdf05e7fa2758fde68"
34
+ "bytes": 168118,
35
+ "sha256": "211a06f8b21fbc12340dd060ac6d36bbbb5cbda6dfc3f45e3cecacda4cc9e8be"
35
36
  },
36
37
  {
37
38
  "path": "index.cjs",
38
- "bytes": 262051,
39
- "sha256": "cb0de734231081997bff5d4aef19562f94ba0d8fcff6d983e1fd5772fe91e2de"
39
+ "bytes": 276097,
40
+ "sha256": "bad26ca5d24335e344695dac673559ed2ff7693af0068ad0f21d5996fc5979da"
40
41
  },
41
42
  {
42
43
  "path": "index.d.ts",
43
- "bytes": 7617,
44
- "sha256": "fe901c67f8a6222805b742120e6d7ba539afb4164b44829df06e09664059869c"
44
+ "bytes": 8785,
45
+ "sha256": "129ac75e783259221d7d93b9305ef222de327b9ae105bf311d07334152fc1857"
45
46
  },
46
47
  {
47
48
  "path": "index.mjs",
48
- "bytes": 260966,
49
- "sha256": "b189c643a880c7e96a6e610c814c476baf24b46688abf8fd401524a350c5aa73"
49
+ "bytes": 275012,
50
+ "sha256": "1dcd67e089e11e5e0358e8981df1e16c5a02aea7897f7cce7a53c258e7249a93"
50
51
  },
51
52
  {
52
53
  "path": "react.cjs",
@@ -95,8 +96,8 @@
95
96
  },
96
97
  {
97
98
  "path": "styles/dance-moves-core.css",
98
- "bytes": 2763,
99
- "sha256": "5d51caa8f3d33fc703ecd416160fbb9491b55527e54facc9248050d70cbce8a3"
99
+ "bytes": 3997,
100
+ "sha256": "688b3ef95e245adb9e706a1ac3ab5cdf6a23a7aea77c66d99f1136f57609cb82"
100
101
  },
101
102
  {
102
103
  "path": "styles/ks-epk-device-orientation.css",
@@ -110,8 +111,8 @@
110
111
  },
111
112
  {
112
113
  "path": "wordpress.js",
113
- "bytes": 159672,
114
- "sha256": "1a338d5caa4c2f66d594ac086308939386b1e370457c5d3864d5f6781dd1ac48"
114
+ "bytes": 166906,
115
+ "sha256": "074fc65dfa819c11ac7fd3f4e713d7b00639e9f59768f2778c43733f1e396e24"
115
116
  }
116
117
  ]
117
118
  }
@@ -1,4 +1,4 @@
1
- [data-dance-moves-start-interval]:not([data-dance-moves-started=true]),[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):before,[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):after{animation-play-state:paused!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download{transition-property:background-color,color,transform,border-color!important;transition-duration:var(--dance-moves-shared-control-duration)!important;transition-timing-function:ease!important}.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition-property:transform!important;transition-duration:var(--dance-moves-lyric-disclosure-duration)!important;transition-timing-function:ease!important}.dance-moves-lyric-popover{--dance-moves-lyric-bg: rgba(20, 20, 24, .94);--dance-moves-lyric-border: rgba(255, 255, 255, .28);--dance-moves-lyric-color: #fff;position:fixed;z-index:9998;inset-inline:max(1rem,env(safe-area-inset-left)) max(1rem,env(safe-area-inset-right));bottom:max(1rem,env(safe-area-inset-bottom));display:flex;justify-content:center;pointer-events:none;opacity:0;transform:translateY(.75rem) scale(.98);transition:opacity var(--dance-moves-6t) ease,transform var(--dance-moves-6t) ease}.dance-moves-lyric-popover[data-dance-moves-lyric-state=active]{opacity:1;transform:translateY(0) scale(1)}.dance-moves-lyric-popover__text{display:block;max-width:min(44rem,100%);padding:.72rem 1rem;border:1px solid var(--dance-moves-lyric-border);border-radius:.75rem;background:var(--dance-moves-lyric-bg);color:var(--dance-moves-lyric-color);box-shadow:0 .6rem 1.8rem #00000052;font:700 clamp(1rem,2.4vw,1.35rem)/1.3 system-ui,sans-serif;text-align:center;text-wrap:balance}.dance-moves-lyric-popover[data-dance-moves-lyric-pulse=true] .dance-moves-lyric-popover__text{animation:dance-moves-lyric-arrive var(--dance-moves-6t) ease both}@keyframes dance-moves-lyric-arrive{0%{transform:translateY(.4rem) scale(.98)}to{transform:translateY(0) scale(1)}}@media(forced-colors:active){.dance-moves-lyric-popover__text{border:2px solid CanvasText;background:Canvas;color:CanvasText;box-shadow:none}}@media(prefers-reduced-motion:reduce){[data-dance-moves-start-interval],[data-dance-moves-start-interval]:before,[data-dance-moves-start-interval]:after{animation:none!important;transition-duration:.01ms!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download,.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition:none!important}.dance-moves-lyric-popover,.dance-moves-lyric-popover__text{animation:none!important;transition:none!important;transform:none!important}}
1
+ [data-dance-moves-start-interval]:not([data-dance-moves-started=true]),[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):before,[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):after{animation-play-state:paused!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download{transition-property:background-color,color,transform,border-color!important;transition-duration:var(--dance-moves-shared-control-duration)!important;transition-timing-function:ease!important}.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition-property:transform!important;transition-duration:var(--dance-moves-lyric-disclosure-duration)!important;transition-timing-function:ease!important}.dance-moves-lyric-popover{--dance-moves-lyric-bg: rgba(20, 20, 24, .94);--dance-moves-lyric-border: rgba(255, 255, 255, .28);--dance-moves-lyric-color: #fff;position:fixed;z-index:9998;inset-inline:max(1rem,env(safe-area-inset-left)) max(1rem,env(safe-area-inset-right));bottom:max(1rem,env(safe-area-inset-bottom));display:flex;justify-content:center;pointer-events:none;opacity:0;transform:translateY(.75rem) scale(.98);transition:opacity var(--dance-moves-6t) ease,transform var(--dance-moves-6t) ease}.dance-moves-lyric-popover[data-dance-moves-lyric-state=active]{opacity:1;transform:translateY(0) scale(1)}.dance-moves-lyric-popover__text{display:block;max-width:min(44rem,100%);padding:.72rem 1rem;border:1px solid var(--dance-moves-lyric-border);border-radius:.75rem;background:var(--dance-moves-lyric-bg);color:var(--dance-moves-lyric-color);box-shadow:0 .6rem 1.8rem #00000052;font:700 clamp(1rem,2.4vw,1.35rem)/1.3 system-ui,sans-serif;text-align:center;text-wrap:balance}.dance-moves-lyric-popover[data-dance-moves-lyric-pulse=true] .dance-moves-lyric-popover__text{animation:dance-moves-lyric-arrive var(--dance-moves-6t) ease both}.dance-moves-lyric-popover[data-dance-moves-lyric-stage=ready]{--dance-moves-lyric-stage-step: 4.75rem;--dance-moves-lyric-progress: 0;overflow:hidden;height:calc(var(--dance-moves-lyric-stage-step) * 3);align-items:stretch}.dance-moves-lyric-stage__viewport{width:min(48rem,100%);height:100%;overflow:hidden}.dance-moves-lyric-stage__track{display:grid;grid-template-rows:repeat(3,var(--dance-moves-lyric-stage-step));transform:translate3d(0,calc(var(--dance-moves-lyric-progress) * var(--dance-moves-lyric-stage-step) * -1),0);will-change:transform}.dance-moves-lyric-stage__line{display:grid;place-items:center;min-width:0;padding:.4rem 1rem;color:var(--dance-moves-lyric-color);font:650 clamp(.92rem,2.2vw,1.22rem)/1.25 system-ui,sans-serif;text-align:center;text-wrap:balance;opacity:.58}.dance-moves-lyric-stage__line--current{opacity:1}.dance-moves-lyric-popover[data-dance-moves-lyric-stage=ready] .dance-moves-lyric-popover__text{max-width:none;padding:.4rem 1rem;border:0;border-radius:0;background:transparent;box-shadow:none;animation:none}.dance-moves-lyric-popover[data-dance-moves-lyric-stage=ready][data-dance-moves-lyric-phase=waiting] .dance-moves-lyric-stage__track{will-change:auto}@keyframes dance-moves-lyric-arrive{0%{transform:translateY(.4rem) scale(.98)}to{transform:translateY(0) scale(1)}}@media(forced-colors:active){.dance-moves-lyric-popover__text{border:2px solid CanvasText;background:Canvas;color:CanvasText;box-shadow:none}}@media(prefers-reduced-motion:reduce){[data-dance-moves-start-interval],[data-dance-moves-start-interval]:before,[data-dance-moves-start-interval]:after{animation:none!important;transition-duration:.01ms!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download,.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition:none!important}.dance-moves-lyric-popover,.dance-moves-lyric-popover__text,.dance-moves-lyric-stage__track{animation:none!important;transition:none!important;transform:none!important}}
2
2
 
3
3
  .ks-epk-orientation-control{position:fixed;z-index:999998;left:max(.75rem,env(safe-area-inset-left));bottom:max(.75rem,env(safe-area-inset-bottom));min-height:2.75rem;padding:.65rem .9rem;border:1px solid rgba(255,255,255,.72);border-radius:999px;color:#fff;background:#0c0c10e0;box-shadow:0 .5rem 2rem #0000006b;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);font:700 .72rem/1 system-ui,sans-serif;letter-spacing:.05em;cursor:pointer}.ks-epk-orientation-control:focus-visible{outline:3px solid #fff;outline-offset:3px}.ks-epk-orientation-control:disabled{cursor:default;opacity:.72}.ks-epk[data-release=presents-and-chocolate][data-ks-orientation=active] .epk-cover-wrap{animation:none;transform:translate3d(var(--pc-sensor-x, 0px),var(--pc-sensor-y, 0px),0) rotate(var(--pc-sensor-rotate, 0deg))}#light-will-win-top[data-ks-orientation=active] .lww-hero{background-position:calc(50% + var(--lww-cover-x, 0px)) calc(44% + var(--lww-cover-y, 0px))}.ks-epk[data-release=walk-with-me][data-ks-orientation=active] .wwm-cover-stage{transform:perspective(1100px) rotateX(var(--wwm-tilt-x, 0deg)) rotateY(var(--wwm-tilt-y, 0deg)) translate(var(--wwm-shift-x, 0px),var(--wwm-shift-y, 0px))!important}#light-will-win-top[data-ks-orientation=active] .lww-hero{transition:background-position var(--dance-moves-2t, 62.5ms) cubic-bezier(.15,.8,.2,1)!important;will-change:background-position}#light-will-win-top[data-ks-orientation=active] :is(.lww-player-card,.lww-story-quote,.lww-glass,.lww-contact-card,.lww-fact),.dfad-motion-stage[data-ks-orientation=active] :is([data-tilt],[data-parallax] img),[data-ks-orientation-adapter=presents-and-chocolate][data-ks-orientation=active] .epk-cover-wrap,[data-ks-orientation-adapter=fully-nocturnal][data-ks-orientation=active] :is(.fnx-horizon-glow,.fnx-road,.epk-cover-wrap,.epk-cover),[data-ks-orientation-adapter=amnesty-honestly][data-ks-orientation=active] :is(.epk-cover-wrap,.epk-heading),[data-ks-orientation-adapter=walk-with-me][data-ks-orientation=active] .wwm-cover-stage,[data-ks-orientation-adapter=dmitri-my-talisman][data-ks-orientation=active] :is(.chamber,.cover-frame),[data-ks-orientation-adapter=clay-stars][data-ks-orientation=active] :is(.epk-cover-wrap,.ks-warm-bloom,.ks-lens-flare,.ks-specular-sweep),[data-ks-orientation-adapter=california-screamin][data-ks-orientation=active] :is(.cs-cover,.cs-cables,.cs-cover-glow){transition:transform var(--dance-moves-2t, 62.5ms) cubic-bezier(.15,.8,.2,1)!important;will-change:transform}@media(max-width:900px){#light-will-win-top[data-ks-orientation=active] .lww-hero{background-position:calc(58% + var(--lww-cover-x, 0px)) calc(46% + var(--lww-cover-y, 0px))}}@media(prefers-reduced-motion:reduce){.ks-epk-orientation-control{display:none!important}.ks-epk[data-release=presents-and-chocolate] .epk-cover-wrap,.ks-epk[data-release=walk-with-me] .wwm-cover-stage{transform:none!important}[data-ks-orientation] *,[data-ks-orientation] *:before,[data-ks-orientation] *:after{transition:none!important;will-change:auto!important}}@media(forced-colors:active){.ks-epk-orientation-control{color:ButtonText;background:ButtonFace;border-color:ButtonText;forced-color-adjust:auto}}
4
4