dictate-button 1.7.0 → 1.9.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/README.md +13 -15
- package/dist/dictate-button.d.ts +0 -1
- package/dist/dictate-button.js +265 -279
- package/dist/dictate-button.test.d.ts +0 -0
- package/dist/inject-exclusive.d.ts +0 -1
- package/dist/inject-exclusive.js +1 -0
- package/dist/inject-inclusive.d.ts +0 -1
- package/dist/inject-inclusive.js +1 -0
- package/package.json +15 -7
package/README.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
# Dictate Button
|
|
1
|
+
# Dictate Button
|
|
2
2
|

|
|
3
|
+
[](https://github.com/dictate-button/dictate-button/actions/workflows/test.yml)
|
|
3
4
|
|
|
4
5
|
A customizable web component that adds speech-to-text dictation capabilities to any text input, textarea field, or contenteditable element on your website.
|
|
5
6
|
|
|
@@ -46,10 +47,9 @@ Both auto-inject modes:
|
|
|
46
47
|
|
|
47
48
|
#### Option 1: Using the exclusive auto-inject script
|
|
48
49
|
|
|
49
|
-
In your HTML `<head>` tag, add the following script
|
|
50
|
+
In your HTML `<head>` tag, add the following script tag:
|
|
50
51
|
|
|
51
52
|
```html
|
|
52
|
-
<script type="module" crossorigin src="https://cdn.dictate-button.io/dictate-button.js"></script>
|
|
53
53
|
<script type="module" crossorigin src="https://cdn.dictate-button.io/inject-exclusive.js"></script>
|
|
54
54
|
```
|
|
55
55
|
|
|
@@ -65,10 +65,9 @@ Add the `data-dictate-button-on` attribute to any `textarea`, `input[type="text"
|
|
|
65
65
|
|
|
66
66
|
#### Option 2: Using the inclusive auto-inject script
|
|
67
67
|
|
|
68
|
-
In your HTML `<head>` tag, add the following script
|
|
68
|
+
In your HTML `<head>` tag, add the following script tag:
|
|
69
69
|
|
|
70
70
|
```html
|
|
71
|
-
<script type="module" crossorigin src="https://cdn.dictate-button.io/dictate-button.js"></script>
|
|
72
71
|
<script type="module" crossorigin src="https://cdn.dictate-button.io/inject-inclusive.js"></script>
|
|
73
72
|
```
|
|
74
73
|
|
|
@@ -96,15 +95,7 @@ Import the component and use it directly in your code:
|
|
|
96
95
|
|
|
97
96
|
### From NPM
|
|
98
97
|
|
|
99
|
-
Import once for your app
|
|
100
|
-
|
|
101
|
-
The button component:
|
|
102
|
-
|
|
103
|
-
```js
|
|
104
|
-
import 'dictate-button'
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
The auto-inject script:
|
|
98
|
+
Import once for your app:
|
|
108
99
|
|
|
109
100
|
```js
|
|
110
101
|
// For selected text fields (with data-dictate-button-on attribute):
|
|
@@ -123,6 +114,7 @@ Tip: You can also import from subpaths (e.g., 'dictate-button/libs/injectDictate
|
|
|
123
114
|
for smaller bundles, if your bundler resolves package subpath exports.
|
|
124
115
|
|
|
125
116
|
```js
|
|
117
|
+
import 'dictate-button' // Required when using library functions directly
|
|
126
118
|
import { injectDictateButton, injectDictateButtonOnLoad } from 'dictate-button/libs'
|
|
127
119
|
|
|
128
120
|
// Inject dictate buttons immediately to matching elements
|
|
@@ -162,6 +154,12 @@ The dictate-button component emits the following events:
|
|
|
162
154
|
- `transcribing:finished`: Fired when transcribing is complete. The event detail contains the transcribed text.
|
|
163
155
|
- `transcribing:failed`: Fired when an error occurs during transcribing.
|
|
164
156
|
|
|
157
|
+
The ideal scenario is when user first starts recording (`recording:started`), then stops recording (`recording:stopped`), then the recorded audio is sent to the server for processing (`transcribing:started`), and finally the transcribed text is received (`transcribing:finished`).
|
|
158
|
+
|
|
159
|
+
> recording:started -> recording:stopped -> transcribing:started -> transcribing:finished
|
|
160
|
+
|
|
161
|
+
In case of an error in recording or transcribing, the `recording:failed` or `transcribing:failed` event is fired, respectively.
|
|
162
|
+
|
|
165
163
|
Example event handling:
|
|
166
164
|
|
|
167
165
|
```javascript
|
|
@@ -215,7 +213,7 @@ You can specify your own endpoint by setting the `apiEndpoint` attribute.
|
|
|
215
213
|
The API expects:
|
|
216
214
|
- POST request
|
|
217
215
|
- Multipart form data with the following fields:
|
|
218
|
-
- `audio`: Audio data as a
|
|
216
|
+
- `audio`: Audio data as a File (audio/webm format)
|
|
219
217
|
- `origin`: The origin of the website (automatically added)
|
|
220
218
|
- `language`: Optional language code (if provided as an attribute)
|
|
221
219
|
- Response should be JSON with a `text` property containing the transcribed text
|
package/dist/dictate-button.d.ts
CHANGED
package/dist/dictate-button.js
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
const
|
|
2
|
-
equals:
|
|
1
|
+
const St = (t, n) => t === n, I = {
|
|
2
|
+
equals: St
|
|
3
3
|
};
|
|
4
|
-
let pt =
|
|
5
|
-
const
|
|
4
|
+
let pt = _t;
|
|
5
|
+
const x = 1, N = 2, ht = {
|
|
6
6
|
owned: null,
|
|
7
7
|
cleanups: null,
|
|
8
8
|
context: null,
|
|
9
9
|
owner: null
|
|
10
10
|
};
|
|
11
|
-
var
|
|
12
|
-
let
|
|
11
|
+
var b = null;
|
|
12
|
+
let W = null, xt = null, g = null, w = null, E = null, z = 0;
|
|
13
13
|
function At(t, n) {
|
|
14
|
-
const e = g,
|
|
14
|
+
const e = g, o = b, r = t.length === 0, i = n === void 0 ? o : n, l = r ? ht : {
|
|
15
15
|
owned: null,
|
|
16
16
|
cleanups: null,
|
|
17
17
|
context: i ? i.context : null,
|
|
18
18
|
owner: i
|
|
19
|
-
}, s =
|
|
20
|
-
|
|
19
|
+
}, s = r ? t : () => t(() => V(() => L(l)));
|
|
20
|
+
b = l, g = null;
|
|
21
21
|
try {
|
|
22
|
-
return
|
|
22
|
+
return M(s, !0);
|
|
23
23
|
} finally {
|
|
24
|
-
g = e,
|
|
24
|
+
g = e, b = o;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
function gt(t, n) {
|
|
28
|
-
n = n ? Object.assign({},
|
|
28
|
+
n = n ? Object.assign({}, I, n) : I;
|
|
29
29
|
const e = {
|
|
30
30
|
value: t,
|
|
31
31
|
observers: null,
|
|
32
32
|
observerSlots: null,
|
|
33
33
|
comparator: n.equals || void 0
|
|
34
|
-
},
|
|
35
|
-
return [bt.bind(e),
|
|
34
|
+
}, o = (r) => (typeof r == "function" && (r = r(e.value)), yt(e, r));
|
|
35
|
+
return [bt.bind(e), o];
|
|
36
36
|
}
|
|
37
37
|
function D(t, n, e) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
function Tt(t, n, e) {
|
|
42
|
-
pt = Ot;
|
|
43
|
-
const r = Z(t, n, !1, S);
|
|
44
|
-
r.user = !0, E ? E.push(r) : L(r);
|
|
38
|
+
const o = Z(t, n, !1, x);
|
|
39
|
+
$(o);
|
|
45
40
|
}
|
|
46
41
|
function kt(t, n, e) {
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
|
|
42
|
+
pt = Mt;
|
|
43
|
+
const o = Z(t, n, !1, x);
|
|
44
|
+
o.user = !0, E ? E.push(o) : $(o);
|
|
45
|
+
}
|
|
46
|
+
function Tt(t, n, e) {
|
|
47
|
+
e = e ? Object.assign({}, I, e) : I;
|
|
48
|
+
const o = Z(t, n, !0, 0);
|
|
49
|
+
return o.observers = null, o.observerSlots = null, o.comparator = e.equals || void 0, $(o), bt.bind(o);
|
|
50
50
|
}
|
|
51
|
-
function
|
|
51
|
+
function V(t) {
|
|
52
52
|
if (g === null) return t();
|
|
53
53
|
const n = g;
|
|
54
54
|
g = null;
|
|
@@ -59,14 +59,14 @@ function z(t) {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
function Pt(t) {
|
|
62
|
-
return
|
|
62
|
+
return b === null || (b.cleanups === null ? b.cleanups = [t] : b.cleanups.push(t)), t;
|
|
63
63
|
}
|
|
64
64
|
function bt() {
|
|
65
65
|
if (this.sources && this.state)
|
|
66
|
-
if (this.state ===
|
|
66
|
+
if (this.state === x) $(this);
|
|
67
67
|
else {
|
|
68
|
-
const t =
|
|
69
|
-
|
|
68
|
+
const t = w;
|
|
69
|
+
w = null, M(() => K(this), !1), w = t;
|
|
70
70
|
}
|
|
71
71
|
if (g) {
|
|
72
72
|
const t = this.observers ? this.observers.length : 0;
|
|
@@ -75,125 +75,125 @@ function bt() {
|
|
|
75
75
|
return this.value;
|
|
76
76
|
}
|
|
77
77
|
function yt(t, n, e) {
|
|
78
|
-
let
|
|
79
|
-
return (!t.comparator || !t.comparator(
|
|
80
|
-
for (let
|
|
81
|
-
const i = t.observers[
|
|
82
|
-
l &&
|
|
78
|
+
let o = t.value;
|
|
79
|
+
return (!t.comparator || !t.comparator(o, n)) && (t.value = n, t.observers && t.observers.length && M(() => {
|
|
80
|
+
for (let r = 0; r < t.observers.length; r += 1) {
|
|
81
|
+
const i = t.observers[r], l = W && W.running;
|
|
82
|
+
l && W.disposed.has(i), (l ? !i.tState : !i.state) && (i.pure ? w.push(i) : E.push(i), i.observers && wt(i)), l || (i.state = x);
|
|
83
83
|
}
|
|
84
|
-
if (
|
|
85
|
-
throw
|
|
84
|
+
if (w.length > 1e6)
|
|
85
|
+
throw w = [], new Error();
|
|
86
86
|
}, !1)), n;
|
|
87
87
|
}
|
|
88
|
-
function
|
|
88
|
+
function $(t) {
|
|
89
89
|
if (!t.fn) return;
|
|
90
|
-
|
|
91
|
-
const n =
|
|
92
|
-
|
|
90
|
+
L(t);
|
|
91
|
+
const n = z;
|
|
92
|
+
Lt(t, t.value, n);
|
|
93
93
|
}
|
|
94
|
-
function
|
|
95
|
-
let
|
|
96
|
-
const
|
|
97
|
-
g =
|
|
94
|
+
function Lt(t, n, e) {
|
|
95
|
+
let o;
|
|
96
|
+
const r = b, i = g;
|
|
97
|
+
g = b = t;
|
|
98
98
|
try {
|
|
99
|
-
|
|
99
|
+
o = t.fn(n);
|
|
100
100
|
} catch (l) {
|
|
101
|
-
return t.pure && (t.state =
|
|
101
|
+
return t.pure && (t.state = x, t.owned && t.owned.forEach(L), t.owned = null), t.updatedAt = e + 1, vt(l);
|
|
102
102
|
} finally {
|
|
103
|
-
g = i,
|
|
103
|
+
g = i, b = r;
|
|
104
104
|
}
|
|
105
|
-
(!t.updatedAt || t.updatedAt <= e) && (t.updatedAt != null && "observers" in t ? yt(t,
|
|
105
|
+
(!t.updatedAt || t.updatedAt <= e) && (t.updatedAt != null && "observers" in t ? yt(t, o) : t.value = o, t.updatedAt = e);
|
|
106
106
|
}
|
|
107
|
-
function Z(t, n, e,
|
|
107
|
+
function Z(t, n, e, o = x, r) {
|
|
108
108
|
const i = {
|
|
109
109
|
fn: t,
|
|
110
|
-
state:
|
|
110
|
+
state: o,
|
|
111
111
|
updatedAt: null,
|
|
112
112
|
owned: null,
|
|
113
113
|
sources: null,
|
|
114
114
|
sourceSlots: null,
|
|
115
115
|
cleanups: null,
|
|
116
116
|
value: n,
|
|
117
|
-
owner:
|
|
118
|
-
context:
|
|
117
|
+
owner: b,
|
|
118
|
+
context: b ? b.context : null,
|
|
119
119
|
pure: e
|
|
120
120
|
};
|
|
121
|
-
return
|
|
121
|
+
return b === null || b !== ht && (b.owned ? b.owned.push(i) : b.owned = [i]), i;
|
|
122
122
|
}
|
|
123
123
|
function F(t) {
|
|
124
124
|
if (t.state === 0) return;
|
|
125
|
-
if (t.state ===
|
|
126
|
-
if (t.suspense &&
|
|
125
|
+
if (t.state === N) return K(t);
|
|
126
|
+
if (t.suspense && V(t.suspense.inFallback)) return t.suspense.effects.push(t);
|
|
127
127
|
const n = [t];
|
|
128
|
-
for (; (t = t.owner) && (!t.updatedAt || t.updatedAt <
|
|
128
|
+
for (; (t = t.owner) && (!t.updatedAt || t.updatedAt < z); )
|
|
129
129
|
t.state && n.push(t);
|
|
130
130
|
for (let e = n.length - 1; e >= 0; e--)
|
|
131
|
-
if (t = n[e], t.state ===
|
|
132
|
-
|
|
133
|
-
else if (t.state ===
|
|
134
|
-
const
|
|
135
|
-
|
|
131
|
+
if (t = n[e], t.state === x)
|
|
132
|
+
$(t);
|
|
133
|
+
else if (t.state === N) {
|
|
134
|
+
const o = w;
|
|
135
|
+
w = null, M(() => K(t, n[0]), !1), w = o;
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
|
-
function
|
|
139
|
-
if (
|
|
138
|
+
function M(t, n) {
|
|
139
|
+
if (w) return t();
|
|
140
140
|
let e = !1;
|
|
141
|
-
n || (
|
|
141
|
+
n || (w = []), E ? e = !0 : E = [], z++;
|
|
142
142
|
try {
|
|
143
|
-
const
|
|
144
|
-
return
|
|
145
|
-
} catch (
|
|
146
|
-
e || (E = null),
|
|
143
|
+
const o = t();
|
|
144
|
+
return $t(e), o;
|
|
145
|
+
} catch (o) {
|
|
146
|
+
e || (E = null), w = null, vt(o);
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
|
-
function
|
|
150
|
-
if (
|
|
149
|
+
function $t(t) {
|
|
150
|
+
if (w && (_t(w), w = null), t) return;
|
|
151
151
|
const n = E;
|
|
152
|
-
E = null, n.length &&
|
|
152
|
+
E = null, n.length && M(() => pt(n), !1);
|
|
153
153
|
}
|
|
154
|
-
function
|
|
154
|
+
function _t(t) {
|
|
155
155
|
for (let n = 0; n < t.length; n++) F(t[n]);
|
|
156
156
|
}
|
|
157
|
-
function
|
|
157
|
+
function Mt(t) {
|
|
158
158
|
let n, e = 0;
|
|
159
159
|
for (n = 0; n < t.length; n++) {
|
|
160
|
-
const
|
|
161
|
-
|
|
160
|
+
const o = t[n];
|
|
161
|
+
o.user ? t[e++] = o : F(o);
|
|
162
162
|
}
|
|
163
163
|
for (n = 0; n < e; n++) F(t[n]);
|
|
164
164
|
}
|
|
165
165
|
function K(t, n) {
|
|
166
166
|
t.state = 0;
|
|
167
167
|
for (let e = 0; e < t.sources.length; e += 1) {
|
|
168
|
-
const
|
|
169
|
-
if (
|
|
170
|
-
const
|
|
171
|
-
|
|
168
|
+
const o = t.sources[e];
|
|
169
|
+
if (o.sources) {
|
|
170
|
+
const r = o.state;
|
|
171
|
+
r === x ? o !== n && (!o.updatedAt || o.updatedAt < z) && F(o) : r === N && K(o, n);
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
|
-
function
|
|
175
|
+
function wt(t) {
|
|
176
176
|
for (let n = 0; n < t.observers.length; n += 1) {
|
|
177
177
|
const e = t.observers[n];
|
|
178
|
-
e.state || (e.state =
|
|
178
|
+
e.state || (e.state = N, e.pure ? w.push(e) : E.push(e), e.observers && wt(e));
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
|
-
function
|
|
181
|
+
function L(t) {
|
|
182
182
|
let n;
|
|
183
183
|
if (t.sources)
|
|
184
184
|
for (; t.sources.length; ) {
|
|
185
|
-
const e = t.sources.pop(),
|
|
186
|
-
if (
|
|
187
|
-
const i =
|
|
188
|
-
|
|
185
|
+
const e = t.sources.pop(), o = t.sourceSlots.pop(), r = e.observers;
|
|
186
|
+
if (r && r.length) {
|
|
187
|
+
const i = r.pop(), l = e.observerSlots.pop();
|
|
188
|
+
o < r.length && (i.sourceSlots[l] = o, r[o] = i, e.observerSlots[o] = l);
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
if (t.tOwned) {
|
|
192
|
-
for (n = t.tOwned.length - 1; n >= 0; n--)
|
|
192
|
+
for (n = t.tOwned.length - 1; n >= 0; n--) L(t.tOwned[n]);
|
|
193
193
|
delete t.tOwned;
|
|
194
194
|
}
|
|
195
195
|
if (t.owned) {
|
|
196
|
-
for (n = t.owned.length - 1; n >= 0; n--)
|
|
196
|
+
for (n = t.owned.length - 1; n >= 0; n--) L(t.owned[n]);
|
|
197
197
|
t.owned = null;
|
|
198
198
|
}
|
|
199
199
|
if (t.cleanups) {
|
|
@@ -202,47 +202,47 @@ function $(t) {
|
|
|
202
202
|
}
|
|
203
203
|
t.state = 0;
|
|
204
204
|
}
|
|
205
|
-
function
|
|
205
|
+
function Ot(t) {
|
|
206
206
|
return t instanceof Error ? t : new Error(typeof t == "string" ? t : "Unknown error", {
|
|
207
207
|
cause: t
|
|
208
208
|
});
|
|
209
209
|
}
|
|
210
|
-
function vt(t, n =
|
|
211
|
-
throw
|
|
210
|
+
function vt(t, n = b) {
|
|
211
|
+
throw Ot(t);
|
|
212
212
|
}
|
|
213
|
-
function
|
|
214
|
-
return
|
|
213
|
+
function j(t, n) {
|
|
214
|
+
return V(() => t(n || {}));
|
|
215
215
|
}
|
|
216
|
-
const
|
|
216
|
+
const B = (t) => Tt(() => t());
|
|
217
217
|
function Rt(t, n, e) {
|
|
218
|
-
let
|
|
219
|
-
for (; l <
|
|
218
|
+
let o = e.length, r = n.length, i = o, l = 0, s = 0, a = n[r - 1].nextSibling, d = null;
|
|
219
|
+
for (; l < r || s < i; ) {
|
|
220
220
|
if (n[l] === e[s]) {
|
|
221
221
|
l++, s++;
|
|
222
222
|
continue;
|
|
223
223
|
}
|
|
224
|
-
for (; n[
|
|
225
|
-
|
|
226
|
-
if (
|
|
227
|
-
const c = i <
|
|
224
|
+
for (; n[r - 1] === e[i - 1]; )
|
|
225
|
+
r--, i--;
|
|
226
|
+
if (r === l) {
|
|
227
|
+
const c = i < o ? s ? e[s - 1].nextSibling : e[i - s] : a;
|
|
228
228
|
for (; s < i; ) t.insertBefore(e[s++], c);
|
|
229
229
|
} else if (i === s)
|
|
230
|
-
for (; l <
|
|
230
|
+
for (; l < r; )
|
|
231
231
|
(!d || !d.has(n[l])) && n[l].remove(), l++;
|
|
232
|
-
else if (n[l] === e[i - 1] && e[s] === n[
|
|
233
|
-
const c = n[--
|
|
234
|
-
t.insertBefore(e[s++], n[l++].nextSibling), t.insertBefore(e[--i], c), n[
|
|
232
|
+
else if (n[l] === e[i - 1] && e[s] === n[r - 1]) {
|
|
233
|
+
const c = n[--r].nextSibling;
|
|
234
|
+
t.insertBefore(e[s++], n[l++].nextSibling), t.insertBefore(e[--i], c), n[r] = e[i];
|
|
235
235
|
} else {
|
|
236
236
|
if (!d) {
|
|
237
237
|
d = /* @__PURE__ */ new Map();
|
|
238
|
-
let
|
|
239
|
-
for (;
|
|
238
|
+
let y = s;
|
|
239
|
+
for (; y < i; ) d.set(e[y], y++);
|
|
240
240
|
}
|
|
241
241
|
const c = d.get(n[l]);
|
|
242
242
|
if (c != null)
|
|
243
243
|
if (s < c && c < i) {
|
|
244
|
-
let
|
|
245
|
-
for (; ++
|
|
244
|
+
let y = l, C = 1, p;
|
|
245
|
+
for (; ++y < r && y < i && !((p = d.get(n[y])) == null || p !== c + C); )
|
|
246
246
|
C++;
|
|
247
247
|
if (C > c - s) {
|
|
248
248
|
const q = n[l];
|
|
@@ -253,144 +253,144 @@ function Rt(t, n, e) {
|
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
|
-
function
|
|
257
|
-
let
|
|
256
|
+
function O(t, n, e, o) {
|
|
257
|
+
let r;
|
|
258
258
|
const i = () => {
|
|
259
259
|
const s = document.createElement("template");
|
|
260
260
|
return s.innerHTML = t, s.content.firstChild;
|
|
261
|
-
}, l = () => (
|
|
261
|
+
}, l = () => (r || (r = i())).cloneNode(!0);
|
|
262
262
|
return l.cloneNode = l, l;
|
|
263
263
|
}
|
|
264
264
|
function P(t, n, e) {
|
|
265
265
|
e == null ? t.removeAttribute(n) : t.setAttribute(n, e);
|
|
266
266
|
}
|
|
267
|
-
function
|
|
267
|
+
function jt(t, n, e) {
|
|
268
268
|
if (!n) return e ? P(t, "style") : n;
|
|
269
|
-
const
|
|
270
|
-
if (typeof n == "string") return
|
|
271
|
-
typeof e == "string" && (
|
|
272
|
-
let
|
|
269
|
+
const o = t.style;
|
|
270
|
+
if (typeof n == "string") return o.cssText = n;
|
|
271
|
+
typeof e == "string" && (o.cssText = e = void 0), e || (e = {}), n || (n = {});
|
|
272
|
+
let r, i;
|
|
273
273
|
for (i in e)
|
|
274
|
-
n[i] == null &&
|
|
274
|
+
n[i] == null && o.removeProperty(i), delete e[i];
|
|
275
275
|
for (i in n)
|
|
276
|
-
|
|
276
|
+
r = n[i], r !== e[i] && (o.setProperty(i, r), e[i] = r);
|
|
277
277
|
return e;
|
|
278
278
|
}
|
|
279
|
-
function
|
|
280
|
-
return
|
|
279
|
+
function Bt(t, n, e) {
|
|
280
|
+
return V(() => t(n, e));
|
|
281
281
|
}
|
|
282
|
-
function A(t, n, e,
|
|
283
|
-
if (e !== void 0 && !
|
|
284
|
-
D((
|
|
282
|
+
function A(t, n, e, o) {
|
|
283
|
+
if (e !== void 0 && !o && (o = []), typeof n != "function") return U(t, n, o, e);
|
|
284
|
+
D((r) => U(t, n(), r, e), o);
|
|
285
285
|
}
|
|
286
|
-
function U(t, n, e,
|
|
286
|
+
function U(t, n, e, o, r) {
|
|
287
287
|
for (; typeof e == "function"; ) e = e();
|
|
288
288
|
if (n === e) return e;
|
|
289
|
-
const i = typeof n, l =
|
|
289
|
+
const i = typeof n, l = o !== void 0;
|
|
290
290
|
if (t = l && e[0] && e[0].parentNode || t, i === "string" || i === "number") {
|
|
291
291
|
if (i === "number" && (n = n.toString(), n === e))
|
|
292
292
|
return e;
|
|
293
293
|
if (l) {
|
|
294
294
|
let s = e[0];
|
|
295
|
-
s && s.nodeType === 3 ? s.data !== n && (s.data = n) : s = document.createTextNode(n), e =
|
|
295
|
+
s && s.nodeType === 3 ? s.data !== n && (s.data = n) : s = document.createTextNode(n), e = k(t, e, o, s);
|
|
296
296
|
} else
|
|
297
297
|
e !== "" && typeof e == "string" ? e = t.firstChild.data = n : e = t.textContent = n;
|
|
298
298
|
} else if (n == null || i === "boolean")
|
|
299
|
-
e =
|
|
299
|
+
e = k(t, e, o);
|
|
300
300
|
else {
|
|
301
301
|
if (i === "function")
|
|
302
302
|
return D(() => {
|
|
303
303
|
let s = n();
|
|
304
304
|
for (; typeof s == "function"; ) s = s();
|
|
305
|
-
e = U(t, s, e,
|
|
305
|
+
e = U(t, s, e, o);
|
|
306
306
|
}), () => e;
|
|
307
307
|
if (Array.isArray(n)) {
|
|
308
308
|
const s = [], a = e && Array.isArray(e);
|
|
309
|
-
if (X(s, n, e,
|
|
310
|
-
return D(() => e = U(t, s, e,
|
|
309
|
+
if (X(s, n, e, r))
|
|
310
|
+
return D(() => e = U(t, s, e, o, !0)), () => e;
|
|
311
311
|
if (s.length === 0) {
|
|
312
|
-
if (e =
|
|
313
|
-
} else a ? e.length === 0 ? at(t, s,
|
|
312
|
+
if (e = k(t, e, o), l) return e;
|
|
313
|
+
} else a ? e.length === 0 ? at(t, s, o) : Rt(t, e, s) : (e && k(t), at(t, s));
|
|
314
314
|
e = s;
|
|
315
315
|
} else if (n.nodeType) {
|
|
316
316
|
if (Array.isArray(e)) {
|
|
317
|
-
if (l) return e =
|
|
318
|
-
|
|
317
|
+
if (l) return e = k(t, e, o, n);
|
|
318
|
+
k(t, e, null, n);
|
|
319
319
|
} else e == null || e === "" || !t.firstChild ? t.appendChild(n) : t.replaceChild(n, t.firstChild);
|
|
320
320
|
e = n;
|
|
321
321
|
}
|
|
322
322
|
}
|
|
323
323
|
return e;
|
|
324
324
|
}
|
|
325
|
-
function X(t, n, e,
|
|
326
|
-
let
|
|
325
|
+
function X(t, n, e, o) {
|
|
326
|
+
let r = !1;
|
|
327
327
|
for (let i = 0, l = n.length; i < l; i++) {
|
|
328
328
|
let s = n[i], a = e && e[t.length], d;
|
|
329
329
|
if (!(s == null || s === !0 || s === !1)) if ((d = typeof s) == "object" && s.nodeType)
|
|
330
330
|
t.push(s);
|
|
331
331
|
else if (Array.isArray(s))
|
|
332
|
-
|
|
332
|
+
r = X(t, s, a) || r;
|
|
333
333
|
else if (d === "function")
|
|
334
|
-
if (
|
|
334
|
+
if (o) {
|
|
335
335
|
for (; typeof s == "function"; ) s = s();
|
|
336
|
-
|
|
336
|
+
r = X(t, Array.isArray(s) ? s : [s], Array.isArray(a) ? a : [a]) || r;
|
|
337
337
|
} else
|
|
338
|
-
t.push(s),
|
|
338
|
+
t.push(s), r = !0;
|
|
339
339
|
else {
|
|
340
340
|
const c = String(s);
|
|
341
341
|
a && a.nodeType === 3 && a.data === c ? t.push(a) : t.push(document.createTextNode(c));
|
|
342
342
|
}
|
|
343
343
|
}
|
|
344
|
-
return
|
|
344
|
+
return r;
|
|
345
345
|
}
|
|
346
346
|
function at(t, n, e = null) {
|
|
347
|
-
for (let
|
|
347
|
+
for (let o = 0, r = n.length; o < r; o++) t.insertBefore(n[o], e);
|
|
348
348
|
}
|
|
349
|
-
function
|
|
349
|
+
function k(t, n, e, o) {
|
|
350
350
|
if (e === void 0) return t.textContent = "";
|
|
351
|
-
const
|
|
351
|
+
const r = o || document.createTextNode("");
|
|
352
352
|
if (n.length) {
|
|
353
353
|
let i = !1;
|
|
354
354
|
for (let l = n.length - 1; l >= 0; l--) {
|
|
355
355
|
const s = n[l];
|
|
356
|
-
if (
|
|
356
|
+
if (r !== s) {
|
|
357
357
|
const a = s.parentNode === t;
|
|
358
|
-
!i && !l ? a ? t.replaceChild(
|
|
358
|
+
!i && !l ? a ? t.replaceChild(r, s) : t.insertBefore(r, e) : a && s.remove();
|
|
359
359
|
} else i = !0;
|
|
360
360
|
}
|
|
361
|
-
} else t.insertBefore(
|
|
362
|
-
return [
|
|
361
|
+
} else t.insertBefore(r, e);
|
|
362
|
+
return [r];
|
|
363
363
|
}
|
|
364
|
-
function
|
|
365
|
-
return Object.keys(t).reduce((e,
|
|
366
|
-
const
|
|
367
|
-
return e[
|
|
364
|
+
function It(t) {
|
|
365
|
+
return Object.keys(t).reduce((e, o) => {
|
|
366
|
+
const r = t[o];
|
|
367
|
+
return e[o] = Object.assign({}, r), mt(r.value) && !Ut(r.value) && !Array.isArray(r.value) && (e[o].value = Object.assign({}, r.value)), Array.isArray(r.value) && (e[o].value = r.value.slice(0)), e;
|
|
368
368
|
}, {});
|
|
369
369
|
}
|
|
370
|
-
function
|
|
371
|
-
return t ? Object.keys(t).reduce((e,
|
|
372
|
-
const
|
|
373
|
-
return e[
|
|
374
|
-
value:
|
|
375
|
-
}, e[
|
|
370
|
+
function Nt(t) {
|
|
371
|
+
return t ? Object.keys(t).reduce((e, o) => {
|
|
372
|
+
const r = t[o];
|
|
373
|
+
return e[o] = mt(r) && "value" in r ? r : {
|
|
374
|
+
value: r
|
|
375
|
+
}, e[o].attribute || (e[o].attribute = Kt(o)), e[o].parse = "parse" in e[o] ? e[o].parse : typeof e[o].value != "string", e;
|
|
376
376
|
}, {}) : {};
|
|
377
377
|
}
|
|
378
378
|
function Dt(t) {
|
|
379
|
-
return Object.keys(t).reduce((e,
|
|
379
|
+
return Object.keys(t).reduce((e, o) => (e[o] = t[o].value, e), {});
|
|
380
380
|
}
|
|
381
381
|
function Ft(t, n) {
|
|
382
|
-
const e =
|
|
383
|
-
return Object.keys(n).forEach((
|
|
384
|
-
const i = e[
|
|
385
|
-
l != null && (i.value = i.parse ? Ct(l) : l), s != null && (i.value = Array.isArray(s) ? s.slice(0) : s), i.reflect && ct(t, i.attribute, i.value, !!i.parse), Object.defineProperty(t,
|
|
382
|
+
const e = It(n);
|
|
383
|
+
return Object.keys(n).forEach((r) => {
|
|
384
|
+
const i = e[r], l = t.getAttribute(i.attribute), s = t[r];
|
|
385
|
+
l != null && (i.value = i.parse ? Ct(l) : l), s != null && (i.value = Array.isArray(s) ? s.slice(0) : s), i.reflect && ct(t, i.attribute, i.value, !!i.parse), Object.defineProperty(t, r, {
|
|
386
386
|
get() {
|
|
387
387
|
return i.value;
|
|
388
388
|
},
|
|
389
389
|
set(a) {
|
|
390
390
|
const d = i.value;
|
|
391
391
|
i.value = a, i.reflect && ct(this, i.attribute, i.value, !!i.parse);
|
|
392
|
-
for (let c = 0,
|
|
393
|
-
this.__propertyChangedCallbacks[c](
|
|
392
|
+
for (let c = 0, y = this.__propertyChangedCallbacks.length; c < y; c++)
|
|
393
|
+
this.__propertyChangedCallbacks[c](r, a, d);
|
|
394
394
|
},
|
|
395
395
|
enumerable: !0,
|
|
396
396
|
configurable: !0
|
|
@@ -405,10 +405,10 @@ function Ct(t) {
|
|
|
405
405
|
return t;
|
|
406
406
|
}
|
|
407
407
|
}
|
|
408
|
-
function ct(t, n, e,
|
|
408
|
+
function ct(t, n, e, o) {
|
|
409
409
|
if (e == null || e === !1) return t.removeAttribute(n);
|
|
410
|
-
let
|
|
411
|
-
t.__updating[n] = !0,
|
|
410
|
+
let r = o ? JSON.stringify(e) : e;
|
|
411
|
+
t.__updating[n] = !0, r === "true" && (r = ""), t.setAttribute(n, r), Promise.resolve().then(() => delete t.__updating[n]);
|
|
412
412
|
}
|
|
413
413
|
function Kt(t) {
|
|
414
414
|
return t.replace(/\.?([A-Z]+)/g, (n, e) => "-" + e.toLowerCase()).replace("_", "-").replace(/^-/, "");
|
|
@@ -419,82 +419,82 @@ function mt(t) {
|
|
|
419
419
|
function Ut(t) {
|
|
420
420
|
return Object.prototype.toString.call(t) === "[object Function]";
|
|
421
421
|
}
|
|
422
|
-
function
|
|
422
|
+
function zt(t) {
|
|
423
423
|
return typeof t == "function" && t.toString().indexOf("class") === 0;
|
|
424
424
|
}
|
|
425
|
-
let
|
|
426
|
-
function
|
|
425
|
+
let G;
|
|
426
|
+
function Vt(t, n) {
|
|
427
427
|
const e = Object.keys(n);
|
|
428
428
|
return class extends t {
|
|
429
429
|
static get observedAttributes() {
|
|
430
|
-
return e.map((
|
|
430
|
+
return e.map((r) => n[r].attribute);
|
|
431
431
|
}
|
|
432
432
|
constructor() {
|
|
433
433
|
super(), this.__initialized = !1, this.__released = !1, this.__releaseCallbacks = [], this.__propertyChangedCallbacks = [], this.__updating = {}, this.props = {};
|
|
434
|
-
for (let
|
|
435
|
-
this[
|
|
434
|
+
for (let r of e)
|
|
435
|
+
this[r] = void 0;
|
|
436
436
|
}
|
|
437
437
|
connectedCallback() {
|
|
438
438
|
if (this.__initialized) return;
|
|
439
439
|
this.__releaseCallbacks = [], this.__propertyChangedCallbacks = [], this.__updating = {}, this.props = Ft(this, n);
|
|
440
|
-
const
|
|
440
|
+
const r = Dt(this.props), i = this.Component, l = G;
|
|
441
441
|
try {
|
|
442
|
-
|
|
442
|
+
G = this, this.__initialized = !0, zt(i) ? new i(r, {
|
|
443
443
|
element: this
|
|
444
|
-
}) : i(
|
|
444
|
+
}) : i(r, {
|
|
445
445
|
element: this
|
|
446
446
|
});
|
|
447
447
|
} finally {
|
|
448
|
-
|
|
448
|
+
G = l;
|
|
449
449
|
}
|
|
450
450
|
}
|
|
451
451
|
async disconnectedCallback() {
|
|
452
452
|
if (await Promise.resolve(), this.isConnected) return;
|
|
453
453
|
this.__propertyChangedCallbacks.length = 0;
|
|
454
|
-
let
|
|
455
|
-
for (;
|
|
454
|
+
let r = null;
|
|
455
|
+
for (; r = this.__releaseCallbacks.pop(); ) r(this);
|
|
456
456
|
delete this.__initialized, this.__released = !0;
|
|
457
457
|
}
|
|
458
|
-
attributeChangedCallback(
|
|
459
|
-
if (this.__initialized && !this.__updating[
|
|
460
|
-
if (l == null && !this[
|
|
461
|
-
this[
|
|
458
|
+
attributeChangedCallback(r, i, l) {
|
|
459
|
+
if (this.__initialized && !this.__updating[r] && (r = this.lookupProp(r), r in n)) {
|
|
460
|
+
if (l == null && !this[r]) return;
|
|
461
|
+
this[r] = n[r].parse ? Ct(l) : l;
|
|
462
462
|
}
|
|
463
463
|
}
|
|
464
|
-
lookupProp(
|
|
464
|
+
lookupProp(r) {
|
|
465
465
|
if (n)
|
|
466
|
-
return e.find((i) =>
|
|
466
|
+
return e.find((i) => r === i || r === n[i].attribute);
|
|
467
467
|
}
|
|
468
468
|
get renderRoot() {
|
|
469
469
|
return this.shadowRoot || this.attachShadow({
|
|
470
470
|
mode: "open"
|
|
471
471
|
});
|
|
472
472
|
}
|
|
473
|
-
addReleaseCallback(
|
|
474
|
-
this.__releaseCallbacks.push(
|
|
473
|
+
addReleaseCallback(r) {
|
|
474
|
+
this.__releaseCallbacks.push(r);
|
|
475
475
|
}
|
|
476
|
-
addPropertyChangedCallback(
|
|
477
|
-
this.__propertyChangedCallbacks.push(
|
|
476
|
+
addPropertyChangedCallback(r) {
|
|
477
|
+
this.__propertyChangedCallbacks.push(r);
|
|
478
478
|
}
|
|
479
479
|
};
|
|
480
480
|
}
|
|
481
481
|
function qt(t, n = {}, e = {}) {
|
|
482
482
|
const {
|
|
483
|
-
BaseElement:
|
|
484
|
-
extension:
|
|
483
|
+
BaseElement: o = HTMLElement,
|
|
484
|
+
extension: r,
|
|
485
485
|
customElements: i = window.customElements
|
|
486
486
|
} = e;
|
|
487
487
|
return (l) => {
|
|
488
488
|
let s = i.get(t);
|
|
489
|
-
return s ? (s.prototype.Component = l, s) : (s =
|
|
489
|
+
return s ? (s.prototype.Component = l, s) : (s = Vt(o, Nt(n)), s.prototype.Component = l, s.prototype.registeredTag = t, i.define(t, s, r), s);
|
|
490
490
|
};
|
|
491
491
|
}
|
|
492
492
|
function Ht(t) {
|
|
493
493
|
const n = Object.keys(t), e = {};
|
|
494
|
-
for (let
|
|
495
|
-
const [
|
|
496
|
-
Object.defineProperty(e, n[
|
|
497
|
-
get:
|
|
494
|
+
for (let o = 0; o < n.length; o++) {
|
|
495
|
+
const [r, i] = gt(t[n[o]]);
|
|
496
|
+
Object.defineProperty(e, n[o], {
|
|
497
|
+
get: r,
|
|
498
498
|
set(l) {
|
|
499
499
|
i(() => l);
|
|
500
500
|
}
|
|
@@ -502,28 +502,28 @@ function Ht(t) {
|
|
|
502
502
|
}
|
|
503
503
|
return e;
|
|
504
504
|
}
|
|
505
|
-
function
|
|
505
|
+
function Wt(t) {
|
|
506
506
|
if (t.assignedSlot && t.assignedSlot._$owner) return t.assignedSlot._$owner;
|
|
507
507
|
let n = t.parentNode;
|
|
508
508
|
for (; n && !n._$owner && !(n.assignedSlot && n.assignedSlot._$owner); )
|
|
509
509
|
n = n.parentNode;
|
|
510
510
|
return n && n.assignedSlot ? n.assignedSlot._$owner : t._$owner;
|
|
511
511
|
}
|
|
512
|
-
function
|
|
512
|
+
function Gt(t) {
|
|
513
513
|
return (n, e) => {
|
|
514
|
-
const { element:
|
|
515
|
-
return At((
|
|
514
|
+
const { element: o } = e;
|
|
515
|
+
return At((r) => {
|
|
516
516
|
const i = Ht(n);
|
|
517
|
-
|
|
518
|
-
|
|
517
|
+
o.addPropertyChangedCallback((s, a) => i[s] = a), o.addReleaseCallback(() => {
|
|
518
|
+
o.renderRoot.textContent = "", r();
|
|
519
519
|
});
|
|
520
520
|
const l = t(i, e);
|
|
521
|
-
return A(
|
|
522
|
-
},
|
|
521
|
+
return A(o.renderRoot, l);
|
|
522
|
+
}, Wt(o));
|
|
523
523
|
};
|
|
524
524
|
}
|
|
525
525
|
function Jt(t, n, e) {
|
|
526
|
-
return arguments.length === 2 && (e = n, n = {}), qt(t, n)(
|
|
526
|
+
return arguments.length === 2 && (e = n, n = {}), qt(t, n)(Gt(e));
|
|
527
527
|
}
|
|
528
528
|
const Xt = `
|
|
529
529
|
:host([theme="dark"]) {
|
|
@@ -583,62 +583,56 @@ const Xt = `
|
|
|
583
583
|
}
|
|
584
584
|
}
|
|
585
585
|
`;
|
|
586
|
-
var Zt = /* @__PURE__ */
|
|
587
|
-
console.debug("dictate-button version:", "1.
|
|
588
|
-
const ne = "https://api.dictate-button.io/transcribe",
|
|
589
|
-
Jt("dictate-button", {
|
|
586
|
+
var Zt = /* @__PURE__ */ O('<div part=container class=dictate-button__container><style></style><div aria-live=polite class=dictate-button__status-announcer style="position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0"></div><button part=button class=dictate-button__button>'), Qt = /* @__PURE__ */ O('<svg part=icon class="dictate-button__icon dictate-button__icon--idle"fill=none viewBox="0 0 24 24"stroke-width=1.5 stroke=currentColor role=img aria-hidden=true><path stroke-linecap=round stroke-linejoin=round d="M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z">'), Yt = /* @__PURE__ */ O('<svg part=icon class="dictate-button__icon dictate-button__icon--recording"viewBox="0 0 24 24"fill=currentColor role=img aria-hidden=true><circle cx=12 cy=12 r=10>'), te = /* @__PURE__ */ O('<svg part=icon class="dictate-button__icon dictate-button__icon--processing"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round role=img aria-hidden=true><path d="M12 2v4"></path><path d="m16.2 7.8 2.9-2.9"></path><path d="M18 12h4"></path><path d="m16.2 16.2 2.9 2.9"></path><path d="M12 18v4"></path><path d="m4.9 19.1 2.9-2.9"></path><path d="M2 12h4"></path><path d="m4.9 4.9 2.9 2.9">'), ee = /* @__PURE__ */ O('<svg part=icon class="dictate-button__icon dictate-button__icon--error"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=4 stroke-linecap=round stroke-linejoin=round role=img aria-hidden=true><line x1=12 x2=12 y1=4 y2=14></line><line x1=12 x2=12.01 y1=20 y2=20>');
|
|
587
|
+
console.debug("dictate-button version:", "1.9.0");
|
|
588
|
+
const ne = "https://api.dictate-button.io/transcribe", S = "dictate-button.io", J = -70, ut = -10, dt = 0, re = 4, oe = 0.25, ie = 0.05;
|
|
589
|
+
customElements.get("dictate-button") ? console.debug("dictate-button: We don't require importing the dictate-button component separately anymore, so you may remove the script tag which imports https://cdn.dictate-button.io/dictate-button.js from the HTML head.") : Jt("dictate-button", {
|
|
590
590
|
size: 30,
|
|
591
591
|
apiEndpoint: ne,
|
|
592
|
-
language: void 0
|
|
593
|
-
audioFeedback: !0
|
|
592
|
+
language: void 0
|
|
594
593
|
}, (t, {
|
|
595
594
|
element: n
|
|
596
595
|
}) => {
|
|
597
596
|
console.debug("api", t.apiEndpoint);
|
|
598
|
-
const [e,
|
|
599
|
-
let
|
|
597
|
+
const [e, o] = gt("idle");
|
|
598
|
+
let r = null, i = null, l = [], s = null, a = null, d = null, c = null, y = !1, C = 0;
|
|
600
599
|
const p = (f) => f <= J ? 0 : f >= ut ? 1 : (f - J) / (ut - J), q = (f) => {
|
|
601
|
-
let
|
|
600
|
+
let _ = 0;
|
|
602
601
|
for (let v = 0; v < f.length; v++) {
|
|
603
602
|
const u = (f[v] - 128) / 128;
|
|
604
|
-
|
|
603
|
+
_ += u * u;
|
|
605
604
|
}
|
|
606
|
-
return Math.sqrt(
|
|
605
|
+
return Math.sqrt(_ / f.length);
|
|
607
606
|
}, Et = (f) => 20 * Math.log10(Math.max(f, 1e-8)), Q = (f) => {
|
|
608
|
-
const
|
|
609
|
-
if (!
|
|
607
|
+
const _ = n.shadowRoot.querySelector(".dictate-button__button");
|
|
608
|
+
if (!_)
|
|
610
609
|
return;
|
|
611
610
|
const v = dt + f * (re - dt), u = 0 + f * 0.4;
|
|
612
|
-
|
|
611
|
+
_.style.boxShadow = `0 0 0 ${v}px light-dark(rgba(0, 0, 0, ${u}), rgba(255, 255, 255, ${u}))`;
|
|
613
612
|
}, Y = () => {
|
|
614
|
-
if (!
|
|
613
|
+
if (!y || !d || !c) return;
|
|
615
614
|
d.getByteTimeDomainData(c);
|
|
616
|
-
const f = q(c),
|
|
615
|
+
const f = q(c), _ = Et(f), v = p(_), u = v > C ? oe : ie;
|
|
617
616
|
C = u * v + (1 - u) * C, Q(C), requestAnimationFrame(Y);
|
|
618
617
|
}, tt = () => {
|
|
619
|
-
|
|
618
|
+
r && r.state !== "inactive" && r.stop(), i && (i.getTracks().forEach((f) => f.stop()), i = null), l = [], s = null, y = !1, a && a.state !== "closed" && a.close(), a = null, d = null, c = null, C = 0, Q(0);
|
|
620
619
|
};
|
|
621
620
|
n.addEventListener("disconnected", tt);
|
|
622
621
|
const et = async (f) => {
|
|
623
622
|
if (e() === "idle") {
|
|
624
623
|
s = f;
|
|
625
624
|
try {
|
|
626
|
-
|
|
627
|
-
} catch (b) {
|
|
628
|
-
console.warn("Failed to play starting sound:", b);
|
|
629
|
-
}
|
|
630
|
-
try {
|
|
631
|
-
const b = await navigator.mediaDevices.getUserMedia({
|
|
625
|
+
const _ = await navigator.mediaDevices.getUserMedia({
|
|
632
626
|
audio: !0
|
|
633
627
|
});
|
|
634
|
-
i =
|
|
635
|
-
const v = a.createMediaStreamSource(
|
|
636
|
-
d = a.createAnalyser(), d.fftSize = 2048, v.connect(d), c = new Uint8Array(d.fftSize),
|
|
628
|
+
i = _, a = new (window.AudioContext || window.webkitAudioContext)();
|
|
629
|
+
const v = a.createMediaStreamSource(_);
|
|
630
|
+
d = a.createAnalyser(), d.fftSize = 2048, v.connect(d), c = new Uint8Array(d.fftSize), r = new MediaRecorder(_, {
|
|
637
631
|
mimeType: "audio/webm"
|
|
638
|
-
}), l = [],
|
|
632
|
+
}), l = [], r.ondataavailable = (u) => {
|
|
639
633
|
l.push(u.data);
|
|
640
|
-
},
|
|
641
|
-
|
|
634
|
+
}, r.onstop = async () => {
|
|
635
|
+
y = !1, o("processing"), T(n, "transcribing:started", "Started transcribing");
|
|
642
636
|
const u = new Blob(l, {
|
|
643
637
|
type: "audio/webm"
|
|
644
638
|
});
|
|
@@ -652,22 +646,22 @@ Jt("dictate-button", {
|
|
|
652
646
|
if (!h.ok) throw new Error("Failed to transcribe audio");
|
|
653
647
|
const H = await h.json();
|
|
654
648
|
if (e() !== "processing") return;
|
|
655
|
-
|
|
649
|
+
T(n, "transcribing:finished", H.text), o("idle");
|
|
656
650
|
} catch (m) {
|
|
657
|
-
console.error("Failed to transcribe audio:", m),
|
|
651
|
+
console.error("Failed to transcribe audio:", m), T(n, "transcribing:failed", "Failed to transcribe audio"), rt();
|
|
658
652
|
}
|
|
659
|
-
},
|
|
660
|
-
} catch (
|
|
661
|
-
console.error("Failed to start recording:",
|
|
653
|
+
}, r.start(), T(n, "recording:started", "Started recording"), y = !0, Y(), o("recording");
|
|
654
|
+
} catch (_) {
|
|
655
|
+
console.error("Failed to start recording:", _), T(n, "recording:failed", "Failed to start recording"), rt();
|
|
662
656
|
}
|
|
663
657
|
}
|
|
664
658
|
}, nt = () => {
|
|
665
|
-
e() === "recording" && (
|
|
659
|
+
e() === "recording" && (T(n, "recording:stopped", "Stopped recording"), o("idle"), tt());
|
|
666
660
|
}, rt = () => {
|
|
667
|
-
|
|
661
|
+
o("error"), setTimeout(() => o("idle"), 2e3);
|
|
668
662
|
};
|
|
669
663
|
let R;
|
|
670
|
-
return
|
|
664
|
+
return kt(() => {
|
|
671
665
|
if (!R) return;
|
|
672
666
|
const f = de(R, {
|
|
673
667
|
onShortTap: () => {
|
|
@@ -682,24 +676,24 @@ Jt("dictate-button", {
|
|
|
682
676
|
});
|
|
683
677
|
Pt(f);
|
|
684
678
|
}), (() => {
|
|
685
|
-
var f = Zt(),
|
|
686
|
-
A(
|
|
679
|
+
var f = Zt(), _ = f.firstChild, v = _.nextSibling, u = v.nextSibling;
|
|
680
|
+
A(_, Xt), A(v, () => ft(e()));
|
|
687
681
|
var m = R;
|
|
688
|
-
return typeof m == "function" ?
|
|
689
|
-
var h =
|
|
690
|
-
return () => h() &&
|
|
682
|
+
return typeof m == "function" ? Bt(m, u) : R = u, A(u, (() => {
|
|
683
|
+
var h = B(() => e() === "idle");
|
|
684
|
+
return () => h() && j(le, {});
|
|
691
685
|
})(), null), A(u, (() => {
|
|
692
|
-
var h =
|
|
693
|
-
return () => h() &&
|
|
686
|
+
var h = B(() => e() === "recording");
|
|
687
|
+
return () => h() && j(ae, {});
|
|
694
688
|
})(), null), A(u, (() => {
|
|
695
|
-
var h =
|
|
696
|
-
return () => h() &&
|
|
689
|
+
var h = B(() => e() === "processing");
|
|
690
|
+
return () => h() && j(ce, {});
|
|
697
691
|
})(), null), A(u, (() => {
|
|
698
|
-
var h =
|
|
699
|
-
return () => h() &&
|
|
692
|
+
var h = B(() => e() === "error");
|
|
693
|
+
return () => h() && j(ue, {});
|
|
700
694
|
})(), null), D((h) => {
|
|
701
695
|
var H = `width:${t.size}px;height:${t.size}px"`, ot = se(e()), it = ft(e()), st = e() === "recording", lt = e() === "processing";
|
|
702
|
-
return h.e =
|
|
696
|
+
return h.e = jt(u, H, h.e), ot !== h.t && P(u, "title", h.t = ot), it !== h.a && P(u, "aria-label", h.a = it), st !== h.o && P(u, "aria-pressed", h.o = st), lt !== h.i && P(u, "aria-busy", h.i = lt), h;
|
|
703
697
|
}, {
|
|
704
698
|
e: void 0,
|
|
705
699
|
t: void 0,
|
|
@@ -712,26 +706,26 @@ Jt("dictate-button", {
|
|
|
712
706
|
const se = (t) => {
|
|
713
707
|
switch (t) {
|
|
714
708
|
case "idle":
|
|
715
|
-
return `Start dictation (${
|
|
709
|
+
return `Start dictation (${S})`;
|
|
716
710
|
case "recording":
|
|
717
|
-
return `Stop dictation (${
|
|
711
|
+
return `Stop dictation (${S})`;
|
|
718
712
|
case "processing":
|
|
719
|
-
return `Stop processing (${
|
|
713
|
+
return `Stop processing (${S})`;
|
|
720
714
|
case "error":
|
|
721
|
-
return `Click to reset (${
|
|
715
|
+
return `Click to reset (${S})`;
|
|
722
716
|
}
|
|
723
717
|
}, ft = (t) => {
|
|
724
718
|
switch (t) {
|
|
725
719
|
case "idle":
|
|
726
|
-
return `Start dictation (${
|
|
720
|
+
return `Start dictation (${S})`;
|
|
727
721
|
case "recording":
|
|
728
|
-
return `Dictation in progress. Click to stop it (${
|
|
722
|
+
return `Dictation in progress. Click to stop it (${S})`;
|
|
729
723
|
case "processing":
|
|
730
|
-
return `Processing dictation. Click to cancel it (${
|
|
724
|
+
return `Processing dictation. Click to cancel it (${S})`;
|
|
731
725
|
case "error":
|
|
732
|
-
return `Dictation error. Click to reset (${
|
|
726
|
+
return `Dictation error. Click to reset (${S})`;
|
|
733
727
|
}
|
|
734
|
-
},
|
|
728
|
+
}, T = (t, n, e) => {
|
|
735
729
|
t.dispatchEvent(new CustomEvent(n, {
|
|
736
730
|
detail: e,
|
|
737
731
|
bubbles: !0,
|
|
@@ -741,37 +735,29 @@ const se = (t) => {
|
|
|
741
735
|
function de(t, {
|
|
742
736
|
threshold: n = 500,
|
|
743
737
|
preventScroll: e = !0,
|
|
744
|
-
onShortTap:
|
|
745
|
-
onLongPressStart:
|
|
738
|
+
onShortTap: o,
|
|
739
|
+
onLongPressStart: r,
|
|
746
740
|
onLongPressEnd: i
|
|
747
741
|
} = {}) {
|
|
748
742
|
let l, s = !1;
|
|
749
743
|
const a = (p) => p.preventDefault(), d = (p) => {
|
|
750
744
|
l && clearTimeout(l), s = !1, p.preventDefault(), t.setPointerCapture(p.pointerId), l = window.setTimeout(() => {
|
|
751
|
-
s = !0,
|
|
745
|
+
s = !0, r?.(p), t.dispatchEvent(new CustomEvent("longpress", {
|
|
752
746
|
detail: p
|
|
753
747
|
}));
|
|
754
748
|
}, n);
|
|
755
749
|
}, c = (p) => {
|
|
756
750
|
l && clearTimeout(l), t.releasePointerCapture(p.pointerId), s ? (i?.(p), t.dispatchEvent(new CustomEvent("longpressend", {
|
|
757
751
|
detail: p
|
|
758
|
-
}))) : (
|
|
752
|
+
}))) : (o?.(p), t.dispatchEvent(new CustomEvent("shorttap", {
|
|
759
753
|
detail: p
|
|
760
754
|
})));
|
|
761
|
-
},
|
|
755
|
+
}, y = (p) => {
|
|
762
756
|
l && clearTimeout(l), t.releasePointerCapture(p.pointerId), s = !1;
|
|
763
757
|
}, C = (p) => {
|
|
764
758
|
p.preventDefault(), p.stopPropagation();
|
|
765
759
|
};
|
|
766
|
-
return e && (t.style.touchAction = "none", t.addEventListener("contextmenu", a)), t.addEventListener("pointerdown", d), t.addEventListener("pointerup", c), t.addEventListener("pointercancel",
|
|
767
|
-
e && t.removeEventListener("contextmenu", a), t.removeEventListener("pointerdown", d), t.removeEventListener("pointerup", c), t.removeEventListener("pointercancel",
|
|
768
|
-
};
|
|
769
|
-
}
|
|
770
|
-
function fe() {
|
|
771
|
-
const t = new (window.AudioContext || window.webkitAudioContext)(), n = t.createOscillator(), e = t.createGain();
|
|
772
|
-
n.type = "sine", n.frequency.setValueAtTime(550, t.currentTime);
|
|
773
|
-
const r = t.currentTime;
|
|
774
|
-
e.gain.setValueAtTime(0, r), e.gain.linearRampToValueAtTime(0.035, r + 0.03), e.gain.linearRampToValueAtTime(0, r + 0.25), n.connect(e), e.connect(t.destination), n.start(r), n.stop(r + 0.3), n.onended = () => {
|
|
775
|
-
t && t.state !== "closed" && t.close();
|
|
760
|
+
return e && (t.style.touchAction = "none", t.addEventListener("contextmenu", a)), t.addEventListener("pointerdown", d), t.addEventListener("pointerup", c), t.addEventListener("pointercancel", y), t.addEventListener("click", C), () => {
|
|
761
|
+
e && t.removeEventListener("contextmenu", a), t.removeEventListener("pointerdown", d), t.removeEventListener("pointerup", c), t.removeEventListener("pointercancel", y), t.removeEventListener("click", C);
|
|
776
762
|
};
|
|
777
763
|
}
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/inject-exclusive.js
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/inject-inclusive.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dictate-button",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.9.0",
|
|
4
|
+
"description": "Customizable Web Component that adds speech-to-text dictation capabilities to text fields",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"custom-element",
|
|
7
7
|
"dictate",
|
|
@@ -60,15 +60,20 @@
|
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"solid-element": "^1.9.1",
|
|
63
|
-
"solid-js": "^1.9.
|
|
63
|
+
"solid-js": "^1.9.10"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
|
+
"@solidjs/testing-library": "^0.8.10",
|
|
67
|
+
"@testing-library/user-event": "^14.6.1",
|
|
68
|
+
"@vitest/ui": "^4.0.10",
|
|
69
|
+
"jsdom": "^27.2.0",
|
|
66
70
|
"prettier": "^3.6.2",
|
|
67
71
|
"typescript": "^5.9.3",
|
|
68
|
-
"vite": "^7.
|
|
72
|
+
"vite": "^7.2.2",
|
|
69
73
|
"vite-plugin-dts": "^4.5.4",
|
|
70
|
-
"vite-plugin-solid": "^2.11.
|
|
71
|
-
"vite-plugin-static-copy": "^3.1.4"
|
|
74
|
+
"vite-plugin-solid": "^2.11.10",
|
|
75
|
+
"vite-plugin-static-copy": "^3.1.4",
|
|
76
|
+
"vitest": "^4.0.10"
|
|
72
77
|
},
|
|
73
78
|
"homepage": "https://github.com/dictate-button/dictate-button",
|
|
74
79
|
"repository": {
|
|
@@ -81,6 +86,9 @@
|
|
|
81
86
|
"scripts": {
|
|
82
87
|
"build": "vite build",
|
|
83
88
|
"format": "prettier --write './src/**/*.{js,jsx,ts,tsx}'",
|
|
84
|
-
"deploy": "firebase deploy"
|
|
89
|
+
"deploy": "firebase deploy",
|
|
90
|
+
"test": "vitest run",
|
|
91
|
+
"test:watch": "vitest",
|
|
92
|
+
"test:ui": "vitest --ui"
|
|
85
93
|
}
|
|
86
94
|
}
|