@real-music-packages/web-core 0.31.0 → 0.32.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.
@@ -1020,7 +1020,8 @@ declare const keyboardFactory: LayerFactory<KeyboardProps>;
1020
1020
  interface FretboardProps {
1021
1021
  /** Highest fret drawn. Default: auto-fit the excerpt (min 5, max 15), padded. */
1022
1022
  visibleFrets?: number;
1023
- /** Board height in world px. Default 220. */
1023
+ /** Board height in world px. Default 360 — 6 strings need more vertical room
1024
+ * than the piano strip (220 cramped them to ~37px each). */
1024
1025
  height?: number;
1025
1026
  /** Board bottom edge in world px. Default safeBox.bottom. */
1026
1027
  bottomY?: number;
@@ -1988,4 +1989,24 @@ interface EndCardProps {
1988
1989
  }
1989
1990
  declare const endCardFactory: LayerFactory<EndCardProps>;
1990
1991
 
1991
- export { type Affine, type AudioClock, type AudioEvent, type BackgroundProps, type BeatGridOpts, type BeatPulseProps, type BeatTick, type BrandingProps, type BufferFactory, type BuildSceneOpts, type BuiltScene, type CameraState, type CaptionCue, type CaptionProps, type CaptionScript, type CaptionStyle, type ChordRibbonProps, type ChordSpan, type CircleOfFifthsProps, type CirclePoint, type ClickTrackOpts, type ColorBy, type ContourPlot, type ContourPoint, type CountInOpts, type CountdownProps, type CountingTrackProps, type CtaProps, DEFAULT_FUNCTION_COLORS, type DegreeLabel, type DegreeLabelsProps, type DroneOpts, type DuckWindow, type Easing, type EndCardProps, type ExtendedDemoOpts, FIFTHS_MAJOR, FIFTHS_MINOR, FOLLOW_BARS, FOLLOW_PAD, type FallingKeyboardDemoOpts, type FallingNotesProps, type FretboardProps, type FunctionColors, type FunctionalHarmonyProps, type GateError, type GateInput, type HandColors, type HarmonicFunction, type HarmonyMode, type HighlightRegion, type HookProps, type IntervalArcsProps, type KaraokeCaptionProps, type KaraokeWord, type KeyRect, type KeyboardLayout, type KeyboardLayoutOpts, type KeyboardProps, type KineticMode, type KineticTextProps, type LabelMode, type Layer, type LayerFactory, type McqCardProps, type NotationEngraving, type NotationLayout, type NotationLayoutOpts, type NotationProps, type NotationRect, type OutputProbe, PIANO_HIGH, PIANO_LOW, type ParticleBurstProps, type PitchContourProps, type Placement, type PlayheadLine, type PortraitProps, type ProgressRingProps, type PromoCardsDemoOpts, type PulseStyle, type Quiz, type QuizOption, type QuizPhase, type RadialSpectrumProps, type RayEndpoints, type RecordSceneSpecOpts, type Rect, type RenderCtx, type ResolvedSegment, type RevealProps, SCALE_INTERVALS, type SafeGuidesProps, type ScaleHighlightProps, type SceneSpec, type ScheduleTarget, type Score, type ScoreFromMusicXMLOpts, type ScoreNote, type ScrollCursorProps, type Section, type SectionMinimapProps, type SegmentAudio, type SegmentAudioCtx, type SegmentTransition, type SpecLayer, type SpectrumInput, type SpectrumProps, type StaffKeyboardRayProps, type StatCounterProps, type TempoMap, type TensionGraphProps, type TensionPoint, type TextureProps, type TimeAnchor, type TimelineSegment, type WaveformInput, type WaveformProps, activeChord, activeCue, activeSection, animatedSlot, applySchedule, applyToContext, assertGate, audioPlayheadLine, ballArc, ballX, beatGrid, beatPhase, beatPulseFactory, blackKeys, bpmOf, brandingFactory, buildScene, cameraForFollow, cameraTransform, chordRibbonFactory, circleOfFifthsDemoSpec, circleOfFifthsFactory, clamp, clickTrackSchedule, contourMinimapDemoSpec, contourPoints, contourPolyline, countInLeadSec, countInSchedule, countdownFactory, countdownRemaining, countdownSeconds, countingDegreeDemoSpec, countingTrackFactory, cropAroundBox, ctaFactory, cubicEaseInOut, cueOpacity, degreeLabel, degreeLabelsFactory, distinctMeasureIndices, distinctOnsets, dotAt, drawCaption, drawHighlight, droneSchedule, duckGainAt, easeIn, easeInOut, easeOut, endCardFactory, fallingKeyboardDemoScore, fallingKeyboardDemoSpec, fallingNotesFactory, firstMeasureBox, followBoxAt, followSrcBox, followWindowStart, fracSlotPoint, frameRect, fretboardFactory, functionColor, functionalHarmonyFactory, getKeyboardLayout, getLayerFactory, getNotationEngraving, harmonyDemoSpec, highlightIntensity, hookFactory, identityCamera, inRange, intervalArcsFactory, invLerp, isBlackKey, karaokeCaptionFactory, kenBurns, keyCenterX, keyColumnWidth, keyRect, keySlot, keyboardFactory, keyboardLayout, kineticTextFactory, lerp, lerpBox, lerpCamera, linear, mapBoxThroughLayout, mcqCardFactory, mcqDemoSpec, measureColumnsFromLayout, measureCount, measureSpanBox, measureSpans, measureSystemMap, timeToX as minimapTimeToX, msPerBeat, notationFactory, notationLayout, noteColor, noteSetXRange, parseKey, parseTimeSig, particleBurstFactory, pcToSlot, pitchAt, pitchContourFactory, pitchRange, playheadLine, portraitFactory, progress01, progressRingFactory, projectPoint, promoCardsDemoSpec, pulseAt, quizPhase, radialSpectrumFactory, rayEndpoints, rayPointAt, recordSceneSpec, registerLayer, registeredKeys, resolveAnchor, resolveKeyboardLayout, resolveTimeline, revealFactory, revealProgress, runGate, safeGuidesFactory, scaleHighlightFactory, scoreFromMusicXML, scorePitchSpan, scrollCursorFactory, sectionMinimapFactory, setFollowLayoutProvider, setKeyboardLayout, setNotationEngraving, slotAngle, slotPc, slotPoint, spectrumFactory, staffAnchor, staffKeyboardRayFactory, staffRayDemoSpec, statCounterFactory, systemBox, tensionGraphFactory, textureFactory, transitionProgress, validateChordTrack, validateQuiz, validateSections, visualTimelineMs, vstackAudioPlayheadLine, vstackFollowBox, waveformFactory, whiteKeys, worldToViewport };
1992
+ type ImageRevealMode = 'pixelate' | 'shuffle' | 'blur';
1993
+ interface ImageRevealProps {
1994
+ /** The image to reveal. Any CanvasImageSource (HTMLImageElement, OffscreenCanvas, …). */
1995
+ image: CanvasImageSource;
1996
+ /** Reveal mode. Default 'pixelate'. */
1997
+ mode?: ImageRevealMode;
1998
+ /** When the reveal starts (ms). Default 0. */
1999
+ startMs?: number;
2000
+ /** How long the full reveal takes (ms). Default 6000. */
2001
+ durationMs?: number;
2002
+ /**
2003
+ * Difficulty scalar 0..1.
2004
+ * - pixelate: controls maximum block size (0→small, 1→large; default 0.5 ≈ 1/8 width).
2005
+ * - shuffle: controls maximum tile offset fraction (default 0.5).
2006
+ * - blur: controls maximum blur radius in px (0→mild, 1→extreme; default 0.5 ≈ 40px).
2007
+ */
2008
+ difficulty?: number;
2009
+ }
2010
+ declare const imageRevealFactory: LayerFactory<ImageRevealProps>;
2011
+
2012
+ export { type Affine, type AudioClock, type AudioEvent, type BackgroundProps, type BeatGridOpts, type BeatPulseProps, type BeatTick, type BrandingProps, type BufferFactory, type BuildSceneOpts, type BuiltScene, type CameraState, type CaptionCue, type CaptionProps, type CaptionScript, type CaptionStyle, type ChordRibbonProps, type ChordSpan, type CircleOfFifthsProps, type CirclePoint, type ClickTrackOpts, type ColorBy, type ContourPlot, type ContourPoint, type CountInOpts, type CountdownProps, type CountingTrackProps, type CtaProps, DEFAULT_FUNCTION_COLORS, type DegreeLabel, type DegreeLabelsProps, type DroneOpts, type DuckWindow, type Easing, type EndCardProps, type ExtendedDemoOpts, FIFTHS_MAJOR, FIFTHS_MINOR, FOLLOW_BARS, FOLLOW_PAD, type FallingKeyboardDemoOpts, type FallingNotesProps, type FretboardProps, type FunctionColors, type FunctionalHarmonyProps, type GateError, type GateInput, type HandColors, type HarmonicFunction, type HarmonyMode, type HighlightRegion, type HookProps, type ImageRevealMode, type ImageRevealProps, type IntervalArcsProps, type KaraokeCaptionProps, type KaraokeWord, type KeyRect, type KeyboardLayout, type KeyboardLayoutOpts, type KeyboardProps, type KineticMode, type KineticTextProps, type LabelMode, type Layer, type LayerFactory, type McqCardProps, type NotationEngraving, type NotationLayout, type NotationLayoutOpts, type NotationProps, type NotationRect, type OutputProbe, PIANO_HIGH, PIANO_LOW, type ParticleBurstProps, type PitchContourProps, type Placement, type PlayheadLine, type PortraitProps, type ProgressRingProps, type PromoCardsDemoOpts, type PulseStyle, type Quiz, type QuizOption, type QuizPhase, type RadialSpectrumProps, type RayEndpoints, type RecordSceneSpecOpts, type Rect, type RenderCtx, type ResolvedSegment, type RevealProps, SCALE_INTERVALS, type SafeGuidesProps, type ScaleHighlightProps, type SceneSpec, type ScheduleTarget, type Score, type ScoreFromMusicXMLOpts, type ScoreNote, type ScrollCursorProps, type Section, type SectionMinimapProps, type SegmentAudio, type SegmentAudioCtx, type SegmentTransition, type SpecLayer, type SpectrumInput, type SpectrumProps, type StaffKeyboardRayProps, type StatCounterProps, type TempoMap, type TensionGraphProps, type TensionPoint, type TextureProps, type TimeAnchor, type TimelineSegment, type WaveformInput, type WaveformProps, activeChord, activeCue, activeSection, animatedSlot, applySchedule, applyToContext, assertGate, audioPlayheadLine, ballArc, ballX, beatGrid, beatPhase, beatPulseFactory, blackKeys, bpmOf, brandingFactory, buildScene, cameraForFollow, cameraTransform, chordRibbonFactory, circleOfFifthsDemoSpec, circleOfFifthsFactory, clamp, clickTrackSchedule, contourMinimapDemoSpec, contourPoints, contourPolyline, countInLeadSec, countInSchedule, countdownFactory, countdownRemaining, countdownSeconds, countingDegreeDemoSpec, countingTrackFactory, cropAroundBox, ctaFactory, cubicEaseInOut, cueOpacity, degreeLabel, degreeLabelsFactory, distinctMeasureIndices, distinctOnsets, dotAt, drawCaption, drawHighlight, droneSchedule, duckGainAt, easeIn, easeInOut, easeOut, endCardFactory, fallingKeyboardDemoScore, fallingKeyboardDemoSpec, fallingNotesFactory, firstMeasureBox, followBoxAt, followSrcBox, followWindowStart, fracSlotPoint, frameRect, fretboardFactory, functionColor, functionalHarmonyFactory, getKeyboardLayout, getLayerFactory, getNotationEngraving, harmonyDemoSpec, highlightIntensity, hookFactory, identityCamera, imageRevealFactory, inRange, intervalArcsFactory, invLerp, isBlackKey, karaokeCaptionFactory, kenBurns, keyCenterX, keyColumnWidth, keyRect, keySlot, keyboardFactory, keyboardLayout, kineticTextFactory, lerp, lerpBox, lerpCamera, linear, mapBoxThroughLayout, mcqCardFactory, mcqDemoSpec, measureColumnsFromLayout, measureCount, measureSpanBox, measureSpans, measureSystemMap, timeToX as minimapTimeToX, msPerBeat, notationFactory, notationLayout, noteColor, noteSetXRange, parseKey, parseTimeSig, particleBurstFactory, pcToSlot, pitchAt, pitchContourFactory, pitchRange, playheadLine, portraitFactory, progress01, progressRingFactory, projectPoint, promoCardsDemoSpec, pulseAt, quizPhase, radialSpectrumFactory, rayEndpoints, rayPointAt, recordSceneSpec, registerLayer, registeredKeys, resolveAnchor, resolveKeyboardLayout, resolveTimeline, revealFactory, revealProgress, runGate, safeGuidesFactory, scaleHighlightFactory, scoreFromMusicXML, scorePitchSpan, scrollCursorFactory, sectionMinimapFactory, setFollowLayoutProvider, setKeyboardLayout, setNotationEngraving, slotAngle, slotPc, slotPoint, spectrumFactory, staffAnchor, staffKeyboardRayFactory, staffRayDemoSpec, statCounterFactory, systemBox, tensionGraphFactory, textureFactory, transitionProgress, validateChordTrack, validateQuiz, validateSections, visualTimelineMs, vstackAudioPlayheadLine, vstackFollowBox, waveformFactory, whiteKeys, worldToViewport };
@@ -1318,7 +1318,7 @@ function fretboardLayer() {
1318
1318
  for (const p of placement.values()) maxFret = Math.max(maxFret, p.fret);
1319
1319
  visibleFrets = props.visibleFrets ?? Math.min(15, Math.max(5, maxFret + 1));
1320
1320
  const sb = ctx.safeBox;
1321
- const height = props.height ?? 220;
1321
+ const height = props.height ?? 360;
1322
1322
  const bottomY = props.bottomY ?? sb.bottom;
1323
1323
  rect = { x: sb.left, y: bottomY - height, w: sb.w, h: height };
1324
1324
  },
@@ -4765,6 +4765,212 @@ var endCardFactory = {
4765
4765
  }
4766
4766
  };
