@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 +4 -3
- package/docs/README.md +3 -3
- package/docs/api/effects.md +39 -4
- package/docs/api/javascript.md +8 -3
- package/docs/api/styling.md +23 -2
- package/docs/guide.md +7 -1
- package/docs/javascript-api.md +5 -3
- package/docs/releasing-shared.md +7 -6
- package/docs/shared-feature-coverage.md +2 -2
- package/docs/shared-runtime-migration.md +1 -1
- package/docs/wordpress-shared-runtime.md +6 -1
- package/lib/build-manifest.json +16 -15
- package/lib/dancemoves.css +1 -1
- package/lib/dancemoves.min.js +3 -3
- package/lib/index.cjs +329 -1
- package/lib/index.d.ts +6 -1
- package/lib/index.mjs +329 -1
- package/lib/styles/dance-moves-core.css +1 -1
- package/lib/wordpress.js +3 -3
- package/package.json +2 -2
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.
|
|
7
|
-
|
|
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 |
|
|
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. |
|
package/docs/api/effects.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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.
|
package/docs/api/javascript.md
CHANGED
|
@@ -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
|
-
`
|
|
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.
|
|
373
|
-
the 2.4.1/2.5.1 changes
|
|
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.
|
package/docs/api/styling.md
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
[Documentation index](../README.md) · [JavaScript](javascript.md) ·
|
|
4
4
|
[Adapters](adapters.md)
|
|
5
5
|
|
|
6
|
-
|
|
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,
|
|
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
|
package/docs/javascript-api.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Shared JavaScript API
|
|
2
2
|
|
|
3
|
-
Package: `@kieransimkin/dancemoves`,
|
|
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`,
|
|
155
|
-
`
|
|
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
|
package/docs/releasing-shared.md
CHANGED
|
@@ -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-
|
|
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
|
|
12
|
-
|
|
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
|
|
113
|
+
git tag -a vVERSION -m "DanceMoves VERSION"
|
|
113
114
|
git push origin HEAD
|
|
114
|
-
git push origin refs/tags/
|
|
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,
|
|
14
|
-
| Pointer, playbackPulse, cueClass, cueTimeline, quality | `runtime.effects` |
|
|
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
|
|
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.
|
|
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.
|
package/lib/build-manifest.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "dancemoves-library-build/v1",
|
|
3
3
|
"name": "@kieransimkin/dancemoves",
|
|
4
|
-
"version": "3.0.
|
|
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":
|
|
29
|
-
"sha256": "
|
|
29
|
+
"bytes": 32457,
|
|
30
|
+
"sha256": "0b920fbe168a3f10767d4d31ea969a211c78382b882abb63ef9bb5eaf3cbd8ac"
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
33
|
"path": "dancemoves.min.js",
|
|
33
|
-
"bytes":
|
|
34
|
-
"sha256": "
|
|
34
|
+
"bytes": 168118,
|
|
35
|
+
"sha256": "211a06f8b21fbc12340dd060ac6d36bbbb5cbda6dfc3f45e3cecacda4cc9e8be"
|
|
35
36
|
},
|
|
36
37
|
{
|
|
37
38
|
"path": "index.cjs",
|
|
38
|
-
"bytes":
|
|
39
|
-
"sha256": "
|
|
39
|
+
"bytes": 276097,
|
|
40
|
+
"sha256": "bad26ca5d24335e344695dac673559ed2ff7693af0068ad0f21d5996fc5979da"
|
|
40
41
|
},
|
|
41
42
|
{
|
|
42
43
|
"path": "index.d.ts",
|
|
43
|
-
"bytes":
|
|
44
|
-
"sha256": "
|
|
44
|
+
"bytes": 8785,
|
|
45
|
+
"sha256": "129ac75e783259221d7d93b9305ef222de327b9ae105bf311d07334152fc1857"
|
|
45
46
|
},
|
|
46
47
|
{
|
|
47
48
|
"path": "index.mjs",
|
|
48
|
-
"bytes":
|
|
49
|
-
"sha256": "
|
|
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":
|
|
99
|
-
"sha256": "
|
|
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":
|
|
114
|
-
"sha256": "
|
|
114
|
+
"bytes": 166906,
|
|
115
|
+
"sha256": "074fc65dfa819c11ac7fd3f4e713d7b00639e9f59768f2778c43733f1e396e24"
|
|
115
116
|
}
|
|
116
117
|
]
|
|
117
118
|
}
|
package/lib/dancemoves.css
CHANGED
|
@@ -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
|
|