@real-music-packages/web-core 0.24.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/audio.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import {
2
- KEYS_PREFER_FLATS,
3
- getMidiNote
4
- } from "./chunk-5ZK4HVY4.js";
2
+ KEYS_PREFER_FLATS
3
+ } from "./chunk-BYZBLH25.js";
5
4
  import {
6
5
  SALAMANDER_CDN_BASE,
7
6
  SALAMANDER_URLS_8,
@@ -10,8 +9,9 @@ import {
10
9
  generateReverb
11
10
  } from "./chunk-JVGAABTK.js";
12
11
  import {
12
+ getMidiNote,
13
13
  midiToNoteName
14
- } from "./chunk-25RUSM2X.js";
14
+ } from "./chunk-GORQ5YMR.js";
15
15
 
16
16
  // src/engine.ts
17
17
  var browser = typeof window !== "undefined";
@@ -0,0 +1,15 @@
1
+ // src/enharmonic.ts
2
+ var KEYS_PREFER_FLATS = ["F", "Bb", "Eb", "Ab", "Db", "Gb"];
3
+ function useFlatsForKeyName(key) {
4
+ return KEYS_PREFER_FLATS.includes(key);
5
+ }
6
+ function useFlatsForKeyFifths(fifths) {
7
+ return fifths < 0;
8
+ }
9
+
10
+ export {
11
+ KEYS_PREFER_FLATS,
12
+ useFlatsForKeyName,
13
+ useFlatsForKeyFifths
14
+ };
15
+ //# sourceMappingURL=chunk-BYZBLH25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/enharmonic.ts"],"sourcesContent":["/** Keys conventionally spelled with flats (RET's key-name model). */\nexport const KEYS_PREFER_FLATS = ['F', 'Bb', 'Eb', 'Ab', 'Db', 'Gb'] as const;\n\n/** Whether to use flat spellings for a key given by name (e.g. \"Eb\"). */\nexport function useFlatsForKeyName(key: string): boolean {\n return (KEYS_PREFER_FLATS as readonly string[]).includes(key);\n}\n\n/**\n * Whether to use flat spellings for a key given by its key-signature \"fifths\"\n * value (Stave's model: -7..+7, negative = flat keys). 0 (C) and positive\n * (sharp keys) use sharps.\n */\nexport function useFlatsForKeyFifths(fifths: number): boolean {\n return fifths < 0;\n}\n"],"mappings":";AACO,IAAM,oBAAoB,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAG5D,SAAS,mBAAmB,KAAsB;AACvD,SAAQ,kBAAwC,SAAS,GAAG;AAC9D;AAOO,SAAS,qBAAqB,QAAyB;AAC5D,SAAO,SAAS;AAClB;","names":[]}
@@ -1,6 +1,25 @@
1
- import {
2
- noteNameToIndex
3
- } from "./chunk-25RUSM2X.js";
1
+ // src/notes.ts
2
+ var NOTE_NAMES = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
3
+ var NOTE_NAMES_FLAT = ["C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B"];
4
+ var LETTER_TO_INDEX = { C: 0, D: 2, E: 4, F: 5, G: 7, A: 9, B: 11 };
5
+ function noteNameToIndex(note) {
6
+ const letter = note[0]?.toUpperCase();
7
+ let index = LETTER_TO_INDEX[letter];
8
+ if (index === void 0) throw new Error(`Invalid note name: ${note}`);
9
+ for (const ch of note.slice(1)) {
10
+ if (ch === "#") index += 1;
11
+ else if (ch === "b") index -= 1;
12
+ }
13
+ return (index % 12 + 12) % 12;
14
+ }
15
+ function pitchClass(midi) {
16
+ return (midi % 12 + 12) % 12;
17
+ }
18
+ function midiToNoteName(midi, useFlats = false) {
19
+ const names = useFlats ? NOTE_NAMES_FLAT : NOTE_NAMES;
20
+ const octave = Math.floor(midi / 12) - 1;
21
+ return `${names[pitchClass(midi)]}${octave}`;
22
+ }
4
23
 