4767
4767
 
4768
+ // src/scene/layers/imageReveal.ts
4769
+ var DEFAULTS11 = {
4770
+ mode: "pixelate",
4771
+ startMs: 0,
4772
+ durationMs: 6e3,
4773
+ difficulty: 0.5
4774
+ };
4775
+ function clamp017(x) {
4776
+ return x < 0 ? 0 : x > 1 ? 1 : x;
4777
+ }
4778
+ function fitRect(iW, iH, bx, by, bw, bh) {
4779
+ const scale = Math.min(bw / iW, bh / iH);
4780
+ const dw = iW * scale;
4781
+ const dh = iH * scale;
4782
+ return { dx: bx + (bw - dw) / 2, dy: by + (bh - dh) / 2, dw, dh };
4783
+ }
4784
+ function blockSizeAt(p, maxBlock) {
4785
+ return Math.max(1, Math.round(maxBlock * (1 - p) + 1 * p));
4786
+ }
4787
+ function tileHash(i) {
4788
+ let x = i * 2654435761 >>> 0;
4789
+ x ^= x << 13;
4790
+ x ^= x >>> 17;
4791
+ x ^= x << 5;
4792
+ return (x >>> 0) / 4294967295;
4793
+ }
4794
+ function tileHashSigned(i, salt) {
4795
+ return tileHash(i * 1013904223 + salt * 22695477 | 0) * 2 - 1;
4796
+ }
4797
+ function imageRevealLayer() {
4798
+ let mode = DEFAULTS11.mode;
4799
+ let startMs = DEFAULTS11.startMs;
4800
+ let durationMs = DEFAULTS11.durationMs;
4801
+ let difficulty = DEFAULTS11.difficulty;
4802
+ let image = null;
4803
+ let offscreen = null;
4804
+ let offCtx = null;
4805
+ let imgW = 0;
4806
+ let imgH = 0;
4807
+ function ensureOffscreen(w, h) {
4808
+ const needNew = !offscreen || offscreen.width !== w || offscreen.height !== h;
4809
+ if (needNew) {
4810
+ if (typeof OffscreenCanvas !== "undefined") {
4811
+ offscreen = new OffscreenCanvas(w, h);
4812
+ offCtx = offscreen.getContext("2d");
4813
+ } else {
4814
+ const el = typeof document !== "undefined" ? document.createElement("canvas") : null;
4815
+ if (!el) {
4816
+ offscreen = null;
4817
+ offCtx = null;
4818
+ return null;
4819
+ }
4820
+ el.width = w;
4821
+ el.height = h;
4822
+ offscreen = el;
4823
+ offCtx = el.getContext("2d");
4824
+ }
4825
+ }
4826
+ return offCtx;
4827
+ }
4828
+ return {
4829
+ key: "image-reveal",
4830
+ init(_ctx, props) {
4831
+ mode = props.mode ?? DEFAULTS11.mode;
4832
+ startMs = props.startMs ?? DEFAULTS11.startMs;
4833
+ durationMs = props.durationMs ?? DEFAULTS11.durationMs;
4834
+ difficulty = props.difficulty ?? DEFAULTS11.difficulty;
4835
+ image = props.image;
4836
+ const src = props.image;
4837
+ imgW = src["naturalWidth"] ?? src["displayWidth"] ?? src["width"] ?? 0;
4838
+ imgH = src["naturalHeight"] ?? src["displayHeight"] ?? src["height"] ?? 0;
4839
+ },
4840
+ draw(ctx, tMs) {
4841
+ if (!image || imgW === 0 || imgH === 0) return;
4842
+ const p = clamp017((tMs - startMs) / (durationMs > 0 ? durationMs : 1));
4843
+ const sb = ctx.safeBox;
4844
+ const fit = fitRect(imgW, imgH, sb.left, sb.top, sb.w, sb.h);
4845
+ const c = ctx.ctx2d;
4846
+ c.save();
4847
+ c.beginPath();
4848
+ c.rect(fit.dx, fit.dy, fit.dw, fit.dh);
4849
+ c.clip();
4850
+ if (mode === "pixelate") {
4851
+ drawPixelate(c, image, fit, p, difficulty, imgW, imgH, ensureOffscreen);
4852
+ } else if (mode === "blur") {
4853
+ drawBlur(c, image, fit, p, difficulty, imgW, imgH, ensureOffscreen);
4854
+ } else {
4855
+ drawShuffle(c, image, fit, p, difficulty, imgW, imgH);
4856
+ }
4857
+ c.restore();
4858
+ },
4859
+ dispose() {
4860
+ image = null;
4861
+ offscreen = null;
4862
+ offCtx = null;
4863
+ }
4864
+ };
4865
+ }
4866
+ function drawPixelate(c, image, fit, p, difficulty, imgW, imgH, getOffCtx) {
4867
+ const maxBlock = Math.max(2, Math.round(fit.dw * (0.03125 + difficulty * 0.21875)));
4868
+ const blockSize = blockSizeAt(p, maxBlock);
4869
+ if (blockSize <= 1) {
4870
+ c.drawImage(image, 0, 0, imgW, imgH, fit.dx, fit.dy, fit.dw, fit.dh);
4871
+ return;
4872
+ }
4873
+ const smallW = Math.max(1, Math.ceil(fit.dw / blockSize));
4874
+ const smallH = Math.max(1, Math.ceil(fit.dh / blockSize));
4875
+ const oc = getOffCtx(smallW, smallH);
4876
+ if (!oc) {
4877
+ c.drawImage(image, 0, 0, imgW, imgH, fit.dx, fit.dy, fit.dw, fit.dh);
4878
+ return;
4879
+ }
4880
+ oc.clearRect(0, 0, smallW, smallH);
4881
+ oc.drawImage(image, 0, 0, imgW, imgH, 0, 0, smallW, smallH);
4882
+ const prev = c.imageSmoothingEnabled;
4883
+ c.imageSmoothingEnabled = false;
4884
+ const off = oc.canvas;
4885
+ c.drawImage(off, 0, 0, smallW, smallH, fit.dx, fit.dy, fit.dw, fit.dh);
4886
+ c.imageSmoothingEnabled = prev;
4887
+ }
4888
+ function drawBlur(c, image, fit, p, difficulty, imgW, imgH, getOffCtx) {
4889
+ const maxBlur = 8 + difficulty * 72;
4890
+ const blurPx = maxBlur * (1 - p);
4891
+ const cAny = c;
4892
+ const hasFilter = "filter" in c && cAny["filter"] !== void 0;
4893
+ if (hasFilter && blurPx > 0) {
4894
+ const prev = cAny["filter"];
4895
+ cAny["filter"] = `blur(${blurPx.toFixed(1)}px)`;
4896
+ c.drawImage(image, 0, 0, imgW, imgH, fit.dx, fit.dy, fit.dw, fit.dh);
4897
+ cAny["filter"] = prev ?? "none";
4898
+ } else if (blurPx > 0) {
4899
+ const passes = Math.min(6, Math.round(blurPx / 8));
4900
+ if (passes > 0) {
4901
+ let w = Math.max(1, Math.round(fit.dw / Math.pow(2, passes)));
4902
+ let h = Math.max(1, Math.round(fit.dh / Math.pow(2, passes)));
4903
+ const oc = getOffCtx(w, h);
4904
+ if (oc) {
4905
+ oc.clearRect(0, 0, w, h);
4906
+ oc.drawImage(image, 0, 0, imgW, imgH, 0, 0, w, h);
4907
+ c.drawImage(oc.canvas, 0, 0, w, h, fit.dx, fit.dy, fit.dw, fit.dh);
4908
+ } else {
4909
+ c.drawImage(image, 0, 0, imgW, imgH, fit.dx, fit.dy, fit.dw, fit.dh);
4910
+ }
4911
+ } else {
4912
+ c.drawImage(image, 0, 0, imgW, imgH, fit.dx, fit.dy, fit.dw, fit.dh);
4913
+ }
4914
+ } else {
4915
+ c.drawImage(image, 0, 0, imgW, imgH, fit.dx, fit.dy, fit.dw, fit.dh);
4916
+ }
4917
+ }
4918
+ function drawShuffle(c, image, fit, p, difficulty, imgW, imgH) {
4919
+ const cols = 8;
4920
+ const rows = 14;
4921
+ const tileW = fit.dw / cols;
4922
+ const tileH = fit.dh / rows;
4923
+ const srcTileW = imgW / cols;
4924
+ const srcTileH = imgH / rows;
4925
+ const maxOffX = tileW * difficulty * 1.5;
4926
+ const maxOffY = tileH * difficulty * 1.5;
4927
+ const ease = 1 - (1 - p) * (1 - p);
4928
+ for (let row = 0; row < rows; row++) {
4929
+ for (let col = 0; col < cols; col++) {
4930
+ const i = row * cols + col;
4931
+ const offX = tileHashSigned(i, 0) * maxOffX * (1 - ease);
4932
+ const offY = tileHashSigned(i, 1) * maxOffY * (1 - ease);
4933
+ const sx = col * srcTileW;
4934
+ const sy = row * srcTileH;
4935
+ const dxHome = fit.dx + col * tileW;
4936
+ const dyHome = fit.dy + row * tileH;
4937
+ const dx = dxHome + offX;
4938
+ const dy = dyHome + offY;
4939
+ c.drawImage(
4940
+ image,
4941
+ sx,
4942
+ sy,
4943
+ srcTileW,
4944
+ srcTileH,
4945
+ dx,
4946
+ dy,
4947
+ tileW,
4948
+ tileH
4949
+ );
4950
+ }
4951
+ }
4952
+ }
4953
+ var VALID_MODES = ["pixelate", "shuffle", "blur"];
4954
+ var imageRevealFactory = {
4955
+ key: "image-reveal",
4956
+ create: imageRevealLayer,
4957
+ validateProps(props) {
4958
+ if (props == null || typeof props !== "object") return ["image-reveal: props must be an object"];
4959
+ const p = props;
4960
+ const errs = [];
4961
+ if (p["image"] == null) errs.push("image-reveal.image is required");
4962
+ if (p["mode"] != null && !VALID_MODES.includes(p["mode"]))
4963
+ errs.push(`image-reveal.mode must be one of: ${VALID_MODES.join(", ")}`);
4964
+ if (p["startMs"] != null && typeof p["startMs"] !== "number")
4965
+ errs.push("image-reveal.startMs must be a number");
4966
+ if (p["durationMs"] != null && (typeof p["durationMs"] !== "number" || p["durationMs"] <= 0))
4967
+ errs.push("image-reveal.durationMs must be a positive number");
4968
+ if (p["difficulty"] != null && (typeof p["difficulty"] !== "number" || p["difficulty"] < 0 || p["difficulty"] > 1))
4969
+ errs.push("image-reveal.difficulty must be a number in [0, 1]");
4970
+ return errs;
4971
+ }
4972
+ };
4973
+
4768
4974
  // src/scene/registry.ts
4769
4975
  var REGISTRY = /* @__PURE__ */ new Map();
4770
4976
  function registerLayer(factory) {
@@ -4813,6 +5019,7 @@ registerLayer(tensionGraphFactory);
4813
5019
  registerLayer(textureFactory);
4814
5020
  registerLayer(statCounterFactory);
4815
5021
  registerLayer(endCardFactory);
5022
+ registerLayer(imageRevealFactory);
4816
5023
 
4817
5024
  // src/scene/audioLayers.ts
4818
5025
  function countInSchedule(opts) {
@@ -5633,6 +5840,7 @@ export {
5633
5840
  highlightIntensity,
5634
5841
  hookFactory,
5635
5842
  identityCamera,
5843
+ imageRevealFactory,
5636
5844
  inRange,
5637
5845
  intervalArcsFactory,
5638
5846
  invLerp,