@joewinke/jatui 0.22.0 → 0.24.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/CLAUDE.md +72 -2
- package/dist/actions/reveal.d.ts +37 -0
- package/dist/actions/reveal.js +42 -0
- package/dist/components/AudioRecorder.svelte +529 -0
- package/dist/components/AudioRecorder.svelte.d.ts +30 -0
- package/dist/components/BulkActionBar.svelte +40 -0
- package/dist/components/BulkActionBar.svelte.d.ts +9 -0
- package/dist/components/ConfirmDialog.svelte +39 -35
- package/dist/components/CopyButton.svelte +5 -2
- package/dist/components/FloatingActionBar.svelte +55 -1
- package/dist/components/FloatingActionBar.svelte.d.ts +8 -1
- package/dist/components/IconSelector.svelte +417 -0
- package/dist/components/IconSelector.svelte.d.ts +55 -0
- package/dist/components/InfiniteGrid.svelte +305 -0
- package/dist/components/InfiniteGrid.svelte.d.ts +71 -0
- package/dist/components/InfiniteSearchGrid.svelte +131 -0
- package/dist/components/InfiniteSearchGrid.svelte.d.ts +67 -0
- package/dist/components/InputDialog.svelte +49 -38
- package/dist/components/KeyboardShortcutsOverlay.svelte +94 -3
- package/dist/components/KeyboardShortcutsOverlay.svelte.d.ts +61 -16
- package/dist/components/MediaCaptureIcon.svelte +23 -0
- package/dist/components/MediaCaptureIcon.svelte.d.ts +1 -1
- package/dist/components/ThumbnailGrid.svelte +137 -0
- package/dist/components/ThumbnailGrid.svelte.d.ts +42 -0
- package/dist/components/batch/BatchJobTable.svelte +549 -0
- package/dist/components/batch/BatchJobTable.svelte.d.ts +114 -0
- package/dist/components/batch/QuotaMeter.svelte +78 -0
- package/dist/components/batch/QuotaMeter.svelte.d.ts +16 -0
- package/dist/components/batch/batchQueue.d.ts +56 -0
- package/dist/components/batch/batchQueue.js +81 -0
- package/dist/components/batch/elapsedEstimate.d.ts +24 -0
- package/dist/components/batch/elapsedEstimate.js +25 -0
- package/dist/components/batch/pollOperation.d.ts +45 -0
- package/dist/components/batch/pollOperation.js +80 -0
- package/dist/components/batch/useElapsedEstimate.d.ts +10 -0
- package/dist/components/batch/useElapsedEstimate.js +38 -0
- package/dist/components/bulkActionBarKeys.d.ts +40 -0
- package/dist/components/bulkActionBarKeys.js +38 -0
- package/dist/components/infiniteGridLoader.d.ts +70 -0
- package/dist/components/infiniteGridLoader.js +141 -0
- package/dist/components/linked-columns/LinkedColumns.svelte +10 -22
- package/dist/components/linked-columns/LinkedColumns.svelte.d.ts +1 -9
- package/dist/components/linked-columns/types.d.ts +9 -0
- package/dist/components/linked-columns/types.js +1 -0
- package/dist/components/replay/ChapterTimeline.svelte +43 -25
- package/dist/components/replay/ChapterTimeline.svelte.d.ts +26 -1
- package/dist/components/table/columnResize.d.ts +38 -0
- package/dist/components/table/columnResize.js +117 -0
- package/dist/components/table/index.d.ts +2 -0
- package/dist/components/table/index.js +1 -0
- package/dist/components/toast/ToastItem.svelte +47 -2
- package/dist/components/variant/VariantMatrixPicker.svelte +181 -0
- package/dist/components/variant/VariantMatrixPicker.svelte.d.ts +37 -0
- package/dist/components/variant/variantCombinations.d.ts +75 -0
- package/dist/components/variant/variantCombinations.js +100 -0
- package/dist/index.d.ts +34 -3
- package/dist/index.js +30 -1
- package/dist/stores/toast.d.ts +8 -0
- package/dist/stores/toast.js +2 -0
- package/dist/styles/motion.css +100 -0
- package/dist/utils/audioRecorder.d.ts +28 -0
- package/dist/utils/audioRecorder.js +58 -0
- package/dist/utils/audioRecorderCore.d.ts +132 -0
- package/dist/utils/audioRecorderCore.js +447 -0
- package/dist/utils/clipboard.d.ts +25 -0
- package/dist/utils/clipboard.js +59 -0
- package/dist/utils/dateFormatters.d.ts +11 -2
- package/dist/utils/dateFormatters.js +22 -2
- package/dist/utils/keyboardShortcutRegistry.d.ts +152 -0
- package/dist/utils/keyboardShortcutRegistry.js +365 -0
- package/package.json +1 -1
package/dist/stores/toast.d.ts
CHANGED
|
@@ -2,6 +2,12 @@ export type ToastType = 'info' | 'success' | 'warning' | 'error';
|
|
|
2
2
|
export type ToastOptions = {
|
|
3
3
|
type?: ToastType;
|
|
4
4
|
message: string;
|
|
5
|
+
/** Extended detail text (e.g. a stack trace or error chain) — rendered by
|
|
6
|
+
* ToastHost behind a collapsible "Details" toggle. Multiline-safe. */
|
|
7
|
+
details?: string;
|
|
8
|
+
/** Arbitrary structured context carried on the Toast for programmatic
|
|
9
|
+
* access (getToasts()); not rendered by ToastHost. */
|
|
10
|
+
meta?: Record<string, unknown>;
|
|
5
11
|
action?: {
|
|
6
12
|
label: string;
|
|
7
13
|
onClick: () => void;
|
|
@@ -13,6 +19,8 @@ export type Toast = {
|
|
|
13
19
|
id: number;
|
|
14
20
|
type: ToastType;
|
|
15
21
|
message: string;
|
|
22
|
+
details?: string;
|
|
23
|
+
meta?: Record<string, unknown>;
|
|
16
24
|
action?: {
|
|
17
25
|
label: string;
|
|
18
26
|
onClick: () => void;
|
package/dist/stores/toast.js
CHANGED
package/dist/styles/motion.css
CHANGED
|
@@ -44,3 +44,103 @@
|
|
|
44
44
|
scroll-behavior: auto !important;
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* Scroll-reveal (use:reveal) — ported from chimaro's animista-powered reveal
|
|
50
|
+
* action (jatui-m4uz3.3). The action toggles `.jatui-reveal-hidden` off and
|
|
51
|
+
* `.jatui-reveal jatui-reveal-<variant>` on when the element first intersects
|
|
52
|
+
* the viewport. Every class here reads ONLY the tokens above — animista.css
|
|
53
|
+
* is deliberately NOT shipped; the variants below are the remap.
|
|
54
|
+
*/
|
|
55
|
+
.jatui-reveal-hidden {
|
|
56
|
+
opacity: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.jatui-reveal {
|
|
60
|
+
animation-duration: var(--motion-move);
|
|
61
|
+
animation-timing-function: var(--motion-glide);
|
|
62
|
+
animation-fill-mode: both; /* holds the from-state through any animation-delay */
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.jatui-reveal-fade-in {
|
|
66
|
+
animation-name: jatui-reveal-fade-in;
|
|
67
|
+
}
|
|
68
|
+
.jatui-reveal-fade-in-bottom {
|
|
69
|
+
animation-name: jatui-reveal-fade-in-bottom;
|
|
70
|
+
}
|
|
71
|
+
.jatui-reveal-fade-in-top {
|
|
72
|
+
animation-name: jatui-reveal-fade-in-top;
|
|
73
|
+
}
|
|
74
|
+
.jatui-reveal-fade-in-left {
|
|
75
|
+
animation-name: jatui-reveal-fade-in-left;
|
|
76
|
+
}
|
|
77
|
+
.jatui-reveal-fade-in-right {
|
|
78
|
+
animation-name: jatui-reveal-fade-in-right;
|
|
79
|
+
}
|
|
80
|
+
.jatui-reveal-scale-in-center {
|
|
81
|
+
animation-name: jatui-reveal-scale-in-center;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@keyframes jatui-reveal-fade-in {
|
|
85
|
+
from {
|
|
86
|
+
opacity: 0;
|
|
87
|
+
}
|
|
88
|
+
to {
|
|
89
|
+
opacity: 1;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@keyframes jatui-reveal-fade-in-bottom {
|
|
94
|
+
from {
|
|
95
|
+
transform: translateY(24px);
|
|
96
|
+
opacity: 0;
|
|
97
|
+
}
|
|
98
|
+
to {
|
|
99
|
+
transform: translateY(0);
|
|
100
|
+
opacity: 1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@keyframes jatui-reveal-fade-in-top {
|
|
105
|
+
from {
|
|
106
|
+
transform: translateY(-24px);
|
|
107
|
+
opacity: 0;
|
|
108
|
+
}
|
|
109
|
+
to {
|
|
110
|
+
transform: translateY(0);
|
|
111
|
+
opacity: 1;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@keyframes jatui-reveal-fade-in-left {
|
|
116
|
+
from {
|
|
117
|
+
transform: translateX(-24px);
|
|
118
|
+
opacity: 0;
|
|
119
|
+
}
|
|
120
|
+
to {
|
|
121
|
+
transform: translateX(0);
|
|
122
|
+
opacity: 1;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@keyframes jatui-reveal-fade-in-right {
|
|
127
|
+
from {
|
|
128
|
+
transform: translateX(24px);
|
|
129
|
+
opacity: 0;
|
|
130
|
+
}
|
|
131
|
+
to {
|
|
132
|
+
transform: translateX(0);
|
|
133
|
+
opacity: 1;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@keyframes jatui-reveal-scale-in-center {
|
|
138
|
+
from {
|
|
139
|
+
transform: scale(0.6);
|
|
140
|
+
opacity: 0;
|
|
141
|
+
}
|
|
142
|
+
to {
|
|
143
|
+
transform: scale(1);
|
|
144
|
+
opacity: 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AudioRecorderMode, AudioRecorderOptions, AudioRecorderPhase, AudioRecorderSnapshot } from './audioRecorderCore';
|
|
2
|
+
export type { AudioRecorderError, AudioRecorderErrorKind, AudioRecorderFrame, AudioRecorderMode, AudioRecorderOptions, AudioRecorderPhase, AudioRecordingResult } from './audioRecorderCore';
|
|
3
|
+
export interface AudioRecorder {
|
|
4
|
+
/** False when the platform has no getUserMedia/MediaRecorder (SSR, Node). */
|
|
5
|
+
readonly supported: boolean;
|
|
6
|
+
readonly mode: AudioRecorderMode;
|
|
7
|
+
readonly phase: AudioRecorderPhase;
|
|
8
|
+
/** True while recording is suspended (pause()). */
|
|
9
|
+
readonly paused: boolean;
|
|
10
|
+
/** 0–100 live mic level. */
|
|
11
|
+
readonly level: number;
|
|
12
|
+
/** Bytes captured so far. */
|
|
13
|
+
readonly sizeBytes: number;
|
|
14
|
+
/** Pause-adjusted wall-clock elapsed ms. */
|
|
15
|
+
readonly elapsedMs: number;
|
|
16
|
+
/** Last error, or null. */
|
|
17
|
+
readonly error: AudioRecorderSnapshot['error'];
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
stop(): void;
|
|
20
|
+
pause(): void;
|
|
21
|
+
resume(): void;
|
|
22
|
+
cancel(): void;
|
|
23
|
+
/** Return a finished/errored recorder to idle so the host can record again. */
|
|
24
|
+
reset(): void;
|
|
25
|
+
/** Final teardown — releases mic + timers. Call from onDestroy. */
|
|
26
|
+
destroy(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare function createAudioRecorder(options?: AudioRecorderOptions): AudioRecorder;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/* audioRecorder.svelte.js generated by Svelte v5.53.11 */
|
|
2
|
+
import * as $ from 'svelte/internal/client';
|
|
3
|
+
import { createAudioRecorderCore } from './audioRecorderCore';
|
|
4
|
+
|
|
5
|
+
export function createAudioRecorder(options = {}) {
|
|
6
|
+
const core = createAudioRecorderCore(options);
|
|
7
|
+
const snap = $.proxy(core.snapshot());
|
|
8
|
+
|
|
9
|
+
core.subscribe((s) => {
|
|
10
|
+
snap.phase = s.phase;
|
|
11
|
+
snap.paused = s.paused;
|
|
12
|
+
snap.level = s.level;
|
|
13
|
+
snap.sizeBytes = s.sizeBytes;
|
|
14
|
+
snap.elapsedMs = s.elapsedMs;
|
|
15
|
+
snap.error = s.error;
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
get supported() {
|
|
20
|
+
return core.supported;
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
get mode() {
|
|
24
|
+
return core.mode;
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
get phase() {
|
|
28
|
+
return snap.phase;
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
get paused() {
|
|
32
|
+
return snap.paused;
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
get level() {
|
|
36
|
+
return snap.level;
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
get sizeBytes() {
|
|
40
|
+
return snap.sizeBytes;
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
get elapsedMs() {
|
|
44
|
+
return snap.elapsedMs;
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
get error() {
|
|
48
|
+
return snap.error;
|
|
49
|
+
},
|
|
50
|
+
start: () => core.start(),
|
|
51
|
+
stop: () => core.stop(),
|
|
52
|
+
pause: () => core.pause(),
|
|
53
|
+
resume: () => core.resume(),
|
|
54
|
+
cancel: () => core.cancel(),
|
|
55
|
+
reset: () => core.reset(),
|
|
56
|
+
destroy: () => core.destroy()
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createAudioRecorderCore — headless audio-capture primitive (jatui-is2ow.8).
|
|
3
|
+
*
|
|
4
|
+
* The capture pipeline of `AudioRecorder.svelte` (permission request, MIME
|
|
5
|
+
* negotiation, MediaRecorder state machine, pause-aware wall-clock timing,
|
|
6
|
+
* AnalyserNode level meter, blob out) factored into a dependency-injected,
|
|
7
|
+
* DOM-free core so any host can drive it from its own UI — mic buttons,
|
|
8
|
+
* push-to-talk keys, overlays — without importing the component.
|
|
9
|
+
*
|
|
10
|
+
* NO transcription here by design: hosts that transcribe (the jat IDE's
|
|
11
|
+
* VoiceMicButton/VoiceInput, wave 3.5 of the adoption audit jat-1alfp) keep
|
|
12
|
+
* their POST-local capture shape and consume `onStop`'s blob payload.
|
|
13
|
+
*
|
|
14
|
+
* Two layers:
|
|
15
|
+
* • this plain module — every knob injectable via `deps` (tests drive a fake
|
|
16
|
+
* MediaRecorder backend in node:test, no DOM);
|
|
17
|
+
* • `audioRecorder.svelte.ts` — the `createAudioRecorder()` rune wrapper
|
|
18
|
+
* that wires the core's snapshot into `$state` so Svelte 5 templates react
|
|
19
|
+
* to it. Components and app code import the wrapper; tests import this.
|
|
20
|
+
*
|
|
21
|
+
* Modes:
|
|
22
|
+
* • `'toggle'` (default) — click-style: `start()` begins, `stop()` ends.
|
|
23
|
+
* • `'push'` — hold-to-talk: the host wires pointerdown → `start()`,
|
|
24
|
+
* pointerup → `stop()`. A `stop()` that arrives while the mic stream is
|
|
25
|
+
* still being acquired (a very quick tap) CANCELS — no blob, no error —
|
|
26
|
+
* matching the jat IDE VoiceMicButton's pointerup-before-stream behavior.
|
|
27
|
+
*
|
|
28
|
+
* Phases: idle → starting → recording ⇄(pause/resume) → processing → done,
|
|
29
|
+
* with `cancel()` from recording returning straight to idle and `reset()`
|
|
30
|
+
* returning a finished/errored recorder to idle so the host can go again.
|
|
31
|
+
*
|
|
32
|
+
* Timer discipline (lesson from MediaCapture, mos-ow4q4.37): elapsed time is
|
|
33
|
+
* derived from the wall clock minus accumulated pause, never an incremented
|
|
34
|
+
* counter — a throttled background tab can't freeze it.
|
|
35
|
+
*/
|
|
36
|
+
export type AudioRecorderPhase = 'idle' | 'starting' | 'recording' | 'processing' | 'done';
|
|
37
|
+
export type AudioRecorderMode = 'toggle' | 'push';
|
|
38
|
+
/** Why a recording attempt failed. */
|
|
39
|
+
export type AudioRecorderErrorKind = 'unsupported' | 'denied' | 'no-mic' | 'start-failed' | 'too-short' | 'handler-failed';
|
|
40
|
+
export interface AudioRecorderError {
|
|
41
|
+
kind: AudioRecorderErrorKind;
|
|
42
|
+
message: string;
|
|
43
|
+
}
|
|
44
|
+
/** What a finished recording hands back to the host — mirrors MediaCaptureResult's shape for the audio kind. */
|
|
45
|
+
export interface AudioRecordingResult {
|
|
46
|
+
blob: Blob;
|
|
47
|
+
mimeType: string;
|
|
48
|
+
durationSeconds: number;
|
|
49
|
+
sizeBytes: number;
|
|
50
|
+
}
|
|
51
|
+
/** One animation frame of analyser data, for hosts that render a visualization. */
|
|
52
|
+
export interface AudioRecorderFrame {
|
|
53
|
+
/** 0–100 RMS level (same value exposed reactively as `level`). */
|
|
54
|
+
level: number;
|
|
55
|
+
/** Frequency-domain bytes (from getByteFrequencyData). */
|
|
56
|
+
frequency: Uint8Array;
|
|
57
|
+
/** Time-domain bytes (from getByteTimeDomainData) — raw PCM-ish shape. */
|
|
58
|
+
time: Uint8Array;
|
|
59
|
+
}
|
|
60
|
+
export interface AudioRecorderOptions {
|
|
61
|
+
/** `'toggle'` (default) or `'push'` (hold-to-talk — see module header). */
|
|
62
|
+
mode?: AudioRecorderMode;
|
|
63
|
+
/** Auto-stop ceiling in ms. 0 (default) records until stopped manually. */
|
|
64
|
+
maxDurationMs?: number;
|
|
65
|
+
/** Fired once the mic stream is live and recording has started. */
|
|
66
|
+
onStart?: () => void;
|
|
67
|
+
onPause?: () => void;
|
|
68
|
+
onResume?: () => void;
|
|
69
|
+
/** Fired with the finished recording. May return a Promise — the recorder
|
|
70
|
+
* stays in "processing" until it settles, so hosts can upload/transcribe
|
|
71
|
+
* without the user re-triggering a recording. */
|
|
72
|
+
onStop?: (result: AudioRecordingResult) => void | Promise<void>;
|
|
73
|
+
/** Fired when the recording is cancelled — no blob is produced. */
|
|
74
|
+
onCancel?: () => void;
|
|
75
|
+
/** Fired on recorder errors (permission denied, no mic, start failure, …). */
|
|
76
|
+
onError?: (error: AudioRecorderError) => void;
|
|
77
|
+
/** Fired every animation frame while recording — analyser data for hosts
|
|
78
|
+
* that draw their own waveform/level UI. Not fired while paused. */
|
|
79
|
+
onFrame?: (frame: AudioRecorderFrame) => void;
|
|
80
|
+
}
|
|
81
|
+
/** Injectable platform bindings — defaults resolve from globalThis lazily at factory time, so Node (no MediaRecorder) degrades to `supported: false` instead of throwing at import. */
|
|
82
|
+
export interface AudioRecorderDeps {
|
|
83
|
+
getUserMedia?: (constraints?: MediaStreamConstraints) => Promise<MediaStream>;
|
|
84
|
+
MediaRecorder?: any;
|
|
85
|
+
AudioContext?: any;
|
|
86
|
+
requestAnimationFrame?: (cb: (t: number) => void) => number;
|
|
87
|
+
cancelAnimationFrame?: (id: number) => void;
|
|
88
|
+
setTimeout?: typeof setTimeout;
|
|
89
|
+
clearTimeout?: typeof clearTimeout;
|
|
90
|
+
setInterval?: typeof setInterval;
|
|
91
|
+
clearInterval?: typeof clearInterval;
|
|
92
|
+
/** Wall clock — injectable so tests can advance time deterministically. */
|
|
93
|
+
now?: () => number;
|
|
94
|
+
}
|
|
95
|
+
export interface AudioRecorderSnapshot {
|
|
96
|
+
phase: AudioRecorderPhase;
|
|
97
|
+
/** True while recording is suspended (pause()). */
|
|
98
|
+
paused: boolean;
|
|
99
|
+
/** 0–100 live mic level. */
|
|
100
|
+
level: number;
|
|
101
|
+
/** Bytes captured so far. */
|
|
102
|
+
sizeBytes: number;
|
|
103
|
+
/** Pause-adjusted wall-clock elapsed ms. */
|
|
104
|
+
elapsedMs: number;
|
|
105
|
+
/** Last error, or null. */
|
|
106
|
+
error: AudioRecorderError | null;
|
|
107
|
+
}
|
|
108
|
+
export interface AudioRecorderCore {
|
|
109
|
+
/** False when the platform has no getUserMedia/MediaRecorder (SSR, Node). */
|
|
110
|
+
readonly supported: boolean;
|
|
111
|
+
readonly mode: AudioRecorderMode;
|
|
112
|
+
/** Current reactive-independent snapshot (the rune wrapper copies this into $state). */
|
|
113
|
+
snapshot(): AudioRecorderSnapshot;
|
|
114
|
+
/** Subscribe to snapshot changes. Returns an unsubscribe fn. */
|
|
115
|
+
subscribe(fn: (snapshot: AudioRecorderSnapshot) => void): () => void;
|
|
116
|
+
start(): Promise<void>;
|
|
117
|
+
stop(): void;
|
|
118
|
+
pause(): void;
|
|
119
|
+
resume(): void;
|
|
120
|
+
cancel(): void;
|
|
121
|
+
/** Return a finished/errored recorder to idle so the host can record again. */
|
|
122
|
+
reset(): void;
|
|
123
|
+
/** Final teardown — releases mic + timers. Safe to call from any phase. */
|
|
124
|
+
destroy(): void;
|
|
125
|
+
}
|
|
126
|
+
/** First supported recording MIME type, or '' when none are. */
|
|
127
|
+
export declare function pickAudioMimeType(isSupported?: (type: string) => boolean): string;
|
|
128
|
+
/** RMS of the time-domain data scaled to the recorder's 0–100 meter range. */
|
|
129
|
+
export declare function computeAudioLevel(timeData: ArrayLike<number> | null): number;
|
|
130
|
+
/** Elapsed from the wall clock, pause-adjusted — see module header note. */
|
|
131
|
+
export declare function computeElapsedMs(startedAt: number, pausedTotalMs: number, pauseStartedAt: number, now: number): number;
|
|
132
|
+
export declare function createAudioRecorderCore(options?: AudioRecorderOptions, deps?: AudioRecorderDeps): AudioRecorderCore;
|