@mieweb/ui 0.6.1-dev.169 → 0.6.1-dev.170
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/brands/index.cjs +18 -18
- package/dist/brands/index.js +3 -3
- package/dist/chunk-3Q2VWPML.cjs +1802 -0
- package/dist/chunk-3Q2VWPML.cjs.map +1 -0
- package/dist/{chunk-6W3HLFAJ.cjs → chunk-3YRDZBW6.cjs} +3 -3
- package/dist/{chunk-6W3HLFAJ.cjs.map → chunk-3YRDZBW6.cjs.map} +1 -1
- package/dist/{chunk-UVQEHZRF.js → chunk-6VGXX6L6.js} +2 -2
- package/dist/{chunk-UVQEHZRF.js.map → chunk-6VGXX6L6.js.map} +1 -1
- package/dist/chunk-CH26CHPH.js +1776 -0
- package/dist/chunk-CH26CHPH.js.map +1 -0
- package/dist/{chunk-TXRQQMG5.js → chunk-CYMZ2QS5.js} +2 -2
- package/dist/{chunk-TXRQQMG5.js.map → chunk-CYMZ2QS5.js.map} +1 -1
- package/dist/chunk-FGP64Z24.js +131 -0
- package/dist/chunk-FGP64Z24.js.map +1 -0
- package/dist/chunk-FIWKHLWY.js +197 -0
- package/dist/chunk-FIWKHLWY.js.map +1 -0
- package/dist/chunk-GLXTVCHN.cjs +4 -0
- package/dist/chunk-GLXTVCHN.cjs.map +1 -0
- package/dist/chunk-J7KWQJOB.js +14 -0
- package/dist/chunk-J7KWQJOB.js.map +1 -0
- package/dist/chunk-JYZW2PZS.cjs +166 -0
- package/dist/chunk-JYZW2PZS.cjs.map +1 -0
- package/dist/{chunk-XVF472GT.js → chunk-NSLR3B7K.js} +2 -2
- package/dist/{chunk-XVF472GT.js.map → chunk-NSLR3B7K.js.map} +1 -1
- package/dist/chunk-NTYGCBCL.js +543 -0
- package/dist/chunk-NTYGCBCL.js.map +1 -0
- package/dist/chunk-RISZWWEQ.js +3 -0
- package/dist/chunk-RISZWWEQ.js.map +1 -0
- package/dist/chunk-S7JQ3FV5.cjs +16 -0
- package/dist/chunk-S7JQ3FV5.cjs.map +1 -0
- package/dist/{chunk-JWTCEWQ4.cjs → chunk-SNEQXSC5.cjs} +2 -2
- package/dist/{chunk-JWTCEWQ4.cjs.map → chunk-SNEQXSC5.cjs.map} +1 -1
- package/dist/chunk-SQHMGT4W.js +164 -0
- package/dist/chunk-SQHMGT4W.js.map +1 -0
- package/dist/chunk-UO3KEUYK.cjs +220 -0
- package/dist/chunk-UO3KEUYK.cjs.map +1 -0
- package/dist/{chunk-FETRH4V5.js → chunk-X763OLF2.js} +3 -3
- package/dist/{chunk-FETRH4V5.js.map → chunk-X763OLF2.js.map} +1 -1
- package/dist/{chunk-DKGUOMBC.cjs → chunk-X7J45FU5.cjs} +2 -2
- package/dist/{chunk-DKGUOMBC.cjs.map → chunk-X7J45FU5.cjs.map} +1 -1
- package/dist/chunk-Y4ESBDQ5.cjs +552 -0
- package/dist/chunk-Y4ESBDQ5.cjs.map +1 -0
- package/dist/{chunk-MJ7YITLN.cjs → chunk-Y65SK5Y2.cjs} +2 -2
- package/dist/{chunk-MJ7YITLN.cjs.map → chunk-Y65SK5Y2.cjs.map} +1 -1
- package/dist/chunk-YD23ZGRU.cjs +155 -0
- package/dist/chunk-YD23ZGRU.cjs.map +1 -0
- package/dist/components/Markdown/index.cjs +10 -10
- package/dist/components/Markdown/index.js +2 -2
- package/dist/components/MediaEditor/index.cjs +42 -0
- package/dist/components/MediaEditor/index.cjs.map +1 -0
- package/dist/components/MediaEditor/index.d.cts +151 -0
- package/dist/components/MediaEditor/index.d.ts +151 -0
- package/dist/components/MediaEditor/index.js +17 -0
- package/dist/components/MediaEditor/index.js.map +1 -0
- package/dist/components/MediaPlayer/index.cjs +24 -0
- package/dist/components/MediaPlayer/index.cjs.map +1 -0
- package/dist/components/MediaPlayer/index.d.cts +71 -0
- package/dist/components/MediaPlayer/index.d.ts +71 -0
- package/dist/components/MediaPlayer/index.js +7 -0
- package/dist/components/MediaPlayer/index.js.map +1 -0
- package/dist/components/TranscriptView/index.cjs +21 -0
- package/dist/components/TranscriptView/index.cjs.map +1 -0
- package/dist/components/TranscriptView/index.d.cts +55 -0
- package/dist/components/TranscriptView/index.d.ts +55 -0
- package/dist/components/TranscriptView/index.js +4 -0
- package/dist/components/TranscriptView/index.js.map +1 -0
- package/dist/esheet.cjs +5 -5
- package/dist/esheet.js +2 -2
- package/dist/hooks/index.cjs +49 -11
- package/dist/hooks/index.d.cts +88 -1
- package/dist/hooks/index.d.ts +88 -1
- package/dist/hooks/index.js +3 -1
- package/dist/index.cjs +374 -247
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +87 -40
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/transcript-oaWqY3yr.d.cts +81 -0
- package/dist/transcript-oaWqY3yr.d.ts +81 -0
- package/dist/useTranscriptEdits-BUylQFg0.d.cts +168 -0
- package/dist/useTranscriptEdits-CWYnjbGP.d.ts +168 -0
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import { T as Transcript, E as EditableWord, S as SpeedMarker, P as PlaybackSpeed } from '../../transcript-oaWqY3yr.cjs';
|
|
5
|
+
import { MediaKind, MediaPlayerRef } from '../MediaPlayer/index.cjs';
|
|
6
|
+
import { S as SilenceThresholdCount } from '../../useTranscriptEdits-BUylQFg0.cjs';
|
|
7
|
+
|
|
8
|
+
interface MediaEditorProps extends VariantProps<typeof mediaEditorVariants> {
|
|
9
|
+
/** Media URL */
|
|
10
|
+
src: string;
|
|
11
|
+
/** Force the media kind; inferred from the src extension when omitted */
|
|
12
|
+
kind?: MediaKind;
|
|
13
|
+
/** The source transcript (canonical, immutable) */
|
|
14
|
+
transcript: Transcript;
|
|
15
|
+
/** Initial edited words (from saved edits) */
|
|
16
|
+
initialEditedWords?: EditableWord[];
|
|
17
|
+
/** Initial undo stack (from saved edits) */
|
|
18
|
+
initialUndoStack?: EditableWord[][];
|
|
19
|
+
/** Fired after every edit mutation (for persistence) */
|
|
20
|
+
onEditorStateChange?: (editedWords: EditableWord[], undoStack: EditableWord[][]) => void;
|
|
21
|
+
/** Fired when the hasEdits flag changes */
|
|
22
|
+
onHasEditsChange?: (hasEdits: boolean) => void;
|
|
23
|
+
/** Fired when the cursor moves (start time of the cursor word in ms, or null) */
|
|
24
|
+
onCursorTimestampChange?: (timestampMs: number | null) => void;
|
|
25
|
+
/** Fired whenever the edited words change — lets the host build raw-data views */
|
|
26
|
+
onEditedWordsRender?: (editedWords: EditableWord[]) => void;
|
|
27
|
+
/** Optional ref to the internal MediaPlayer (host escape hatch, e.g. thumbnail capture) */
|
|
28
|
+
playerRef?: React.Ref<MediaPlayerRef>;
|
|
29
|
+
/** Additional class name */
|
|
30
|
+
className?: string;
|
|
31
|
+
/**
|
|
32
|
+
* 'horizontal' (default): media stacked above the transcript.
|
|
33
|
+
* 'vertical': media and transcript side by side.
|
|
34
|
+
*/
|
|
35
|
+
splitLayout?: 'horizontal' | 'vertical';
|
|
36
|
+
}
|
|
37
|
+
declare const mediaEditorVariants: (props?: ({
|
|
38
|
+
splitLayout?: "horizontal" | "vertical" | null | undefined;
|
|
39
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
40
|
+
/**
|
|
41
|
+
* Media editor: MediaPlayer on top, an editable word-mode transcript below,
|
|
42
|
+
* and a toolbar with speed control, filler removal, and edit statistics.
|
|
43
|
+
*
|
|
44
|
+
* Interactions (ported from pulseclip's TranscriptViewer):
|
|
45
|
+
* - Click a word: seek and play just that word
|
|
46
|
+
* - Double-click: set a range anchor; click another word to select the range
|
|
47
|
+
* - Mouse-down + drag: select a range; long-press (500ms) opens the editor
|
|
48
|
+
* - Right-click: speed marker menu
|
|
49
|
+
* - Keyboard: arrows (+Shift to select), Home/End, Backspace/Delete toggle
|
|
50
|
+
* delete, Cmd/Ctrl+X/C/V cut/copy/paste, Cmd/Ctrl+Z undo, Space plays the
|
|
51
|
+
* edited timeline from the cursor, Enter opens the word editor
|
|
52
|
+
*/
|
|
53
|
+
declare const MediaEditor: React.ForwardRefExoticComponent<MediaEditorProps & React.RefAttributes<HTMLDivElement>>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* FillerWordsModal — select filler words (and long silences) to mark deleted.
|
|
57
|
+
*
|
|
58
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. Pure UI: match
|
|
59
|
+
* counts/durations come in via props (see useTranscriptEdits.fillerAnalysis);
|
|
60
|
+
* the selection is reported through onApply.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
interface FillerWordsModalProps {
|
|
64
|
+
isOpen: boolean;
|
|
65
|
+
onClose: () => void;
|
|
66
|
+
/** Apply removal: selected filler words + optional silence threshold (seconds) */
|
|
67
|
+
onApply: (fillerWords: string[], removeSilenceAboveSec: number | null) => void;
|
|
68
|
+
/** Occurrence count per normalized word */
|
|
69
|
+
matchingCounts: Map<string, number>;
|
|
70
|
+
/** Total duration (ms) per filler word */
|
|
71
|
+
fillerDurations: Map<string, number>;
|
|
72
|
+
/** Count and total duration of silences at each threshold */
|
|
73
|
+
silenceCounts: SilenceThresholdCount[];
|
|
74
|
+
/** Current total edited duration in ms */
|
|
75
|
+
currentDurationMs: number;
|
|
76
|
+
}
|
|
77
|
+
/** Modal for selecting filler words to remove from the edited transcript */
|
|
78
|
+
declare const FillerWordsModal: React.FC<FillerWordsModalProps>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* WordEditorModal — edit a word's text or split a silence into segments.
|
|
82
|
+
*
|
|
83
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. For silences,
|
|
84
|
+
* space-separated durations (e.g. "1 1 4 1") split the silence; the
|
|
85
|
+
* remainder becomes the final segment.
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
interface WordEditorModalProps {
|
|
89
|
+
isOpen: boolean;
|
|
90
|
+
editableWord: EditableWord | null;
|
|
91
|
+
onClose: () => void;
|
|
92
|
+
/** Save a new text for the word */
|
|
93
|
+
onSave: (newText: string) => void;
|
|
94
|
+
/** Split a silence into segments with the given durations (seconds) */
|
|
95
|
+
onSplitSilence: (durations: number[]) => void;
|
|
96
|
+
/** Toggle the word's deleted state */
|
|
97
|
+
onDelete: () => void;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Modal for editing a word or splitting a silence.
|
|
101
|
+
* For silences, enter space-separated durations (e.g., "1 1 4 1") to split.
|
|
102
|
+
*/
|
|
103
|
+
declare const WordEditorModal: React.FC<WordEditorModalProps>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* SilenceSettingsModal — configure silence detection thresholds.
|
|
107
|
+
*
|
|
108
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. The paragraph
|
|
109
|
+
* break threshold is clamped to be >= the minimum silence duration.
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
interface SilenceSettingsModalProps {
|
|
113
|
+
isOpen: boolean;
|
|
114
|
+
onClose: () => void;
|
|
115
|
+
/** Current minimum silence duration (ms) */
|
|
116
|
+
minSilenceMs: number;
|
|
117
|
+
/** Current paragraph break threshold (ms) */
|
|
118
|
+
nlSilenceMs: number;
|
|
119
|
+
/** Apply new thresholds (both in ms) */
|
|
120
|
+
onApply: (minSilenceMs: number, nlSilenceMs: number) => void;
|
|
121
|
+
}
|
|
122
|
+
/** Modal for configuring silence detection settings */
|
|
123
|
+
declare const SilenceSettingsModal: React.FC<SilenceSettingsModalProps>;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* SpeedMarkerMenu — context-menu popup for setting per-word speed markers.
|
|
127
|
+
*
|
|
128
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. Hand-built (plain
|
|
129
|
+
* elements + tokens): a positioned context menu has no @mieweb/ui primitive.
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
interface SpeedMarkerMenuProps {
|
|
133
|
+
isOpen: boolean;
|
|
134
|
+
/** Viewport coordinates for the menu (already clamped by the caller) */
|
|
135
|
+
position: {
|
|
136
|
+
x: number;
|
|
137
|
+
y: number;
|
|
138
|
+
} | null;
|
|
139
|
+
/** The edited-word index the menu applies to */
|
|
140
|
+
wordIndex: number | null;
|
|
141
|
+
/** Existing marker at that word, if any */
|
|
142
|
+
currentMarker: SpeedMarker | undefined;
|
|
143
|
+
defaultSpeed: PlaybackSpeed;
|
|
144
|
+
onSetSpeed: (speed: PlaybackSpeed) => void;
|
|
145
|
+
onRemoveMarker: () => void;
|
|
146
|
+
onClose: () => void;
|
|
147
|
+
}
|
|
148
|
+
/** Popup menu for setting speed markers on a word */
|
|
149
|
+
declare const SpeedMarkerMenu: React.FC<SpeedMarkerMenuProps>;
|
|
150
|
+
|
|
151
|
+
export { FillerWordsModal, type FillerWordsModalProps, MediaEditor, type MediaEditorProps, SilenceSettingsModal, type SilenceSettingsModalProps, SpeedMarkerMenu, type SpeedMarkerMenuProps, WordEditorModal, type WordEditorModalProps };
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import { T as Transcript, E as EditableWord, S as SpeedMarker, P as PlaybackSpeed } from '../../transcript-oaWqY3yr.js';
|
|
5
|
+
import { MediaKind, MediaPlayerRef } from '../MediaPlayer/index.js';
|
|
6
|
+
import { S as SilenceThresholdCount } from '../../useTranscriptEdits-CWYnjbGP.js';
|
|
7
|
+
|
|
8
|
+
interface MediaEditorProps extends VariantProps<typeof mediaEditorVariants> {
|
|
9
|
+
/** Media URL */
|
|
10
|
+
src: string;
|
|
11
|
+
/** Force the media kind; inferred from the src extension when omitted */
|
|
12
|
+
kind?: MediaKind;
|
|
13
|
+
/** The source transcript (canonical, immutable) */
|
|
14
|
+
transcript: Transcript;
|
|
15
|
+
/** Initial edited words (from saved edits) */
|
|
16
|
+
initialEditedWords?: EditableWord[];
|
|
17
|
+
/** Initial undo stack (from saved edits) */
|
|
18
|
+
initialUndoStack?: EditableWord[][];
|
|
19
|
+
/** Fired after every edit mutation (for persistence) */
|
|
20
|
+
onEditorStateChange?: (editedWords: EditableWord[], undoStack: EditableWord[][]) => void;
|
|
21
|
+
/** Fired when the hasEdits flag changes */
|
|
22
|
+
onHasEditsChange?: (hasEdits: boolean) => void;
|
|
23
|
+
/** Fired when the cursor moves (start time of the cursor word in ms, or null) */
|
|
24
|
+
onCursorTimestampChange?: (timestampMs: number | null) => void;
|
|
25
|
+
/** Fired whenever the edited words change — lets the host build raw-data views */
|
|
26
|
+
onEditedWordsRender?: (editedWords: EditableWord[]) => void;
|
|
27
|
+
/** Optional ref to the internal MediaPlayer (host escape hatch, e.g. thumbnail capture) */
|
|
28
|
+
playerRef?: React.Ref<MediaPlayerRef>;
|
|
29
|
+
/** Additional class name */
|
|
30
|
+
className?: string;
|
|
31
|
+
/**
|
|
32
|
+
* 'horizontal' (default): media stacked above the transcript.
|
|
33
|
+
* 'vertical': media and transcript side by side.
|
|
34
|
+
*/
|
|
35
|
+
splitLayout?: 'horizontal' | 'vertical';
|
|
36
|
+
}
|
|
37
|
+
declare const mediaEditorVariants: (props?: ({
|
|
38
|
+
splitLayout?: "horizontal" | "vertical" | null | undefined;
|
|
39
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
40
|
+
/**
|
|
41
|
+
* Media editor: MediaPlayer on top, an editable word-mode transcript below,
|
|
42
|
+
* and a toolbar with speed control, filler removal, and edit statistics.
|
|
43
|
+
*
|
|
44
|
+
* Interactions (ported from pulseclip's TranscriptViewer):
|
|
45
|
+
* - Click a word: seek and play just that word
|
|
46
|
+
* - Double-click: set a range anchor; click another word to select the range
|
|
47
|
+
* - Mouse-down + drag: select a range; long-press (500ms) opens the editor
|
|
48
|
+
* - Right-click: speed marker menu
|
|
49
|
+
* - Keyboard: arrows (+Shift to select), Home/End, Backspace/Delete toggle
|
|
50
|
+
* delete, Cmd/Ctrl+X/C/V cut/copy/paste, Cmd/Ctrl+Z undo, Space plays the
|
|
51
|
+
* edited timeline from the cursor, Enter opens the word editor
|
|
52
|
+
*/
|
|
53
|
+
declare const MediaEditor: React.ForwardRefExoticComponent<MediaEditorProps & React.RefAttributes<HTMLDivElement>>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* FillerWordsModal — select filler words (and long silences) to mark deleted.
|
|
57
|
+
*
|
|
58
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. Pure UI: match
|
|
59
|
+
* counts/durations come in via props (see useTranscriptEdits.fillerAnalysis);
|
|
60
|
+
* the selection is reported through onApply.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
interface FillerWordsModalProps {
|
|
64
|
+
isOpen: boolean;
|
|
65
|
+
onClose: () => void;
|
|
66
|
+
/** Apply removal: selected filler words + optional silence threshold (seconds) */
|
|
67
|
+
onApply: (fillerWords: string[], removeSilenceAboveSec: number | null) => void;
|
|
68
|
+
/** Occurrence count per normalized word */
|
|
69
|
+
matchingCounts: Map<string, number>;
|
|
70
|
+
/** Total duration (ms) per filler word */
|
|
71
|
+
fillerDurations: Map<string, number>;
|
|
72
|
+
/** Count and total duration of silences at each threshold */
|
|
73
|
+
silenceCounts: SilenceThresholdCount[];
|
|
74
|
+
/** Current total edited duration in ms */
|
|
75
|
+
currentDurationMs: number;
|
|
76
|
+
}
|
|
77
|
+
/** Modal for selecting filler words to remove from the edited transcript */
|
|
78
|
+
declare const FillerWordsModal: React.FC<FillerWordsModalProps>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* WordEditorModal — edit a word's text or split a silence into segments.
|
|
82
|
+
*
|
|
83
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. For silences,
|
|
84
|
+
* space-separated durations (e.g. "1 1 4 1") split the silence; the
|
|
85
|
+
* remainder becomes the final segment.
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
interface WordEditorModalProps {
|
|
89
|
+
isOpen: boolean;
|
|
90
|
+
editableWord: EditableWord | null;
|
|
91
|
+
onClose: () => void;
|
|
92
|
+
/** Save a new text for the word */
|
|
93
|
+
onSave: (newText: string) => void;
|
|
94
|
+
/** Split a silence into segments with the given durations (seconds) */
|
|
95
|
+
onSplitSilence: (durations: number[]) => void;
|
|
96
|
+
/** Toggle the word's deleted state */
|
|
97
|
+
onDelete: () => void;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Modal for editing a word or splitting a silence.
|
|
101
|
+
* For silences, enter space-separated durations (e.g., "1 1 4 1") to split.
|
|
102
|
+
*/
|
|
103
|
+
declare const WordEditorModal: React.FC<WordEditorModalProps>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* SilenceSettingsModal — configure silence detection thresholds.
|
|
107
|
+
*
|
|
108
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. The paragraph
|
|
109
|
+
* break threshold is clamped to be >= the minimum silence duration.
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
interface SilenceSettingsModalProps {
|
|
113
|
+
isOpen: boolean;
|
|
114
|
+
onClose: () => void;
|
|
115
|
+
/** Current minimum silence duration (ms) */
|
|
116
|
+
minSilenceMs: number;
|
|
117
|
+
/** Current paragraph break threshold (ms) */
|
|
118
|
+
nlSilenceMs: number;
|
|
119
|
+
/** Apply new thresholds (both in ms) */
|
|
120
|
+
onApply: (minSilenceMs: number, nlSilenceMs: number) => void;
|
|
121
|
+
}
|
|
122
|
+
/** Modal for configuring silence detection settings */
|
|
123
|
+
declare const SilenceSettingsModal: React.FC<SilenceSettingsModalProps>;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* SpeedMarkerMenu — context-menu popup for setting per-word speed markers.
|
|
127
|
+
*
|
|
128
|
+
* Ported from pulseclip's TranscriptViewer for @mieweb/ui. Hand-built (plain
|
|
129
|
+
* elements + tokens): a positioned context menu has no @mieweb/ui primitive.
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
interface SpeedMarkerMenuProps {
|
|
133
|
+
isOpen: boolean;
|
|
134
|
+
/** Viewport coordinates for the menu (already clamped by the caller) */
|
|
135
|
+
position: {
|
|
136
|
+
x: number;
|
|
137
|
+
y: number;
|
|
138
|
+
} | null;
|
|
139
|
+
/** The edited-word index the menu applies to */
|
|
140
|
+
wordIndex: number | null;
|
|
141
|
+
/** Existing marker at that word, if any */
|
|
142
|
+
currentMarker: SpeedMarker | undefined;
|
|
143
|
+
defaultSpeed: PlaybackSpeed;
|
|
144
|
+
onSetSpeed: (speed: PlaybackSpeed) => void;
|
|
145
|
+
onRemoveMarker: () => void;
|
|
146
|
+
onClose: () => void;
|
|
147
|
+
}
|
|
148
|
+
/** Popup menu for setting speed markers on a word */
|
|
149
|
+
declare const SpeedMarkerMenu: React.FC<SpeedMarkerMenuProps>;
|
|
150
|
+
|
|
151
|
+
export { FillerWordsModal, type FillerWordsModalProps, MediaEditor, type MediaEditorProps, SilenceSettingsModal, type SilenceSettingsModalProps, SpeedMarkerMenu, type SpeedMarkerMenuProps, WordEditorModal, type WordEditorModalProps };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { FillerWordsModal, MediaEditor, SilenceSettingsModal, SpeedMarkerMenu, WordEditorModal } from '../../chunk-CH26CHPH.js';
|
|
2
|
+
import '../../chunk-J7KWQJOB.js';
|
|
3
|
+
import '../../chunk-JBB25LFB.js';
|
|
4
|
+
import '../../chunk-FGP64Z24.js';
|
|
5
|
+
import '../../chunk-XCLQZ4FV.js';
|
|
6
|
+
import '../../chunk-R25H4N4Z.js';
|
|
7
|
+
import '../../chunk-IUFDGB5O.js';
|
|
8
|
+
import '../../chunk-PVUDXJAI.js';
|
|
9
|
+
import '../../chunk-ZVSW2KS6.js';
|
|
10
|
+
import '../../chunk-NTYGCBCL.js';
|
|
11
|
+
import '../../chunk-SQHMGT4W.js';
|
|
12
|
+
import '../../chunk-4SMSH4OY.js';
|
|
13
|
+
import '../../chunk-T4ME7QCT.js';
|
|
14
|
+
import '../../chunk-F3SOEIN2.js';
|
|
15
|
+
import '../../chunk-VSQF22GL.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('../../chunk-GLXTVCHN.cjs');
|
|
4
|
+
var chunkYD23ZGRU_cjs = require('../../chunk-YD23ZGRU.cjs');
|
|
5
|
+
require('../../chunk-A2QVQF54.cjs');
|
|
6
|
+
require('../../chunk-JYZW2PZS.cjs');
|
|
7
|
+
require('../../chunk-OR5DRJCW.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Object.defineProperty(exports, "MediaPlayer", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkYD23ZGRU_cjs.MediaPlayer; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "inferMediaKind", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkYD23ZGRU_cjs.inferMediaKind; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "mediaPlayerVariants", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkYD23ZGRU_cjs.mediaPlayerVariants; }
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=index.cjs.map
|
|
24
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
|
|
5
|
+
type MediaPlayerState = 'idle' | 'loading' | 'playing' | 'paused' | 'error';
|
|
6
|
+
type MediaKind = 'video' | 'audio';
|
|
7
|
+
/** Ref handle for controlling {@link MediaPlayer} programmatically. */
|
|
8
|
+
interface MediaPlayerRef {
|
|
9
|
+
/** Seek to a specific time in milliseconds. */
|
|
10
|
+
seekToMs: (timeMs: number) => void;
|
|
11
|
+
/** Start playback. */
|
|
12
|
+
play: () => void;
|
|
13
|
+
/** Pause playback. */
|
|
14
|
+
pause: () => void;
|
|
15
|
+
/** Get current playback time in milliseconds. */
|
|
16
|
+
getCurrentTimeMs: () => number;
|
|
17
|
+
/** Get total duration in milliseconds. */
|
|
18
|
+
getDurationMs: () => number;
|
|
19
|
+
/** Whether playback is currently paused. */
|
|
20
|
+
isPaused: () => boolean;
|
|
21
|
+
/** Set playback speed multiplier. */
|
|
22
|
+
setPlaybackRate: (rate: number) => void;
|
|
23
|
+
/**
|
|
24
|
+
* The underlying media element.
|
|
25
|
+
* Escape hatch for host integrations (e.g. thumbnail capture); prefer the
|
|
26
|
+
* typed methods above for playback control.
|
|
27
|
+
*/
|
|
28
|
+
mediaElement: HTMLVideoElement | HTMLAudioElement | null;
|
|
29
|
+
}
|
|
30
|
+
interface MediaPlayerProps extends VariantProps<typeof mediaPlayerVariants> {
|
|
31
|
+
/** Media source URL. */
|
|
32
|
+
src: string;
|
|
33
|
+
/** Force the media kind; when omitted it is inferred from the src extension. */
|
|
34
|
+
kind?: MediaKind;
|
|
35
|
+
/** Whether to show native controls (default `true`). */
|
|
36
|
+
controls?: boolean;
|
|
37
|
+
/** Callback when playback state changes. */
|
|
38
|
+
onStateChange?: (state: MediaPlayerState) => void;
|
|
39
|
+
/** Callback when playback ends. */
|
|
40
|
+
onEnded?: () => void;
|
|
41
|
+
/** Callback when an error occurs. */
|
|
42
|
+
onError?: (error: Error) => void;
|
|
43
|
+
/** Callback on time updates (milliseconds). */
|
|
44
|
+
onTimeUpdate?: (currentTimeMs: number, durationMs: number) => void;
|
|
45
|
+
/** Additional class name. */
|
|
46
|
+
className?: string;
|
|
47
|
+
/** Accessible label for the media element. */
|
|
48
|
+
'aria-label'?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Transitional: exposes the raw media element to legacy consumers.
|
|
51
|
+
* Prefer {@link MediaPlayerRef} for playback control.
|
|
52
|
+
*/
|
|
53
|
+
mediaElementRef?: React.RefObject<HTMLVideoElement | HTMLAudioElement | null>;
|
|
54
|
+
}
|
|
55
|
+
declare const mediaPlayerVariants: (props?: ({
|
|
56
|
+
variant?: "card" | "plain" | null | undefined;
|
|
57
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
58
|
+
/** Infer media kind from a URL's file extension; defaults to audio. */
|
|
59
|
+
declare function inferMediaKind(src: string): MediaKind;
|
|
60
|
+
/**
|
|
61
|
+
* Media playback surface for audio and video with a shared imperative handle.
|
|
62
|
+
*
|
|
63
|
+
* Renders a native `<video>` or `<audio>` element (kind inferred from the src
|
|
64
|
+
* extension unless forced) with themed error/retry handling. Playback state and
|
|
65
|
+
* controls come from the shared {@link useMediaTransport} hook and are exposed
|
|
66
|
+
* through {@link MediaPlayerRef} (all times in milliseconds) — consumers should
|
|
67
|
+
* not reach into the DOM element directly.
|
|
68
|
+
*/
|
|
69
|
+
declare const MediaPlayer: React.ForwardRefExoticComponent<MediaPlayerProps & React.RefAttributes<MediaPlayerRef>>;
|
|
70
|
+
|
|
71
|
+
export { type MediaKind, MediaPlayer, type MediaPlayerProps, type MediaPlayerRef, type MediaPlayerState, inferMediaKind, mediaPlayerVariants };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
|
|
5
|
+
type MediaPlayerState = 'idle' | 'loading' | 'playing' | 'paused' | 'error';
|
|
6
|
+
type MediaKind = 'video' | 'audio';
|
|
7
|
+
/** Ref handle for controlling {@link MediaPlayer} programmatically. */
|
|
8
|
+
interface MediaPlayerRef {
|
|
9
|
+
/** Seek to a specific time in milliseconds. */
|
|
10
|
+
seekToMs: (timeMs: number) => void;
|
|
11
|
+
/** Start playback. */
|
|
12
|
+
play: () => void;
|
|
13
|
+
/** Pause playback. */
|
|
14
|
+
pause: () => void;
|
|
15
|
+
/** Get current playback time in milliseconds. */
|
|
16
|
+
getCurrentTimeMs: () => number;
|
|
17
|
+
/** Get total duration in milliseconds. */
|
|
18
|
+
getDurationMs: () => number;
|
|
19
|
+
/** Whether playback is currently paused. */
|
|
20
|
+
isPaused: () => boolean;
|
|
21
|
+
/** Set playback speed multiplier. */
|
|
22
|
+
setPlaybackRate: (rate: number) => void;
|
|
23
|
+
/**
|
|
24
|
+
* The underlying media element.
|
|
25
|
+
* Escape hatch for host integrations (e.g. thumbnail capture); prefer the
|
|
26
|
+
* typed methods above for playback control.
|
|
27
|
+
*/
|
|
28
|
+
mediaElement: HTMLVideoElement | HTMLAudioElement | null;
|
|
29
|
+
}
|
|
30
|
+
interface MediaPlayerProps extends VariantProps<typeof mediaPlayerVariants> {
|
|
31
|
+
/** Media source URL. */
|
|
32
|
+
src: string;
|
|
33
|
+
/** Force the media kind; when omitted it is inferred from the src extension. */
|
|
34
|
+
kind?: MediaKind;
|
|
35
|
+
/** Whether to show native controls (default `true`). */
|
|
36
|
+
controls?: boolean;
|
|
37
|
+
/** Callback when playback state changes. */
|
|
38
|
+
onStateChange?: (state: MediaPlayerState) => void;
|
|
39
|
+
/** Callback when playback ends. */
|
|
40
|
+
onEnded?: () => void;
|
|
41
|
+
/** Callback when an error occurs. */
|
|
42
|
+
onError?: (error: Error) => void;
|
|
43
|
+
/** Callback on time updates (milliseconds). */
|
|
44
|
+
onTimeUpdate?: (currentTimeMs: number, durationMs: number) => void;
|
|
45
|
+
/** Additional class name. */
|
|
46
|
+
className?: string;
|
|
47
|
+
/** Accessible label for the media element. */
|
|
48
|
+
'aria-label'?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Transitional: exposes the raw media element to legacy consumers.
|
|
51
|
+
* Prefer {@link MediaPlayerRef} for playback control.
|
|
52
|
+
*/
|
|
53
|
+
mediaElementRef?: React.RefObject<HTMLVideoElement | HTMLAudioElement | null>;
|
|
54
|
+
}
|
|
55
|
+
declare const mediaPlayerVariants: (props?: ({
|
|
56
|
+
variant?: "card" | "plain" | null | undefined;
|
|
57
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
58
|
+
/** Infer media kind from a URL's file extension; defaults to audio. */
|
|
59
|
+
declare function inferMediaKind(src: string): MediaKind;
|
|
60
|
+
/**
|
|
61
|
+
* Media playback surface for audio and video with a shared imperative handle.
|
|
62
|
+
*
|
|
63
|
+
* Renders a native `<video>` or `<audio>` element (kind inferred from the src
|
|
64
|
+
* extension unless forced) with themed error/retry handling. Playback state and
|
|
65
|
+
* controls come from the shared {@link useMediaTransport} hook and are exposed
|
|
66
|
+
* through {@link MediaPlayerRef} (all times in milliseconds) — consumers should
|
|
67
|
+
* not reach into the DOM element directly.
|
|
68
|
+
*/
|
|
69
|
+
declare const MediaPlayer: React.ForwardRefExoticComponent<MediaPlayerProps & React.RefAttributes<MediaPlayerRef>>;
|
|
70
|
+
|
|
71
|
+
export { type MediaKind, MediaPlayer, type MediaPlayerProps, type MediaPlayerRef, type MediaPlayerState, inferMediaKind, mediaPlayerVariants };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import '../../chunk-RISZWWEQ.js';
|
|
2
|
+
export { MediaPlayer, inferMediaKind, mediaPlayerVariants } from '../../chunk-FGP64Z24.js';
|
|
3
|
+
import '../../chunk-ZVSW2KS6.js';
|
|
4
|
+
import '../../chunk-SQHMGT4W.js';
|
|
5
|
+
import '../../chunk-F3SOEIN2.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUO3KEUYK_cjs = require('../../chunk-UO3KEUYK.cjs');
|
|
4
|
+
var chunkS7JQ3FV5_cjs = require('../../chunk-S7JQ3FV5.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "TranscriptView", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkUO3KEUYK_cjs.TranscriptView; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "formatTimestampMs", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunkUO3KEUYK_cjs.formatTimestampMs; }
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(exports, "PLAYBACK_SPEEDS", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return chunkS7JQ3FV5_cjs.PLAYBACK_SPEEDS; }
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=index.cjs.map
|
|
21
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import { T as Transcript } from '../../transcript-oaWqY3yr.cjs';
|
|
5
|
+
export { E as EditableWord, c as PLAYBACK_SPEEDS, a as PlaybackSegment, P as PlaybackSpeed, d as Speaker, S as SpeedMarker, e as TranscriptSegment, b as TranscriptWord, W as WordType } from '../../transcript-oaWqY3yr.cjs';
|
|
6
|
+
|
|
7
|
+
type TranscriptGranularity = 'word' | 'segment';
|
|
8
|
+
interface TranscriptViewProps extends VariantProps<typeof transcriptViewVariants> {
|
|
9
|
+
/** The transcript to render */
|
|
10
|
+
transcript: Transcript;
|
|
11
|
+
/**
|
|
12
|
+
* Rendering granularity. Defaults to 'segment' when the transcript has
|
|
13
|
+
* segments, otherwise 'word'.
|
|
14
|
+
*/
|
|
15
|
+
granularity?: TranscriptGranularity;
|
|
16
|
+
/** Controlled playback position (ms); the matching word/segment is highlighted */
|
|
17
|
+
currentTimeMs?: number;
|
|
18
|
+
/** Called with the start time (ms) of a clicked word/segment; the host performs the seek/play */
|
|
19
|
+
onSeek?: (timeMs: number) => void;
|
|
20
|
+
/** Auto-scroll the active word/segment into view (default true) */
|
|
21
|
+
followPlayback?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Maps Speaker.id to a display label (e.g. Clinician/Patient). Falls back to
|
|
24
|
+
* Speaker.name from transcript.speakers, then the raw id.
|
|
25
|
+
*/
|
|
26
|
+
speakerLabels?: Record<string, string>;
|
|
27
|
+
/** Segment mode: merge consecutive same-speaker segments into one row (default false) */
|
|
28
|
+
mergeSameSpeaker?: boolean;
|
|
29
|
+
/** Segment mode: show mm:ss timestamps (default true) */
|
|
30
|
+
showTimestamps?: boolean;
|
|
31
|
+
/** Rendered in a header row (host supplies copy/re-transcribe/remove buttons) */
|
|
32
|
+
actions?: React.ReactNode;
|
|
33
|
+
/** Additional class name */
|
|
34
|
+
className?: string;
|
|
35
|
+
/** Accessible label for the transcript container (default 'Transcript') */
|
|
36
|
+
'aria-label'?: string;
|
|
37
|
+
}
|
|
38
|
+
declare const transcriptViewVariants: (props?: ({
|
|
39
|
+
variant?: "card" | "plain" | null | undefined;
|
|
40
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
41
|
+
/** Format milliseconds as m:ss (osheet timestamp style) */
|
|
42
|
+
declare function formatTimestampMs(ms: number): string;
|
|
43
|
+
/**
|
|
44
|
+
* Read-only transcript viewer with word-level and segment-level (diarized)
|
|
45
|
+
* rendering modes.
|
|
46
|
+
*
|
|
47
|
+
* Controlled and persistence-agnostic: the host owns playback and passes the
|
|
48
|
+
* position via `currentTimeMs`; clicking a word/segment reports the target
|
|
49
|
+
* time through `onSeek`. Segment mode matches the osheet artifact-viewer row
|
|
50
|
+
* UX (timestamp | speaker | text, click to seek + play). Editing lives in
|
|
51
|
+
* MediaEditor, not here.
|
|
52
|
+
*/
|
|
53
|
+
declare const TranscriptView: React.ForwardRefExoticComponent<TranscriptViewProps & React.RefAttributes<HTMLDivElement>>;
|
|
54
|
+
|
|
55
|
+
export { Transcript, type TranscriptGranularity, TranscriptView, type TranscriptViewProps, formatTimestampMs };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import { T as Transcript } from '../../transcript-oaWqY3yr.js';
|
|
5
|
+
export { E as EditableWord, c as PLAYBACK_SPEEDS, a as PlaybackSegment, P as PlaybackSpeed, d as Speaker, S as SpeedMarker, e as TranscriptSegment, b as TranscriptWord, W as WordType } from '../../transcript-oaWqY3yr.js';
|
|
6
|
+
|
|
7
|
+
type TranscriptGranularity = 'word' | 'segment';
|
|
8
|
+
interface TranscriptViewProps extends VariantProps<typeof transcriptViewVariants> {
|
|
9
|
+
/** The transcript to render */
|
|
10
|
+
transcript: Transcript;
|
|
11
|
+
/**
|
|
12
|
+
* Rendering granularity. Defaults to 'segment' when the transcript has
|
|
13
|
+
* segments, otherwise 'word'.
|
|
14
|
+
*/
|
|
15
|
+
granularity?: TranscriptGranularity;
|
|
16
|
+
/** Controlled playback position (ms); the matching word/segment is highlighted */
|
|
17
|
+
currentTimeMs?: number;
|
|
18
|
+
/** Called with the start time (ms) of a clicked word/segment; the host performs the seek/play */
|
|
19
|
+
onSeek?: (timeMs: number) => void;
|
|
20
|
+
/** Auto-scroll the active word/segment into view (default true) */
|
|
21
|
+
followPlayback?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Maps Speaker.id to a display label (e.g. Clinician/Patient). Falls back to
|
|
24
|
+
* Speaker.name from transcript.speakers, then the raw id.
|
|
25
|
+
*/
|
|
26
|
+
speakerLabels?: Record<string, string>;
|
|
27
|
+
/** Segment mode: merge consecutive same-speaker segments into one row (default false) */
|
|
28
|
+
mergeSameSpeaker?: boolean;
|
|
29
|
+
/** Segment mode: show mm:ss timestamps (default true) */
|
|
30
|
+
showTimestamps?: boolean;
|
|
31
|
+
/** Rendered in a header row (host supplies copy/re-transcribe/remove buttons) */
|
|
32
|
+
actions?: React.ReactNode;
|
|
33
|
+
/** Additional class name */
|
|
34
|
+
className?: string;
|
|
35
|
+
/** Accessible label for the transcript container (default 'Transcript') */
|
|
36
|
+
'aria-label'?: string;
|
|
37
|
+
}
|
|
38
|
+
declare const transcriptViewVariants: (props?: ({
|
|
39
|
+
variant?: "card" | "plain" | null | undefined;
|
|
40
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
41
|
+
/** Format milliseconds as m:ss (osheet timestamp style) */
|
|
42
|
+
declare function formatTimestampMs(ms: number): string;
|
|
43
|
+
/**
|
|
44
|
+
* Read-only transcript viewer with word-level and segment-level (diarized)
|
|
45
|
+
* rendering modes.
|
|
46
|
+
*
|
|
47
|
+
* Controlled and persistence-agnostic: the host owns playback and passes the
|
|
48
|
+
* position via `currentTimeMs`; clicking a word/segment reports the target
|
|
49
|
+
* time through `onSeek`. Segment mode matches the osheet artifact-viewer row
|
|
50
|
+
* UX (timestamp | speaker | text, click to seek + play). Editing lives in
|
|
51
|
+
* MediaEditor, not here.
|
|
52
|
+
*/
|
|
53
|
+
declare const TranscriptView: React.ForwardRefExoticComponent<TranscriptViewProps & React.RefAttributes<HTMLDivElement>>;
|
|
54
|
+
|
|
55
|
+
export { Transcript, type TranscriptGranularity, TranscriptView, type TranscriptViewProps, formatTimestampMs };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|