5
24
  // src/scales.ts
6
25
  var MAJOR_SCALE_INTERVALS = [0, 2, 4, 5, 7, 9, 11];
@@ -28,24 +47,17 @@ function getStability(degree) {
28
47
  return null;
29
48
  }
30
49
 
31
- // src/enharmonic.ts
32
- var KEYS_PREFER_FLATS = ["F", "Bb", "Eb", "Ab", "Db", "Gb"];
33
- function useFlatsForKeyName(key) {
34
- return KEYS_PREFER_FLATS.includes(key);
35
- }
36
- function useFlatsForKeyFifths(fifths) {
37
- return fifths < 0;
38
- }
39
-
40
50
  export {
51
+ NOTE_NAMES,
52
+ NOTE_NAMES_FLAT,
53
+ noteNameToIndex,
54
+ pitchClass,
55
+ midiToNoteName,
41
56
  MAJOR_SCALE_INTERVALS,
42
57
  ALL_KEYS,
43
58
  getMidiNote,
44
59
  getScaleDegree,
45
60
  isInScale,
46
- getStability,
47
- KEYS_PREFER_FLATS,
48
- useFlatsForKeyName,
49
- useFlatsForKeyFifths
61
+ getStability
50
62
  };
51
- //# sourceMappingURL=chunk-5ZK4HVY4.js.map
63
+ //# sourceMappingURL=chunk-GORQ5YMR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/notes.ts","../src/scales.ts"],"sourcesContent":["export const NOTE_NAMES = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'] as const;\nexport const NOTE_NAMES_FLAT = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'] as const;\n\nconst LETTER_TO_INDEX: Record<string, number> = { C: 0, D: 2, E: 4, F: 5, G: 7, A: 9, B: 11 };\n\n/** Note name (e.g. \"C\", \"C#\", \"Db\", \"Cb\") → pitch class 0..11. */\nexport function noteNameToIndex(note: string): number {\n const letter = note[0]?.toUpperCase();\n let index = LETTER_TO_INDEX[letter];\n if (index === undefined) throw new Error(`Invalid note name: ${note}`);\n for (const ch of note.slice(1)) {\n if (ch === '#') index += 1;\n else if (ch === 'b') index -= 1;\n }\n return ((index % 12) + 12) % 12;\n}\n\n/** MIDI number → pitch class 0..11. */\nexport function pitchClass(midi: number): number {\n return ((midi % 12) + 12) % 12;\n}\n\n/** MIDI → note name with octave, e.g. 61 → \"C#4\" (or \"Db4\" with useFlats). */\nexport function midiToNoteName(midi: number, useFlats = false): string {\n const names = useFlats ? NOTE_NAMES_FLAT : NOTE_NAMES;\n const octave = Math.floor(midi / 12) - 1;\n return `${names[pitchClass(midi)]}${octave}`;\n}\n","import { noteNameToIndex } from './notes';\n\nexport const MAJOR_SCALE_INTERVALS = [0, 2, 4, 5, 7, 9, 11] as const;\nexport const ALL_KEYS = ['C', 'G', 'D', 'A', 'E', 'B', 'F#', 'F', 'Bb', 'Eb', 'Ab', 'Db'] as const;\n\n/**\n * Get MIDI note number for a scale degree in a given key.\n * Ported verbatim from RET src/lib/audio/scales.ts.\n * NOTE: RET uses octave*12 (not (octave+1)*12), so getMidiNote(1,'C',4)=48,\n * not 60. This is RET's established convention — consumers must account for it.\n */\nexport function getMidiNote(degree: number, key: string, octave = 4): number {\n const rootIndex = noteNameToIndex(key);\n const actualDegree = ((degree - 1) % 7 + 7) % 7;\n const octaveShift = Math.floor((degree - 1) / 7);\n const semitones = MAJOR_SCALE_INTERVALS[actualDegree];\n return rootIndex + semitones + ((octave + octaveShift) * 12);\n}\n\n/**\n * Get the scale degree (1-7) for a MIDI note in a key, or null if not in scale.\n * Ported verbatim from RET src/lib/audio/scales.ts.\n */\nexport function getScaleDegree(midiNote: number, key: string): number | null {\n const rootIndex = noteNameToIndex(key);\n const noteInOctave = ((midiNote % 12) - rootIndex + 12) % 12;\n const degreeIndex = (MAJOR_SCALE_INTERVALS as readonly number[]).indexOf(noteInOctave);\n return degreeIndex !== -1 ? degreeIndex + 1 : null;\n}\n\n/**\n * Check if a MIDI note is in the given key.\n */\nexport function isInScale(midiNote: number, key: string): boolean {\n return getScaleDegree(midiNote, key) !== null;\n}\n\n/**\n * Get stability category for a scale degree.\n * Ported verbatim from RET src/lib/audio/scales.ts.\n */\nexport function getStability(degree: number): 'stable' | 'lessStable' | 'unstable' | null {\n if ([1, 3, 5].includes(degree)) return 'stable';\n if ([2, 4, 6].includes(degree)) return 'lessStable';\n if (degree === 7) return 'unstable';\n return null;\n}\n"],"mappings":";AAAO,IAAM,aAAa,CAAC,KAAK,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;AACnF,IAAM,kBAAkB,CAAC,KAAK,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;AAE/F,IAAM,kBAA0C,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAGrF,SAAS,gBAAgB,MAAsB;AACpD,QAAM,SAAS,KAAK,CAAC,GAAG,YAAY;AACpC,MAAI,QAAQ,gBAAgB,MAAM;AAClC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,sBAAsB,IAAI,EAAE;AACrE,aAAW,MAAM,KAAK,MAAM,CAAC,GAAG;AAC9B,QAAI,OAAO,IAAK,UAAS;AAAA,aAChB,OAAO,IAAK,UAAS;AAAA,EAChC;AACA,UAAS,QAAQ,KAAM,MAAM;AAC/B;AAGO,SAAS,WAAW,MAAsB;AAC/C,UAAS,OAAO,KAAM,MAAM;AAC9B;AAGO,SAAS,eAAe,MAAc,WAAW,OAAe;AACrE,QAAM,QAAQ,WAAW,kBAAkB;AAC3C,QAAM,SAAS,KAAK,MAAM,OAAO,EAAE,IAAI;AACvC,SAAO,GAAG,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,MAAM;AAC5C;;;ACzBO,IAAM,wBAAwB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AACnD,IAAM,WAAW,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI;AAQjF,SAAS,YAAY,QAAgB,KAAa,SAAS,GAAW;AAC3E,QAAM,YAAY,gBAAgB,GAAG;AACrC,QAAM,iBAAiB,SAAS,KAAK,IAAI,KAAK;AAC9C,QAAM,cAAc,KAAK,OAAO,SAAS,KAAK,CAAC;AAC/C,QAAM,YAAY,sBAAsB,YAAY;AACpD,SAAO,YAAY,aAAc,SAAS,eAAe;AAC3D;AAMO,SAAS,eAAe,UAAkB,KAA4B;AAC3E,QAAM,YAAY,gBAAgB,GAAG;AACrC,QAAM,gBAAiB,WAAW,KAAM,YAAY,MAAM;AAC1D,QAAM,cAAe,sBAA4C,QAAQ,YAAY;AACrF,SAAO,gBAAgB,KAAK,cAAc,IAAI;AAChD;AAKO,SAAS,UAAU,UAAkB,KAAsB;AAChE,SAAO,eAAe,UAAU,GAAG,MAAM;AAC3C;AAMO,SAAS,aAAa,QAA6D;AACxF,MAAI,CAAC,GAAG,GAAG,CAAC,EAAE,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,CAAC,GAAG,GAAG,CAAC,EAAE,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,WAAW,EAAG,QAAO;AACzB,SAAO;AACT;","names":[]}
package/dist/index.js CHANGED
@@ -1,25 +1,25 @@
1
1
  import {
2
- ALL_KEYS,
3
2
  KEYS_PREFER_FLATS,
4
- MAJOR_SCALE_INTERVALS,
5
- getMidiNote,
6
- getScaleDegree,
7
- getStability,
8
- isInScale,
9
3
  useFlatsForKeyFifths,
10
4
  useFlatsForKeyName
11
- } from "./chunk-5ZK4HVY4.js";
5
+ } from "./chunk-BYZBLH25.js";
12
6
  import {
13
7
  INTERVALS,
14
8
  intervalBySemitones
15
9
  } from "./chunk-N56UTMWA.js";
