@refraction-ui/react 0.19.1 → 0.20.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/chunk-533MCMSU.js +2355 -0
- package/dist/chunk-533MCMSU.js.map +7 -0
- package/dist/chunk-AMK4VCBG.js +250 -0
- package/dist/chunk-AMK4VCBG.js.map +7 -0
- package/dist/chunk-BOLFYVI6.js +90 -0
- package/dist/chunk-BOLFYVI6.js.map +7 -0
- package/dist/chunk-F7B64KT3.js +187 -0
- package/dist/chunk-F7B64KT3.js.map +7 -0
- package/dist/chunk-FD37DFCC.js +77 -0
- package/dist/chunk-FD37DFCC.js.map +7 -0
- package/dist/chunk-H54FLNAF.js +132 -0
- package/dist/chunk-H54FLNAF.js.map +7 -0
- package/dist/chunk-INP46354.js +664 -0
- package/dist/chunk-INP46354.js.map +7 -0
- package/dist/chunk-ONACRMG4.js +116 -0
- package/dist/chunk-ONACRMG4.js.map +7 -0
- package/dist/chunk-SDZ3LROZ.js +7 -0
- package/dist/chunk-SDZ3LROZ.js.map +7 -0
- package/dist/chunk-TOZBR4GL.js +154 -0
- package/dist/chunk-TOZBR4GL.js.map +7 -0
- package/dist/chunk-UNEM2TRI.js +225 -0
- package/dist/chunk-UNEM2TRI.js.map +7 -0
- package/dist/chunk-VK3EQ34F.js +92 -0
- package/dist/chunk-VK3EQ34F.js.map +7 -0
- package/dist/chunk-WK2IIUFO.js +316 -0
- package/dist/chunk-WK2IIUFO.js.map +7 -0
- package/dist/chunk-WSPJTQAV.js +59 -0
- package/dist/chunk-WSPJTQAV.js.map +7 -0
- package/dist/chunk-XWP763SH.js +3 -2
- package/dist/chunk-XWP763SH.js.map +7 -1
- package/dist/chunk-Y2FNNAIL.js +80 -0
- package/dist/chunk-Y2FNNAIL.js.map +1 -0
- package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
- package/dist/chunk-ZF3OHCGV.js.map +7 -0
- package/dist/form.cjs +5 -11
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +6 -12
- package/dist/form.js.map +1 -1
- package/dist/index.cjs +2879 -33936
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +126 -28780
- package/dist/internal/react-app-shell/index.d.cts +2 -22
- package/dist/internal/react-app-shell/index.d.ts +2 -22
- package/dist/internal/react-badge/index.d.cts +5 -0
- package/dist/internal/react-badge/index.d.ts +5 -0
- package/dist/internal/react-callout/index.d.cts +4 -0
- package/dist/internal/react-callout/index.d.ts +4 -0
- package/dist/internal/react-card/index.d.cts +8 -1
- package/dist/internal/react-card/index.d.ts +8 -1
- package/dist/internal/react-collapsible/index.d.cts +0 -3
- package/dist/internal/react-collapsible/index.d.ts +0 -3
- package/dist/internal/react-combobox/index.d.cts +0 -3
- package/dist/internal/react-combobox/index.d.ts +0 -3
- package/dist/internal/react-command/index.d.cts +0 -3
- package/dist/internal/react-command/index.d.ts +0 -3
- package/dist/internal/react-data-table/index.d.cts +0 -3
- package/dist/internal/react-data-table/index.d.ts +0 -3
- package/dist/internal/react-dialog/index.d.cts +0 -3
- package/dist/internal/react-dialog/index.d.ts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
- package/dist/internal/react-form/index.d.cts +2 -21
- package/dist/internal/react-form/index.d.ts +2 -21
- package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
- package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
- package/dist/internal/react-link-card/index.d.cts +8 -2
- package/dist/internal/react-link-card/index.d.ts +8 -2
- package/dist/internal/react-popover/index.d.cts +0 -3
- package/dist/internal/react-popover/index.d.ts +0 -3
- package/dist/internal/react-sheet/index.d.cts +0 -3
- package/dist/internal/react-sheet/index.d.ts +0 -3
- package/dist/internal/react-slot/index.d.cts +23 -0
- package/dist/internal/react-slot/index.d.ts +23 -0
- package/dist/internal/react-toast/index.d.cts +0 -3
- package/dist/internal/react-toast/index.d.ts +0 -3
- package/dist/internal/react-tooltip/index.d.cts +0 -3
- package/dist/internal/react-tooltip/index.d.ts +0 -3
- package/dist/react-accordion.js +125 -0
- package/dist/react-accordion.js.map +7 -0
- package/dist/react-ai.js +257 -0
- package/dist/react-ai.js.map +7 -0
- package/dist/react-analytics.js +1698 -0
- package/dist/react-analytics.js.map +7 -0
- package/dist/react-animated-text.js +164 -0
- package/dist/react-animated-text.js.map +7 -0
- package/dist/react-app-shell.js +631 -0
- package/dist/react-app-shell.js.map +7 -0
- package/dist/react-audience-feature-card.js +53 -0
- package/dist/react-audience-feature-card.js.map +7 -0
- package/dist/react-audio-room.js +166 -0
- package/dist/react-audio-room.js.map +7 -0
- package/dist/react-auth.js +211 -0
- package/dist/react-auth.js.map +7 -0
- package/dist/react-avatar-group.js +154 -0
- package/dist/react-avatar-group.js.map +7 -0
- package/dist/react-avatar.js +168 -0
- package/dist/react-avatar.js.map +7 -0
- package/dist/react-badge.js +86 -0
- package/dist/react-badge.js.map +7 -0
- package/dist/react-bottom-nav.js +67 -0
- package/dist/react-bottom-nav.js.map +7 -0
- package/dist/react-brand-network-cell.js +92 -0
- package/dist/react-brand-network-cell.js.map +7 -0
- package/dist/react-breadcrumbs.js +104 -0
- package/dist/react-breadcrumbs.js.map +7 -0
- package/dist/react-browser-chrome-mock.js +89 -0
- package/dist/react-browser-chrome-mock.js.map +7 -0
- package/dist/react-button.js +13 -0
- package/dist/react-button.js.map +7 -0
- package/dist/react-calendar.js +301 -0
- package/dist/react-calendar.js.map +7 -0
- package/dist/react-call-controls.js +113 -0
- package/dist/react-call-controls.js.map +7 -0
- package/dist/react-callout.js +152 -0
- package/dist/react-callout.js.map +7 -0
- package/dist/react-card-grid.js +34 -0
- package/dist/react-card-grid.js.map +7 -0
- package/dist/react-card.js +200 -0
- package/dist/react-card.js.map +7 -0
- package/dist/react-carousel.js +132 -0
- package/dist/react-carousel.js.map +7 -0
- package/dist/react-charts.js +509 -0
- package/dist/react-charts.js.map +7 -0
- package/dist/react-checkbox.js +156 -0
- package/dist/react-checkbox.js.map +7 -0
- package/dist/react-checklist.js +168 -0
- package/dist/react-checklist.js.map +7 -0
- package/dist/react-code-block.js +78 -0
- package/dist/react-code-block.js.map +7 -0
- package/dist/react-code-editor.js +184 -0
- package/dist/react-code-editor.js.map +7 -0
- package/dist/react-collapsible.js +192 -0
- package/dist/react-collapsible.js.map +7 -0
- package/dist/react-combobox.js +609 -0
- package/dist/react-combobox.js.map +7 -0
- package/dist/react-command-input.js +202 -0
- package/dist/react-command-input.js.map +7 -0
- package/dist/react-command.js +364 -0
- package/dist/react-command.js.map +7 -0
- package/dist/react-composer.js +2036 -0
- package/dist/react-composer.js.map +7 -0
- package/dist/react-content-protection.js +133 -0
- package/dist/react-content-protection.js.map +7 -0
- package/dist/react-conversation.js +1226 -0
- package/dist/react-conversation.js.map +7 -0
- package/dist/react-cookie-consent.js +291 -0
- package/dist/react-cookie-consent.js.map +7 -0
- package/dist/react-data-table.js +310 -0
- package/dist/react-data-table.js.map +7 -0
- package/dist/react-date-picker.js +95 -0
- package/dist/react-date-picker.js.map +7 -0
- package/dist/react-device-frame.js +137 -0
- package/dist/react-device-frame.js.map +7 -0
- package/dist/react-dialog.js +218 -0
- package/dist/react-dialog.js.map +7 -0
- package/dist/react-diff-viewer.js +460 -0
- package/dist/react-diff-viewer.js.map +7 -0
- package/dist/react-dropdown-menu.js +292 -0
- package/dist/react-dropdown-menu.js.map +7 -0
- package/dist/react-editor-status-bar.js +148 -0
- package/dist/react-editor-status-bar.js.map +7 -0
- package/dist/react-editor-tabs.js +159 -0
- package/dist/react-editor-tabs.js.map +7 -0
- package/dist/react-emoji-picker.js +238 -0
- package/dist/react-emoji-picker.js.map +7 -0
- package/dist/react-empty-state.js +90 -0
- package/dist/react-empty-state.js.map +7 -0
- package/dist/react-feedback-dialog.js +275 -0
- package/dist/react-feedback-dialog.js.map +7 -0
- package/dist/react-file-tree.js +376 -0
- package/dist/react-file-tree.js.map +7 -0
- package/dist/react-file-upload.js +360 -0
- package/dist/react-file-upload.js.map +7 -0
- package/dist/react-floating-reactions.js +124 -0
- package/dist/react-floating-reactions.js.map +7 -0
- package/dist/react-flow-editor.js +198 -0
- package/dist/react-flow-editor.js.map +7 -0
- package/dist/react-footer.js +67 -0
- package/dist/react-footer.js.map +7 -0
- package/dist/react-graph-view.js +197 -0
- package/dist/react-graph-view.js.map +7 -0
- package/dist/react-icon-system.js +9 -0
- package/dist/react-icon-system.js.map +7 -0
- package/dist/react-infinite-canvas.js +8 -0
- package/dist/react-infinite-canvas.js.map +7 -0
- package/dist/react-inline-editor.js +216 -0
- package/dist/react-inline-editor.js.map +7 -0
- package/dist/react-input-group.js +150 -0
- package/dist/react-input-group.js.map +7 -0
- package/dist/react-input.js +10 -0
- package/dist/react-input.js.map +7 -0
- package/dist/react-install-prompt.js +132 -0
- package/dist/react-install-prompt.js.map +7 -0
- package/dist/react-kanban-board.js +198 -0
- package/dist/react-kanban-board.js.map +7 -0
- package/dist/react-keyboard-shortcut.js +36 -0
- package/dist/react-keyboard-shortcut.js.map +7 -0
- package/dist/react-language-selector.js +311 -0
- package/dist/react-language-selector.js.map +7 -0
- package/dist/react-link-card.js +48 -0
- package/dist/react-link-card.js.map +7 -0
- package/dist/react-live-captions.js +92 -0
- package/dist/react-live-captions.js.map +7 -0
- package/dist/react-live-cursors.js +145 -0
- package/dist/react-live-cursors.js.map +7 -0
- package/dist/react-live-transcript.js +117 -0
- package/dist/react-live-transcript.js.map +7 -0
- package/dist/react-location-selector.js +252 -0
- package/dist/react-location-selector.js.map +7 -0
- package/dist/react-logger.js +415 -0
- package/dist/react-logger.js.map +7 -0
- package/dist/react-markdown-renderer.js +12 -0
- package/dist/react-markdown-renderer.js.map +7 -0
- package/dist/react-marquee-strip.js +62 -0
- package/dist/react-marquee-strip.js.map +7 -0
- package/dist/react-mascot.js +367 -0
- package/dist/react-mascot.js.map +7 -0
- package/dist/react-mastery-bar.js +97 -0
- package/dist/react-mastery-bar.js.map +7 -0
- package/dist/react-mini-map.js +207 -0
- package/dist/react-mini-map.js.map +7 -0
- package/dist/react-mobile-nav.js +216 -0
- package/dist/react-mobile-nav.js.map +7 -0
- package/dist/react-navbar.js +96 -0
- package/dist/react-navbar.js.map +7 -0
- package/dist/react-numbered-steps.js +67 -0
- package/dist/react-numbered-steps.js.map +7 -0
- package/dist/react-otp-input.js +318 -0
- package/dist/react-otp-input.js.map +7 -0
- package/dist/react-pagination.js +199 -0
- package/dist/react-pagination.js.map +7 -0
- package/dist/react-password-input.js +104 -0
- package/dist/react-password-input.js.map +7 -0
- package/dist/react-payment.js +81 -0
- package/dist/react-payment.js.map +7 -0
- package/dist/react-popover.js +176 -0
- package/dist/react-popover.js.map +7 -0
- package/dist/react-pre-call-lobby.js +309 -0
- package/dist/react-pre-call-lobby.js.map +7 -0
- package/dist/react-presence-indicator.js +86 -0
- package/dist/react-presence-indicator.js.map +7 -0
- package/dist/react-pricing-card.js +142 -0
- package/dist/react-pricing-card.js.map +7 -0
- package/dist/react-progress-display.js +188 -0
- package/dist/react-progress-display.js.map +7 -0
- package/dist/react-radial-gauge.js +193 -0
- package/dist/react-radial-gauge.js.map +7 -0
- package/dist/react-radio.js +169 -0
- package/dist/react-radio.js.map +7 -0
- package/dist/react-rating-scale.js +171 -0
- package/dist/react-rating-scale.js.map +7 -0
- package/dist/react-reaction-bar.js +111 -0
- package/dist/react-reaction-bar.js.map +7 -0
- package/dist/react-resizable-layout.js +298 -0
- package/dist/react-resizable-layout.js.map +7 -0
- package/dist/react-rich-editor.js +1 -0
- package/dist/react-rich-editor.js.map +7 -0
- package/dist/react-search-bar.js +285 -0
- package/dist/react-search-bar.js.map +7 -0
- package/dist/react-section-head.js +65 -0
- package/dist/react-section-head.js.map +7 -0
- package/dist/react-segmented-control.js +215 -0
- package/dist/react-segmented-control.js.map +7 -0
- package/dist/react-select.js +389 -0
- package/dist/react-select.js.map +7 -0
- package/dist/react-separator.js +86 -0
- package/dist/react-separator.js.map +7 -0
- package/dist/react-sheet.js +310 -0
- package/dist/react-sheet.js.map +7 -0
- package/dist/react-sidebar.js +100 -0
- package/dist/react-sidebar.js.map +7 -0
- package/dist/react-skeleton.js +91 -0
- package/dist/react-skeleton.js.map +7 -0
- package/dist/react-skip-to-content.js +38 -0
- package/dist/react-skip-to-content.js.map +7 -0
- package/dist/react-slide-viewer.js +264 -0
- package/dist/react-slide-viewer.js.map +7 -0
- package/dist/react-slider.js +105 -0
- package/dist/react-slider.js.map +7 -0
- package/dist/react-slot-picker.js +184 -0
- package/dist/react-slot-picker.js.map +7 -0
- package/dist/react-slot.js +7 -0
- package/dist/react-slot.js.map +7 -0
- package/dist/react-social-auth-button.js +169 -0
- package/dist/react-social-auth-button.js.map +7 -0
- package/dist/react-sortable-list.js +204 -0
- package/dist/react-sortable-list.js.map +7 -0
- package/dist/react-stat-grid.js +69 -0
- package/dist/react-stat-grid.js.map +7 -0
- package/dist/react-status-indicator.js +117 -0
- package/dist/react-status-indicator.js.map +7 -0
- package/dist/react-steps.js +167 -0
- package/dist/react-steps.js.map +7 -0
- package/dist/react-sticky-note.js +131 -0
- package/dist/react-sticky-note.js.map +7 -0
- package/dist/react-switch.js +139 -0
- package/dist/react-switch.js.map +7 -0
- package/dist/react-table-of-contents.js +80 -0
- package/dist/react-table-of-contents.js.map +7 -0
- package/dist/react-tabs.js +230 -0
- package/dist/react-tabs.js.map +7 -0
- package/dist/react-terminal.js +101 -0
- package/dist/react-terminal.js.map +7 -0
- package/dist/react-test-results.js +158 -0
- package/dist/react-test-results.js.map +7 -0
- package/dist/react-textarea.js +89 -0
- package/dist/react-textarea.js.map +7 -0
- package/dist/react-thread-view.js +139 -0
- package/dist/react-thread-view.js.map +7 -0
- package/dist/react-timeline.js +153 -0
- package/dist/react-timeline.js.map +7 -0
- package/dist/react-toast.js +253 -0
- package/dist/react-toast.js.map +7 -0
- package/dist/react-tooltip.js +221 -0
- package/dist/react-tooltip.js.map +7 -0
- package/dist/react-version-selector.js +270 -0
- package/dist/react-version-selector.js.map +7 -0
- package/dist/react-video-grid.js +129 -0
- package/dist/react-video-grid.js.map +7 -0
- package/dist/react-video-player.js +206 -0
- package/dist/react-video-player.js.map +7 -0
- package/dist/react-video-tile.js +8 -0
- package/dist/react-video-tile.js.map +7 -0
- package/dist/react-voice-pill.js +314 -0
- package/dist/react-voice-pill.js.map +7 -0
- package/dist/react-waveform.js +558 -0
- package/dist/react-waveform.js.map +7 -0
- package/dist/react-wizard.js +337 -0
- package/dist/react-wizard.js.map +7 -0
- package/dist/styles.css +7 -0
- package/dist/theme.js +1 -1
- package/package.json +3 -2
- package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
- package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
- package/dist/chunk-4A4BW3GR.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-X3HTTRQK.js +0 -6438
- package/dist/module-X3HTTRQK.js.map +0 -1
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-waveform/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../waveform/dist/index.js
|
|
10
|
+
var DEFAULT_WAVEFORM_BAR_COUNT = 48;
|
|
11
|
+
var DEFAULT_WAVEFORM_COLOR = "var(--accent-2)";
|
|
12
|
+
var DEFAULT_WAVEFORM_HEIGHT = 80;
|
|
13
|
+
var DEFAULT_WAVEFORM_INTENSITY = 1;
|
|
14
|
+
var DEFAULT_WAVEFORM_AMPLITUDE = 1;
|
|
15
|
+
var DEFAULT_WAVEFORM_SMOOTHING = 0.8;
|
|
16
|
+
var MAX_BAR_COUNT = 1024;
|
|
17
|
+
var MAX_INTENSITY = 1;
|
|
18
|
+
function normalizeBarCount(value) {
|
|
19
|
+
if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_BAR_COUNT;
|
|
20
|
+
return Math.min(MAX_BAR_COUNT, Math.max(1, Math.round(value)));
|
|
21
|
+
}
|
|
22
|
+
function normalizeSmoothing(value) {
|
|
23
|
+
if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_SMOOTHING;
|
|
24
|
+
return Math.min(0.99, Math.max(0, value));
|
|
25
|
+
}
|
|
26
|
+
function normalizeIntensity(value) {
|
|
27
|
+
if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_INTENSITY;
|
|
28
|
+
return Math.min(MAX_INTENSITY, Math.max(0, value));
|
|
29
|
+
}
|
|
30
|
+
function normalizeAmplitude(value) {
|
|
31
|
+
if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_AMPLITUDE;
|
|
32
|
+
return Math.min(1, Math.max(0, value));
|
|
33
|
+
}
|
|
34
|
+
function normalizeWaveformConfig(props = {}) {
|
|
35
|
+
return {
|
|
36
|
+
variant: props.variant ?? "bars",
|
|
37
|
+
intensity: normalizeIntensity(props.intensity),
|
|
38
|
+
amplitude: normalizeAmplitude(props.amplitude),
|
|
39
|
+
height: props.height ?? DEFAULT_WAVEFORM_HEIGHT,
|
|
40
|
+
width: props.width ?? "100%",
|
|
41
|
+
barCount: normalizeBarCount(props.barCount),
|
|
42
|
+
smoothing: normalizeSmoothing(props.smoothing),
|
|
43
|
+
color: props.color ?? DEFAULT_WAVEFORM_COLOR,
|
|
44
|
+
paused: props.paused ?? false
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function isWaveformSampleInput(value) {
|
|
48
|
+
return value instanceof Float32Array || Array.isArray(value);
|
|
49
|
+
}
|
|
50
|
+
function createSilentSamples(count = DEFAULT_WAVEFORM_BAR_COUNT) {
|
|
51
|
+
return new Float32Array(normalizeBarCount(count));
|
|
52
|
+
}
|
|
53
|
+
function createIntensitySamples(intensity = DEFAULT_WAVEFORM_INTENSITY, count = DEFAULT_WAVEFORM_BAR_COUNT, phase = 0) {
|
|
54
|
+
const normalizedIntensity = normalizeIntensity(intensity);
|
|
55
|
+
const normalizedCount = normalizeBarCount(count);
|
|
56
|
+
const samples = new Float32Array(normalizedCount);
|
|
57
|
+
if (normalizedIntensity === 0) return samples;
|
|
58
|
+
const pulse = 0.72 + Math.sin(phase * 1.8) * 0.18;
|
|
59
|
+
for (let i = 0; i < normalizedCount; i += 1) {
|
|
60
|
+
const progress = normalizedCount <= 1 ? 0.5 : i / (normalizedCount - 1);
|
|
61
|
+
const envelope = 0.35 + Math.sin(progress * Math.PI) * 0.65;
|
|
62
|
+
const carrier = Math.sin(progress * Math.PI * 6 + phase * 2.8);
|
|
63
|
+
samples[i] = carrier * envelope * normalizedIntensity * pulse;
|
|
64
|
+
}
|
|
65
|
+
return samples;
|
|
66
|
+
}
|
|
67
|
+
function normalizeWaveformSamples(input, targetCount) {
|
|
68
|
+
const sourceLength = input?.length ?? 0;
|
|
69
|
+
if (sourceLength === 0) {
|
|
70
|
+
return targetCount == null ? new Float32Array() : createSilentSamples(targetCount);
|
|
71
|
+
}
|
|
72
|
+
const normalized = new Float32Array(sourceLength);
|
|
73
|
+
let maxAbs = 0;
|
|
74
|
+
for (let i = 0; i < sourceLength; i += 1) {
|
|
75
|
+
const value = Number(input?.[i]);
|
|
76
|
+
const sample = Number.isFinite(value) ? value : 0;
|
|
77
|
+
normalized[i] = sample;
|
|
78
|
+
maxAbs = Math.max(maxAbs, Math.abs(sample));
|
|
79
|
+
}
|
|
80
|
+
const divisor = maxAbs > 1 ? maxAbs : 1;
|
|
81
|
+
for (let i = 0; i < normalized.length; i += 1) {
|
|
82
|
+
normalized[i] = clamp(normalized[i] / divisor, -1, 1);
|
|
83
|
+
}
|
|
84
|
+
if (targetCount == null || targetCount === normalized.length) {
|
|
85
|
+
return normalized;
|
|
86
|
+
}
|
|
87
|
+
return resampleWaveformSamples(normalized, targetCount);
|
|
88
|
+
}
|
|
89
|
+
function resampleWaveformSamples(samples, targetCount) {
|
|
90
|
+
const count = normalizeBarCount(targetCount);
|
|
91
|
+
const sourceLength = samples.length;
|
|
92
|
+
if (sourceLength === 0) return createSilentSamples(count);
|
|
93
|
+
if (sourceLength === count) return Float32Array.from(samples);
|
|
94
|
+
const output = new Float32Array(count);
|
|
95
|
+
for (let i = 0; i < count; i += 1) {
|
|
96
|
+
const start = i * sourceLength / count;
|
|
97
|
+
const end = (i + 1) * sourceLength / count;
|
|
98
|
+
const firstIndex = Math.floor(start);
|
|
99
|
+
const lastIndex = Math.max(firstIndex + 1, Math.ceil(end));
|
|
100
|
+
let total = 0;
|
|
101
|
+
let values = 0;
|
|
102
|
+
for (let j = firstIndex; j < lastIndex && j < sourceLength; j += 1) {
|
|
103
|
+
total += Number(samples[j]);
|
|
104
|
+
values += 1;
|
|
105
|
+
}
|
|
106
|
+
output[i] = values > 0 ? total / values : Number(samples[Math.min(firstIndex, sourceLength - 1)]);
|
|
107
|
+
}
|
|
108
|
+
return output;
|
|
109
|
+
}
|
|
110
|
+
function smoothWaveformSamples(previous, next, smoothing = DEFAULT_WAVEFORM_SMOOTHING) {
|
|
111
|
+
if (previous == null || previous.length === 0) {
|
|
112
|
+
return Float32Array.from(next);
|
|
113
|
+
}
|
|
114
|
+
const amount = normalizeSmoothing(smoothing);
|
|
115
|
+
const output = new Float32Array(next.length);
|
|
116
|
+
for (let i = 0; i < next.length; i += 1) {
|
|
117
|
+
const previousValue = Number(previous[i] ?? next[i]);
|
|
118
|
+
output[i] = previousValue * amount + Number(next[i]) * (1 - amount);
|
|
119
|
+
}
|
|
120
|
+
return output;
|
|
121
|
+
}
|
|
122
|
+
function scaleWaveformSamples(samples, intensity = DEFAULT_WAVEFORM_INTENSITY) {
|
|
123
|
+
const amount = normalizeIntensity(intensity);
|
|
124
|
+
const output = new Float32Array(samples.length);
|
|
125
|
+
for (let i = 0; i < samples.length; i += 1) {
|
|
126
|
+
output[i] = clamp(Number(samples[i]) * amount, -1, 1);
|
|
127
|
+
}
|
|
128
|
+
return output;
|
|
129
|
+
}
|
|
130
|
+
function getWaveformPeak(samples) {
|
|
131
|
+
let peak = 0;
|
|
132
|
+
for (let i = 0; i < samples.length; i += 1) {
|
|
133
|
+
peak = Math.max(peak, Math.abs(Number(samples[i]) || 0));
|
|
134
|
+
}
|
|
135
|
+
return Math.min(1, peak);
|
|
136
|
+
}
|
|
137
|
+
function toCssDimension(value) {
|
|
138
|
+
if (value == null) return void 0;
|
|
139
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
140
|
+
}
|
|
141
|
+
function createWaveform(props = {}) {
|
|
142
|
+
const config = normalizeWaveformConfig(props);
|
|
143
|
+
const inputSamples = props.samples ?? (isWaveformSampleInput(props.source) ? props.source : void 0);
|
|
144
|
+
const samples = inputSamples == null ? createIntensitySamples(config.intensity, config.barCount) : normalizeWaveformSamples(inputSamples, config.barCount);
|
|
145
|
+
return {
|
|
146
|
+
config,
|
|
147
|
+
samples,
|
|
148
|
+
ariaProps: {
|
|
149
|
+
role: "img",
|
|
150
|
+
"aria-label": "Audio waveform"
|
|
151
|
+
},
|
|
152
|
+
dataAttributes: {
|
|
153
|
+
"data-variant": config.variant,
|
|
154
|
+
"data-paused": String(config.paused)
|
|
155
|
+
},
|
|
156
|
+
getSamples(barCount = config.barCount) {
|
|
157
|
+
return inputSamples == null ? createIntensitySamples(config.intensity, barCount) : normalizeWaveformSamples(inputSamples, barCount);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function clamp(value, min, max) {
|
|
162
|
+
return Math.min(max, Math.max(min, value));
|
|
163
|
+
}
|
|
164
|
+
function prepareWaveformCanvas(canvas, size) {
|
|
165
|
+
const width = Math.max(1, Math.floor(size.width));
|
|
166
|
+
const height = Math.max(1, Math.floor(size.height));
|
|
167
|
+
const pixelRatio = Math.max(1, size.pixelRatio ?? 1);
|
|
168
|
+
const pixelWidth = Math.floor(width * pixelRatio);
|
|
169
|
+
const pixelHeight = Math.floor(height * pixelRatio);
|
|
170
|
+
if (canvas.width !== pixelWidth) {
|
|
171
|
+
canvas.width = pixelWidth;
|
|
172
|
+
}
|
|
173
|
+
if (canvas.height !== pixelHeight) {
|
|
174
|
+
canvas.height = pixelHeight;
|
|
175
|
+
}
|
|
176
|
+
const context = canvas.getContext("2d");
|
|
177
|
+
if (!context) return null;
|
|
178
|
+
context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
|
|
179
|
+
return context;
|
|
180
|
+
}
|
|
181
|
+
function drawWaveform(context, samples, size, options = {}) {
|
|
182
|
+
const width = Math.max(1, Math.floor(size.width));
|
|
183
|
+
const height = Math.max(1, Math.floor(size.height));
|
|
184
|
+
const variant = options.variant ?? "bars";
|
|
185
|
+
const color = options.color ?? DEFAULT_WAVEFORM_COLOR;
|
|
186
|
+
const intensity = normalizeIntensity(options.intensity ?? DEFAULT_WAVEFORM_INTENSITY);
|
|
187
|
+
const amplitude = normalizeAmplitude(options.amplitude ?? DEFAULT_WAVEFORM_AMPLITUDE);
|
|
188
|
+
const barCount = normalizeBarCount(options.barCount);
|
|
189
|
+
context.clearRect(0, 0, width, height);
|
|
190
|
+
applyCanvasColor(context, color);
|
|
191
|
+
if (variant === "line") {
|
|
192
|
+
drawLine(context, samples, width, height, intensity, amplitude);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (variant === "rings") {
|
|
196
|
+
drawRings(context, samples, width, height, intensity, amplitude);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
drawBars(context, samples, width, height, intensity, amplitude, barCount);
|
|
200
|
+
}
|
|
201
|
+
function drawBars(context, samples, width, height, intensity, amplitude, barCount) {
|
|
202
|
+
const bars = scaleWaveformSamples(resampleWaveformSamples(samples, barCount), intensity);
|
|
203
|
+
const slotWidth = width / bars.length;
|
|
204
|
+
const barWidth = Math.max(1, slotWidth * 0.64);
|
|
205
|
+
const center = height / 2;
|
|
206
|
+
for (let i = 0; i < bars.length; i += 1) {
|
|
207
|
+
const value = Math.abs(bars[i]);
|
|
208
|
+
const barHeight = Math.max(value * height * amplitude, value > 0 ? 1 : 0);
|
|
209
|
+
const x = i * slotWidth + (slotWidth - barWidth) / 2;
|
|
210
|
+
const y = center - barHeight / 2;
|
|
211
|
+
context.fillRect(x, y, barWidth, barHeight);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function drawLine(context, samples, width, height, intensity, amplitudeScale) {
|
|
215
|
+
const lineSamples = scaleWaveformSamples(samples, intensity);
|
|
216
|
+
const center = height / 2;
|
|
217
|
+
const amplitude = height * 0.45 * amplitudeScale;
|
|
218
|
+
context.beginPath();
|
|
219
|
+
for (let i = 0; i < lineSamples.length; i += 1) {
|
|
220
|
+
const x = lineSamples.length <= 1 ? width / 2 : i / (lineSamples.length - 1) * width;
|
|
221
|
+
const y = center - Number(lineSamples[i]) * amplitude;
|
|
222
|
+
if (i === 0) {
|
|
223
|
+
context.moveTo(x, y);
|
|
224
|
+
} else {
|
|
225
|
+
context.lineTo(x, y);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
context.lineWidth = Math.max(1.5, Math.min(width, height) * 0.025);
|
|
229
|
+
context.lineCap = "round";
|
|
230
|
+
context.lineJoin = "round";
|
|
231
|
+
context.stroke();
|
|
232
|
+
}
|
|
233
|
+
function drawRings(context, samples, width, height, intensity, amplitude) {
|
|
234
|
+
const peak = getWaveformPeak(scaleWaveformSamples(samples, intensity)) * amplitude;
|
|
235
|
+
const minDimension = Math.min(width, height);
|
|
236
|
+
const centerX = width / 2;
|
|
237
|
+
const centerY = height / 2;
|
|
238
|
+
const ringCount = 3;
|
|
239
|
+
const baseRadius = minDimension * 0.16;
|
|
240
|
+
const radiusStep = minDimension * 0.13;
|
|
241
|
+
context.save();
|
|
242
|
+
context.lineWidth = Math.max(1.5, minDimension * 0.018);
|
|
243
|
+
for (let i = 0; i < ringCount; i += 1) {
|
|
244
|
+
const progress = (i + 1) / ringCount;
|
|
245
|
+
const pulse = peak * minDimension * 0.1 * progress;
|
|
246
|
+
const radius = baseRadius + radiusStep * i + pulse;
|
|
247
|
+
context.globalAlpha = 0.28 + progress * 0.34;
|
|
248
|
+
context.beginPath();
|
|
249
|
+
context.arc(centerX, centerY, radius, 0, Math.PI * 2);
|
|
250
|
+
context.stroke();
|
|
251
|
+
}
|
|
252
|
+
context.restore();
|
|
253
|
+
}
|
|
254
|
+
function applyCanvasColor(context, color) {
|
|
255
|
+
try {
|
|
256
|
+
context.fillStyle = color;
|
|
257
|
+
context.strokeStyle = color;
|
|
258
|
+
} catch {
|
|
259
|
+
context.fillStyle = "#000";
|
|
260
|
+
context.strokeStyle = "#000";
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
var waveformVariants = cva({
|
|
264
|
+
base: "relative block overflow-hidden",
|
|
265
|
+
variants: {
|
|
266
|
+
variant: {
|
|
267
|
+
bars: "",
|
|
268
|
+
line: "",
|
|
269
|
+
rings: ""
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
defaultVariants: {
|
|
273
|
+
variant: "bars"
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
var waveformCanvasVariants = cva({
|
|
277
|
+
base: "block h-full w-full"
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// ../react-waveform/dist/index.js
|
|
281
|
+
import { jsx } from "react/jsx-runtime";
|
|
282
|
+
var Waveform = React.forwardRef(
|
|
283
|
+
function Waveform2({
|
|
284
|
+
source,
|
|
285
|
+
samples,
|
|
286
|
+
intensity,
|
|
287
|
+
amplitude,
|
|
288
|
+
variant,
|
|
289
|
+
height,
|
|
290
|
+
width,
|
|
291
|
+
barCount,
|
|
292
|
+
smoothing,
|
|
293
|
+
color,
|
|
294
|
+
paused,
|
|
295
|
+
className,
|
|
296
|
+
style,
|
|
297
|
+
...props
|
|
298
|
+
}, ref) {
|
|
299
|
+
const rootRef = React.useRef(null);
|
|
300
|
+
const canvasRef = React.useRef(null);
|
|
301
|
+
const previousSamplesRef = React.useRef(null);
|
|
302
|
+
const mediaAnalyserRef = React.useRef(null);
|
|
303
|
+
const floatBufferRef = React.useRef(null);
|
|
304
|
+
const byteBufferRef = React.useRef(null);
|
|
305
|
+
const prefersReducedMotion = usePrefersReducedMotion();
|
|
306
|
+
const api = createWaveform({
|
|
307
|
+
source,
|
|
308
|
+
samples,
|
|
309
|
+
intensity,
|
|
310
|
+
amplitude,
|
|
311
|
+
variant,
|
|
312
|
+
height,
|
|
313
|
+
width,
|
|
314
|
+
barCount,
|
|
315
|
+
smoothing,
|
|
316
|
+
color,
|
|
317
|
+
paused
|
|
318
|
+
});
|
|
319
|
+
const rootStyle = React.useMemo(
|
|
320
|
+
() => ({
|
|
321
|
+
...style,
|
|
322
|
+
width: toCssDimension(width) ?? style?.width ?? "100%",
|
|
323
|
+
height: toCssDimension(height) ?? style?.height ?? `${api.config.height}px`,
|
|
324
|
+
"--waveform-color": api.config.color
|
|
325
|
+
}),
|
|
326
|
+
[api.config.color, api.config.height, height, style, width]
|
|
327
|
+
);
|
|
328
|
+
const setRootRef = React.useCallback(
|
|
329
|
+
(node) => {
|
|
330
|
+
rootRef.current = node;
|
|
331
|
+
if (typeof ref === "function") {
|
|
332
|
+
ref(node);
|
|
333
|
+
} else if (ref) {
|
|
334
|
+
ref.current = node;
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
[ref]
|
|
338
|
+
);
|
|
339
|
+
React.useEffect(() => {
|
|
340
|
+
if (!isMediaStreamSource(source)) {
|
|
341
|
+
mediaAnalyserRef.current = null;
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
if (typeof window === "undefined") return;
|
|
345
|
+
const AudioContextClass = window.AudioContext ?? window.webkitAudioContext;
|
|
346
|
+
if (!AudioContextClass) return;
|
|
347
|
+
const audioContext = new AudioContextClass();
|
|
348
|
+
const analyser = audioContext.createAnalyser();
|
|
349
|
+
const streamSource = audioContext.createMediaStreamSource(source);
|
|
350
|
+
analyser.smoothingTimeConstant = normalizeSmoothing(api.config.smoothing);
|
|
351
|
+
streamSource.connect(analyser);
|
|
352
|
+
mediaAnalyserRef.current = analyser;
|
|
353
|
+
return () => {
|
|
354
|
+
mediaAnalyserRef.current = null;
|
|
355
|
+
streamSource.disconnect();
|
|
356
|
+
analyser.disconnect();
|
|
357
|
+
if (audioContext.state !== "closed") {
|
|
358
|
+
void audioContext.close();
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
}, [api.config.smoothing, source]);
|
|
362
|
+
React.useEffect(() => {
|
|
363
|
+
if (isAnalyserSource(source)) {
|
|
364
|
+
source.smoothingTimeConstant = normalizeSmoothing(api.config.smoothing);
|
|
365
|
+
}
|
|
366
|
+
}, [api.config.smoothing, source]);
|
|
367
|
+
React.useEffect(() => {
|
|
368
|
+
const root = rootRef.current;
|
|
369
|
+
const canvas = canvasRef.current;
|
|
370
|
+
if (!root || !canvas) return;
|
|
371
|
+
let size = measureWaveform(root, api.config.width, api.config.height);
|
|
372
|
+
let frame = null;
|
|
373
|
+
let disposed = false;
|
|
374
|
+
const cancelFrame = () => {
|
|
375
|
+
if (frame == null) return;
|
|
376
|
+
if (typeof window.requestAnimationFrame === "function") {
|
|
377
|
+
window.cancelAnimationFrame(frame);
|
|
378
|
+
} else {
|
|
379
|
+
clearTimeout(frame);
|
|
380
|
+
}
|
|
381
|
+
frame = null;
|
|
382
|
+
};
|
|
383
|
+
const readSamples = (phase = 0) => {
|
|
384
|
+
if (samples != null) {
|
|
385
|
+
return normalizeWaveformSamples(samples, api.config.barCount);
|
|
386
|
+
}
|
|
387
|
+
if (isWaveformSampleInput(source)) {
|
|
388
|
+
return normalizeWaveformSamples(source, api.config.barCount);
|
|
389
|
+
}
|
|
390
|
+
const analyser = isAnalyserSource(source) ? source : mediaAnalyserRef.current;
|
|
391
|
+
if (analyser) {
|
|
392
|
+
return readAnalyserSamples(analyser, api.config.barCount, floatBufferRef, byteBufferRef);
|
|
393
|
+
}
|
|
394
|
+
return createIntensitySamples(api.config.intensity, api.config.barCount, phase);
|
|
395
|
+
};
|
|
396
|
+
const draw = (time = typeof performance === "undefined" ? 0 : performance.now()) => {
|
|
397
|
+
const context = prepareWaveformCanvas(canvas, {
|
|
398
|
+
...size,
|
|
399
|
+
pixelRatio: window.devicePixelRatio || 1
|
|
400
|
+
});
|
|
401
|
+
if (!context) return;
|
|
402
|
+
const nextSamples = readSamples(time / 1e3);
|
|
403
|
+
const renderedSamples = smoothWaveformSamples(
|
|
404
|
+
previousSamplesRef.current ?? void 0,
|
|
405
|
+
nextSamples,
|
|
406
|
+
api.config.smoothing
|
|
407
|
+
);
|
|
408
|
+
previousSamplesRef.current = renderedSamples;
|
|
409
|
+
drawWaveform(context, renderedSamples, size, {
|
|
410
|
+
variant: api.config.variant,
|
|
411
|
+
color: resolveCanvasColor(root, api.config.color),
|
|
412
|
+
intensity: api.config.intensity,
|
|
413
|
+
amplitude: api.config.amplitude,
|
|
414
|
+
barCount: api.config.barCount
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
const schedule = () => {
|
|
418
|
+
if (disposed || api.config.paused || prefersReducedMotion) return;
|
|
419
|
+
if (typeof window.requestAnimationFrame === "function") {
|
|
420
|
+
frame = window.requestAnimationFrame(tick);
|
|
421
|
+
} else {
|
|
422
|
+
frame = window.setTimeout(() => tick(performance.now()), 16);
|
|
423
|
+
}
|
|
424
|
+
};
|
|
425
|
+
const tick = (time) => {
|
|
426
|
+
draw(time);
|
|
427
|
+
schedule();
|
|
428
|
+
};
|
|
429
|
+
draw();
|
|
430
|
+
schedule();
|
|
431
|
+
const observer = typeof ResizeObserver === "function" ? new ResizeObserver(() => {
|
|
432
|
+
size = measureWaveform(root, api.config.width, api.config.height);
|
|
433
|
+
draw();
|
|
434
|
+
}) : null;
|
|
435
|
+
observer?.observe(root);
|
|
436
|
+
return () => {
|
|
437
|
+
disposed = true;
|
|
438
|
+
cancelFrame();
|
|
439
|
+
observer?.disconnect();
|
|
440
|
+
};
|
|
441
|
+
}, [
|
|
442
|
+
api.config.barCount,
|
|
443
|
+
api.config.color,
|
|
444
|
+
api.config.height,
|
|
445
|
+
api.config.intensity,
|
|
446
|
+
api.config.amplitude,
|
|
447
|
+
api.config.paused,
|
|
448
|
+
api.config.smoothing,
|
|
449
|
+
api.config.variant,
|
|
450
|
+
api.config.width,
|
|
451
|
+
prefersReducedMotion,
|
|
452
|
+
samples,
|
|
453
|
+
source
|
|
454
|
+
]);
|
|
455
|
+
return /* @__PURE__ */ jsx(
|
|
456
|
+
"div",
|
|
457
|
+
{
|
|
458
|
+
ref: setRootRef,
|
|
459
|
+
className: cn(waveformVariants({ variant: api.config.variant }), className),
|
|
460
|
+
style: rootStyle,
|
|
461
|
+
...api.ariaProps,
|
|
462
|
+
...api.dataAttributes,
|
|
463
|
+
...props,
|
|
464
|
+
children: /* @__PURE__ */ jsx(
|
|
465
|
+
"canvas",
|
|
466
|
+
{
|
|
467
|
+
ref: canvasRef,
|
|
468
|
+
className: waveformCanvasVariants(),
|
|
469
|
+
"aria-hidden": "true",
|
|
470
|
+
"data-waveform-canvas": ""
|
|
471
|
+
}
|
|
472
|
+
)
|
|
473
|
+
}
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
);
|
|
477
|
+
function usePrefersReducedMotion() {
|
|
478
|
+
const [prefersReducedMotion, setPrefersReducedMotion] = React.useState(false);
|
|
479
|
+
React.useEffect(() => {
|
|
480
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const media = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
484
|
+
const update = () => setPrefersReducedMotion(media.matches);
|
|
485
|
+
update();
|
|
486
|
+
media.addEventListener?.("change", update);
|
|
487
|
+
return () => {
|
|
488
|
+
media.removeEventListener?.("change", update);
|
|
489
|
+
};
|
|
490
|
+
}, []);
|
|
491
|
+
return prefersReducedMotion;
|
|
492
|
+
}
|
|
493
|
+
function readAnalyserSamples(analyser, barCount, floatBufferRef, byteBufferRef) {
|
|
494
|
+
if (typeof analyser.getFloatTimeDomainData === "function") {
|
|
495
|
+
const length2 = Math.max(1, analyser.fftSize || analyser.frequencyBinCount || barCount);
|
|
496
|
+
if (floatBufferRef.current?.length !== length2) {
|
|
497
|
+
floatBufferRef.current = new Float32Array(length2);
|
|
498
|
+
}
|
|
499
|
+
analyser.getFloatTimeDomainData(floatBufferRef.current);
|
|
500
|
+
return normalizeWaveformSamples(floatBufferRef.current, barCount);
|
|
501
|
+
}
|
|
502
|
+
const length = Math.max(1, analyser.frequencyBinCount || barCount);
|
|
503
|
+
if (byteBufferRef.current?.length !== length) {
|
|
504
|
+
byteBufferRef.current = new Uint8Array(length);
|
|
505
|
+
}
|
|
506
|
+
analyser.getByteFrequencyData(byteBufferRef.current);
|
|
507
|
+
return normalizeWaveformSamples(Array.from(byteBufferRef.current), barCount);
|
|
508
|
+
}
|
|
509
|
+
function measureWaveform(element, width, height) {
|
|
510
|
+
const rect = element.getBoundingClientRect();
|
|
511
|
+
const fallbackWidth = typeof width === "number" ? width : 300;
|
|
512
|
+
const fallbackHeight = typeof height === "number" ? height : 80;
|
|
513
|
+
return {
|
|
514
|
+
width: Math.max(1, Math.round(rect.width || element.clientWidth || fallbackWidth)),
|
|
515
|
+
height: Math.max(1, Math.round(rect.height || element.clientHeight || fallbackHeight))
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
function resolveCanvasColor(element, color) {
|
|
519
|
+
const variableMatch = color.match(/^var\((--[^),\s]+)(?:,[^)]+)?\)$/);
|
|
520
|
+
if (!variableMatch || typeof window.getComputedStyle !== "function") {
|
|
521
|
+
return color;
|
|
522
|
+
}
|
|
523
|
+
const value = window.getComputedStyle(element).getPropertyValue(variableMatch[1]).trim();
|
|
524
|
+
return value || color;
|
|
525
|
+
}
|
|
526
|
+
function isAnalyserSource(value) {
|
|
527
|
+
return value != null && typeof value.frequencyBinCount === "number" && (typeof value.getFloatTimeDomainData === "function" || typeof value.getByteFrequencyData === "function");
|
|
528
|
+
}
|
|
529
|
+
function isMediaStreamSource(value) {
|
|
530
|
+
return value != null && typeof value.getTracks === "function";
|
|
531
|
+
}
|
|
532
|
+
export {
|
|
533
|
+
DEFAULT_WAVEFORM_BAR_COUNT,
|
|
534
|
+
DEFAULT_WAVEFORM_COLOR,
|
|
535
|
+
DEFAULT_WAVEFORM_HEIGHT,
|
|
536
|
+
DEFAULT_WAVEFORM_INTENSITY,
|
|
537
|
+
DEFAULT_WAVEFORM_SMOOTHING,
|
|
538
|
+
Waveform,
|
|
539
|
+
createIntensitySamples,
|
|
540
|
+
createSilentSamples,
|
|
541
|
+
createWaveform,
|
|
542
|
+
drawWaveform,
|
|
543
|
+
getWaveformPeak,
|
|
544
|
+
isWaveformSampleInput,
|
|
545
|
+
normalizeBarCount,
|
|
546
|
+
normalizeIntensity,
|
|
547
|
+
normalizeSmoothing,
|
|
548
|
+
normalizeWaveformConfig,
|
|
549
|
+
normalizeWaveformSamples,
|
|
550
|
+
prepareWaveformCanvas,
|
|
551
|
+
resampleWaveformSamples,
|
|
552
|
+
scaleWaveformSamples,
|
|
553
|
+
smoothWaveformSamples,
|
|
554
|
+
toCssDimension,
|
|
555
|
+
waveformCanvasVariants,
|
|
556
|
+
waveformVariants
|
|
557
|
+
};
|
|
558
|
+
//# sourceMappingURL=react-waveform.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../waveform/src/waveform.ts", "../../waveform/src/waveform-renderer.ts", "../../waveform/src/waveform.styles.ts", "../../react-waveform/src/waveform.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport type WaveformVariant = 'bars' | 'line' | 'rings'\nexport type WaveformSampleInput = Float32Array | number[]\nexport type WaveformSource = AnalyserNode | MediaStream | WaveformSampleInput\n\nexport interface WaveformProps {\n source?: WaveformSource\n samples?: WaveformSampleInput\n intensity?: number\n amplitude?: number\n variant?: WaveformVariant\n height?: number | string\n width?: number | string\n barCount?: number\n smoothing?: number\n color?: string\n paused?: boolean\n}\n\nexport interface NormalizedWaveformConfig {\n variant: WaveformVariant\n intensity: number\n amplitude: number\n height: number | string\n width: number | string\n barCount: number\n smoothing: number\n color: string\n paused: boolean\n}\n\nexport interface WaveformAPI {\n config: NormalizedWaveformConfig\n samples: Float32Array\n ariaProps: Partial<AccessibilityProps>\n dataAttributes: Record<'data-variant' | 'data-paused', string>\n getSamples: (barCount?: number) => Float32Array\n}\n\nexport const DEFAULT_WAVEFORM_BAR_COUNT = 48\nexport const DEFAULT_WAVEFORM_COLOR = 'var(--accent-2)'\nexport const DEFAULT_WAVEFORM_HEIGHT = 80\nexport const DEFAULT_WAVEFORM_INTENSITY = 1\nexport const DEFAULT_WAVEFORM_AMPLITUDE = 1\nexport const DEFAULT_WAVEFORM_SMOOTHING = 0.8\n\nconst MAX_BAR_COUNT = 1024\nconst MAX_INTENSITY = 1\n\nexport function normalizeBarCount(value: number | undefined): number {\n if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_BAR_COUNT\n\n return Math.min(MAX_BAR_COUNT, Math.max(1, Math.round(value)))\n}\n\nexport function normalizeSmoothing(value: number | undefined): number {\n if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_SMOOTHING\n\n return Math.min(0.99, Math.max(0, value))\n}\n\nexport function normalizeIntensity(value: number | undefined): number {\n if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_INTENSITY\n\n return Math.min(MAX_INTENSITY, Math.max(0, value))\n}\n\nexport function normalizeAmplitude(value: number | undefined): number {\n if (value == null || !Number.isFinite(value)) return DEFAULT_WAVEFORM_AMPLITUDE\n\n return Math.min(1, Math.max(0, value))\n}\n\nexport function normalizeWaveformConfig(props: WaveformProps = {}): NormalizedWaveformConfig {\n return {\n variant: props.variant ?? 'bars',\n intensity: normalizeIntensity(props.intensity),\n amplitude: normalizeAmplitude(props.amplitude),\n height: props.height ?? DEFAULT_WAVEFORM_HEIGHT,\n width: props.width ?? '100%',\n barCount: normalizeBarCount(props.barCount),\n smoothing: normalizeSmoothing(props.smoothing),\n color: props.color ?? DEFAULT_WAVEFORM_COLOR,\n paused: props.paused ?? false,\n }\n}\n\nexport function isWaveformSampleInput(value: unknown): value is WaveformSampleInput {\n return value instanceof Float32Array || Array.isArray(value)\n}\n\nexport function createSilentSamples(count = DEFAULT_WAVEFORM_BAR_COUNT): Float32Array {\n return new Float32Array(normalizeBarCount(count))\n}\n\nexport function createIntensitySamples(\n intensity = DEFAULT_WAVEFORM_INTENSITY,\n count = DEFAULT_WAVEFORM_BAR_COUNT,\n phase = 0,\n): Float32Array {\n const normalizedIntensity = normalizeIntensity(intensity)\n const normalizedCount = normalizeBarCount(count)\n const samples = new Float32Array(normalizedCount)\n\n if (normalizedIntensity === 0) return samples\n\n const pulse = 0.72 + Math.sin(phase * 1.8) * 0.18\n\n for (let i = 0; i < normalizedCount; i += 1) {\n const progress = normalizedCount <= 1 ? 0.5 : i / (normalizedCount - 1)\n const envelope = 0.35 + Math.sin(progress * Math.PI) * 0.65\n const carrier = Math.sin(progress * Math.PI * 6 + phase * 2.8)\n samples[i] = carrier * envelope * normalizedIntensity * pulse\n }\n\n return samples\n}\n\nexport function normalizeWaveformSamples(\n input: WaveformSampleInput | undefined,\n targetCount?: number,\n): Float32Array {\n const sourceLength = input?.length ?? 0\n\n if (sourceLength === 0) {\n return targetCount == null ? new Float32Array() : createSilentSamples(targetCount)\n }\n\n const normalized = new Float32Array(sourceLength)\n let maxAbs = 0\n\n for (let i = 0; i < sourceLength; i += 1) {\n const value = Number(input?.[i])\n const sample = Number.isFinite(value) ? value : 0\n normalized[i] = sample\n maxAbs = Math.max(maxAbs, Math.abs(sample))\n }\n\n const divisor = maxAbs > 1 ? maxAbs : 1\n\n for (let i = 0; i < normalized.length; i += 1) {\n normalized[i] = clamp(normalized[i] / divisor, -1, 1)\n }\n\n if (targetCount == null || targetCount === normalized.length) {\n return normalized\n }\n\n return resampleWaveformSamples(normalized, targetCount)\n}\n\nexport function resampleWaveformSamples(\n samples: WaveformSampleInput,\n targetCount: number,\n): Float32Array {\n const count = normalizeBarCount(targetCount)\n const sourceLength = samples.length\n\n if (sourceLength === 0) return createSilentSamples(count)\n if (sourceLength === count) return Float32Array.from(samples)\n\n const output = new Float32Array(count)\n\n for (let i = 0; i < count; i += 1) {\n const start = (i * sourceLength) / count\n const end = ((i + 1) * sourceLength) / count\n const firstIndex = Math.floor(start)\n const lastIndex = Math.max(firstIndex + 1, Math.ceil(end))\n let total = 0\n let values = 0\n\n for (let j = firstIndex; j < lastIndex && j < sourceLength; j += 1) {\n total += Number(samples[j])\n values += 1\n }\n\n output[i] = values > 0 ? total / values : Number(samples[Math.min(firstIndex, sourceLength - 1)])\n }\n\n return output\n}\n\nexport function smoothWaveformSamples(\n previous: WaveformSampleInput | undefined,\n next: WaveformSampleInput,\n smoothing = DEFAULT_WAVEFORM_SMOOTHING,\n): Float32Array {\n if (previous == null || previous.length === 0) {\n return Float32Array.from(next)\n }\n\n const amount = normalizeSmoothing(smoothing)\n const output = new Float32Array(next.length)\n\n for (let i = 0; i < next.length; i += 1) {\n const previousValue = Number(previous[i] ?? next[i])\n output[i] = previousValue * amount + Number(next[i]) * (1 - amount)\n }\n\n return output\n}\n\nexport function scaleWaveformSamples(\n samples: WaveformSampleInput,\n intensity = DEFAULT_WAVEFORM_INTENSITY,\n): Float32Array {\n const amount = normalizeIntensity(intensity)\n const output = new Float32Array(samples.length)\n\n for (let i = 0; i < samples.length; i += 1) {\n output[i] = clamp(Number(samples[i]) * amount, -1, 1)\n }\n\n return output\n}\n\nexport function getWaveformPeak(samples: WaveformSampleInput): number {\n let peak = 0\n\n for (let i = 0; i < samples.length; i += 1) {\n peak = Math.max(peak, Math.abs(Number(samples[i]) || 0))\n }\n\n return Math.min(1, peak)\n}\n\nexport function toCssDimension(value: number | string | undefined): string | undefined {\n if (value == null) return undefined\n\n return typeof value === 'number' ? `${value}px` : value\n}\n\nexport function createWaveform(props: WaveformProps = {}): WaveformAPI {\n const config = normalizeWaveformConfig(props)\n const inputSamples = props.samples ?? (isWaveformSampleInput(props.source) ? props.source : undefined)\n const samples = inputSamples == null\n ? createIntensitySamples(config.intensity, config.barCount)\n : normalizeWaveformSamples(inputSamples, config.barCount)\n\n return {\n config,\n samples,\n ariaProps: {\n role: 'img',\n 'aria-label': 'Audio waveform',\n },\n dataAttributes: {\n 'data-variant': config.variant,\n 'data-paused': String(config.paused),\n },\n getSamples(barCount = config.barCount) {\n return inputSamples == null\n ? createIntensitySamples(config.intensity, barCount)\n : normalizeWaveformSamples(inputSamples, barCount)\n },\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n", "import {\n DEFAULT_WAVEFORM_COLOR,\n DEFAULT_WAVEFORM_AMPLITUDE,\n DEFAULT_WAVEFORM_INTENSITY,\n getWaveformPeak,\n normalizeAmplitude,\n normalizeBarCount,\n normalizeIntensity,\n resampleWaveformSamples,\n scaleWaveformSamples,\n type WaveformSampleInput,\n type WaveformVariant,\n} from './waveform.js'\n\nexport interface WaveformCanvasSize {\n width: number\n height: number\n pixelRatio?: number\n}\n\nexport interface WaveformRenderOptions {\n variant?: WaveformVariant\n color?: string\n intensity?: number\n amplitude?: number\n barCount?: number\n}\n\nexport function prepareWaveformCanvas(\n canvas: HTMLCanvasElement,\n size: WaveformCanvasSize,\n): CanvasRenderingContext2D | null {\n const width = Math.max(1, Math.floor(size.width))\n const height = Math.max(1, Math.floor(size.height))\n const pixelRatio = Math.max(1, size.pixelRatio ?? 1)\n const pixelWidth = Math.floor(width * pixelRatio)\n const pixelHeight = Math.floor(height * pixelRatio)\n\n if (canvas.width !== pixelWidth) {\n canvas.width = pixelWidth\n }\n\n if (canvas.height !== pixelHeight) {\n canvas.height = pixelHeight\n }\n\n const context = canvas.getContext('2d')\n if (!context) return null\n\n context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0)\n\n return context\n}\n\nexport function drawWaveform(\n context: CanvasRenderingContext2D,\n samples: WaveformSampleInput,\n size: WaveformCanvasSize,\n options: WaveformRenderOptions = {},\n): void {\n const width = Math.max(1, Math.floor(size.width))\n const height = Math.max(1, Math.floor(size.height))\n const variant = options.variant ?? 'bars'\n const color = options.color ?? DEFAULT_WAVEFORM_COLOR\n const intensity = normalizeIntensity(options.intensity ?? DEFAULT_WAVEFORM_INTENSITY)\n const amplitude = normalizeAmplitude(options.amplitude ?? DEFAULT_WAVEFORM_AMPLITUDE)\n const barCount = normalizeBarCount(options.barCount)\n\n context.clearRect(0, 0, width, height)\n applyCanvasColor(context, color)\n\n if (variant === 'line') {\n drawLine(context, samples, width, height, intensity, amplitude)\n return\n }\n\n if (variant === 'rings') {\n drawRings(context, samples, width, height, intensity, amplitude)\n return\n }\n\n drawBars(context, samples, width, height, intensity, amplitude, barCount)\n}\n\nfunction drawBars(\n context: CanvasRenderingContext2D,\n samples: WaveformSampleInput,\n width: number,\n height: number,\n intensity: number,\n amplitude: number,\n barCount: number,\n) {\n const bars = scaleWaveformSamples(resampleWaveformSamples(samples, barCount), intensity)\n const slotWidth = width / bars.length\n const barWidth = Math.max(1, slotWidth * 0.64)\n const center = height / 2\n\n for (let i = 0; i < bars.length; i += 1) {\n const value = Math.abs(bars[i])\n const barHeight = Math.max(value * height * amplitude, value > 0 ? 1 : 0)\n const x = i * slotWidth + (slotWidth - barWidth) / 2\n const y = center - barHeight / 2\n\n context.fillRect(x, y, barWidth, barHeight)\n }\n}\n\nfunction drawLine(\n context: CanvasRenderingContext2D,\n samples: WaveformSampleInput,\n width: number,\n height: number,\n intensity: number,\n amplitudeScale: number,\n) {\n const lineSamples = scaleWaveformSamples(samples, intensity)\n const center = height / 2\n const amplitude = height * 0.45 * amplitudeScale\n\n context.beginPath()\n\n for (let i = 0; i < lineSamples.length; i += 1) {\n const x = lineSamples.length <= 1 ? width / 2 : (i / (lineSamples.length - 1)) * width\n const y = center - Number(lineSamples[i]) * amplitude\n\n if (i === 0) {\n context.moveTo(x, y)\n } else {\n context.lineTo(x, y)\n }\n }\n\n context.lineWidth = Math.max(1.5, Math.min(width, height) * 0.025)\n context.lineCap = 'round'\n context.lineJoin = 'round'\n context.stroke()\n}\n\nfunction drawRings(\n context: CanvasRenderingContext2D,\n samples: WaveformSampleInput,\n width: number,\n height: number,\n intensity: number,\n amplitude: number,\n) {\n const peak = getWaveformPeak(scaleWaveformSamples(samples, intensity)) * amplitude\n const minDimension = Math.min(width, height)\n const centerX = width / 2\n const centerY = height / 2\n const ringCount = 3\n const baseRadius = minDimension * 0.16\n const radiusStep = minDimension * 0.13\n\n context.save()\n context.lineWidth = Math.max(1.5, minDimension * 0.018)\n\n for (let i = 0; i < ringCount; i += 1) {\n const progress = (i + 1) / ringCount\n const pulse = peak * minDimension * 0.1 * progress\n const radius = baseRadius + radiusStep * i + pulse\n\n context.globalAlpha = 0.28 + progress * 0.34\n context.beginPath()\n context.arc(centerX, centerY, radius, 0, Math.PI * 2)\n context.stroke()\n }\n\n context.restore()\n}\n\nfunction applyCanvasColor(context: CanvasRenderingContext2D, color: string) {\n try {\n context.fillStyle = color\n context.strokeStyle = color\n } catch {\n context.fillStyle = '#000'\n context.strokeStyle = '#000'\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const waveformVariants = cva({\n base: 'relative block overflow-hidden',\n variants: {\n variant: {\n bars: '',\n line: '',\n rings: '',\n },\n },\n defaultVariants: {\n variant: 'bars',\n },\n})\n\nexport const waveformCanvasVariants = cva({\n base: 'block h-full w-full',\n})\n", "import * as React from 'react'\nimport {\n createIntensitySamples,\n createWaveform,\n drawWaveform,\n isWaveformSampleInput,\n normalizeSmoothing,\n normalizeWaveformSamples,\n prepareWaveformCanvas,\n smoothWaveformSamples,\n toCssDimension,\n waveformCanvasVariants,\n waveformVariants,\n type WaveformProps as CoreWaveformProps,\n type WaveformSource,\n} from '@refraction-ui/waveform'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface WaveformProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'color' | 'height' | 'width'>,\n CoreWaveformProps {}\n\ntype AnimationFrame = ReturnType<typeof requestAnimationFrame>\ntype TimeoutFrame = ReturnType<typeof setTimeout>\ntype AudioContextConstructor = typeof AudioContext\n\ninterface WaveformSize {\n width: number\n height: number\n}\n\nexport const Waveform = React.forwardRef<HTMLDivElement, WaveformProps>(\n function Waveform(\n {\n source,\n samples,\n intensity,\n amplitude,\n variant,\n height,\n width,\n barCount,\n smoothing,\n color,\n paused,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n const canvasRef = React.useRef<HTMLCanvasElement | null>(null)\n const previousSamplesRef = React.useRef<Float32Array | null>(null)\n const mediaAnalyserRef = React.useRef<AnalyserNode | null>(null)\n const floatBufferRef = React.useRef<Float32Array | null>(null)\n const byteBufferRef = React.useRef<Uint8Array | null>(null)\n const prefersReducedMotion = usePrefersReducedMotion()\n\n const api = createWaveform({\n source,\n samples,\n intensity,\n amplitude,\n variant,\n height,\n width,\n barCount,\n smoothing,\n color,\n paused,\n })\n\n const rootStyle = React.useMemo(\n () => ({\n ...style,\n width: toCssDimension(width) ?? style?.width ?? '100%',\n height: toCssDimension(height) ?? style?.height ?? `${api.config.height}px`,\n '--waveform-color': api.config.color,\n }) as React.CSSProperties & { '--waveform-color': string },\n [api.config.color, api.config.height, height, style, width],\n )\n\n const setRootRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node\n\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [ref],\n )\n\n React.useEffect(() => {\n if (!isMediaStreamSource(source)) {\n mediaAnalyserRef.current = null\n return\n }\n\n if (typeof window === 'undefined') return\n\n const AudioContextClass =\n window.AudioContext ??\n (window as Window & { webkitAudioContext?: AudioContextConstructor }).webkitAudioContext\n\n if (!AudioContextClass) return\n\n const audioContext = new AudioContextClass()\n const analyser = audioContext.createAnalyser()\n const streamSource = audioContext.createMediaStreamSource(source)\n\n analyser.smoothingTimeConstant = normalizeSmoothing(api.config.smoothing)\n streamSource.connect(analyser)\n mediaAnalyserRef.current = analyser\n\n return () => {\n mediaAnalyserRef.current = null\n streamSource.disconnect()\n analyser.disconnect()\n\n if (audioContext.state !== 'closed') {\n void audioContext.close()\n }\n }\n }, [api.config.smoothing, source])\n\n React.useEffect(() => {\n if (isAnalyserSource(source)) {\n source.smoothingTimeConstant = normalizeSmoothing(api.config.smoothing)\n }\n }, [api.config.smoothing, source])\n\n React.useEffect(() => {\n const root = rootRef.current\n const canvas = canvasRef.current\n\n if (!root || !canvas) return\n\n let size = measureWaveform(root, api.config.width, api.config.height)\n let frame: AnimationFrame | TimeoutFrame | null = null\n let disposed = false\n\n const cancelFrame = () => {\n if (frame == null) return\n\n if (typeof window.requestAnimationFrame === 'function') {\n window.cancelAnimationFrame(frame as AnimationFrame)\n } else {\n clearTimeout(frame as TimeoutFrame)\n }\n\n frame = null\n }\n\n const readSamples = (phase = 0): Float32Array => {\n if (samples != null) {\n return normalizeWaveformSamples(samples, api.config.barCount)\n }\n\n if (isWaveformSampleInput(source)) {\n return normalizeWaveformSamples(source, api.config.barCount)\n }\n\n const analyser = isAnalyserSource(source) ? source : mediaAnalyserRef.current\n if (analyser) {\n return readAnalyserSamples(analyser, api.config.barCount, floatBufferRef, byteBufferRef)\n }\n\n return createIntensitySamples(api.config.intensity, api.config.barCount, phase)\n }\n\n const draw = (time = typeof performance === 'undefined' ? 0 : performance.now()) => {\n const context = prepareWaveformCanvas(canvas, {\n ...size,\n pixelRatio: window.devicePixelRatio || 1,\n })\n\n if (!context) return\n\n const nextSamples = readSamples(time / 1000)\n const renderedSamples = smoothWaveformSamples(\n previousSamplesRef.current ?? undefined,\n nextSamples,\n api.config.smoothing,\n )\n\n previousSamplesRef.current = renderedSamples\n\n drawWaveform(context, renderedSamples, size, {\n variant: api.config.variant,\n color: resolveCanvasColor(root, api.config.color),\n intensity: api.config.intensity,\n amplitude: api.config.amplitude,\n barCount: api.config.barCount,\n })\n }\n\n const schedule = () => {\n if (disposed || api.config.paused || prefersReducedMotion) return\n\n if (typeof window.requestAnimationFrame === 'function') {\n frame = window.requestAnimationFrame(tick)\n } else {\n frame = window.setTimeout(() => tick(performance.now()), 16)\n }\n }\n\n const tick = (time: number) => {\n draw(time)\n schedule()\n }\n\n draw()\n schedule()\n\n const observer =\n typeof ResizeObserver === 'function'\n ? new ResizeObserver(() => {\n size = measureWaveform(root, api.config.width, api.config.height)\n draw()\n })\n : null\n\n observer?.observe(root)\n\n return () => {\n disposed = true\n cancelFrame()\n observer?.disconnect()\n }\n }, [\n api.config.barCount,\n api.config.color,\n api.config.height,\n api.config.intensity,\n api.config.amplitude,\n api.config.paused,\n api.config.smoothing,\n api.config.variant,\n api.config.width,\n prefersReducedMotion,\n samples,\n source,\n ])\n\n return (\n <div\n ref={setRootRef}\n className={cn(waveformVariants({ variant: api.config.variant }), className)}\n style={rootStyle}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n <canvas\n ref={canvasRef}\n className={waveformCanvasVariants()}\n aria-hidden=\"true\"\n data-waveform-canvas=\"\"\n />\n </div>\n )\n },\n)\n\nfunction usePrefersReducedMotion() {\n const [prefersReducedMotion, setPrefersReducedMotion] = React.useState(false)\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return\n }\n\n const media = window.matchMedia('(prefers-reduced-motion: reduce)')\n const update = () => setPrefersReducedMotion(media.matches)\n\n update()\n media.addEventListener?.('change', update)\n\n return () => {\n media.removeEventListener?.('change', update)\n }\n }, [])\n\n return prefersReducedMotion\n}\n\nfunction readAnalyserSamples(\n analyser: AnalyserNode,\n barCount: number,\n floatBufferRef: React.MutableRefObject<Float32Array | null>,\n byteBufferRef: React.MutableRefObject<Uint8Array | null>,\n): Float32Array {\n if (typeof analyser.getFloatTimeDomainData === 'function') {\n const length = Math.max(1, analyser.fftSize || analyser.frequencyBinCount || barCount)\n\n if (floatBufferRef.current?.length !== length) {\n floatBufferRef.current = new Float32Array(length)\n }\n\n analyser.getFloatTimeDomainData(floatBufferRef.current)\n return normalizeWaveformSamples(floatBufferRef.current, barCount)\n }\n\n const length = Math.max(1, analyser.frequencyBinCount || barCount)\n\n if (byteBufferRef.current?.length !== length) {\n byteBufferRef.current = new Uint8Array(length)\n }\n\n analyser.getByteFrequencyData(byteBufferRef.current)\n return normalizeWaveformSamples(Array.from(byteBufferRef.current), barCount)\n}\n\nfunction measureWaveform(\n element: HTMLElement,\n width: number | string,\n height: number | string,\n): WaveformSize {\n const rect = element.getBoundingClientRect()\n const fallbackWidth = typeof width === 'number' ? width : 300\n const fallbackHeight = typeof height === 'number' ? height : 80\n\n return {\n width: Math.max(1, Math.round(rect.width || element.clientWidth || fallbackWidth)),\n height: Math.max(1, Math.round(rect.height || element.clientHeight || fallbackHeight)),\n }\n}\n\nfunction resolveCanvasColor(element: HTMLElement, color: string): string {\n const variableMatch = color.match(/^var\\((--[^),\\s]+)(?:,[^)]+)?\\)$/)\n\n if (!variableMatch || typeof window.getComputedStyle !== 'function') {\n return color\n }\n\n const value = window.getComputedStyle(element).getPropertyValue(variableMatch[1]).trim()\n\n return value || color\n}\n\nfunction isAnalyserSource(value: WaveformSource | undefined): value is AnalyserNode {\n return (\n value != null &&\n typeof (value as AnalyserNode).frequencyBinCount === 'number' &&\n (\n typeof (value as AnalyserNode).getFloatTimeDomainData === 'function' ||\n typeof (value as AnalyserNode).getByteFrequencyData === 'function'\n )\n )\n}\n\nfunction isMediaStreamSource(value: WaveformSource | undefined): value is MediaStream {\n return value != null && typeof (value as MediaStream).getTracks === 'function'\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAwCO,IAAM,6BAA6B;AACnC,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAChC,IAAM,6BAA6B;AACnC,IAAM,6BAA6B;AACnC,IAAM,6BAA6B;AAE1C,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAEf,SAAS,kBAAkB,OAAmC;AACnE,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAErD,SAAO,KAAK,IAAI,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAC/D;AAEO,SAAS,mBAAmB,OAAmC;AACpE,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAErD,SAAO,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,KAAK,CAAC;AAC1C;AAEO,SAAS,mBAAmB,OAAmC;AACpE,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAErD,SAAO,KAAK,IAAI,eAAe,KAAK,IAAI,GAAG,KAAK,CAAC;AACnD;AAEO,SAAS,mBAAmB,OAAmC;AACpE,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAErD,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEO,SAAS,wBAAwB,QAAuB,CAAA,GAA8B;AAC3F,SAAO;IACL,SAAS,MAAM,WAAW;IAC1B,WAAW,mBAAmB,MAAM,SAAS;IAC7C,WAAW,mBAAmB,MAAM,SAAS;IAC7C,QAAQ,MAAM,UAAU;IACxB,OAAO,MAAM,SAAS;IACtB,UAAU,kBAAkB,MAAM,QAAQ;IAC1C,WAAW,mBAAmB,MAAM,SAAS;IAC7C,OAAO,MAAM,SAAS;IACtB,QAAQ,MAAM,UAAU;EAAA;AAE5B;AAEO,SAAS,sBAAsB,OAA8C;AAClF,SAAO,iBAAiB,gBAAgB,MAAM,QAAQ,KAAK;AAC7D;AAEO,SAAS,oBAAoB,QAAQ,4BAA0C;AACpF,SAAO,IAAI,aAAa,kBAAkB,KAAK,CAAC;AAClD;AAEO,SAAS,uBACd,YAAY,4BACZ,QAAQ,4BACR,QAAQ,GACM;AACd,QAAM,sBAAsB,mBAAmB,SAAS;AACxD,QAAM,kBAAkB,kBAAkB,KAAK;AAC/C,QAAM,UAAU,IAAI,aAAa,eAAe;AAEhD,MAAI,wBAAwB,EAAG,QAAO;AAEtC,QAAM,QAAQ,OAAO,KAAK,IAAI,QAAQ,GAAG,IAAI;AAE7C,WAAS,IAAI,GAAG,IAAI,iBAAiB,KAAK,GAAG;AAC3C,UAAM,WAAW,mBAAmB,IAAI,MAAM,KAAK,kBAAkB;AACrE,UAAM,WAAW,OAAO,KAAK,IAAI,WAAW,KAAK,EAAE,IAAI;AACvD,UAAM,UAAU,KAAK,IAAI,WAAW,KAAK,KAAK,IAAI,QAAQ,GAAG;AAC7D,YAAQ,CAAC,IAAI,UAAU,WAAW,sBAAsB;EAC1D;AAEA,SAAO;AACT;AAEO,SAAS,yBACd,OACA,aACc;AACd,QAAM,eAAe,OAAO,UAAU;AAEtC,MAAI,iBAAiB,GAAG;AACtB,WAAO,eAAe,OAAO,IAAI,aAAA,IAAiB,oBAAoB,WAAW;EACnF;AAEA,QAAM,aAAa,IAAI,aAAa,YAAY;AAChD,MAAI,SAAS;AAEb,WAAS,IAAI,GAAG,IAAI,cAAc,KAAK,GAAG;AACxC,UAAM,QAAQ,OAAO,QAAQ,CAAC,CAAC;AAC/B,UAAM,SAAS,OAAO,SAAS,KAAK,IAAI,QAAQ;AAChD,eAAW,CAAC,IAAI;AAChB,aAAS,KAAK,IAAI,QAAQ,KAAK,IAAI,MAAM,CAAC;EAC5C;AAEA,QAAM,UAAU,SAAS,IAAI,SAAS;AAEtC,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;AAC7C,eAAW,CAAC,IAAI,MAAM,WAAW,CAAC,IAAI,SAAS,IAAI,CAAC;EACtD;AAEA,MAAI,eAAe,QAAQ,gBAAgB,WAAW,QAAQ;AAC5D,WAAO;EACT;AAEA,SAAO,wBAAwB,YAAY,WAAW;AACxD;AAEO,SAAS,wBACd,SACA,aACc;AACd,QAAM,QAAQ,kBAAkB,WAAW;AAC3C,QAAM,eAAe,QAAQ;AAE7B,MAAI,iBAAiB,EAAG,QAAO,oBAAoB,KAAK;AACxD,MAAI,iBAAiB,MAAO,QAAO,aAAa,KAAK,OAAO;AAE5D,QAAM,SAAS,IAAI,aAAa,KAAK;AAErC,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG;AACjC,UAAM,QAAS,IAAI,eAAgB;AACnC,UAAM,OAAQ,IAAI,KAAK,eAAgB;AACvC,UAAM,aAAa,KAAK,MAAM,KAAK;AACnC,UAAM,YAAY,KAAK,IAAI,aAAa,GAAG,KAAK,KAAK,GAAG,CAAC;AACzD,QAAI,QAAQ;AACZ,QAAI,SAAS;AAEb,aAAS,IAAI,YAAY,IAAI,aAAa,IAAI,cAAc,KAAK,GAAG;AAClE,eAAS,OAAO,QAAQ,CAAC,CAAC;AAC1B,gBAAU;IACZ;AAEA,WAAO,CAAC,IAAI,SAAS,IAAI,QAAQ,SAAS,OAAO,QAAQ,KAAK,IAAI,YAAY,eAAe,CAAC,CAAC,CAAC;EAClG;AAEA,SAAO;AACT;AAEO,SAAS,sBACd,UACA,MACA,YAAY,4BACE;AACd,MAAI,YAAY,QAAQ,SAAS,WAAW,GAAG;AAC7C,WAAO,aAAa,KAAK,IAAI;EAC/B;AAEA,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,SAAS,IAAI,aAAa,KAAK,MAAM;AAE3C,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,gBAAgB,OAAO,SAAS,CAAC,KAAK,KAAK,CAAC,CAAC;AACnD,WAAO,CAAC,IAAI,gBAAgB,SAAS,OAAO,KAAK,CAAC,CAAC,KAAK,IAAI;EAC9D;AAEA,SAAO;AACT;AAEO,SAAS,qBACd,SACA,YAAY,4BACE;AACd,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,SAAS,IAAI,aAAa,QAAQ,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,WAAO,CAAC,IAAI,MAAM,OAAO,QAAQ,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC;EACtD;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,SAAsC;AACpE,MAAI,OAAO;AAEX,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,WAAO,KAAK,IAAI,MAAM,KAAK,IAAI,OAAO,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;EACzD;AAEA,SAAO,KAAK,IAAI,GAAG,IAAI;AACzB;AAEO,SAAS,eAAe,OAAwD;AACrF,MAAI,SAAS,KAAM,QAAO;AAE1B,SAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AACpD;AAEO,SAAS,eAAe,QAAuB,CAAA,GAAiB;AACrE,QAAM,SAAS,wBAAwB,KAAK;AAC5C,QAAM,eAAe,MAAM,YAAY,sBAAsB,MAAM,MAAM,IAAI,MAAM,SAAS;AAC5F,QAAM,UAAU,gBAAgB,OAC5B,uBAAuB,OAAO,WAAW,OAAO,QAAQ,IACxD,yBAAyB,cAAc,OAAO,QAAQ;AAE1D,SAAO;IACL;IACA;IACA,WAAW;MACT,MAAM;MACN,cAAc;IAAA;IAEhB,gBAAgB;MACd,gBAAgB,OAAO;MACvB,eAAe,OAAO,OAAO,MAAM;IAAA;IAErC,WAAW,WAAW,OAAO,UAAU;AACrC,aAAO,gBAAgB,OACnB,uBAAuB,OAAO,WAAW,QAAQ,IACjD,yBAAyB,cAAc,QAAQ;IACrD;EAAA;AAEJ;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;ACzOO,SAAS,sBACd,QACA,MACiC;AACjC,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAChD,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAClD,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,cAAc,CAAC;AACnD,QAAM,aAAa,KAAK,MAAM,QAAQ,UAAU;AAChD,QAAM,cAAc,KAAK,MAAM,SAAS,UAAU;AAElD,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO,QAAQ;EACjB;AAEA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,SAAS;EAClB;AAEA,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,QAAS,QAAO;AAErB,UAAQ,aAAa,YAAY,GAAG,GAAG,YAAY,GAAG,CAAC;AAEvD,SAAO;AACT;AAEO,SAAS,aACd,SACA,SACA,MACA,UAAiC,CAAA,GAC3B;AACN,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAChD,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAClD,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,YAAY,mBAAmB,QAAQ,aAAa,0BAA0B;AACpF,QAAM,YAAY,mBAAmB,QAAQ,aAAa,0BAA0B;AACpF,QAAM,WAAW,kBAAkB,QAAQ,QAAQ;AAEnD,UAAQ,UAAU,GAAG,GAAG,OAAO,MAAM;AACrC,mBAAiB,SAAS,KAAK;AAE/B,MAAI,YAAY,QAAQ;AACtB,aAAS,SAAS,SAAS,OAAO,QAAQ,WAAW,SAAS;AAC9D;EACF;AAEA,MAAI,YAAY,SAAS;AACvB,cAAU,SAAS,SAAS,OAAO,QAAQ,WAAW,SAAS;AAC/D;EACF;AAEA,WAAS,SAAS,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ;AAC1E;AAEA,SAAS,SACP,SACA,SACA,OACA,QACA,WACA,WACA,UACA;AACA,QAAM,OAAO,qBAAqB,wBAAwB,SAAS,QAAQ,GAAG,SAAS;AACvF,QAAM,YAAY,QAAQ,KAAK;AAC/B,QAAM,WAAW,KAAK,IAAI,GAAG,YAAY,IAAI;AAC7C,QAAM,SAAS,SAAS;AAExB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,QAAQ,KAAK,IAAI,KAAK,CAAC,CAAC;AAC9B,UAAM,YAAY,KAAK,IAAI,QAAQ,SAAS,WAAW,QAAQ,IAAI,IAAI,CAAC;AACxE,UAAM,IAAI,IAAI,aAAa,YAAY,YAAY;AACnD,UAAM,IAAI,SAAS,YAAY;AAE/B,YAAQ,SAAS,GAAG,GAAG,UAAU,SAAS;EAC5C;AACF;AAEA,SAAS,SACP,SACA,SACA,OACA,QACA,WACA,gBACA;AACA,QAAM,cAAc,qBAAqB,SAAS,SAAS;AAC3D,QAAM,SAAS,SAAS;AACxB,QAAM,YAAY,SAAS,OAAO;AAElC,UAAQ,UAAA;AAER,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,UAAM,IAAI,YAAY,UAAU,IAAI,QAAQ,IAAK,KAAK,YAAY,SAAS,KAAM;AACjF,UAAM,IAAI,SAAS,OAAO,YAAY,CAAC,CAAC,IAAI;AAE5C,QAAI,MAAM,GAAG;AACX,cAAQ,OAAO,GAAG,CAAC;IACrB,OAAO;AACL,cAAQ,OAAO,GAAG,CAAC;IACrB;EACF;AAEA,UAAQ,YAAY,KAAK,IAAI,KAAK,KAAK,IAAI,OAAO,MAAM,IAAI,KAAK;AACjE,UAAQ,UAAU;AAClB,UAAQ,WAAW;AACnB,UAAQ,OAAA;AACV;AAEA,SAAS,UACP,SACA,SACA,OACA,QACA,WACA,WACA;AACA,QAAM,OAAO,gBAAgB,qBAAqB,SAAS,SAAS,CAAC,IAAI;AACzE,QAAM,eAAe,KAAK,IAAI,OAAO,MAAM;AAC3C,QAAM,UAAU,QAAQ;AACxB,QAAM,UAAU,SAAS;AACzB,QAAM,YAAY;AAClB,QAAM,aAAa,eAAe;AAClC,QAAM,aAAa,eAAe;AAElC,UAAQ,KAAA;AACR,UAAQ,YAAY,KAAK,IAAI,KAAK,eAAe,KAAK;AAEtD,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK,GAAG;AACrC,UAAM,YAAY,IAAI,KAAK;AAC3B,UAAM,QAAQ,OAAO,eAAe,MAAM;AAC1C,UAAM,SAAS,aAAa,aAAa,IAAI;AAE7C,YAAQ,cAAc,OAAO,WAAW;AACxC,YAAQ,UAAA;AACR,YAAQ,IAAI,SAAS,SAAS,QAAQ,GAAG,KAAK,KAAK,CAAC;AACpD,YAAQ,OAAA;EACV;AAEA,UAAQ,QAAA;AACV;AAEA,SAAS,iBAAiB,SAAmC,OAAe;AAC1E,MAAI;AACF,YAAQ,YAAY;AACpB,YAAQ,cAAc;EACxB,QAAQ;AACN,YAAQ,YAAY;AACpB,YAAQ,cAAc;EACxB;AACF;AClLO,IAAM,mBAAmB,IAAI;EAClC,MAAM;EACN,UAAU;IACR,SAAS;MACP,MAAM;MACN,MAAM;MACN,OAAO;IAAA;EACT;EAEF,iBAAiB;IACf,SAAS;EAAA;AAEb,CAAC;AAEM,IAAM,yBAAyB,IAAI;EACxC,MAAM;AACR,CAAC;;;;ACaM,IAAM,WAAiB;EAC5B,SAASA,UACP;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,GAAG;EAAA,GAEL,KACA;AACA,UAAM,UAAgB,aAA8B,IAAI;AACxD,UAAM,YAAkB,aAAiC,IAAI;AAC7D,UAAM,qBAA2B,aAA4B,IAAI;AACjE,UAAM,mBAAyB,aAA4B,IAAI;AAC/D,UAAM,iBAAuB,aAA4B,IAAI;AAC7D,UAAM,gBAAsB,aAA0B,IAAI;AAC1D,UAAM,uBAAuB,wBAAA;AAE7B,UAAM,MAAM,eAAe;MACzB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IAAA,CACD;AAED,UAAM,YAAkB;MACtB,OAAO;QACL,GAAG;QACH,OAAO,eAAe,KAAK,KAAK,OAAO,SAAS;QAChD,QAAQ,eAAe,MAAM,KAAK,OAAO,UAAU,GAAG,IAAI,OAAO,MAAM;QACvE,oBAAoB,IAAI,OAAO;MAAA;MAEjC,CAAC,IAAI,OAAO,OAAO,IAAI,OAAO,QAAQ,QAAQ,OAAO,KAAK;IAAA;AAG5D,UAAM,aAAmB;MACvB,CAAC,SAAgC;AAC/B,gBAAQ,UAAU;AAElB,YAAI,OAAO,QAAQ,YAAY;AAC7B,cAAI,IAAI;QACV,WAAW,KAAK;AACd,cAAI,UAAU;QAChB;MACF;MACA,CAAC,GAAG;IAAA;AAGA,IAAA,gBAAU,MAAM;AACpB,UAAI,CAAC,oBAAoB,MAAM,GAAG;AAChC,yBAAiB,UAAU;AAC3B;MACF;AAEA,UAAI,OAAO,WAAW,YAAa;AAEnC,YAAM,oBACJ,OAAO,gBACN,OAAqE;AAExE,UAAI,CAAC,kBAAmB;AAExB,YAAM,eAAe,IAAI,kBAAA;AACzB,YAAM,WAAW,aAAa,eAAA;AAC9B,YAAM,eAAe,aAAa,wBAAwB,MAAM;AAEhE,eAAS,wBAAwB,mBAAmB,IAAI,OAAO,SAAS;AACxE,mBAAa,QAAQ,QAAQ;AAC7B,uBAAiB,UAAU;AAE3B,aAAO,MAAM;AACX,yBAAiB,UAAU;AAC3B,qBAAa,WAAA;AACb,iBAAS,WAAA;AAET,YAAI,aAAa,UAAU,UAAU;AACnC,eAAK,aAAa,MAAA;QACpB;MACF;IACF,GAAG,CAAC,IAAI,OAAO,WAAW,MAAM,CAAC;AAE3B,IAAA,gBAAU,MAAM;AACpB,UAAI,iBAAiB,MAAM,GAAG;AAC5B,eAAO,wBAAwB,mBAAmB,IAAI,OAAO,SAAS;MACxE;IACF,GAAG,CAAC,IAAI,OAAO,WAAW,MAAM,CAAC;AAE3B,IAAA,gBAAU,MAAM;AACpB,YAAM,OAAO,QAAQ;AACrB,YAAM,SAAS,UAAU;AAEzB,UAAI,CAAC,QAAQ,CAAC,OAAQ;AAEtB,UAAI,OAAO,gBAAgB,MAAM,IAAI,OAAO,OAAO,IAAI,OAAO,MAAM;AACpE,UAAI,QAA8C;AAClD,UAAI,WAAW;AAEf,YAAM,cAAc,MAAM;AACxB,YAAI,SAAS,KAAM;AAEnB,YAAI,OAAO,OAAO,0BAA0B,YAAY;AACtD,iBAAO,qBAAqB,KAAuB;QACrD,OAAO;AACL,uBAAa,KAAqB;QACpC;AAEA,gBAAQ;MACV;AAEA,YAAM,cAAc,CAAC,QAAQ,MAAoB;AAC/C,YAAI,WAAW,MAAM;AACnB,iBAAO,yBAAyB,SAAS,IAAI,OAAO,QAAQ;QAC9D;AAEA,YAAI,sBAAsB,MAAM,GAAG;AACjC,iBAAO,yBAAyB,QAAQ,IAAI,OAAO,QAAQ;QAC7D;AAEA,cAAM,WAAW,iBAAiB,MAAM,IAAI,SAAS,iBAAiB;AACtE,YAAI,UAAU;AACZ,iBAAO,oBAAoB,UAAU,IAAI,OAAO,UAAU,gBAAgB,aAAa;QACzF;AAEA,eAAO,uBAAuB,IAAI,OAAO,WAAW,IAAI,OAAO,UAAU,KAAK;MAChF;AAEA,YAAM,OAAO,CAAC,OAAO,OAAO,gBAAgB,cAAc,IAAI,YAAY,IAAA,MAAU;AAClF,cAAM,UAAU,sBAAsB,QAAQ;UAC5C,GAAG;UACH,YAAY,OAAO,oBAAoB;QAAA,CACxC;AAED,YAAI,CAAC,QAAS;AAEd,cAAM,cAAc,YAAY,OAAO,GAAI;AAC3C,cAAM,kBAAkB;UACtB,mBAAmB,WAAW;UAC9B;UACA,IAAI,OAAO;QAAA;AAGb,2BAAmB,UAAU;AAE7B,qBAAa,SAAS,iBAAiB,MAAM;UAC3C,SAAS,IAAI,OAAO;UACpB,OAAO,mBAAmB,MAAM,IAAI,OAAO,KAAK;UAChD,WAAW,IAAI,OAAO;UACtB,WAAW,IAAI,OAAO;UACtB,UAAU,IAAI,OAAO;QAAA,CACtB;MACH;AAEA,YAAM,WAAW,MAAM;AACrB,YAAI,YAAY,IAAI,OAAO,UAAU,qBAAsB;AAE3D,YAAI,OAAO,OAAO,0BAA0B,YAAY;AACtD,kBAAQ,OAAO,sBAAsB,IAAI;QAC3C,OAAO;AACL,kBAAQ,OAAO,WAAW,MAAM,KAAK,YAAY,IAAA,CAAK,GAAG,EAAE;QAC7D;MACF;AAEA,YAAM,OAAO,CAAC,SAAiB;AAC7B,aAAK,IAAI;AACT,iBAAA;MACF;AAEA,WAAA;AACA,eAAA;AAEA,YAAM,WACJ,OAAO,mBAAmB,aACtB,IAAI,eAAe,MAAM;AACvB,eAAO,gBAAgB,MAAM,IAAI,OAAO,OAAO,IAAI,OAAO,MAAM;AAChE,aAAA;MACF,CAAC,IACD;AAEN,gBAAU,QAAQ,IAAI;AAEtB,aAAO,MAAM;AACX,mBAAW;AACX,oBAAA;AACA,kBAAU,WAAA;MACZ;IACF,GAAG;MACD,IAAI,OAAO;MACX,IAAI,OAAO;MACX,IAAI,OAAO;MACX,IAAI,OAAO;MACX,IAAI,OAAO;MACX,IAAI,OAAO;MACX,IAAI,OAAO;MACX,IAAI,OAAO;MACX,IAAI,OAAO;MACX;MACA;MACA;IAAA,CACD;AAED,WACE;MAAC;MAAA;QACC,KAAK;QACL,WAAW,GAAG,iBAAiB,EAAE,SAAS,IAAI,OAAO,QAAA,CAAS,GAAG,SAAS;QAC1E,OAAO;QACN,GAAG,IAAI;QACP,GAAG,IAAI;QACP,GAAG;QAEJ,UAAA;UAAC;UAAA;YACC,KAAK;YACL,WAAW,uBAAA;YACX,eAAY;YACZ,wBAAqB;UAAA;QAAA;MACvB;IAAA;EAGN;AACF;AAEA,SAAS,0BAA0B;AACjC,QAAM,CAAC,sBAAsB,uBAAuB,IAAU,eAAS,KAAK;AAEtE,EAAA,gBAAU,MAAM;AACpB,QAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E;IACF;AAEA,UAAM,QAAQ,OAAO,WAAW,kCAAkC;AAClE,UAAM,SAAS,MAAM,wBAAwB,MAAM,OAAO;AAE1D,WAAA;AACA,UAAM,mBAAmB,UAAU,MAAM;AAEzC,WAAO,MAAM;AACX,YAAM,sBAAsB,UAAU,MAAM;IAC9C;EACF,GAAG,CAAA,CAAE;AAEL,SAAO;AACT;AAEA,SAAS,oBACP,UACA,UACA,gBACA,eACc;AACd,MAAI,OAAO,SAAS,2BAA2B,YAAY;AACzD,UAAMC,UAAS,KAAK,IAAI,GAAG,SAAS,WAAW,SAAS,qBAAqB,QAAQ;AAErF,QAAI,eAAe,SAAS,WAAWA,SAAQ;AAC7C,qBAAe,UAAU,IAAI,aAAaA,OAAM;IAClD;AAEA,aAAS,uBAAuB,eAAe,OAAO;AACtD,WAAO,yBAAyB,eAAe,SAAS,QAAQ;EAClE;AAEA,QAAM,SAAS,KAAK,IAAI,GAAG,SAAS,qBAAqB,QAAQ;AAEjE,MAAI,cAAc,SAAS,WAAW,QAAQ;AAC5C,kBAAc,UAAU,IAAI,WAAW,MAAM;EAC/C;AAEA,WAAS,qBAAqB,cAAc,OAAO;AACnD,SAAO,yBAAyB,MAAM,KAAK,cAAc,OAAO,GAAG,QAAQ;AAC7E;AAEA,SAAS,gBACP,SACA,OACA,QACc;AACd,QAAM,OAAO,QAAQ,sBAAA;AACrB,QAAM,gBAAgB,OAAO,UAAU,WAAW,QAAQ;AAC1D,QAAM,iBAAiB,OAAO,WAAW,WAAW,SAAS;AAE7D,SAAO;IACL,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,QAAQ,eAAe,aAAa,CAAC;IACjF,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,UAAU,QAAQ,gBAAgB,cAAc,CAAC;EAAA;AAEzF;AAEA,SAAS,mBAAmB,SAAsB,OAAuB;AACvE,QAAM,gBAAgB,MAAM,MAAM,kCAAkC;AAEpE,MAAI,CAAC,iBAAiB,OAAO,OAAO,qBAAqB,YAAY;AACnE,WAAO;EACT;AAEA,QAAM,QAAQ,OAAO,iBAAiB,OAAO,EAAE,iBAAiB,cAAc,CAAC,CAAC,EAAE,KAAA;AAElF,SAAO,SAAS;AAClB;AAEA,SAAS,iBAAiB,OAA0D;AAClF,SACE,SAAS,QACT,OAAQ,MAAuB,sBAAsB,aAEnD,OAAQ,MAAuB,2BAA2B,cAC1D,OAAQ,MAAuB,yBAAyB;AAG9D;AAEA,SAAS,oBAAoB,OAAyD;AACpF,SAAO,SAAS,QAAQ,OAAQ,MAAsB,cAAc;AACtE;",
|
|
6
|
+
"names": ["Waveform", "length"]
|
|
7
|
+
}
|