@nice2dev/ui-audio 0.1.0 → 1.0.2
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/CHANGELOG.md +217 -1
- package/dist/__benchmarks__/audio-latency.bench.d.ts +2 -0
- package/dist/__benchmarks__/audio-latency.bench.d.ts.map +1 -0
- package/dist/constants/index.d.ts +6 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/karaokeScoringConfig.d.ts.map +1 -1
- package/dist/core/NiceAudioErrorBoundary.d.ts +28 -0
- package/dist/core/NiceAudioErrorBoundary.d.ts.map +1 -0
- package/dist/editor/NiceSampleBrowser.d.ts +79 -0
- package/dist/editor/NiceSampleBrowser.d.ts.map +1 -0
- package/dist/editor/Waveform.d.ts +53 -1
- package/dist/editor/Waveform.d.ts.map +1 -1
- package/dist/editor/hooks/useProjectCRUD.d.ts.map +1 -1
- package/dist/editor/nav/SaveLoadControls.d.ts.map +1 -1
- package/dist/editor/useEditorRecording.d.ts.map +1 -1
- package/dist/engine/NiceAudioEffects.d.ts +186 -0
- package/dist/engine/NiceAudioEffects.d.ts.map +1 -0
- package/dist/engine/NiceAudioEffectsRack.d.ts +17 -0
- package/dist/engine/NiceAudioEffectsRack.d.ts.map +1 -0
- package/dist/engine/NiceAudioWorklet.d.ts +184 -0
- package/dist/engine/NiceAudioWorklet.d.ts.map +1 -0
- package/dist/engine/NiceMultitrackExport.d.ts +165 -0
- package/dist/engine/NiceMultitrackExport.d.ts.map +1 -0
- package/dist/engine/audioContext.d.ts.map +1 -1
- package/dist/engine/audioKeyboard.d.ts.map +1 -1
- package/dist/engine/audioPlaybackEngine.d.ts.map +1 -1
- package/dist/index.cjs +373 -34
- package/dist/index.d.ts +95 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +9988 -5652
- package/dist/karaoke/AudioPitchAnalyzer.d.ts.map +1 -1
- package/dist/karaoke/KaraokeSummaryOverlay.d.ts +22 -0
- package/dist/karaoke/KaraokeSummaryOverlay.d.ts.map +1 -0
- package/dist/karaoke/rendering/fontCatalog.d.ts.map +1 -1
- package/dist/karaoke/rendering/glossyBarRenderer.d.ts.map +1 -1
- package/dist/karaoke/rendering/karaokeLyrics.d.ts.map +1 -1
- package/dist/karaoke/rendering/karaokeNoteParsing.d.ts.map +1 -1
- package/dist/karaoke/rendering/karaokeSettings.d.ts.map +1 -1
- package/dist/karaoke/rendering/karaokeTimelineRenderer.d.ts.map +1 -1
- package/dist/karaoke/rendering/karaokeTimelineTypes.d.ts.map +1 -1
- package/dist/lighting/NiceDMXTimeline.d.ts +226 -0
- package/dist/lighting/NiceDMXTimeline.d.ts.map +1 -0
- package/dist/models/index.d.ts +16 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/modelsAiVideo.d.ts.map +1 -1
- package/dist/player/GenericPlayer.d.ts +34 -1
- package/dist/player/GenericPlayer.d.ts.map +1 -1
- package/dist/playlist/GenericPlaylist.d.ts.map +1 -1
- package/dist/playlist/PlaylistBrowser.d.ts.map +1 -1
- package/dist/playlist/PlaylistImportWizard.d.ts +42 -0
- package/dist/playlist/PlaylistImportWizard.d.ts.map +1 -0
- package/dist/playlist/PlaylistList.d.ts.map +1 -1
- package/dist/radio/NiceRadioPlayer.d.ts +141 -0
- package/dist/radio/NiceRadioPlayer.d.ts.map +1 -0
- package/dist/streaming/NiceStreamingVisualizer.d.ts +86 -0
- package/dist/streaming/NiceStreamingVisualizer.d.ts.map +1 -0
- package/dist/streaming/NiceVoiceChatOverlay.d.ts +97 -0
- package/dist/streaming/NiceVoiceChatOverlay.d.ts.map +1 -0
- package/dist/streaming/index.d.ts +11 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/liveStreamManager.d.ts +194 -0
- package/dist/streaming/liveStreamManager.d.ts.map +1 -0
- package/dist/streaming/useLiveStream.d.ts +19 -0
- package/dist/streaming/useLiveStream.d.ts.map +1 -0
- package/dist/streaming/webrtcAudio.d.ts +111 -0
- package/dist/streaming/webrtcAudio.d.ts.map +1 -0
- package/dist/ui-audio.css +1 -1
- package/dist/utils/BaseStreamClient.d.ts.map +1 -1
- package/dist/utils/audioDragDrop.d.ts +72 -0
- package/dist/utils/audioDragDrop.d.ts.map +1 -0
- package/dist/utils/crepeStreaming.d.ts.map +1 -1
- package/dist/utils/index.d.ts +40 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/latencyEstimate.d.ts +1 -1
- package/dist/utils/latencyEstimate.d.ts.map +1 -1
- package/dist/utils/midiCCMapping.d.ts +93 -0
- package/dist/utils/midiCCMapping.d.ts.map +1 -0
- package/dist/utils/musicPlayerUtils.d.ts.map +1 -1
- package/dist/utils/pianoRollUtils.d.ts +58 -0
- package/dist/utils/pianoRollUtils.d.ts.map +1 -0
- package/dist/utils/sanitize.d.ts +24 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/shortcutManager.d.ts +81 -0
- package/dist/utils/shortcutManager.d.ts.map +1 -0
- package/dist/utils/undoRedoUtils.d.ts +45 -0
- package/dist/utils/undoRedoUtils.d.ts.map +1 -1
- package/dist/workers/audioWorkletProcessor.d.ts +92 -0
- package/dist/workers/audioWorkletProcessor.d.ts.map +1 -0
- package/dist/workers/useAudioWorklet.d.ts +82 -0
- package/dist/workers/useAudioWorklet.d.ts.map +1 -0
- package/dist/workers/useWorker.d.ts +1 -0
- package/dist/workers/useWorker.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/** ICY metadata from a radio stream. */
|
|
3
|
+
export interface RadioStreamMetadata {
|
|
4
|
+
title?: string;
|
|
5
|
+
artist?: string;
|
|
6
|
+
album?: string;
|
|
7
|
+
genre?: string;
|
|
8
|
+
bitrate?: number;
|
|
9
|
+
sampleRate?: number;
|
|
10
|
+
}
|
|
11
|
+
/** A radio station definition. */
|
|
12
|
+
export interface RadioStation {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
streamUrl: string;
|
|
16
|
+
logoUrl?: string;
|
|
17
|
+
genre?: string;
|
|
18
|
+
country?: string;
|
|
19
|
+
language?: string;
|
|
20
|
+
bitrate?: number;
|
|
21
|
+
codec?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
isFavorite?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** EQ preset definition. */
|
|
26
|
+
export interface EQPreset {
|
|
27
|
+
name: string;
|
|
28
|
+
/** Frequency → gain(dB) pairs for parametric EQ bands. */
|
|
29
|
+
bands: {
|
|
30
|
+
frequency: number;
|
|
31
|
+
gain: number;
|
|
32
|
+
Q?: number;
|
|
33
|
+
}[];
|
|
34
|
+
}
|
|
35
|
+
/** State returned by {@link useRadioStream}. */
|
|
36
|
+
export interface RadioStreamState {
|
|
37
|
+
/** Whether the stream is currently playing. */
|
|
38
|
+
isPlaying: boolean;
|
|
39
|
+
/** Current volume (0–1). */
|
|
40
|
+
volume: number;
|
|
41
|
+
/** Whether the stream is buffering/connecting. */
|
|
42
|
+
isBuffering: boolean;
|
|
43
|
+
/** ICY metadata from the current stream. */
|
|
44
|
+
metadata: RadioStreamMetadata | null;
|
|
45
|
+
/** Error message, if any. */
|
|
46
|
+
error: string | null;
|
|
47
|
+
/** Active EQ preset name. */
|
|
48
|
+
activePreset: string | null;
|
|
49
|
+
}
|
|
50
|
+
/** Controls returned by {@link useRadioStream}. */
|
|
51
|
+
export interface RadioStreamControls {
|
|
52
|
+
play: () => void;
|
|
53
|
+
pause: () => void;
|
|
54
|
+
toggle: () => void;
|
|
55
|
+
setVolume: (v: number) => void;
|
|
56
|
+
setStation: (station: RadioStation) => void;
|
|
57
|
+
applyEQPreset: (preset: EQPreset) => void;
|
|
58
|
+
clearEQ: () => void;
|
|
59
|
+
}
|
|
60
|
+
/** Props for {@link NiceRadioPlayer}. */
|
|
61
|
+
export interface NiceRadioPlayerProps {
|
|
62
|
+
/** List of available radio stations. */
|
|
63
|
+
stations: RadioStation[];
|
|
64
|
+
/** Initially selected station ID. */
|
|
65
|
+
initialStationId?: string;
|
|
66
|
+
/** Auto-play when a station is selected. */
|
|
67
|
+
autoPlay?: boolean;
|
|
68
|
+
/** Built-in EQ presets. */
|
|
69
|
+
eqPresets?: EQPreset[];
|
|
70
|
+
/** Called when the active station changes. */
|
|
71
|
+
onStationChange?: (station: RadioStation) => void;
|
|
72
|
+
/** Called when play/pause state changes. */
|
|
73
|
+
onPlayingChange?: (playing: boolean) => void;
|
|
74
|
+
/** Called when ICY metadata is received. */
|
|
75
|
+
onMetadata?: (meta: RadioStreamMetadata) => void;
|
|
76
|
+
/** Show station browser panel. */
|
|
77
|
+
showBrowser?: boolean;
|
|
78
|
+
/** Show equalizer panel. */
|
|
79
|
+
showEqualizer?: boolean;
|
|
80
|
+
/** Show simple spectrum visualizer. */
|
|
81
|
+
showVisualizer?: boolean;
|
|
82
|
+
/** Show metadata history panel */
|
|
83
|
+
showMetadataHistory?: boolean;
|
|
84
|
+
/** Show recording controls */
|
|
85
|
+
showRecording?: boolean;
|
|
86
|
+
/** Show sleep timer */
|
|
87
|
+
showSleepTimer?: boolean;
|
|
88
|
+
/** Called when a station is favorited/unfavorited */
|
|
89
|
+
onToggleFavorite?: (stationId: string) => void;
|
|
90
|
+
/** Called when recording starts */
|
|
91
|
+
onRecordingStart?: () => void;
|
|
92
|
+
/** Called when recording stops with the recorded blob */
|
|
93
|
+
onRecordingStop?: (blob: Blob) => void;
|
|
94
|
+
/** Additional CSS class. */
|
|
95
|
+
className?: string;
|
|
96
|
+
/** Inline styles. */
|
|
97
|
+
style?: React.CSSProperties;
|
|
98
|
+
}
|
|
99
|
+
/** Props for {@link NiceStationBrowser}. */
|
|
100
|
+
export interface NiceStationBrowserProps {
|
|
101
|
+
/** Available stations. */
|
|
102
|
+
stations: RadioStation[];
|
|
103
|
+
/** Currently active station ID. */
|
|
104
|
+
activeStationId?: string;
|
|
105
|
+
/** Called when a station is selected. */
|
|
106
|
+
onSelect: (station: RadioStation) => void;
|
|
107
|
+
/** Called when toggling favorite status. */
|
|
108
|
+
onToggleFavorite?: (stationId: string) => void;
|
|
109
|
+
/** Additional CSS class. */
|
|
110
|
+
className?: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Hook for managing an internet radio stream with Web Audio API.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```tsx
|
|
117
|
+
* const [state, controls] = useRadioStream();
|
|
118
|
+
* controls.setStation({ id: '1', name: 'Jazz FM', streamUrl: 'https://...' });
|
|
119
|
+
* controls.play();
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export declare function useRadioStream(): [RadioStreamState, RadioStreamControls];
|
|
123
|
+
/** Browsable, filterable list of radio stations. */
|
|
124
|
+
export declare function NiceStationBrowser({ stations, activeStationId, onSelect, onToggleFavorite, className, }: NiceStationBrowserProps): import("react/jsx-runtime").JSX.Element;
|
|
125
|
+
/**
|
|
126
|
+
* Full-featured internet radio player with station browser, equalizer, and visualizer.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```tsx
|
|
130
|
+
* <NiceRadioPlayer
|
|
131
|
+
* stations={[
|
|
132
|
+
* { id: '1', name: 'Jazz FM', streamUrl: 'https://stream.jazzfm.com/aac', genre: 'Jazz' },
|
|
133
|
+
* { id: '2', name: 'Rock Radio', streamUrl: 'https://stream.rock.com/mp3', genre: 'Rock' },
|
|
134
|
+
* ]}
|
|
135
|
+
* showBrowser
|
|
136
|
+
* showEqualizer
|
|
137
|
+
* />
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export declare function NiceRadioPlayer({ stations, initialStationId, autoPlay, eqPresets, onStationChange, onPlayingChange, onMetadata, onToggleFavorite, onRecordingStart, onRecordingStop, showBrowser, showEqualizer, showVisualizer, showMetadataHistory, showRecording, showSleepTimer, className, style, }: NiceRadioPlayerProps): import("react/jsx-runtime").JSX.Element;
|
|
141
|
+
//# sourceMappingURL=NiceRadioPlayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NiceRadioPlayer.d.ts","sourceRoot":"","sources":["../../src/radio/NiceRadioPlayer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type VisualizerMode = 'bars' | 'waveform' | 'circle' | 'mirror-bars';
|
|
3
|
+
export interface NiceStreamingVisualizerProps {
|
|
4
|
+
/** Visualizer style: bars, waveform, circle, or mirror-bars (default: 'bars') */
|
|
5
|
+
mode?: VisualizerMode;
|
|
6
|
+
/** Canvas width (default: 300) */
|
|
7
|
+
width?: number;
|
|
8
|
+
/** Canvas height (default: 100) */
|
|
9
|
+
height?: number;
|
|
10
|
+
/** Number of frequency bars (default: 32, only for 'bars' and 'mirror-bars') */
|
|
11
|
+
barCount?: number;
|
|
12
|
+
/** Bar color or gradient colors (default: '#3b82f6') */
|
|
13
|
+
barColor?: string | string[];
|
|
14
|
+
/** Background color (default: 'transparent') */
|
|
15
|
+
backgroundColor?: string;
|
|
16
|
+
/** FFT size for frequency analysis (default: 256) */
|
|
17
|
+
fftSize?: 64 | 128 | 256 | 512 | 1024 | 2048;
|
|
18
|
+
/** Smoothing time constant 0-1 (default: 0.8) */
|
|
19
|
+
smoothing?: number;
|
|
20
|
+
/** Minimum decibel value (default: -90) */
|
|
21
|
+
minDecibels?: number;
|
|
22
|
+
/** Maximum decibel value (default: -10) */
|
|
23
|
+
maxDecibels?: number;
|
|
24
|
+
/** Device ID for specific microphone (default: system default) */
|
|
25
|
+
deviceId?: string;
|
|
26
|
+
/** Whether to start capturing immediately (default: false) */
|
|
27
|
+
autoStart?: boolean;
|
|
28
|
+
/** Callback when capture starts */
|
|
29
|
+
onStart?: () => void;
|
|
30
|
+
/** Callback when capture stops */
|
|
31
|
+
onStop?: () => void;
|
|
32
|
+
/** Callback with current audio level (0-1) */
|
|
33
|
+
onAudioLevel?: (level: number) => void;
|
|
34
|
+
/** Callback on error (e.g., permission denied) */
|
|
35
|
+
onError?: (error: Error) => void;
|
|
36
|
+
/** Additional CSS class */
|
|
37
|
+
className?: string;
|
|
38
|
+
/** Inline styles */
|
|
39
|
+
style?: React.CSSProperties;
|
|
40
|
+
/** Border radius for bars (default: 2) */
|
|
41
|
+
barBorderRadius?: number;
|
|
42
|
+
/** Gap between bars in pixels (default: 2) */
|
|
43
|
+
barGap?: number;
|
|
44
|
+
/** Line width for waveform mode (default: 2) */
|
|
45
|
+
lineWidth?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface StreamingVisualizerRef {
|
|
48
|
+
/** Start capturing audio */
|
|
49
|
+
start: () => Promise<void>;
|
|
50
|
+
/** Stop capturing audio */
|
|
51
|
+
stop: () => void;
|
|
52
|
+
/** Check if currently capturing */
|
|
53
|
+
isCapturing: () => boolean;
|
|
54
|
+
/** Get current audio level (0-1) */
|
|
55
|
+
getAudioLevel: () => number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Real-time microphone audio visualizer component.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* import { NiceStreamingVisualizer, StreamingVisualizerRef } from '@nice2dev/ui-audio';
|
|
63
|
+
*
|
|
64
|
+
* function VoiceIndicator() {
|
|
65
|
+
* const visualizerRef = useRef<StreamingVisualizerRef>(null);
|
|
66
|
+
*
|
|
67
|
+
* return (
|
|
68
|
+
* <div>
|
|
69
|
+
* <NiceStreamingVisualizer
|
|
70
|
+
* ref={visualizerRef}
|
|
71
|
+
* mode="bars"
|
|
72
|
+
* width={200}
|
|
73
|
+
* height={60}
|
|
74
|
+
* barColor={['#3b82f6', '#8b5cf6']}
|
|
75
|
+
* autoStart
|
|
76
|
+
* onAudioLevel={(level) => console.log('Level:', level)}
|
|
77
|
+
* />
|
|
78
|
+
* <button onClick={() => visualizerRef.current?.stop()}>Stop</button>
|
|
79
|
+
* </div>
|
|
80
|
+
* );
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare const NiceStreamingVisualizer: React.ForwardRefExoticComponent<NiceStreamingVisualizerProps & React.RefAttributes<StreamingVisualizerRef>>;
|
|
85
|
+
export default NiceStreamingVisualizer;
|
|
86
|
+
//# sourceMappingURL=NiceStreamingVisualizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NiceStreamingVisualizer.d.ts","sourceRoot":"","sources":["../../src/streaming/NiceStreamingVisualizer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE5E,MAAM,WAAW,4BAA4B;IAC3C,iFAAiF;IACjF,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,OAAO,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7C,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,kDAAkD;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,0CAA0C;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,4BAA4B;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,mCAAmC;IACnC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,oCAAoC;IACpC,aAAa,EAAE,MAAM,MAAM,CAAC;CAC7B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,uBAAuB,6GA6VlC,CAAC;AAEH,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { WebRTCAudioManager, WebRTCAudioConfig, SignalingMessage } from './webrtcAudio';
|
|
3
|
+
export interface VoiceChatParticipant {
|
|
4
|
+
/** Unique participant ID */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Display name */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Avatar URL (optional) */
|
|
9
|
+
avatarUrl?: string;
|
|
10
|
+
/** Whether currently speaking (based on audio level) */
|
|
11
|
+
isSpeaking?: boolean;
|
|
12
|
+
/** Whether muted */
|
|
13
|
+
isMuted?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface NiceVoiceChatOverlayProps {
|
|
16
|
+
/** Current user ID */
|
|
17
|
+
userId: string;
|
|
18
|
+
/** Current user display name */
|
|
19
|
+
userName: string;
|
|
20
|
+
/** Current user avatar URL */
|
|
21
|
+
userAvatarUrl?: string;
|
|
22
|
+
/** List of remote participants */
|
|
23
|
+
participants?: VoiceChatParticipant[];
|
|
24
|
+
/** WebRTC configuration */
|
|
25
|
+
rtcConfig?: WebRTCAudioConfig;
|
|
26
|
+
/** Position of the overlay */
|
|
27
|
+
position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
|
|
28
|
+
/** Whether the overlay is expanded (default: true) */
|
|
29
|
+
expanded?: boolean;
|
|
30
|
+
/** Callback to send signaling messages (required for peer connections) */
|
|
31
|
+
onSignalingMessage?: (message: SignalingMessage) => void;
|
|
32
|
+
/** Callback when user toggles mute */
|
|
33
|
+
onMuteToggle?: (muted: boolean) => void;
|
|
34
|
+
/** Callback when user leaves the chat */
|
|
35
|
+
onLeave?: () => void;
|
|
36
|
+
/** Callback when a participant's speaking state changes */
|
|
37
|
+
onSpeakingChange?: (participantId: string, isSpeaking: boolean) => void;
|
|
38
|
+
/** Audio level threshold for speaking detection (default: 0.1) */
|
|
39
|
+
speakingThreshold?: number;
|
|
40
|
+
/** Theme: 'light' | 'dark' | 'auto' */
|
|
41
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
42
|
+
/** Additional CSS class */
|
|
43
|
+
className?: string;
|
|
44
|
+
/** Inline styles */
|
|
45
|
+
style?: React.CSSProperties;
|
|
46
|
+
/** Z-index for positioning (default: 1000) */
|
|
47
|
+
zIndex?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface VoiceChatOverlayRef {
|
|
50
|
+
/** Connect to a peer */
|
|
51
|
+
connectToPeer: (peerId: string) => Promise<void>;
|
|
52
|
+
/** Handle incoming signaling message */
|
|
53
|
+
handleSignalingMessage: (message: SignalingMessage) => Promise<void>;
|
|
54
|
+
/** Toggle mute state */
|
|
55
|
+
toggleMute: () => void;
|
|
56
|
+
/** Check if muted */
|
|
57
|
+
isMuted: () => boolean;
|
|
58
|
+
/** Leave the voice chat */
|
|
59
|
+
leave: () => void;
|
|
60
|
+
/** Get the WebRTC manager instance */
|
|
61
|
+
getManager: () => WebRTCAudioManager | null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Voice chat overlay widget for embedding in applications.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```tsx
|
|
68
|
+
* import { NiceVoiceChatOverlay, VoiceChatOverlayRef } from '@nice2dev/ui-audio';
|
|
69
|
+
*
|
|
70
|
+
* function App() {
|
|
71
|
+
* const overlayRef = useRef<VoiceChatOverlayRef>(null);
|
|
72
|
+
* const [participants, setParticipants] = useState<VoiceChatParticipant[]>([]);
|
|
73
|
+
*
|
|
74
|
+
* // Handle signaling via WebSocket
|
|
75
|
+
* useEffect(() => {
|
|
76
|
+
* socket.on('voice-signal', (msg) => {
|
|
77
|
+
* overlayRef.current?.handleSignalingMessage(msg);
|
|
78
|
+
* });
|
|
79
|
+
* }, []);
|
|
80
|
+
*
|
|
81
|
+
* return (
|
|
82
|
+
* <NiceVoiceChatOverlay
|
|
83
|
+
* ref={overlayRef}
|
|
84
|
+
* userId="user-123"
|
|
85
|
+
* userName="John Doe"
|
|
86
|
+
* participants={participants}
|
|
87
|
+
* onSignalingMessage={(msg) => socket.emit('voice-signal', msg)}
|
|
88
|
+
* onLeave={() => console.log('Left voice chat')}
|
|
89
|
+
* theme="dark"
|
|
90
|
+
* />
|
|
91
|
+
* );
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare const NiceVoiceChatOverlay: React.ForwardRefExoticComponent<NiceVoiceChatOverlayProps & React.RefAttributes<VoiceChatOverlayRef>>;
|
|
96
|
+
export default NiceVoiceChatOverlay;
|
|
97
|
+
//# sourceMappingURL=NiceVoiceChatOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NiceVoiceChatOverlay.d.ts","sourceRoot":"","sources":["../../src/streaming/NiceVoiceChatOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOlG,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;IACrE,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,sCAAsC;IACtC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACxE,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,wBAAwB;IACxB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,wCAAwC;IACxC,sBAAsB,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,wBAAwB;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,sCAAsC;IACtC,UAAU,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAC;CAC7C;AAmED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,oBAAoB,uGA6b/B,CAAC;AAEH,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Audio Module — WebRTC, real-time visualizers, voice chat
|
|
3
|
+
*
|
|
4
|
+
* @module @nice2dev/ui-audio/streaming
|
|
5
|
+
*/
|
|
6
|
+
export { WebRTCAudioManager, isWebRTCSupported, getAudioInputDevices, createVoiceChatAudioContext, type WebRTCAudioConfig, type PeerConnection, type SignalingMessage, type OnRemoteStreamCallback, type OnPeerStateChangeCallback, type OnSignalingMessageCallback, } from './webrtcAudio';
|
|
7
|
+
export { NiceStreamingVisualizer, default as StreamingVisualizer, type NiceStreamingVisualizerProps, type StreamingVisualizerRef, type VisualizerMode, } from './NiceStreamingVisualizer';
|
|
8
|
+
export { NiceVoiceChatOverlay, default as VoiceChatOverlay, type NiceVoiceChatOverlayProps, type VoiceChatOverlayRef, type VoiceChatParticipant, } from './NiceVoiceChatOverlay';
|
|
9
|
+
export { LiveStreamManager, detectStreamProtocol, createLiveStream, type StreamProtocol, type QualityLevel, type LiveStreamConfig, type StreamState, type StreamEvents, type BufferHealth, type StreamMetadata, } from './liveStreamManager';
|
|
10
|
+
export { useLiveStream, type UseLiveStreamOptions, type UseLiveStreamReturn, } from './useLiveStream';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,EAC3B,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,uBAAuB,EACvB,OAAO,IAAI,mBAAmB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,oBAAoB,EACpB,OAAO,IAAI,gBAAgB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live Streaming Ingest — RTMP/HLS/DASH audio stream playback.
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - HLS (HTTP Live Streaming) playback via hls.js
|
|
6
|
+
* - DASH (Dynamic Adaptive Streaming) playback via dash.js
|
|
7
|
+
* - RTMP-over-WebSocket proxied playback
|
|
8
|
+
* - Adaptive bitrate (ABR) monitoring
|
|
9
|
+
* - Buffer health monitoring
|
|
10
|
+
* - Latency tracking
|
|
11
|
+
* - Stream quality selection
|
|
12
|
+
*/
|
|
13
|
+
/** Supported stream protocols. */
|
|
14
|
+
export type StreamProtocol = 'hls' | 'dash' | 'rtmp-ws' | 'icecast' | 'shoutcast';
|
|
15
|
+
/** Stream quality level. */
|
|
16
|
+
export interface QualityLevel {
|
|
17
|
+
index: number;
|
|
18
|
+
bitrate: number;
|
|
19
|
+
codecs?: string;
|
|
20
|
+
width?: number;
|
|
21
|
+
height?: number;
|
|
22
|
+
label: string;
|
|
23
|
+
}
|
|
24
|
+
/** Stream configuration. */
|
|
25
|
+
export interface LiveStreamConfig {
|
|
26
|
+
url: string;
|
|
27
|
+
protocol: StreamProtocol;
|
|
28
|
+
/** Auto-start playback. */
|
|
29
|
+
autoPlay?: boolean;
|
|
30
|
+
/** Target latency for low-latency streams (seconds). */
|
|
31
|
+
targetLatency?: number;
|
|
32
|
+
/** Maximum buffer length (seconds). */
|
|
33
|
+
maxBufferLength?: number;
|
|
34
|
+
/** Initial quality level index (-1 = auto). */
|
|
35
|
+
initialQuality?: number;
|
|
36
|
+
/** Enable ABR (adaptive bitrate). */
|
|
37
|
+
enableABR?: boolean;
|
|
38
|
+
/** Custom headers for requests. */
|
|
39
|
+
headers?: Record<string, string>;
|
|
40
|
+
/** Retry configuration. */
|
|
41
|
+
retry?: {
|
|
42
|
+
maxAttempts: number;
|
|
43
|
+
delayMs: number;
|
|
44
|
+
backoffMultiplier: number;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Stream state. */
|
|
48
|
+
export interface StreamState {
|
|
49
|
+
status: 'idle' | 'connecting' | 'buffering' | 'playing' | 'paused' | 'error' | 'ended';
|
|
50
|
+
currentTime: number;
|
|
51
|
+
duration: number;
|
|
52
|
+
buffered: number;
|
|
53
|
+
latency: number;
|
|
54
|
+
bitrate: number;
|
|
55
|
+
currentQuality: QualityLevel | null;
|
|
56
|
+
availableQualities: QualityLevel[];
|
|
57
|
+
error: string | null;
|
|
58
|
+
isLive: boolean;
|
|
59
|
+
}
|
|
60
|
+
/** Stream events. */
|
|
61
|
+
export interface StreamEvents {
|
|
62
|
+
onStateChange?: (state: StreamState) => void;
|
|
63
|
+
onQualityChange?: (quality: QualityLevel) => void;
|
|
64
|
+
onError?: (error: Error) => void;
|
|
65
|
+
onBufferHealth?: (health: BufferHealth) => void;
|
|
66
|
+
onMetadata?: (metadata: StreamMetadata) => void;
|
|
67
|
+
}
|
|
68
|
+
/** Buffer health metrics. */
|
|
69
|
+
export interface BufferHealth {
|
|
70
|
+
currentLevel: number;
|
|
71
|
+
targetLevel: number;
|
|
72
|
+
isHealthy: boolean;
|
|
73
|
+
stallCount: number;
|
|
74
|
+
lastStallDuration: number;
|
|
75
|
+
}
|
|
76
|
+
/** Stream metadata. */
|
|
77
|
+
export interface StreamMetadata {
|
|
78
|
+
title?: string;
|
|
79
|
+
artist?: string;
|
|
80
|
+
album?: string;
|
|
81
|
+
genre?: string;
|
|
82
|
+
bitrate?: number;
|
|
83
|
+
sampleRate?: number;
|
|
84
|
+
channels?: number;
|
|
85
|
+
[key: string]: unknown;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Manages live audio streaming from various sources.
|
|
89
|
+
*/
|
|
90
|
+
export declare class LiveStreamManager {
|
|
91
|
+
private config;
|
|
92
|
+
private audioContext;
|
|
93
|
+
private audioElement;
|
|
94
|
+
private sourceNode;
|
|
95
|
+
private analyserNode;
|
|
96
|
+
private hlsInstance;
|
|
97
|
+
private dashInstance;
|
|
98
|
+
private state;
|
|
99
|
+
private events;
|
|
100
|
+
private retryCount;
|
|
101
|
+
private retryTimeout;
|
|
102
|
+
private bufferCheckInterval;
|
|
103
|
+
private stallCount;
|
|
104
|
+
private lastStallTime;
|
|
105
|
+
constructor(config: LiveStreamConfig, events?: StreamEvents);
|
|
106
|
+
private getInitialState;
|
|
107
|
+
/**
|
|
108
|
+
* Initialize and connect to stream.
|
|
109
|
+
*/
|
|
110
|
+
connect(): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Set up HLS playback using hls.js.
|
|
113
|
+
*/
|
|
114
|
+
private setupHLS;
|
|
115
|
+
/**
|
|
116
|
+
* Set up DASH playback using dash.js.
|
|
117
|
+
*/
|
|
118
|
+
private setupDASH;
|
|
119
|
+
/**
|
|
120
|
+
* Set up RTMP stream over WebSocket proxy.
|
|
121
|
+
*/
|
|
122
|
+
private setupRTMPOverWebSocket;
|
|
123
|
+
/**
|
|
124
|
+
* Set up Icecast/Shoutcast stream (direct MP3/AAC stream).
|
|
125
|
+
*/
|
|
126
|
+
private setupIcecast;
|
|
127
|
+
/**
|
|
128
|
+
* Poll for Icecast metadata (title/artist).
|
|
129
|
+
*/
|
|
130
|
+
private metadataInterval;
|
|
131
|
+
private startMetadataPolling;
|
|
132
|
+
/**
|
|
133
|
+
* Set up audio element event listeners.
|
|
134
|
+
*/
|
|
135
|
+
private setupEventListeners;
|
|
136
|
+
/**
|
|
137
|
+
* Start buffer health monitoring.
|
|
138
|
+
*/
|
|
139
|
+
private startBufferMonitoring;
|
|
140
|
+
/**
|
|
141
|
+
* Handle stream error with retry logic.
|
|
142
|
+
*/
|
|
143
|
+
private handleError;
|
|
144
|
+
/**
|
|
145
|
+
* Update state and emit events.
|
|
146
|
+
*/
|
|
147
|
+
private updateState;
|
|
148
|
+
/**
|
|
149
|
+
* Start playback.
|
|
150
|
+
*/
|
|
151
|
+
play(): Promise<void>;
|
|
152
|
+
/**
|
|
153
|
+
* Pause playback.
|
|
154
|
+
*/
|
|
155
|
+
pause(): void;
|
|
156
|
+
/**
|
|
157
|
+
* Set quality level.
|
|
158
|
+
*/
|
|
159
|
+
setQuality(levelIndex: number): void;
|
|
160
|
+
/**
|
|
161
|
+
* Seek to the live edge of the stream.
|
|
162
|
+
*/
|
|
163
|
+
seekToLive(): void;
|
|
164
|
+
/**
|
|
165
|
+
* Get current state.
|
|
166
|
+
*/
|
|
167
|
+
getState(): StreamState;
|
|
168
|
+
/**
|
|
169
|
+
* Get analyser node for visualization.
|
|
170
|
+
*/
|
|
171
|
+
getAnalyserNode(): AnalyserNode | null;
|
|
172
|
+
/**
|
|
173
|
+
* Get audio context.
|
|
174
|
+
*/
|
|
175
|
+
getAudioContext(): AudioContext | null;
|
|
176
|
+
/**
|
|
177
|
+
* Disconnect and cleanup.
|
|
178
|
+
*/
|
|
179
|
+
disconnect(): void;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Auto-detect stream protocol from URL.
|
|
183
|
+
*/
|
|
184
|
+
export declare function detectStreamProtocol(url: string): StreamProtocol;
|
|
185
|
+
/**
|
|
186
|
+
* Create LiveStreamManager with auto-detected protocol.
|
|
187
|
+
* @param urlOrConfig - Stream URL string or full config object
|
|
188
|
+
* @param events - Optional stream event handlers
|
|
189
|
+
*/
|
|
190
|
+
export declare function createLiveStream(urlOrConfig: string | Omit<LiveStreamConfig, 'protocol'> & {
|
|
191
|
+
protocol?: StreamProtocol;
|
|
192
|
+
}, events?: StreamEvents): LiveStreamManager;
|
|
193
|
+
export default LiveStreamManager;
|
|
194
|
+
//# sourceMappingURL=liveStreamManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveStreamManager.d.ts","sourceRoot":"","sources":["../../src/streaming/liveStreamManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LiveStreamConfig, StreamState, BufferHealth, StreamMetadata } from './liveStreamManager';
|
|
2
|
+
export interface UseLiveStreamOptions extends Omit<LiveStreamConfig, 'url'> {
|
|
3
|
+
url: string;
|
|
4
|
+
/** Auto-connect on mount. */
|
|
5
|
+
autoConnect?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface UseLiveStreamReturn {
|
|
8
|
+
state: StreamState;
|
|
9
|
+
bufferHealth: BufferHealth | null;
|
|
10
|
+
metadata: StreamMetadata | null;
|
|
11
|
+
connect: () => Promise<void>;
|
|
12
|
+
disconnect: () => void;
|
|
13
|
+
play: () => Promise<void>;
|
|
14
|
+
pause: () => void;
|
|
15
|
+
setQuality: (index: number) => void;
|
|
16
|
+
seekToLive: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function useLiveStream(options: UseLiveStreamOptions): UseLiveStreamReturn;
|
|
19
|
+
//# sourceMappingURL=useLiveStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveStream.d.ts","sourceRoot":"","sources":["../../src/streaming/useLiveStream.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAGhB,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CAmEhF"}
|