16
10
  import {
11
+ ALL_KEYS,
12
+ MAJOR_SCALE_INTERVALS,
17
13
  NOTE_NAMES,
18
14
  NOTE_NAMES_FLAT,
15
+ getMidiNote,
16
+ getScaleDegree,
17
+ getStability,
18
+ isInScale,
19
19
  midiToNoteName,
20
20
  noteNameToIndex,
21
21
  pitchClass
22
- } from "./chunk-25RUSM2X.js";
22
+ } from "./chunk-GORQ5YMR.js";
23
23
 
24
24
  // src/frequency.ts
25
25
  function midiToFrequency(midi) {
@@ -1793,6 +1793,9 @@ interface CountdownProps {
1793
1793
  centerFrac?: number;
1794
1794
  /** Draw a draining ring around the number. Default true. */
1795
1795
  ring?: boolean;
1796
+ /** Ring radius in px. Default = fontPx*0.62. Set explicitly to align the ring
1797
+ * with another circular element (e.g. whozart's radial ring / portrait). */
1798
+ ringRadius?: number;
1796
1799
  }
1797
1800
  declare const countdownFactory: LayerFactory<CountdownProps>;
1798
1801
 
@@ -1846,4 +1849,106 @@ interface ScaleHighlightProps {
1846
1849
  }
1847
1850
  declare const scaleHighlightFactory: LayerFactory<ScaleHighlightProps>;
1848
1851
 
1849
- 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 ExtendedDemoOpts, FIFTHS_MAJOR, FIFTHS_MINOR, FOLLOW_BARS, FOLLOW_PAD, type FallingKeyboardDemoOpts, type FallingNotesProps, 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 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 TempoMap, 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, fallingKeyboardDemoScore, fallingKeyboardDemoSpec, fallingNotesFactory, firstMeasureBox, followBoxAt, followSrcBox, followWindowStart, fracSlotPoint, frameRect, 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, 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, systemBox, transitionProgress, validateChordTrack, validateQuiz, validateSections, visualTimelineMs, vstackAudioPlayheadLine, vstackFollowBox, waveformFactory, whiteKeys, worldToViewport };
1852
+ interface ParticleBurstProps {
1853
+ /** Override onsets. Default = Score onsets (origin x from pitch when available). */
1854
+ onsetsMs?: number[];
1855
+ /** Particles per burst. Default 16. */
1856
+ count?: number;
1857
+ /** Particle lifetime, ms. Default 750. */
1858
+ lifeMs?: number;
1859
+ /** Initial speed (px/s). Default 520. */
1860
+ speed?: number;
1861
+ /** Gravity (px/s²). Default 900. */
1862
+ gravity?: number;
1863
+ /** Origin y as a fraction of H (burst source line). Default 0.6. */
1864
+ originYFrac?: number;
1865
+ /** Particle colour. Default theme.gold. */
1866
+ color?: string;
1867
+ /** Max particle radius (px). Default 9. */
1868
+ size?: number;
1869
+ }
1870
+ declare const particleBurstFactory: LayerFactory<ParticleBurstProps>;
1871
+
1872
+ interface TensionPoint {
1873
+ tMs: number;
1874
+ value: number;
1875
+ }
1876
+ interface TensionGraphProps {
1877
+ /** Host-supplied tension series [{tMs, value 0..1}]. Overrides Score derivation. */
1878
+ series?: TensionPoint[];
1879
+ /** Key (e.g. 'C') → derive tension from scale-degree stability. */
1880
+ key?: string;
1881
+ /** Plot band top (world y). Default safeBox.top + safeBox.h*0.18. */
1882
+ top?: number;
1883
+ /** Plot band height (world px). Default safeBox.h*0.30. */
1884
+ height?: number;
1885
+ /** Line + fill colour. Default theme.accent. */
1886
+ color?: string;
1887
+ /** Fill the area under the curve. Default true. */
1888
+ fill?: boolean;
1889
+ /** Line width. Default 5. */
1890
+ width?: number;
1891
+ /** Moving dot at the current value. Default true. */
1892
+ dot?: boolean;
1893
+ }
1894
+ declare const tensionGraphFactory: LayerFactory<TensionGraphProps>;
1895
+
1896
+ interface TextureProps {
1897
+ /** Grain intensity 0..1 (speck opacity). Default 0.05. 0 disables grain. */
1898
+ grain?: number;
1899
+ /** Grain speck count per frame. Default 700. */
1900
+ grainDensity?: number;
1901
+ /** Vignette strength 0..1 (edge darkening). Default 0.35. 0 disables. */
1902
+ vignette?: number;
1903
+ /** Letterbox bar height as a fraction of H (top+bottom). Default 0 (off). */
1904
+ letterboxFrac?: number;
1905
+ }
1906
+ declare const textureFactory: LayerFactory<TextureProps>;
1907
+
1908
+ interface StatCounterProps {
1909
+ /** Target value to count up to. Required. */
1910
+ value: number;
1911
+ /** When the count starts (ms). Default 0. */
1912
+ startMs?: number;
1913
+ /** Count duration (ms). Default 1200. */
1914
+ durationMs?: number;
1915
+ /** Text before the number (e.g. "No. "). Default "". */
1916
+ prefix?: string;
1917
+ /** Text after the number (e.g. "%", "+"). Default "". */
1918
+ suffix?: string;
1919
+ /** Caption under the number. Default "". */
1920
+ label?: string;
1921
+ /** Number font px. Default 220. */
1922
+ fontPx?: number;
1923
+ /** Vertical center as a fraction of H. Default 0.46. */
1924
+ centerFrac?: number;
1925
+ /** Number colour. Default theme.accent. */
1926
+ color?: string;
1927
+ /** Thousands separators on the number. Default true. */
1928
+ group?: boolean;
1929
+ }
1930
+ declare const statCounterFactory: LayerFactory<StatCounterProps>;
1931
+
1932
+ interface EndCardProps {
1933
+ /** CTA line. Default "Follow for daily". */
1934
+ text?: string;
1935
+ /** Handle / sub-line under the CTA (e.g. "@whozart"). Default "". */
1936
+ handle?: string;
1937
+ /** When the card animates in (ms). Default 0. */
1938
+ startMs?: number;
1939
+ /** Scale-in duration (ms). Default 400. */
1940
+ inMs?: number;
1941
+ /** CTA colour. Default theme.accent. */
1942
+ color?: string;
1943
+ /** Vertical center as a fraction of H. Default 0.5. */
1944
+ centerFrac?: number;
1945
+ /** Font px for the CTA line. Default 72. */
1946
+ fontPx?: number;
1947
+ /** Draw the bouncing chevron. Default true. */
1948
+ arrow?: boolean;
1949
+ /** Arrow direction — which way it points / where the follow button is. Default "up". */
1950
+ arrowDir?: 'up' | 'down';
1951
+ }
1952
+ declare const endCardFactory: LayerFactory<EndCardProps>;
1953
+
1954
+ 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 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, 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 };