umwelt-js 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +10 -4
- package/dist/index.js +591 -579
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,189 +1,189 @@
|
|
|
1
|
-
import { createComponent as S, use as Ne, template as A, delegateEvents as
|
|
2
|
-
import { createContext as
|
|
3
|
-
import { isMultiSpec as
|
|
4
|
-
import { VegaLiteAdapter as
|
|
1
|
+
import { createComponent as S, use as Ne, template as A, delegateEvents as ot, insert as _, effect as L, setAttribute as Be, memo as pe, className as Lt, render as jt } from "solid-js/web";
|
|
2
|
+
import { createContext as W, createSignal as V, useContext as Y, createMemo as T, createEffect as P, onCleanup as X, untrack as ct, Switch as qt, Match as ze, For as ie, onMount as Mt, Show as lt } from "solid-js";
|
|
3
|
+
import { isMultiSpec as Ge, olliVis as Bt } from "olli";
|
|
4
|
+
import { VegaLiteAdapter as zt } from "olli/adapters";
|
|
5
5
|
import he from "moize";
|
|
6
|
-
import { getDomain as
|
|
6
|
+
import { getDomain as Gt, fetchAndParse as Kt, typeCoerceData as Ht, getBins as Xt, serializeValue as Jt } from "@umwelt-data/umwelt-utils/data";
|
|
7
7
|
import { compile as Fe } from "vega-lite";
|
|
8
|
-
import { evaluateVegaData as
|
|
8
|
+
import { evaluateVegaData as ut, extractOutputDatasets as dt, computeGuideTicks as Ke } from "@umwelt-data/umwelt-utils/vega";
|
|
9
9
|
import $e from "lodash.clonedeep";
|
|
10
|
-
import { withExternalStateParam as Wt, selectionStoreToSelection as Yt, EXTERNAL_STATE_STORE as
|
|
10
|
+
import { withExternalStateParam as Wt, selectionStoreToSelection as Yt, EXTERNAL_STATE_STORE as He, predicateToSelectionStore as Zt } from "@umwelt-data/umwelt-utils/vl-bridge";
|
|
11
11
|
import "lz-string";
|
|
12
|
-
import { parse as
|
|
13
|
-
import { debounce as
|
|
14
|
-
import { testDatum as
|
|
12
|
+
import { parse as Qt, View as en } from "vega";
|
|
13
|
+
import { debounce as tn } from "@solid-primitives/scheduled";
|
|
14
|
+
import { testDatum as nn } from "@umwelt-data/umwelt-utils/predicate";
|
|
15
15
|
import { createStore as ye } from "solid-js/store";
|
|
16
|
-
import { makeCommaSeparatedString as Pe, fmtValue as
|
|
16
|
+
import { makeCommaSeparatedString as Pe, fmtValue as rn, describeField as K } from "@umwelt-data/umwelt-utils/description";
|
|
17
17
|
import * as $ from "tone";
|
|
18
|
-
import { Storage as
|
|
19
|
-
import { scaleTime as
|
|
20
|
-
import
|
|
18
|
+
import { Storage as an } from "versioned-storage";
|
|
19
|
+
import { scaleTime as sn, scaleLinear as on, scaleOrdinal as cn, scalePoint as ln } from "d3-scale";
|
|
20
|
+
import un from "fast-cartesian";
|
|
21
21
|
import { styled as N } from "solid-styled-components";
|
|
22
|
-
const
|
|
23
|
-
Viewer:
|
|
24
|
-
},
|
|
25
|
-
function
|
|
26
|
-
return
|
|
22
|
+
const dn = "_Viewer_1uzho_29", fn = {
|
|
23
|
+
Viewer: dn
|
|
24
|
+
}, mn = ["mean", "median", "min", "max", "sum", "count"];
|
|
25
|
+
function ft(e) {
|
|
26
|
+
return mn.includes(e);
|
|
27
27
|
}
|
|
28
|
-
function
|
|
28
|
+
function pn(e) {
|
|
29
29
|
return e && (typeof e.name == "string" || e.name === void 0) && Array.isArray(e.values);
|
|
30
30
|
}
|
|
31
|
-
function
|
|
31
|
+
function mt(e) {
|
|
32
32
|
return e && (typeof e.name == "string" || e.name === void 0) && typeof e.url == "string";
|
|
33
33
|
}
|
|
34
|
-
const
|
|
35
|
-
function
|
|
36
|
-
return
|
|
34
|
+
const gn = ["x", "y", "color", "shape", "size", "opacity", "order", "facet"], vn = ["pure", "bright", "hollow", "bell", "reed", "strings"];
|
|
35
|
+
function hn(e) {
|
|
36
|
+
return vn.includes(e);
|
|
37
37
|
}
|
|
38
|
-
function
|
|
39
|
-
return
|
|
38
|
+
function pt(e) {
|
|
39
|
+
return gn.includes(e);
|
|
40
40
|
}
|
|
41
|
-
const
|
|
42
|
-
function
|
|
41
|
+
const gt = "None", yn = "vis_unit_", Sn = "audio_unit_", bn = (e) => `${yn}${e}`, wn = (e) => `${Sn}${e}`;
|
|
42
|
+
function Xe(e) {
|
|
43
43
|
return "units" in e;
|
|
44
44
|
}
|
|
45
|
-
function
|
|
45
|
+
function Je(e) {
|
|
46
46
|
return "units" in e;
|
|
47
47
|
}
|
|
48
|
-
const
|
|
49
|
-
const t =
|
|
48
|
+
const En = "", J = (e, t) => `${t}_${e}`, j = (e) => [`${e}_bin_start`, `${e}_bin_end`], H = (e, t) => `${t}_${e}`, Se = (e) => {
|
|
49
|
+
const t = Re([e]);
|
|
50
50
|
let n = e.field;
|
|
51
51
|
for (const i of t)
|
|
52
52
|
if ("aggregate" in i)
|
|
53
53
|
for (const r of i.aggregate)
|
|
54
|
-
|
|
55
|
-
else "bin" in i && !e.aggregate ? n = j(n)[0] : "timeUnit" in i && !e.aggregate && (n =
|
|
54
|
+
ft(r.op) && (n = J(n, r.op));
|
|
55
|
+
else "bin" in i && !e.aggregate ? n = j(n)[0] : "timeUnit" in i && !e.aggregate && (n = H(n, i.timeUnit));
|
|
56
56
|
return n;
|
|
57
|
-
},
|
|
58
|
-
const t =
|
|
57
|
+
}, vt = (e) => {
|
|
58
|
+
const t = Re([e]);
|
|
59
59
|
let n = e.field;
|
|
60
60
|
for (const i of t)
|
|
61
61
|
if ("aggregate" in i)
|
|
62
62
|
for (const r of i.aggregate)
|
|
63
|
-
|
|
64
|
-
else "bin" in i && !e.aggregate ? typeof n == "string" ? n = j(n) : n = [j(n[0])[0], j(n[1])[1]] : "timeUnit" in i && !e.aggregate && (typeof n == "string" ? n =
|
|
63
|
+
ft(r.op) && (typeof n == "string" ? n = J(n, r.op) : n = [J(n[0], r.op), J(n[1], r.op)]);
|
|
64
|
+
else "bin" in i && !e.aggregate ? typeof n == "string" ? n = j(n) : n = [j(n[0])[0], j(n[1])[1]] : "timeUnit" in i && !e.aggregate && (typeof n == "string" ? n = H(n, i.timeUnit) : n = [H(n[0], i.timeUnit), H(n[1], i.timeUnit)]);
|
|
65
65
|
if (typeof n == "string")
|
|
66
66
|
throw new Error("Expected derived field name to be a tuple");
|
|
67
67
|
return n;
|
|
68
68
|
}, Oe = (e, t, n) => {
|
|
69
|
-
const i = new Set(t.filter((
|
|
69
|
+
const i = new Set(t.filter((a) => a.bin && n?.[a.field]?.length).map((a) => a.field));
|
|
70
70
|
let r = e;
|
|
71
|
-
i.size && (r = e.map((
|
|
72
|
-
const o = { ...
|
|
71
|
+
i.size && (r = e.map((a) => {
|
|
72
|
+
const o = { ...a };
|
|
73
73
|
for (const f of i) {
|
|
74
|
-
const [d, u] = j(f), c =
|
|
74
|
+
const [d, u] = j(f), c = Un(a[f], n[f]);
|
|
75
75
|
o[d] = c ? c[0] : null, o[u] = c ? c[1] : null;
|
|
76
76
|
}
|
|
77
77
|
return o;
|
|
78
78
|
}));
|
|
79
|
-
const
|
|
80
|
-
return
|
|
81
|
-
},
|
|
79
|
+
const s = Re(t, i);
|
|
80
|
+
return Ve(r, s);
|
|
81
|
+
}, Un = (e, t) => {
|
|
82
82
|
if (e == null) return;
|
|
83
83
|
const n = Number(e);
|
|
84
84
|
if (!isNaN(n))
|
|
85
85
|
for (let i = 0; i < t.length; i++) {
|
|
86
|
-
const [r,
|
|
87
|
-
if (n >= r && (n <
|
|
86
|
+
const [r, s] = t[i];
|
|
87
|
+
if (n >= r && (n < s || i === t.length - 1 && n <= s))
|
|
88
88
|
return t[i];
|
|
89
89
|
}
|
|
90
|
-
},
|
|
91
|
-
const n = [], i = [], r = [],
|
|
90
|
+
}, Re = (e, t) => {
|
|
91
|
+
const n = [], i = [], r = [], s = /* @__PURE__ */ new Set();
|
|
92
92
|
for (const l of e) {
|
|
93
|
-
const { field:
|
|
94
|
-
d || (o &&
|
|
93
|
+
const { field: a, timeUnit: o, bin: f, aggregate: d } = l;
|
|
94
|
+
d || (o && s.add(H(a, o)), f && j(a).forEach((u) => s.add(u)), !o && !f && s.add(a));
|
|
95
95
|
}
|
|
96
96
|
for (const l of e) {
|
|
97
|
-
const { field:
|
|
98
|
-
if (f && !t?.has(
|
|
99
|
-
const u = j(
|
|
97
|
+
const { field: a, timeUnit: o, bin: f, aggregate: d } = l;
|
|
98
|
+
if (f && !t?.has(a)) {
|
|
99
|
+
const u = j(a);
|
|
100
100
|
i.push({
|
|
101
101
|
bin: !0,
|
|
102
|
-
field:
|
|
102
|
+
field: a,
|
|
103
103
|
as: u
|
|
104
104
|
});
|
|
105
105
|
}
|
|
106
106
|
if (o) {
|
|
107
|
-
const u = f ? j(
|
|
107
|
+
const u = f ? j(a)[0] : H(a, o);
|
|
108
108
|
n.push({
|
|
109
109
|
timeUnit: o,
|
|
110
|
-
field:
|
|
110
|
+
field: a,
|
|
111
111
|
as: u
|
|
112
112
|
});
|
|
113
113
|
}
|
|
114
114
|
if (d) {
|
|
115
|
-
const u = f ? j(
|
|
115
|
+
const u = f ? j(a)[0] : a, c = r.find((p) => p.groupby?.length === s.size && p.groupby?.every((m) => s.has(m)));
|
|
116
116
|
c ? c.aggregate.push({
|
|
117
117
|
op: d,
|
|
118
118
|
field: u,
|
|
119
|
-
as: J(
|
|
119
|
+
as: J(a, d)
|
|
120
120
|
}) : r.push({
|
|
121
121
|
aggregate: [
|
|
122
122
|
{
|
|
123
123
|
op: d,
|
|
124
124
|
field: u,
|
|
125
|
-
as: J(
|
|
125
|
+
as: J(a, d)
|
|
126
126
|
}
|
|
127
127
|
],
|
|
128
|
-
groupby: Array.from(
|
|
128
|
+
groupby: Array.from(s)
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
return [...i, ...n, ...r];
|
|
133
133
|
};
|
|
134
|
-
function
|
|
134
|
+
function Ve(e, t) {
|
|
135
135
|
const r = Fe({
|
|
136
136
|
data: { values: e },
|
|
137
137
|
transform: t,
|
|
138
138
|
mark: "point"
|
|
139
|
-
}).spec.data ?? [],
|
|
139
|
+
}).spec.data ?? [], s = ut(r), l = dt(r, s);
|
|
140
140
|
return l[l.length - 1] ?? [];
|
|
141
141
|
}
|
|
142
|
-
function
|
|
143
|
-
const n = Fe(e).spec.data ?? [], i =
|
|
142
|
+
function An(e) {
|
|
143
|
+
const n = Fe(e).spec.data ?? [], i = ut(n), r = dt(n, i), s = /* @__PURE__ */ new Set();
|
|
144
144
|
for (const l of r) {
|
|
145
|
-
const
|
|
146
|
-
|
|
145
|
+
const a = l.find((o) => o && typeof o == "object");
|
|
146
|
+
a && Object.keys(a).forEach((o) => s.add(o));
|
|
147
147
|
}
|
|
148
|
-
return [...
|
|
148
|
+
return [...s];
|
|
149
149
|
}
|
|
150
150
|
const re = he((e, t, n) => {
|
|
151
151
|
const i = n ? Se(e) : e.field;
|
|
152
|
-
return
|
|
153
|
-
}),
|
|
152
|
+
return Gt({ field: i, type: e.type, timeUnit: e.timeUnit }, t);
|
|
153
|
+
}), Dn = he((e, t) => {
|
|
154
154
|
if (e.bin) {
|
|
155
|
-
const n =
|
|
155
|
+
const n = vt(e);
|
|
156
156
|
return t.map((i) => {
|
|
157
|
-
const r = i[n[0]],
|
|
158
|
-
return [r,
|
|
157
|
+
const r = i[n[0]], s = i[n[1]];
|
|
158
|
+
return [r, s];
|
|
159
159
|
}).sort((i, r) => typeof i[0] == "number" && typeof r[0] == "number" ? i[0] - r[0] : i[0] instanceof Date && r[0] instanceof Date ? i[0].getTime() - r[0].getTime() : typeof i[0] == "string" && typeof r[0] == "string" ? i[0].localeCompare(r[0]) : 0);
|
|
160
160
|
}
|
|
161
161
|
return [];
|
|
162
|
-
}), ve = "dataset",
|
|
163
|
-
["stocks.csv", "cars.json", "weather.csv", "seattle-weather.csv", "penguins.json", "driving.json", "barley.json", "disasters.csv", "gapminder.json"].map((e) => [e, `${
|
|
162
|
+
}), ve = "dataset", $n = "https://raw.githubusercontent.com/vega/vega-datasets/master/data/", Tn = Object.fromEntries(
|
|
163
|
+
["stocks.csv", "cars.json", "weather.csv", "seattle-weather.csv", "penguins.json", "driving.json", "barley.json", "disasters.csv", "gapminder.json"].map((e) => [e, `${$n}${e}`])
|
|
164
164
|
);
|
|
165
|
-
async function
|
|
166
|
-
if (
|
|
165
|
+
async function kn(e) {
|
|
166
|
+
if (pn(e)) {
|
|
167
167
|
const t = e.name || ve;
|
|
168
168
|
return e.values.length ? { name: t, data: e.values } : void 0;
|
|
169
169
|
}
|
|
170
|
-
if (
|
|
171
|
-
const t = e.name || e.url.split("/").pop() || ve, n = await
|
|
170
|
+
if (mt(e)) {
|
|
171
|
+
const t = e.name || e.url.split("/").pop() || ve, n = await We(e.url);
|
|
172
172
|
return n.length ? { name: t, data: n, sourceUrl: e.url } : void 0;
|
|
173
173
|
}
|
|
174
174
|
if (e.name) {
|
|
175
|
-
const t =
|
|
175
|
+
const t = Tn[e.name];
|
|
176
176
|
if (!t) {
|
|
177
177
|
console.error(`Unknown example dataset "${e.name}". A name-only data source must reference a built-in example dataset, or provide a url or values.`);
|
|
178
178
|
return;
|
|
179
179
|
}
|
|
180
|
-
const n = await
|
|
180
|
+
const n = await We(t);
|
|
181
181
|
return n.length ? { name: e.name, data: n, sourceUrl: t } : void 0;
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
|
-
const
|
|
184
|
+
const We = he.promise(async (e) => {
|
|
185
185
|
try {
|
|
186
|
-
const t = await
|
|
186
|
+
const t = await Kt(e);
|
|
187
187
|
return Array.isArray(t) ? t : [];
|
|
188
188
|
} catch (t) {
|
|
189
189
|
return console.warn(`Failed to load data from ${e}
|
|
@@ -192,89 +192,89 @@ const Je = he.promise(async (e) => {
|
|
|
192
192
|
});
|
|
193
193
|
he.promise(async (e, t) => {
|
|
194
194
|
try {
|
|
195
|
-
return
|
|
195
|
+
return Ve(e, t);
|
|
196
196
|
} catch (n) {
|
|
197
197
|
return console.warn(`Failed to evaluate transforms
|
|
198
198
|
${n}`), [];
|
|
199
199
|
}
|
|
200
200
|
});
|
|
201
|
-
function
|
|
201
|
+
function _n(e, t) {
|
|
202
202
|
const n = t.map((i) => ({ name: i.name, type: i.type }));
|
|
203
|
-
return
|
|
203
|
+
return Ht(e, n);
|
|
204
204
|
}
|
|
205
|
-
function
|
|
206
|
-
return e.filter((n) => Object.entries(n).every(([i, r]) => t.find((
|
|
205
|
+
function xn(e, t) {
|
|
206
|
+
return e.filter((n) => Object.entries(n).every(([i, r]) => t.find((s) => s.name === i) ? r != null : !0));
|
|
207
207
|
}
|
|
208
208
|
function D(e, t) {
|
|
209
209
|
return e.fields.find((n) => n.name === t);
|
|
210
210
|
}
|
|
211
|
-
function
|
|
212
|
-
const { active: n, name: i, encodings: r, ...
|
|
213
|
-
...
|
|
211
|
+
function x(e, t) {
|
|
212
|
+
const { active: n, name: i, encodings: r, ...s } = e, l = t ? {
|
|
213
|
+
...s,
|
|
214
214
|
...t
|
|
215
|
-
} : { field: i, ...
|
|
216
|
-
return Object.fromEntries(Object.entries(l).filter(([
|
|
215
|
+
} : { field: i, ...s };
|
|
216
|
+
return Object.fromEntries(Object.entries(l).filter(([a, o]) => o !== gt));
|
|
217
217
|
}
|
|
218
|
-
function
|
|
219
|
-
const i = [...Object.values(t.encoding), ...t.traversal].flatMap((
|
|
220
|
-
const l = D(e,
|
|
221
|
-
return l ? [
|
|
218
|
+
function Ce(e, t) {
|
|
219
|
+
const i = [...Object.values(t.encoding), ...t.traversal].flatMap((s) => {
|
|
220
|
+
const l = D(e, s.field);
|
|
221
|
+
return l ? [x(l, s)] : [];
|
|
222
222
|
}), r = /* @__PURE__ */ new Set();
|
|
223
|
-
return i.filter((
|
|
224
|
-
const l = JSON.stringify(
|
|
223
|
+
return i.filter((s) => {
|
|
224
|
+
const l = JSON.stringify(s);
|
|
225
225
|
return r.has(l) ? !1 : (r.add(l), !0);
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
|
-
async function
|
|
228
|
+
async function Nn(e, t, n) {
|
|
229
229
|
if (!e.data || !(e.fields && e.fields.length))
|
|
230
230
|
return;
|
|
231
231
|
const i = e.data.name;
|
|
232
232
|
if (i && t[i]?.data?.length)
|
|
233
|
-
return
|
|
234
|
-
const r = await
|
|
233
|
+
return Ye(e);
|
|
234
|
+
const r = await kn(e.data);
|
|
235
235
|
if (!r)
|
|
236
236
|
return;
|
|
237
|
-
const
|
|
238
|
-
if (
|
|
239
|
-
return n(r.name,
|
|
237
|
+
const s = Ye(e), l = _n(r.data, s.fields), a = xn(l, s.fields);
|
|
238
|
+
if (a.length)
|
|
239
|
+
return n(r.name, a, r.sourceUrl), s;
|
|
240
240
|
}
|
|
241
|
-
function
|
|
242
|
-
if (e.instrument !== void 0 && !
|
|
241
|
+
function Fn(e) {
|
|
242
|
+
if (e.instrument !== void 0 && !hn(e.instrument)) {
|
|
243
243
|
console.warn(`Unknown audio instrument "${e.instrument}" on unit "${e.name}"; falling back to the default.`);
|
|
244
244
|
const { instrument: t, ...n } = e;
|
|
245
245
|
return n;
|
|
246
246
|
}
|
|
247
247
|
return e;
|
|
248
248
|
}
|
|
249
|
-
function
|
|
250
|
-
const t =
|
|
249
|
+
function Ye(e) {
|
|
250
|
+
const t = (Xe(e.visual) ? e.visual.units : [e.visual]).map((a, o) => ({ ...a, name: a.name ?? bn(o) })), n = Xe(e.visual) ? e.visual.composition : void 0, i = (Je(e.audio) ? e.audio.units : [e.audio]).map((a, o) => ({ ...a, name: a.name ?? wn(o) })), r = Je(e.audio) ? e.audio.composition : void 0, s = e.fields.map((a) => {
|
|
251
251
|
const o = [];
|
|
252
252
|
return t.forEach((f) => {
|
|
253
253
|
Object.entries(f.encoding).forEach(([d, u]) => {
|
|
254
|
-
|
|
254
|
+
pt(d) && u.field === a.name && o.push({ unit: f.name, property: d });
|
|
255
255
|
});
|
|
256
256
|
}), i.forEach((f) => {
|
|
257
257
|
Object.entries(f.encoding).forEach(([d, u]) => {
|
|
258
|
-
d === "pitch" && u.field ===
|
|
258
|
+
d === "pitch" && u.field === a.name && o.push({ unit: f.name, property: d });
|
|
259
259
|
});
|
|
260
|
-
}), { ...
|
|
260
|
+
}), { ...a, active: !0, encodings: o };
|
|
261
261
|
});
|
|
262
262
|
return {
|
|
263
263
|
...e,
|
|
264
264
|
data: {
|
|
265
|
-
name: e.data.name || (
|
|
265
|
+
name: e.data.name || (mt(e.data) ? e.data.url.split("/").pop() : ve) || ve
|
|
266
266
|
},
|
|
267
|
-
fields:
|
|
267
|
+
fields: s,
|
|
268
268
|
visual: { units: t, composition: n || "layer" },
|
|
269
|
-
audio: { units: i.map(
|
|
269
|
+
audio: { units: i.map(Fn), composition: r || "concat" },
|
|
270
270
|
// regenerate node ids on import so a serialized id can never collide with one
|
|
271
271
|
// this session's counter later mints
|
|
272
272
|
text: {
|
|
273
|
-
structures: e.text?.structures ? Object.fromEntries(Object.entries(e.text.structures).map(([
|
|
273
|
+
structures: e.text?.structures ? Object.fromEntries(Object.entries(e.text.structures).map(([a, o]) => [a, o.map(ht)])) : {}
|
|
274
274
|
}
|
|
275
275
|
};
|
|
276
276
|
}
|
|
277
|
-
function
|
|
277
|
+
function _e(e, t) {
|
|
278
278
|
if (e.visual.units.length === 0 || e.visual.units.map((o) => Object.values(o.encoding).length).reduce((o, f) => o + f, 0) === 0) return;
|
|
279
279
|
const i = [
|
|
280
280
|
{
|
|
@@ -287,12 +287,12 @@ function xe(e, t) {
|
|
|
287
287
|
if (f.length === 1) {
|
|
288
288
|
const d = f[0], u = $e(d.encoding);
|
|
289
289
|
return u && Object.keys(u).forEach((c) => {
|
|
290
|
-
if (
|
|
290
|
+
if (pt(c)) {
|
|
291
291
|
const p = u[c];
|
|
292
292
|
if (p) {
|
|
293
293
|
const m = D(o, p.field);
|
|
294
294
|
if (m) {
|
|
295
|
-
const y =
|
|
295
|
+
const y = x(m, p);
|
|
296
296
|
if (u[c] = {
|
|
297
297
|
...y
|
|
298
298
|
}, c === "facet") {
|
|
@@ -318,7 +318,7 @@ function xe(e, t) {
|
|
|
318
318
|
encoding: {
|
|
319
319
|
...u,
|
|
320
320
|
color: {
|
|
321
|
-
...
|
|
321
|
+
...s({ ...u.color || { value: "navy" }, scale: d.mark === "area" ? { scheme: "category20b" } : void 0 }, "brush", "grey")
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
324
|
};
|
|
@@ -343,40 +343,40 @@ function xe(e, t) {
|
|
|
343
343
|
const o = e.visual.units[0], f = o.encoding.y?.field, d = o.encoding.x?.field, u = D(e, f), c = D(e, d);
|
|
344
344
|
u?.type === "quantitative" && c?.type !== "quantitative" ? i[0].select = { type: "interval", encodings: ["x"] } : c?.type === "quantitative" && u?.type !== "quantitative" && (i[0].select = { type: "interval", encodings: ["y"] });
|
|
345
345
|
}
|
|
346
|
-
const
|
|
346
|
+
const s = (o, f, d, u) => ({
|
|
347
347
|
condition: { param: f, empty: u || !0, ...o },
|
|
348
348
|
value: d
|
|
349
349
|
}), l = r(e);
|
|
350
|
-
let
|
|
351
|
-
return "mark" in l ?
|
|
350
|
+
let a;
|
|
351
|
+
return "mark" in l ? a = $e({
|
|
352
352
|
data: { values: t },
|
|
353
353
|
params: i,
|
|
354
354
|
...l
|
|
355
|
-
}) :
|
|
355
|
+
}) : a = $e({
|
|
356
356
|
data: { values: t },
|
|
357
357
|
...l
|
|
358
|
-
}), Wt(
|
|
358
|
+
}), Wt(a);
|
|
359
359
|
}
|
|
360
|
-
async function
|
|
360
|
+
async function Pn(e, t) {
|
|
361
361
|
let n;
|
|
362
362
|
const i = e.text.structures, r = e.visual.units.map((o) => o.name);
|
|
363
363
|
JSON.stringify(i);
|
|
364
|
-
const
|
|
365
|
-
if (l ? n = await
|
|
364
|
+
const s = new Map(e.fields.map((o) => [o.name, o.type])), l = _e(e, t);
|
|
365
|
+
if (l ? n = await zt(l) : n = {
|
|
366
366
|
data: t,
|
|
367
367
|
fields: []
|
|
368
|
-
},
|
|
369
|
-
|
|
370
|
-
}) :
|
|
371
|
-
(
|
|
368
|
+
}, Ge(n) ? n.units.forEach((o) => {
|
|
369
|
+
a(o, e);
|
|
370
|
+
}) : a(n, e), l)
|
|
371
|
+
(Ge(n) ? n.units : [n]).forEach((f, d) => {
|
|
372
372
|
const u = i[r[d]];
|
|
373
|
-
u?.length &&
|
|
373
|
+
u?.length && Qe(f, u, s);
|
|
374
374
|
});
|
|
375
375
|
else {
|
|
376
|
-
const o = i[
|
|
377
|
-
o?.length &&
|
|
376
|
+
const o = i[En];
|
|
377
|
+
o?.length && Qe(n, o, s);
|
|
378
378
|
}
|
|
379
|
-
function
|
|
379
|
+
function a(o, f) {
|
|
380
380
|
o.fields?.length === 0 && (delete o.mark, delete o.axes, delete o.legends), o.fields && f.fields.filter((d) => d.active).forEach((d) => {
|
|
381
381
|
o.fields?.find((u) => u.field === d.name) || o.fields?.push({
|
|
382
382
|
...d,
|
|
@@ -387,12 +387,12 @@ async function kn(e, t) {
|
|
|
387
387
|
}
|
|
388
388
|
return n;
|
|
389
389
|
}
|
|
390
|
-
let
|
|
391
|
-
function
|
|
392
|
-
return `text_node_${
|
|
390
|
+
let On = 0;
|
|
391
|
+
function Rn() {
|
|
392
|
+
return `text_node_${On++}`;
|
|
393
393
|
}
|
|
394
|
-
function
|
|
395
|
-
return { ...e, id:
|
|
394
|
+
function ht(e) {
|
|
395
|
+
return { ...e, id: Rn(), children: e.children.map(ht) };
|
|
396
396
|
}
|
|
397
397
|
function ge(e, t) {
|
|
398
398
|
if (!e || typeof e != "object") return e;
|
|
@@ -407,8 +407,8 @@ function ge(e, t) {
|
|
|
407
407
|
}
|
|
408
408
|
return e;
|
|
409
409
|
}
|
|
410
|
-
function
|
|
411
|
-
const i = e.children.map((r) =>
|
|
410
|
+
function yt(e, t, n) {
|
|
411
|
+
const i = e.children.map((r) => yt(r, t, n));
|
|
412
412
|
if (e.nodeType === "group") {
|
|
413
413
|
const r = e.groupby.map(n);
|
|
414
414
|
return { groupby: r.length === 1 ? r[0] : r, ...i.length ? { children: i } : {} };
|
|
@@ -420,55 +420,55 @@ function vt(e, t, n) {
|
|
|
420
420
|
...i.length ? { children: i } : {}
|
|
421
421
|
};
|
|
422
422
|
}
|
|
423
|
-
function
|
|
423
|
+
function Ze(e, t) {
|
|
424
424
|
return {
|
|
425
425
|
type: e.type ?? t?.type,
|
|
426
|
-
timeUnit: e.timeUnit ===
|
|
426
|
+
timeUnit: e.timeUnit === gt ? void 0 : e.timeUnit ?? t?.timeUnit,
|
|
427
427
|
bin: e.bin !== void 0 ? e.bin : !!t?.bin
|
|
428
428
|
};
|
|
429
429
|
}
|
|
430
430
|
const Te = (e) => `${e.type ?? ""}|${e.timeUnit ?? ""}|${e.bin ? "bin" : ""}`;
|
|
431
|
-
function
|
|
432
|
-
const i = e.fields ?? (e.fields = []), r = e.data ?? [],
|
|
431
|
+
function Qe(e, t, n) {
|
|
432
|
+
const i = e.fields ?? (e.fields = []), r = e.data ?? [], s = (d) => i.find((u) => u.field === d), l = /* @__PURE__ */ new Map(), a = (d) => d.forEach((u) => {
|
|
433
433
|
u.nodeType === "group" && u.groupby.forEach((c) => {
|
|
434
|
-
const p =
|
|
434
|
+
const p = Ze(c, s(c.field)), m = l.get(c.field) ?? /* @__PURE__ */ new Map();
|
|
435
435
|
m.set(Te(p), p), l.set(c.field, m);
|
|
436
|
-
}),
|
|
436
|
+
}), a(u.children);
|
|
437
437
|
});
|
|
438
|
-
|
|
438
|
+
a(t);
|
|
439
439
|
const o = /* @__PURE__ */ new Map();
|
|
440
440
|
l.forEach((d, u) => {
|
|
441
|
-
const c =
|
|
441
|
+
const c = s(u), p = c ? Te({ type: c.type, timeUnit: c.timeUnit, bin: !!c.bin }) : void 0, m = [...d.keys()], y = p && d.has(p) ? p : m[0];
|
|
442
442
|
d.forEach((w, O) => {
|
|
443
443
|
if (O === y)
|
|
444
444
|
c && (w.type && (c.type = w.type), c.timeUnit = w.timeUnit, c.bin = w.bin || void 0), o.set(`${u}|${O}`, u);
|
|
445
445
|
else {
|
|
446
|
-
const
|
|
447
|
-
o.set(`${u}|${O}`,
|
|
448
|
-
u in
|
|
446
|
+
const C = [w.type, w.timeUnit, w.bin ? "bin" : ""].filter(Boolean), R = `${u}__${C.join("_") || "raw"}`;
|
|
447
|
+
o.set(`${u}|${O}`, R), i.find((k) => k.field === R) || i.push({ field: R, label: u, type: w.type ?? n.get(u), timeUnit: w.timeUnit, bin: w.bin || void 0 }), r.forEach((k) => {
|
|
448
|
+
u in k && !(R in k) && (k[R] = k[u]);
|
|
449
449
|
});
|
|
450
450
|
}
|
|
451
451
|
});
|
|
452
452
|
});
|
|
453
|
-
const f = (d) => o.get(`${d.field}|${Te(
|
|
454
|
-
e.structure = t.map((d) =>
|
|
453
|
+
const f = (d) => o.get(`${d.field}|${Te(Ze(d, s(d.field)))}`) ?? d.field;
|
|
454
|
+
e.structure = t.map((d) => yt(d, n, f));
|
|
455
455
|
}
|
|
456
|
-
function
|
|
457
|
-
const n = Fe(e).spec, i =
|
|
456
|
+
function Vn(e, t) {
|
|
457
|
+
const n = Fe(e).spec, i = Qt(n), r = new en(i, {
|
|
458
458
|
renderer: "canvas",
|
|
459
459
|
container: t,
|
|
460
460
|
hover: !0
|
|
461
461
|
});
|
|
462
462
|
return r.runAsync(), r;
|
|
463
463
|
}
|
|
464
|
-
const
|
|
465
|
-
function
|
|
466
|
-
const [t, n] =
|
|
464
|
+
const St = W();
|
|
465
|
+
function Cn(e) {
|
|
466
|
+
const [t, n] = V(void 0), i = {
|
|
467
467
|
setSelection: (r) => {
|
|
468
468
|
r && r.predicate && "and" in r.predicate && r.predicate.and.length === 0 && (r.predicate = void 0), n(r);
|
|
469
469
|
}
|
|
470
470
|
};
|
|
471
|
-
return S(
|
|
471
|
+
return S(St.Provider, {
|
|
472
472
|
value: [t, i],
|
|
473
473
|
get children() {
|
|
474
474
|
return e.children;
|
|
@@ -476,71 +476,74 @@ function Fn(e) {
|
|
|
476
476
|
});
|
|
477
477
|
}
|
|
478
478
|
function se() {
|
|
479
|
-
const e =
|
|
479
|
+
const e = Y(St);
|
|
480
480
|
if (e === void 0)
|
|
481
481
|
throw new Error("useUmweltSelection must be used within a UmweltSelectionProvider");
|
|
482
482
|
return e;
|
|
483
483
|
}
|
|
484
|
-
function
|
|
484
|
+
function bt(e, t, n) {
|
|
485
485
|
const i = D(e, n);
|
|
486
486
|
if (!i) return;
|
|
487
487
|
const r = i.encodings.find((u) => u.property === "x" || u.property === "y");
|
|
488
488
|
if (!r) return;
|
|
489
|
-
const
|
|
490
|
-
if (!
|
|
491
|
-
const
|
|
489
|
+
const s = e.visual.units.find((u) => u.name === r.unit), l = s?.encoding[r.property];
|
|
490
|
+
if (!s || !l) return;
|
|
491
|
+
const a = x(i, l), o = s.mark === "point" && a.type === "quantitative" ? !1 : a.scale?.zero, f = Array.isArray(a.scale?.domain) ? a.scale?.domain : void 0, d = {
|
|
492
492
|
field: n,
|
|
493
|
-
type:
|
|
494
|
-
bin: !!
|
|
495
|
-
timeUnit: s.timeUnit,
|
|
493
|
+
type: a.type,
|
|
494
|
+
bin: !!a.bin,
|
|
496
495
|
scaleZero: o,
|
|
497
496
|
scaleDomain: f,
|
|
498
497
|
// vega-lite sorts discrete scales ascending unless told otherwise
|
|
499
|
-
sort:
|
|
498
|
+
sort: a.sort === void 0 ? "ascending" : a.sort
|
|
500
499
|
};
|
|
501
|
-
|
|
500
|
+
if (a.type === "temporal" && a.timeUnit && !a.bin && !a.aggregate) {
|
|
501
|
+
const u = a.timeUnit, c = H(n, u), p = Ve(t, [{ timeUnit: u, field: n, as: c }]);
|
|
502
|
+
return Ke(p, { ...d, field: c });
|
|
503
|
+
}
|
|
504
|
+
return Ke(t, d);
|
|
502
505
|
}
|
|
503
|
-
function
|
|
506
|
+
function wt(e, t) {
|
|
504
507
|
const n = D(e, t);
|
|
505
508
|
if (!n) return;
|
|
506
509
|
const i = n.encodings.find((l) => l.property === "x" || l.property === "y");
|
|
507
510
|
if (!i) return;
|
|
508
|
-
const
|
|
509
|
-
if (
|
|
510
|
-
return
|
|
511
|
+
const s = e.visual.units.find((l) => l.name === i.unit)?.encoding[i.property];
|
|
512
|
+
if (s)
|
|
513
|
+
return x(n, s);
|
|
511
514
|
}
|
|
512
|
-
function
|
|
513
|
-
return !!
|
|
515
|
+
function In(e, t) {
|
|
516
|
+
return !!wt(e, t)?.bin;
|
|
514
517
|
}
|
|
515
|
-
function
|
|
518
|
+
function Ie(e, t, n, i) {
|
|
516
519
|
const r = {};
|
|
517
|
-
for (const
|
|
518
|
-
if (
|
|
519
|
-
if (
|
|
520
|
-
const l = { field:
|
|
521
|
-
let
|
|
522
|
-
if (
|
|
520
|
+
for (const s of i)
|
|
521
|
+
if (s.bin && s.type === "quantitative" && !(s.field in r)) {
|
|
522
|
+
if (In(e, s.field)) continue;
|
|
523
|
+
const l = { field: s.field, type: s.type };
|
|
524
|
+
let a = Xt(l, n, bt(e, t, s.field));
|
|
525
|
+
if (a.length === 0) {
|
|
523
526
|
let o = 1 / 0, f = -1 / 0;
|
|
524
527
|
for (const d of n) {
|
|
525
|
-
const u = d[
|
|
528
|
+
const u = d[s.field];
|
|
526
529
|
if (u == null) continue;
|
|
527
530
|
const c = Number(u);
|
|
528
531
|
isNaN(c) || (c < o && (o = c), c > f && (f = c));
|
|
529
532
|
}
|
|
530
|
-
o <= f && (
|
|
533
|
+
o <= f && (a = [[o, f]]);
|
|
531
534
|
}
|
|
532
|
-
r[
|
|
535
|
+
r[s.field] = a;
|
|
533
536
|
}
|
|
534
537
|
return r;
|
|
535
538
|
}
|
|
536
|
-
function
|
|
537
|
-
return e.filter((n) =>
|
|
539
|
+
function Le(e, t) {
|
|
540
|
+
return e.filter((n) => nn(n, t));
|
|
538
541
|
}
|
|
539
|
-
const
|
|
540
|
-
function
|
|
542
|
+
const et = (e) => e == null ? e : e instanceof Date ? e.getTime() : new Date(e).getTime();
|
|
543
|
+
function Ln(e, t, n) {
|
|
541
544
|
return e.aggregate ? `${e.aggregate}_${t}` : e.timeUnit ? `${e.timeUnit}_${t}` : e.bin ? n.find((i) => i.startsWith("bin") && i.includes(t) && !i.endsWith("_end")) ?? t : t;
|
|
542
545
|
}
|
|
543
|
-
function
|
|
546
|
+
function jn(e, t, n) {
|
|
544
547
|
if (!t) return t;
|
|
545
548
|
const i = (r) => {
|
|
546
549
|
if (!r || typeof r != "object") return r;
|
|
@@ -548,16 +551,16 @@ function Cn(e, t, n) {
|
|
|
548
551
|
if ("or" in r) return { or: r.or.map(i) };
|
|
549
552
|
if ("not" in r) return { not: i(r.not) };
|
|
550
553
|
if (!("field" in r)) return r;
|
|
551
|
-
const
|
|
552
|
-
if (!
|
|
553
|
-
const l =
|
|
554
|
-
return
|
|
554
|
+
const s = wt(e, r.field);
|
|
555
|
+
if (!s) return r;
|
|
556
|
+
const l = Ln(s, r.field, n), a = l === r.field ? { ...r } : { ...r, field: l };
|
|
557
|
+
return s.type === "temporal" && ("equal" in a && (a.equal = et(a.equal)), "range" in a && Array.isArray(a.range) && (a.range = a.range.map(et))), a;
|
|
555
558
|
};
|
|
556
559
|
return i(t);
|
|
557
560
|
}
|
|
558
|
-
var
|
|
559
|
-
function
|
|
560
|
-
const [t, n] = se(), [i, r] =
|
|
561
|
+
var qn = /* @__PURE__ */ A("<div class=uw-vl-container>");
|
|
562
|
+
function Mn(e) {
|
|
563
|
+
const [t, n] = se(), [i, r] = V(!1), [s, l] = V(null), [a, o] = V(null), f = tn((u) => {
|
|
561
564
|
if (i()) {
|
|
562
565
|
const c = Yt(u);
|
|
563
566
|
n.setSelection({
|
|
@@ -565,56 +568,56 @@ function Vn(e) {
|
|
|
565
568
|
predicate: c
|
|
566
569
|
});
|
|
567
570
|
}
|
|
568
|
-
}, 250), d =
|
|
569
|
-
const u =
|
|
570
|
-
return u ?
|
|
571
|
+
}, 250), d = T(() => {
|
|
572
|
+
const u = _e(e.spec, e.data);
|
|
573
|
+
return u ? An(u) : [];
|
|
571
574
|
});
|
|
572
575
|
return P(() => {
|
|
573
|
-
const u = t(), c =
|
|
576
|
+
const u = t(), c = s();
|
|
574
577
|
if (!u) {
|
|
575
|
-
c && c.data(
|
|
578
|
+
c && c.data(He, []).run();
|
|
576
579
|
return;
|
|
577
580
|
}
|
|
578
581
|
if (c && (u.source === "sonification" || u.source === "text-navigation")) {
|
|
579
|
-
const p = u.source === "sonification" ?
|
|
580
|
-
c.data(
|
|
582
|
+
const p = u.source === "sonification" ? jn(e.spec, u.predicate, d()) : u.predicate, m = Zt(p);
|
|
583
|
+
c.data(He, m ? [m] : []).run();
|
|
581
584
|
}
|
|
582
585
|
}), P(() => {
|
|
583
|
-
const u =
|
|
586
|
+
const u = _e(e.spec, e.data), c = a();
|
|
584
587
|
if (u && c)
|
|
585
588
|
try {
|
|
586
|
-
const p =
|
|
589
|
+
const p = Vn(u, c);
|
|
587
590
|
p.addDataListener("brush_store", (m, y) => {
|
|
588
591
|
f(y);
|
|
589
592
|
}), l(p);
|
|
590
593
|
} catch (p) {
|
|
591
594
|
console.error(p);
|
|
592
595
|
}
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
const p =
|
|
596
|
+
X(() => {
|
|
597
|
+
s()?.finalize(), l(null);
|
|
598
|
+
const p = a();
|
|
596
599
|
p && (p.innerHTML = "");
|
|
597
600
|
});
|
|
598
601
|
}), (() => {
|
|
599
|
-
var u =
|
|
602
|
+
var u = qn();
|
|
600
603
|
return u.addEventListener("mouseleave", () => r(!1)), u.addEventListener("mouseenter", () => r(!0)), Ne(o, u), u;
|
|
601
604
|
})();
|
|
602
605
|
}
|
|
603
|
-
var
|
|
604
|
-
function
|
|
605
|
-
const [t, n] = se(), [i, r] =
|
|
606
|
-
let
|
|
606
|
+
var Bn = /* @__PURE__ */ A("<div class=uw-olli-container>");
|
|
607
|
+
function zn(e) {
|
|
608
|
+
const [t, n] = se(), [i, r] = V(null), [s, l] = V(null);
|
|
609
|
+
let a = !1;
|
|
607
610
|
return P(() => {
|
|
608
611
|
let o = !1;
|
|
609
|
-
|
|
612
|
+
X(() => {
|
|
610
613
|
o = !0;
|
|
611
|
-
}),
|
|
614
|
+
}), Pn(e.spec, e.data).then((f) => {
|
|
612
615
|
const d = i();
|
|
613
616
|
if (o || !f || !d) return;
|
|
614
|
-
|
|
615
|
-
const u =
|
|
617
|
+
s()?.destroy(), d.innerHTML = "";
|
|
618
|
+
const u = Bt(f, d);
|
|
616
619
|
u.onFocusChange((c) => {
|
|
617
|
-
if (
|
|
620
|
+
if (a) return;
|
|
618
621
|
const p = u.fullPredicate(c);
|
|
619
622
|
"and" in p && p.and.length > 0 ? n.setSelection({
|
|
620
623
|
source: "text-navigation",
|
|
@@ -631,45 +634,45 @@ function Ln(e) {
|
|
|
631
634
|
}), l(u);
|
|
632
635
|
});
|
|
633
636
|
}), P(() => {
|
|
634
|
-
const o = t(), f =
|
|
635
|
-
o && f && o.source === "visualization" && (
|
|
637
|
+
const o = t(), f = s();
|
|
638
|
+
o && f && o.source === "visualization" && (a = !0, f.setSelection(o.predicate ?? {
|
|
636
639
|
and: []
|
|
637
640
|
}), queueMicrotask(() => {
|
|
638
|
-
|
|
641
|
+
a = !1;
|
|
639
642
|
}));
|
|
640
|
-
}),
|
|
641
|
-
|
|
643
|
+
}), X(() => {
|
|
644
|
+
s()?.destroy();
|
|
642
645
|
}), (() => {
|
|
643
|
-
var o =
|
|
646
|
+
var o = Bn();
|
|
644
647
|
return Ne(r, o), o;
|
|
645
648
|
})();
|
|
646
649
|
}
|
|
647
|
-
const
|
|
648
|
-
function
|
|
650
|
+
const Et = W();
|
|
651
|
+
function Gn(e) {
|
|
649
652
|
const [t] = se(), n = () => ({
|
|
650
653
|
activeUnitName: void 0,
|
|
651
654
|
selection: void 0
|
|
652
655
|
}), [i, r] = ye(n());
|
|
653
|
-
let
|
|
656
|
+
let s = null;
|
|
654
657
|
P(() => {
|
|
655
|
-
const
|
|
656
|
-
|
|
658
|
+
const a = t();
|
|
659
|
+
a && a.source !== "sonification" && l.setSelection(a.predicate);
|
|
657
660
|
});
|
|
658
661
|
const l = {
|
|
659
|
-
setActiveUnit: (
|
|
660
|
-
r("activeUnitName",
|
|
662
|
+
setActiveUnit: (a) => {
|
|
663
|
+
r("activeUnitName", a);
|
|
661
664
|
},
|
|
662
|
-
setSelection: (
|
|
663
|
-
r("selection",
|
|
665
|
+
setSelection: (a) => {
|
|
666
|
+
r("selection", a);
|
|
664
667
|
},
|
|
665
|
-
registerPlayCallback: (
|
|
666
|
-
(o ||
|
|
668
|
+
registerPlayCallback: (a, o = !1) => {
|
|
669
|
+
(o || s === null) && (s = a);
|
|
667
670
|
},
|
|
668
671
|
triggerPlay: () => {
|
|
669
|
-
|
|
672
|
+
s?.();
|
|
670
673
|
}
|
|
671
674
|
};
|
|
672
|
-
return S(
|
|
675
|
+
return S(Et.Provider, {
|
|
673
676
|
value: [i, l],
|
|
674
677
|
get children() {
|
|
675
678
|
return e.children;
|
|
@@ -677,23 +680,23 @@ function jn(e) {
|
|
|
677
680
|
});
|
|
678
681
|
}
|
|
679
682
|
function be() {
|
|
680
|
-
const e =
|
|
683
|
+
const e = Y(Et);
|
|
681
684
|
if (e === void 0)
|
|
682
685
|
throw new Error("useSonificationRuntime must be used within a SonificationRuntimeProvider");
|
|
683
686
|
return e;
|
|
684
687
|
}
|
|
685
|
-
const B = (e, t) => Array.isArray(e) ? e.length === 2 && (t.type === "quantitative" || t.type === "temporal") ? e.map((n) => B(n, t)).join("–") : Pe(e.map((n) => B(n, t))) :
|
|
688
|
+
const B = (e, t) => Array.isArray(e) ? e.length === 2 && (t.type === "quantitative" || t.type === "temporal") ? e.map((n) => B(n, t)).join("–") : Pe(e.map((n) => B(n, t))) : rn(e, t), Kn = "umwelt", Hn = 1, Xn = {
|
|
686
689
|
muted: !1,
|
|
687
690
|
speakAxisTicks: !0,
|
|
688
691
|
speechRate: 50,
|
|
689
692
|
playbackRate: 1
|
|
690
|
-
},
|
|
691
|
-
const t =
|
|
692
|
-
|
|
693
|
+
}, Ut = () => new an(Kn, Hn), At = () => Ut().read(), de = (e) => {
|
|
694
|
+
const t = At() ?? Xn;
|
|
695
|
+
Ut().write({
|
|
693
696
|
...t,
|
|
694
697
|
...e
|
|
695
698
|
});
|
|
696
|
-
},
|
|
699
|
+
}, tt = (e, t, n) => Math.min(Math.max(e, t), n), Jn = {
|
|
697
700
|
// clean triangle beep — the historical default; most pitch-legible source
|
|
698
701
|
pure: {
|
|
699
702
|
create: () => new $.Synth({
|
|
@@ -810,10 +813,10 @@ const B = (e, t) => Array.isArray(e) ? e.length === 2 && (t.type === "quantitati
|
|
|
810
813
|
}),
|
|
811
814
|
gainTrim: -7
|
|
812
815
|
}
|
|
813
|
-
},
|
|
816
|
+
}, nt = ["pure", "bell", "bright", "reed", "hollow", "strings"], Wn = (e) => nt[e % nt.length], ke = "default", ne = 0.1;
|
|
814
817
|
let M = null;
|
|
815
|
-
const ae = 120,
|
|
816
|
-
function
|
|
818
|
+
const ae = 120, Dt = W();
|
|
819
|
+
function Yn(e) {
|
|
817
820
|
const t = /* @__PURE__ */ new Map(), n = {
|
|
818
821
|
attack: 0.01,
|
|
819
822
|
decay: 0,
|
|
@@ -824,16 +827,16 @@ function Kn(e) {
|
|
|
824
827
|
}, r = (c, p) => {
|
|
825
828
|
let m = t.get(c);
|
|
826
829
|
if (m && p !== void 0 && m.instrument !== p && (i(m), t.delete(c), m = void 0), !m) {
|
|
827
|
-
const y = p ?? "pure", w =
|
|
830
|
+
const y = p ?? "pure", w = Jn[y], O = new $.Panner(0).toDestination(), C = w.create().connect(O), R = new $.NoiseSynth({
|
|
828
831
|
noise: {
|
|
829
832
|
type: "pink"
|
|
830
833
|
},
|
|
831
834
|
envelope: n
|
|
832
|
-
}),
|
|
833
|
-
|
|
834
|
-
synth:
|
|
835
|
-
noiseSynth:
|
|
836
|
-
noiseGain:
|
|
835
|
+
}), k = new $.Gain(0.3);
|
|
836
|
+
R.connect(k), k.connect(O), m = {
|
|
837
|
+
synth: C,
|
|
838
|
+
noiseSynth: R,
|
|
839
|
+
noiseGain: k,
|
|
837
840
|
panner: O,
|
|
838
841
|
instrument: y,
|
|
839
842
|
gainTrim: w.gainTrim,
|
|
@@ -842,19 +845,19 @@ function Kn(e) {
|
|
|
842
845
|
}, t.set(c, m);
|
|
843
846
|
}
|
|
844
847
|
return m;
|
|
845
|
-
},
|
|
848
|
+
}, s = (c) => {
|
|
846
849
|
c.synth.triggerRelease(), c.noiseSynth.triggerRelease(), c.isSynthPlaying = !1, c.isNoisePlaying = !1;
|
|
847
850
|
};
|
|
848
851
|
P(() => {
|
|
849
852
|
const c = () => {
|
|
850
853
|
document.hidden && u.stopTransport();
|
|
851
854
|
};
|
|
852
|
-
document.addEventListener("visibilitychange", c),
|
|
855
|
+
document.addEventListener("visibilitychange", c), X(() => {
|
|
853
856
|
document.removeEventListener("visibilitychange", c), t.forEach(i), t.clear(), M === d && (M = null, $.getTransport().cancel(), $.getTransport().stop());
|
|
854
857
|
});
|
|
855
858
|
});
|
|
856
859
|
const l = () => {
|
|
857
|
-
const c =
|
|
860
|
+
const c = At();
|
|
858
861
|
return {
|
|
859
862
|
transport: $.getTransport(),
|
|
860
863
|
muted: c?.muted ?? !1,
|
|
@@ -864,9 +867,9 @@ function Kn(e) {
|
|
|
864
867
|
pauseBetweenSections: 0.25,
|
|
865
868
|
isPlaying: !1
|
|
866
869
|
};
|
|
867
|
-
}, [
|
|
870
|
+
}, [a, o] = ye(l());
|
|
868
871
|
P(() => {
|
|
869
|
-
|
|
872
|
+
a.transport.bpm.value = ae * a.playbackRate;
|
|
870
873
|
});
|
|
871
874
|
const f = () => {
|
|
872
875
|
o((c) => ({
|
|
@@ -896,10 +899,10 @@ function Kn(e) {
|
|
|
896
899
|
}), o((p) => ({
|
|
897
900
|
...p,
|
|
898
901
|
speakAxisTicks: c
|
|
899
|
-
})), c || (speechSynthesis.cancel(),
|
|
902
|
+
})), c || (speechSynthesis.cancel(), a.isPlaying && $.getTransport().start());
|
|
900
903
|
},
|
|
901
904
|
setSpeechRate: (c) => {
|
|
902
|
-
const p =
|
|
905
|
+
const p = tt(c, 1, 100);
|
|
903
906
|
de({
|
|
904
907
|
speechRate: c
|
|
905
908
|
}), o((m) => ({
|
|
@@ -908,7 +911,7 @@ function Kn(e) {
|
|
|
908
911
|
}));
|
|
909
912
|
},
|
|
910
913
|
setPlaybackRate: (c) => {
|
|
911
|
-
const p =
|
|
914
|
+
const p = tt(c, 0.1, 4);
|
|
912
915
|
de({
|
|
913
916
|
playbackRate: p
|
|
914
917
|
}), o((m) => ({
|
|
@@ -938,7 +941,7 @@ function Kn(e) {
|
|
|
938
941
|
startOrRampSynth: (c, p = ke) => {
|
|
939
942
|
const m = r(p);
|
|
940
943
|
if (c.rest) {
|
|
941
|
-
|
|
944
|
+
s(m);
|
|
942
945
|
return;
|
|
943
946
|
}
|
|
944
947
|
if (c.pitch) {
|
|
@@ -951,25 +954,25 @@ function Kn(e) {
|
|
|
951
954
|
releaseSynth: (c) => {
|
|
952
955
|
if (c !== void 0) {
|
|
953
956
|
const p = t.get(c);
|
|
954
|
-
p &&
|
|
957
|
+
p && s(p);
|
|
955
958
|
} else
|
|
956
|
-
t.forEach(
|
|
959
|
+
t.forEach(s);
|
|
957
960
|
}
|
|
958
961
|
};
|
|
959
|
-
return S(
|
|
960
|
-
value: [
|
|
962
|
+
return S(Dt.Provider, {
|
|
963
|
+
value: [a, u],
|
|
961
964
|
get children() {
|
|
962
965
|
return e.children;
|
|
963
966
|
}
|
|
964
967
|
});
|
|
965
968
|
}
|
|
966
969
|
function Z() {
|
|
967
|
-
const e =
|
|
970
|
+
const e = Y(Dt);
|
|
968
971
|
if (e === void 0)
|
|
969
972
|
throw new Error("useSonificationRuntime must be used within a SonificationRuntimeProvider");
|
|
970
973
|
return e;
|
|
971
974
|
}
|
|
972
|
-
const
|
|
975
|
+
const $t = W(), Zn = {
|
|
973
976
|
pitch: [48, 84],
|
|
974
977
|
// in MIDI. Three octaves from C3 to C6
|
|
975
978
|
duration: [0.25, 1],
|
|
@@ -980,7 +983,7 @@ const At = Y(), Hn = {
|
|
|
980
983
|
// lateral without ever going fully single-channel — full pan drops the off ear
|
|
981
984
|
// to silence (fatiguing on headphones, inaudible for single-sided hearing loss).
|
|
982
985
|
pan: [-0.9, 0.9]
|
|
983
|
-
},
|
|
986
|
+
}, it = {
|
|
984
987
|
pitch: 60,
|
|
985
988
|
// MIDI C4 middle C. We encode in MIDI because linear interpolations in Hz are not perceptually linear
|
|
986
989
|
duration: 0.2,
|
|
@@ -990,54 +993,54 @@ const At = Y(), Hn = {
|
|
|
990
993
|
pan: 0
|
|
991
994
|
// center
|
|
992
995
|
};
|
|
993
|
-
function
|
|
996
|
+
function Qn(e, t, n) {
|
|
994
997
|
if (t.length === e.length) {
|
|
995
|
-
const
|
|
996
|
-
return (l) =>
|
|
998
|
+
const s = cn().domain(e).range(t);
|
|
999
|
+
return (l) => s(l);
|
|
997
1000
|
}
|
|
998
1001
|
const i = [Math.min(...t), Math.max(...t)];
|
|
999
1002
|
t.length !== 2 && console.warn(`Audio ${n} scale range has ${t.length} values for ${e.length} categories; ignoring it and spacing evenly across [${i[0]}, ${i[1]}].`);
|
|
1000
|
-
const r =
|
|
1001
|
-
return (
|
|
1003
|
+
const r = ln().domain(e.map(String)).range(i).align(0);
|
|
1004
|
+
return (s) => r(String(s)) ?? i[0];
|
|
1002
1005
|
}
|
|
1003
1006
|
function fe(e, t, n, i) {
|
|
1004
1007
|
const r = n.encoding[i];
|
|
1005
1008
|
if (!r)
|
|
1006
|
-
return () =>
|
|
1007
|
-
const
|
|
1008
|
-
if (!
|
|
1009
|
-
return console.warn(`Field ${r.field} not found in spec`), () =>
|
|
1010
|
-
const l =
|
|
1011
|
-
let
|
|
1012
|
-
if (!
|
|
1013
|
-
const f = l.aggregate === "count" || l.aggregate === "sum", d =
|
|
1014
|
-
switch (
|
|
1009
|
+
return () => it[i];
|
|
1010
|
+
const s = D(e, r.field);
|
|
1011
|
+
if (!s)
|
|
1012
|
+
return console.warn(`Field ${r.field} not found in spec`), () => it[i];
|
|
1013
|
+
const l = x(s, r);
|
|
1014
|
+
let a = l.scale?.domain;
|
|
1015
|
+
if (!a) {
|
|
1016
|
+
const f = l.aggregate === "count" || l.aggregate === "sum", d = Ce(e, n), u = f ? Oe(t, d, Ie(e, t, t, d)) : t;
|
|
1017
|
+
switch (s.type) {
|
|
1015
1018
|
case "ordinal":
|
|
1016
1019
|
case "nominal":
|
|
1017
|
-
|
|
1020
|
+
a = re(l, u, f);
|
|
1018
1021
|
break;
|
|
1019
1022
|
case "quantitative":
|
|
1020
1023
|
case "temporal":
|
|
1021
|
-
|
|
1024
|
+
a = re(l, u, f), a = [a[0], a[a.length - 1]];
|
|
1022
1025
|
break;
|
|
1023
1026
|
default:
|
|
1024
1027
|
throw new Error(`Unsupported field type ${l.type}`);
|
|
1025
1028
|
}
|
|
1026
1029
|
}
|
|
1027
|
-
const o = l.scale?.range ||
|
|
1030
|
+
const o = l.scale?.range || Zn[i];
|
|
1028
1031
|
switch (l.type) {
|
|
1029
1032
|
case "ordinal":
|
|
1030
1033
|
case "nominal":
|
|
1031
|
-
return
|
|
1034
|
+
return Qn(a, o, i);
|
|
1032
1035
|
case "quantitative":
|
|
1033
|
-
return
|
|
1036
|
+
return on().domain(a).range(o);
|
|
1034
1037
|
case "temporal":
|
|
1035
|
-
return
|
|
1038
|
+
return sn().domain(a).range(o);
|
|
1036
1039
|
default:
|
|
1037
1040
|
throw new Error(`Unsupported field type ${l.type}`);
|
|
1038
1041
|
}
|
|
1039
1042
|
}
|
|
1040
|
-
function
|
|
1043
|
+
function Tt(e, t, n) {
|
|
1041
1044
|
return {
|
|
1042
1045
|
pitch: fe(e, t, n, "pitch"),
|
|
1043
1046
|
duration: fe(e, t, n, "duration"),
|
|
@@ -1045,27 +1048,27 @@ function Dt(e, t, n) {
|
|
|
1045
1048
|
pan: fe(e, t, n, "pan")
|
|
1046
1049
|
};
|
|
1047
1050
|
}
|
|
1048
|
-
function
|
|
1049
|
-
return
|
|
1051
|
+
function kt(e, t, n) {
|
|
1052
|
+
return bt(e, t, n) ?? [];
|
|
1050
1053
|
}
|
|
1051
|
-
function
|
|
1052
|
-
const t = (r) =>
|
|
1054
|
+
function ei(e) {
|
|
1055
|
+
const t = (r) => kt(e.spec, e.data, r.field), n = Tt(e.spec, e.data, e.audioUnitSpec), i = {
|
|
1053
1056
|
getAxisTicks: t
|
|
1054
1057
|
};
|
|
1055
|
-
return S(
|
|
1058
|
+
return S($t.Provider, {
|
|
1056
1059
|
value: [n, i],
|
|
1057
1060
|
get children() {
|
|
1058
1061
|
return e.children;
|
|
1059
1062
|
}
|
|
1060
1063
|
});
|
|
1061
1064
|
}
|
|
1062
|
-
function
|
|
1063
|
-
const e =
|
|
1065
|
+
function ti() {
|
|
1066
|
+
const e = Y($t);
|
|
1064
1067
|
if (e === void 0)
|
|
1065
1068
|
throw new Error("useSonificationRuntime must be used within a SonificationRuntimeProvider");
|
|
1066
1069
|
return e;
|
|
1067
1070
|
}
|
|
1068
|
-
const
|
|
1071
|
+
const rt = {
|
|
1069
1072
|
pitch: 60,
|
|
1070
1073
|
// MIDI C4 middle C. We encode in MIDI because linear interpolations in Hz are not perceptually linear
|
|
1071
1074
|
duration: 0.2,
|
|
@@ -1077,31 +1080,31 @@ const nt = {
|
|
|
1077
1080
|
};
|
|
1078
1081
|
function me(e, t, n, i, r) {
|
|
1079
1082
|
if (!n)
|
|
1080
|
-
return
|
|
1081
|
-
const
|
|
1082
|
-
if (!
|
|
1083
|
-
return
|
|
1084
|
-
const l =
|
|
1085
|
-
return i(r[0][
|
|
1086
|
-
}
|
|
1087
|
-
const
|
|
1083
|
+
return rt[e];
|
|
1084
|
+
const s = D(t, n.field);
|
|
1085
|
+
if (!s)
|
|
1086
|
+
return rt[e];
|
|
1087
|
+
const l = x(s, n), a = Se(l);
|
|
1088
|
+
return i(r[0][a]);
|
|
1089
|
+
}
|
|
1090
|
+
const je = (e, t) => e.audioUnitSpec.traversal.find((n) => n.field === t);
|
|
1088
1091
|
function we(e, t, n) {
|
|
1089
|
-
const i = D(e.spec, t), r =
|
|
1092
|
+
const i = D(e.spec, t), r = x(i, je(e, t)), s = e.fieldDomains[t];
|
|
1090
1093
|
if (r.bin && !r.aggregate) {
|
|
1091
|
-
const [l,
|
|
1094
|
+
const [l, a] = vt(r), o = s[n], f = e.derivedData.find((d) => d[l] === o)?.[a] ?? null;
|
|
1092
1095
|
return [o, f];
|
|
1093
1096
|
} else
|
|
1094
|
-
return
|
|
1097
|
+
return s[n];
|
|
1095
1098
|
}
|
|
1096
|
-
function
|
|
1099
|
+
function _t(e, t) {
|
|
1097
1100
|
return {
|
|
1098
1101
|
and: Object.entries(t).map(([n, i]) => {
|
|
1099
|
-
const r = we(e, n, i),
|
|
1102
|
+
const r = we(e, n, i), s = e.fieldDomains[n].length - 1;
|
|
1100
1103
|
return Array.isArray(r) ? {
|
|
1101
1104
|
field: n,
|
|
1102
1105
|
range: r,
|
|
1103
1106
|
inclusiveLeft: !0,
|
|
1104
|
-
inclusiveRight: i ===
|
|
1107
|
+
inclusiveRight: i === s
|
|
1105
1108
|
} : {
|
|
1106
1109
|
field: n,
|
|
1107
1110
|
equal: r
|
|
@@ -1109,22 +1112,22 @@ function Tt(e, t) {
|
|
|
1109
1112
|
})
|
|
1110
1113
|
};
|
|
1111
1114
|
}
|
|
1112
|
-
function
|
|
1115
|
+
function xe(e, t) {
|
|
1113
1116
|
const n = {
|
|
1114
1117
|
and: Object.entries(t).map(([i, r]) => {
|
|
1115
|
-
const
|
|
1118
|
+
const s = e.fieldDomains[i][r], l = D(e.spec, i);
|
|
1116
1119
|
if (!l)
|
|
1117
|
-
return { field: i, equal:
|
|
1118
|
-
const
|
|
1120
|
+
return { field: i, equal: s };
|
|
1121
|
+
const a = x(l, je(e, i));
|
|
1119
1122
|
return {
|
|
1120
|
-
field: Se(
|
|
1121
|
-
equal:
|
|
1123
|
+
field: Se(a),
|
|
1124
|
+
equal: Jt(s, l)
|
|
1122
1125
|
};
|
|
1123
1126
|
})
|
|
1124
1127
|
};
|
|
1125
|
-
return
|
|
1128
|
+
return Le(e.derivedData, n);
|
|
1126
1129
|
}
|
|
1127
|
-
function
|
|
1130
|
+
function ni(e, t) {
|
|
1128
1131
|
const n = e.audioUnitSpec.encoding;
|
|
1129
1132
|
return {
|
|
1130
1133
|
pitch: t.length ? me("pitch", e.spec, n.pitch, e.scales.pitch, t) : void 0,
|
|
@@ -1133,8 +1136,8 @@ function Xn(e, t) {
|
|
|
1133
1136
|
pan: me("pan", e.spec, n.pan, e.scales.pan, t)
|
|
1134
1137
|
};
|
|
1135
1138
|
}
|
|
1136
|
-
function
|
|
1137
|
-
const n = Object.entries(t).map(([r,
|
|
1139
|
+
function ii(e, t) {
|
|
1140
|
+
const n = Object.entries(t).map(([r, s]) => s === e.fieldDomains[r].length - 1 ? 1 : 0).reverse();
|
|
1138
1141
|
let i = 0;
|
|
1139
1142
|
for (let r of n)
|
|
1140
1143
|
if (r)
|
|
@@ -1142,29 +1145,29 @@ function Zn(e, t) {
|
|
|
1142
1145
|
else break;
|
|
1143
1146
|
return i;
|
|
1144
1147
|
}
|
|
1145
|
-
function
|
|
1148
|
+
function ri(e) {
|
|
1146
1149
|
if (e.audioUnitSpec.traversal.length === 0)
|
|
1147
1150
|
return !1;
|
|
1148
1151
|
const t = e.audioUnitSpec.traversal[e.audioUnitSpec.traversal.length - 1].field, n = D(e.spec, t);
|
|
1149
1152
|
return n?.type === "quantitative" || n?.type === "temporal";
|
|
1150
1153
|
}
|
|
1151
|
-
function
|
|
1152
|
-
const t = e.audioUnitSpec.traversal.map((r) => r.field), n = t.map((r) => Array.from({ length: e.fieldDomains[r].length }, (
|
|
1153
|
-
return
|
|
1154
|
-
const
|
|
1155
|
-
return r.forEach((l,
|
|
1156
|
-
|
|
1157
|
-
}),
|
|
1154
|
+
function ai(e) {
|
|
1155
|
+
const t = e.audioUnitSpec.traversal.map((r) => r.field), n = t.map((r) => Array.from({ length: e.fieldDomains[r].length }, (s, l) => l));
|
|
1156
|
+
return un(n).map((r) => {
|
|
1157
|
+
const s = {};
|
|
1158
|
+
return r.forEach((l, a) => {
|
|
1159
|
+
s[t[a]] = l;
|
|
1160
|
+
}), s;
|
|
1158
1161
|
});
|
|
1159
1162
|
}
|
|
1160
|
-
function
|
|
1163
|
+
function si(e, t, n, i) {
|
|
1161
1164
|
if (!n)
|
|
1162
1165
|
return !0;
|
|
1163
1166
|
if (i.bin || i.type === "nominal" || i.type === "ordinal")
|
|
1164
1167
|
return t[i.field] !== n[i.field];
|
|
1165
|
-
const r = e.axisTicks[i.field] ?? [],
|
|
1166
|
-
if (
|
|
1167
|
-
const
|
|
1168
|
+
const r = e.axisTicks[i.field] ?? [], s = xe(e, t), l = xe(e, n);
|
|
1169
|
+
if (s.length && l.length) {
|
|
1170
|
+
const a = Se(i), o = s[0][a], f = l[0][a];
|
|
1168
1171
|
if (o && f) {
|
|
1169
1172
|
const d = r.findIndex((c, p) => {
|
|
1170
1173
|
const m = c instanceof Date ? c.getTime() : c, y = r[p + 1], w = y instanceof Date ? y.getTime() : y;
|
|
@@ -1178,94 +1181,94 @@ function ti(e, t, n, i) {
|
|
|
1178
1181
|
}
|
|
1179
1182
|
return !1;
|
|
1180
1183
|
}
|
|
1181
|
-
function
|
|
1184
|
+
function oi(e, t, n) {
|
|
1182
1185
|
const i = [];
|
|
1183
1186
|
return Object.entries(t).forEach(([r]) => {
|
|
1184
1187
|
if (!e.fieldDomains[r].length) return;
|
|
1185
|
-
const l = D(e.spec, r),
|
|
1186
|
-
|
|
1188
|
+
const l = D(e.spec, r), a = x(l, je(e, r));
|
|
1189
|
+
si(e, t, n, a) && i.push(B(we(e, r, t[r]), a));
|
|
1187
1190
|
}), i.join(", ");
|
|
1188
1191
|
}
|
|
1189
|
-
function
|
|
1192
|
+
function xt(e) {
|
|
1190
1193
|
let t = 0;
|
|
1191
|
-
const n = [], i =
|
|
1192
|
-
let
|
|
1194
|
+
const n = [], i = ai(e), r = ri(e);
|
|
1195
|
+
let s;
|
|
1193
1196
|
return i.forEach((l) => {
|
|
1194
|
-
const
|
|
1197
|
+
const a = xe(e, l), o = ni(e, a), f = ii(e, l), d = e.pauseBetweenSections * f;
|
|
1195
1198
|
n.push({
|
|
1196
1199
|
...o,
|
|
1197
1200
|
time: t,
|
|
1198
1201
|
pauseAfter: d,
|
|
1199
1202
|
ramp: r,
|
|
1200
|
-
rest:
|
|
1203
|
+
rest: a.length === 0,
|
|
1201
1204
|
state: l,
|
|
1202
|
-
speakBefore:
|
|
1203
|
-
}), t += o.duration + d,
|
|
1205
|
+
speakBefore: oi(e, l, s)
|
|
1206
|
+
}), t += o.duration + d, s = l;
|
|
1204
1207
|
}), n;
|
|
1205
1208
|
}
|
|
1206
|
-
function
|
|
1209
|
+
function ci(e) {
|
|
1207
1210
|
if (!e.length) return [];
|
|
1208
1211
|
const t = e[0].notes.length, n = [];
|
|
1209
1212
|
let i = 0;
|
|
1210
1213
|
for (let r = 0; r < t; r++) {
|
|
1211
|
-
const
|
|
1214
|
+
const s = e.map((f) => ({ voiceId: f.voiceId, note: f.notes[r] })), l = Math.max(...s.map((f) => f.note.duration)), a = e[0].notes[r], o = a.pauseAfter ?? 0;
|
|
1212
1215
|
n.push({
|
|
1213
|
-
state:
|
|
1216
|
+
state: a.state,
|
|
1214
1217
|
time: i,
|
|
1215
1218
|
slotDuration: l,
|
|
1216
1219
|
pauseAfter: o,
|
|
1217
|
-
speakBefore:
|
|
1218
|
-
ramp:
|
|
1219
|
-
notes:
|
|
1220
|
+
speakBefore: a.speakBefore,
|
|
1221
|
+
ramp: a.ramp,
|
|
1222
|
+
notes: s
|
|
1220
1223
|
}), i += l + o;
|
|
1221
1224
|
}
|
|
1222
1225
|
return n;
|
|
1223
1226
|
}
|
|
1224
|
-
function
|
|
1227
|
+
function Nt(e) {
|
|
1225
1228
|
return Pe(
|
|
1226
|
-
Object.entries(e.audioUnitSpec.encoding).map(([t, n]) => n ? `${K(
|
|
1229
|
+
Object.entries(e.audioUnitSpec.encoding).map(([t, n]) => n ? `${K(x(D(e.spec, n.field), n))} as ${t}` : "").filter((t) => t)
|
|
1227
1230
|
);
|
|
1228
1231
|
}
|
|
1229
|
-
function
|
|
1232
|
+
function Ft(e) {
|
|
1230
1233
|
if (!e.audioUnitSpec.traversal.length)
|
|
1231
1234
|
return "";
|
|
1232
|
-
const t = e.audioUnitSpec.traversal[e.audioUnitSpec.traversal.length - 1], n = D(e.spec, t.field), i =
|
|
1235
|
+
const t = e.audioUnitSpec.traversal[e.audioUnitSpec.traversal.length - 1], n = D(e.spec, t.field), i = x(n, t);
|
|
1233
1236
|
let r;
|
|
1234
|
-
i.bin ? r =
|
|
1235
|
-
let
|
|
1236
|
-
r.length > 1 ?
|
|
1237
|
-
const l = e.audioUnitSpec.traversal.slice(0, -1).map((
|
|
1238
|
-
const o = D(e.spec,
|
|
1239
|
-
return K(
|
|
1237
|
+
i.bin ? r = Dn(i, e.derivedData) : r = e.fieldDomains[t.field];
|
|
1238
|
+
let s = "";
|
|
1239
|
+
r.length > 1 ? s = `${K(i)} from ${B(r[0], i)} to ${B(r[r.length - 1], i)}` : r.length === 1 ? s = `${K(i)} equals ${B(r[0], i)}` : s = K(i);
|
|
1240
|
+
const l = e.audioUnitSpec.traversal.slice(0, -1).map((a) => {
|
|
1241
|
+
const o = D(e.spec, a.field);
|
|
1242
|
+
return K(x(o, a));
|
|
1240
1243
|
});
|
|
1241
|
-
return l.length && (
|
|
1244
|
+
return l.length && (s += ` for each ${Pe(l)}`), s;
|
|
1242
1245
|
}
|
|
1243
|
-
const
|
|
1244
|
-
function
|
|
1245
|
-
const [t, n] = se(), [i, r] =
|
|
1246
|
+
const qe = W();
|
|
1247
|
+
function li(e) {
|
|
1248
|
+
const [t, n] = se(), [i, r] = ti(), [s, l] = be(), [a, o] = Z(), [f, d] = V(), u = () => {
|
|
1246
1249
|
const E = speechSynthesis.getVoices(), b = E.find((h) => h.name === "Samantha"), g = E.find((h) => h.localService && h.default), v = E.find((h) => h.default);
|
|
1247
1250
|
d(b ?? g ?? v);
|
|
1248
1251
|
};
|
|
1249
|
-
u(), speechSynthesis.addEventListener("voiceschanged", u),
|
|
1252
|
+
u(), speechSynthesis.addEventListener("voiceschanged", u), X(() => speechSynthesis.removeEventListener("voiceschanged", u));
|
|
1250
1253
|
const c = () => ({
|
|
1251
1254
|
traversalState: Object.fromEntries(e.audioUnitSpec.traversal.map((E) => [E.field, 0]))
|
|
1252
|
-
}), [p, m] = ye(c()), y = () => e.audioUnitSpec.name, w = () => e.audioUnitSpec.instrument ?? "pure", O =
|
|
1253
|
-
const b = D(e.spec, E.field), g =
|
|
1255
|
+
}), [p, m] = ye(c()), y = () => e.audioUnitSpec.name, w = () => e.audioUnitSpec.instrument ?? "pure", O = T(() => Ce(e.spec, e.audioUnitSpec)), C = T(() => s.selection ? Le(e.data, s.selection) : e.data), R = T(() => Ie(e.spec, e.data, C(), O())), k = T(() => Oe(C(), O(), R())), z = T(() => Object.fromEntries(e.audioUnitSpec.traversal.map((E) => {
|
|
1256
|
+
const b = D(e.spec, E.field), g = x(b, E), v = re(g, k(), !0);
|
|
1254
1257
|
return [E.field, v];
|
|
1255
|
-
}))), Ue =
|
|
1256
|
-
const b = D(e.spec, E.field), g =
|
|
1258
|
+
}))), Ue = T(() => Object.fromEntries(e.audioUnitSpec.traversal.map((E) => {
|
|
1259
|
+
const b = D(e.spec, E.field), g = x(b, E);
|
|
1257
1260
|
return [E.field, r.getAxisTicks(g)];
|
|
1258
|
-
}))), q =
|
|
1261
|
+
}))), q = T(() => ({
|
|
1259
1262
|
spec: e.spec,
|
|
1260
1263
|
audioUnitSpec: e.audioUnitSpec,
|
|
1261
|
-
derivedData:
|
|
1264
|
+
derivedData: k(),
|
|
1262
1265
|
fieldDomains: z(),
|
|
1263
1266
|
axisTicks: Ue(),
|
|
1264
1267
|
scales: i,
|
|
1265
|
-
pauseBetweenSections:
|
|
1266
|
-
})), oe =
|
|
1268
|
+
pauseBetweenSections: a.pauseBetweenSections
|
|
1269
|
+
})), oe = T(() => xt(q())), Ae = (E, b) => we(q(), E, b), Q = T(() => _t(q(), p.traversalState)), ce = (E) => oe().find((b) => Object.entries(E).every(([g, v]) => b.state[g] === v));
|
|
1267
1270
|
P(() => {
|
|
1268
|
-
if (
|
|
1271
|
+
if (a.isPlaying) {
|
|
1269
1272
|
const E = Q();
|
|
1270
1273
|
n.setSelection({
|
|
1271
1274
|
source: "sonification",
|
|
@@ -1289,7 +1292,7 @@ function ri(e) {
|
|
|
1289
1292
|
}), v && (m((U) => ({
|
|
1290
1293
|
...U,
|
|
1291
1294
|
traversalState: h
|
|
1292
|
-
})),
|
|
1295
|
+
})), s.activeUnitName === e.audioUnitSpec.name && G.setupTransportSequence()), b;
|
|
1293
1296
|
}), P((E) => (E !== e.audioUnitSpec && G.setupTransportSequence(), e.audioUnitSpec));
|
|
1294
1297
|
const G = {
|
|
1295
1298
|
setTraversalIndex: (E, b) => {
|
|
@@ -1299,51 +1302,55 @@ function ri(e) {
|
|
|
1299
1302
|
...h.traversalState,
|
|
1300
1303
|
[E]: b
|
|
1301
1304
|
}
|
|
1302
|
-
})),
|
|
1305
|
+
})), s.activeUnitName === e.audioUnitSpec.name && (l.setActiveUnit(e.audioUnitSpec.name), G.setupTransportSequence());
|
|
1303
1306
|
const g = Q();
|
|
1304
1307
|
n.setSelection({
|
|
1305
1308
|
source: "sonification",
|
|
1306
1309
|
predicate: g
|
|
1307
1310
|
});
|
|
1308
1311
|
const v = ce(p.traversalState);
|
|
1309
|
-
v && (o.ensureVoice(y(), w()),
|
|
1312
|
+
v && (o.ensureVoice(y(), w()), a.transport.seconds = v.time, o.playNote(v, y()));
|
|
1310
1313
|
},
|
|
1311
1314
|
getTraversalIndex: (E) => p.traversalState[E],
|
|
1312
|
-
|
|
1313
|
-
|
|
1315
|
+
// untrack: imperative scheduling action, not a derivation — effects that call
|
|
1316
|
+
// it must not subscribe to the signals it reads (traversal state, notes, ...),
|
|
1317
|
+
// or every step callback's state update re-runs the effect mid-playback.
|
|
1318
|
+
// (See the same guard in AudioLayerGroupContext, where this actually bit.)
|
|
1319
|
+
setupTransportSequence: () => ct(() => {
|
|
1320
|
+
a.transport.cancel(), o.ensureVoice(y(), w()), a.transport.bpm.value = ae;
|
|
1314
1321
|
const E = oe();
|
|
1315
1322
|
E.forEach((b, g) => {
|
|
1316
|
-
Object.entries(b.state).every(([v, h]) => p.traversalState[v] === h) && (
|
|
1317
|
-
if (
|
|
1323
|
+
Object.entries(b.state).every(([v, h]) => p.traversalState[v] === h) && (a.transport.seconds = b.time), a.transport.schedule(() => {
|
|
1324
|
+
if (a.isPlaying)
|
|
1318
1325
|
if (m((v) => ({
|
|
1319
1326
|
...v,
|
|
1320
1327
|
traversalState: b.state
|
|
1321
|
-
})), b.speakBefore &&
|
|
1322
|
-
|
|
1328
|
+
})), b.speakBefore && a.speakAxisTicks && !a.muted) {
|
|
1329
|
+
a.transport.pause(), o.releaseSynth(y()), speechSynthesis.cancel();
|
|
1323
1330
|
const v = new SpeechSynthesisUtterance(b.speakBefore);
|
|
1324
|
-
v.voice = f() ?? null, v.rate =
|
|
1325
|
-
|
|
1331
|
+
v.voice = f() ?? null, v.rate = a.speechRate / 25, v.onend = () => {
|
|
1332
|
+
a.isPlaying && (b.ramp ? o.startOrRampSynth(b, y()) : o.playNote(b, y()), a.transport.start());
|
|
1326
1333
|
}, speechSynthesis.speak(v);
|
|
1327
1334
|
} else
|
|
1328
1335
|
b.ramp ? o.startOrRampSynth(b, y()) : o.playNote(b, y());
|
|
1329
|
-
}, b.time), b.pauseAfter &&
|
|
1336
|
+
}, b.time), b.pauseAfter && a.transport.schedule(() => {
|
|
1330
1337
|
o.releaseSynth(y());
|
|
1331
|
-
}, b.time + b.duration), g === E.length - 1 &&
|
|
1338
|
+
}, b.time + b.duration), g === E.length - 1 && a.transport.schedule(() => {
|
|
1332
1339
|
o.stopTransport();
|
|
1333
1340
|
}, b.time + b.duration);
|
|
1334
|
-
}),
|
|
1335
|
-
},
|
|
1341
|
+
}), a.transport.bpm.value = ae * a.playbackRate;
|
|
1342
|
+
}),
|
|
1336
1343
|
getFieldDomains: z,
|
|
1337
|
-
getDerivedData:
|
|
1344
|
+
getDerivedData: k,
|
|
1338
1345
|
resetTraversalIfEnd: () => {
|
|
1339
1346
|
const E = e.audioUnitSpec.traversal.map((v) => v.field), b = p.traversalState;
|
|
1340
|
-
E.every((v) => b[v] === z()[v].length - 1) && (m(c()),
|
|
1347
|
+
E.every((v) => b[v] === z()[v].length - 1) && (m(c()), a.transport.seconds = 0);
|
|
1341
1348
|
},
|
|
1342
1349
|
getDomainValue: Ae,
|
|
1343
|
-
describeEncodings: () =>
|
|
1344
|
-
describePlaybackOrder: () =>
|
|
1350
|
+
describeEncodings: () => Nt(q()),
|
|
1351
|
+
describePlaybackOrder: () => Ft(q())
|
|
1345
1352
|
};
|
|
1346
|
-
return S(
|
|
1353
|
+
return S(qe.Provider, {
|
|
1347
1354
|
value: [p, G],
|
|
1348
1355
|
get children() {
|
|
1349
1356
|
return e.children;
|
|
@@ -1351,12 +1358,12 @@ function ri(e) {
|
|
|
1351
1358
|
});
|
|
1352
1359
|
}
|
|
1353
1360
|
function Ee() {
|
|
1354
|
-
const e =
|
|
1361
|
+
const e = Y(qe);
|
|
1355
1362
|
if (e === void 0)
|
|
1356
1363
|
throw new Error("useAudioUnitState must be used within a AudioUnitStateProvider");
|
|
1357
1364
|
return e;
|
|
1358
1365
|
}
|
|
1359
|
-
const
|
|
1366
|
+
const Pt = N("div")`
|
|
1360
1367
|
margin-bottom: 3px;
|
|
1361
1368
|
|
|
1362
1369
|
label {
|
|
@@ -1369,9 +1376,9 @@ const Nt = N("div")`
|
|
|
1369
1376
|
label > * {
|
|
1370
1377
|
justify-self: start;
|
|
1371
1378
|
}
|
|
1372
|
-
`,
|
|
1379
|
+
`, Me = `
|
|
1373
1380
|
font-family: monospace;
|
|
1374
|
-
`,
|
|
1381
|
+
`, Ot = N("div")`
|
|
1375
1382
|
border-left: 1px solid #ccc;
|
|
1376
1383
|
padding-left: 1rem;
|
|
1377
1384
|
`;
|
|
@@ -1410,14 +1417,14 @@ N("div")`
|
|
|
1410
1417
|
margin-top: 1em;
|
|
1411
1418
|
`;
|
|
1412
1419
|
N("h4")`
|
|
1413
|
-
${
|
|
1420
|
+
${Me}
|
|
1414
1421
|
`;
|
|
1415
1422
|
N("div")`
|
|
1416
|
-
${
|
|
1423
|
+
${Me}
|
|
1417
1424
|
`;
|
|
1418
1425
|
N("table")`
|
|
1419
1426
|
border: 1px solid #ccc;
|
|
1420
|
-
${
|
|
1427
|
+
${Me}
|
|
1421
1428
|
`;
|
|
1422
1429
|
N("button")`
|
|
1423
1430
|
margin-top: 1rem;
|
|
@@ -1427,45 +1434,45 @@ N("div")`
|
|
|
1427
1434
|
align-items: center;
|
|
1428
1435
|
gap: 8px;
|
|
1429
1436
|
`;
|
|
1430
|
-
var
|
|
1431
|
-
function
|
|
1432
|
-
const [t, n] = Ee(), [i, r] = Z(),
|
|
1437
|
+
var ui = /* @__PURE__ */ A("<select>"), di = /* @__PURE__ */ A("<div><input aria-live=assertive type=range min=0><span>"), fi = /* @__PURE__ */ A("<label><span>"), mi = /* @__PURE__ */ A("<option>");
|
|
1438
|
+
function Rt(e) {
|
|
1439
|
+
const [t, n] = Ee(), [i, r] = Z(), s = () => D(e.spec, e.traversalFieldDef.field), l = () => x(s(), e.traversalFieldDef), a = () => n.getTraversalIndex(e.traversalFieldDef.field), o = (u) => {
|
|
1433
1440
|
r.startAudioContext(), n.setTraversalIndex(e.traversalFieldDef.field, u);
|
|
1434
|
-
}, f = () => n.getFieldDomains()[e.traversalFieldDef.field], d = () => n.getDomainValue(e.traversalFieldDef.field,
|
|
1435
|
-
return S(
|
|
1441
|
+
}, f = () => n.getFieldDomains()[e.traversalFieldDef.field], d = () => n.getDomainValue(e.traversalFieldDef.field, a());
|
|
1442
|
+
return S(Pt, {
|
|
1436
1443
|
get children() {
|
|
1437
|
-
var u =
|
|
1438
|
-
return
|
|
1444
|
+
var u = fi(), c = u.firstChild;
|
|
1445
|
+
return _(c, () => K(l())), _(u, S(qt, {
|
|
1439
1446
|
get children() {
|
|
1440
|
-
return [S(
|
|
1447
|
+
return [S(ze, {
|
|
1441
1448
|
get when() {
|
|
1442
1449
|
return l().type === "nominal";
|
|
1443
1450
|
},
|
|
1444
1451
|
get children() {
|
|
1445
|
-
var p =
|
|
1446
|
-
return p.$$mousedown = () => r.stopTransport(), p.addEventListener("change", (m) => o(m.target.selectedIndex)),
|
|
1452
|
+
var p = ui();
|
|
1453
|
+
return p.$$mousedown = () => r.stopTransport(), p.addEventListener("change", (m) => o(m.target.selectedIndex)), _(p, S(ie, {
|
|
1447
1454
|
get each() {
|
|
1448
1455
|
return f();
|
|
1449
1456
|
},
|
|
1450
1457
|
children: (m) => (() => {
|
|
1451
|
-
var y =
|
|
1452
|
-
return
|
|
1458
|
+
var y = mi();
|
|
1459
|
+
return _(y, () => String(m)), L(() => y.value = String(m)), y;
|
|
1453
1460
|
})()
|
|
1454
1461
|
})), L(() => p.value = String(d())), p;
|
|
1455
1462
|
}
|
|
1456
|
-
}), S(
|
|
1463
|
+
}), S(ze, {
|
|
1457
1464
|
get when() {
|
|
1458
1465
|
return l().type !== "nominal";
|
|
1459
1466
|
},
|
|
1460
1467
|
get children() {
|
|
1461
|
-
var p =
|
|
1462
|
-
return m.$$mousedown = () => r.stopTransport(), m.$$input = (w) => o(w.currentTarget.valueAsNumber),
|
|
1463
|
-
var O = B(d(), l()),
|
|
1464
|
-
return O !== w.e &&
|
|
1468
|
+
var p = di(), m = p.firstChild, y = m.nextSibling;
|
|
1469
|
+
return m.$$mousedown = () => r.stopTransport(), m.$$input = (w) => o(w.currentTarget.valueAsNumber), _(y, () => B(d(), l())), L((w) => {
|
|
1470
|
+
var O = B(d(), l()), C = f().length - 1;
|
|
1471
|
+
return O !== w.e && Be(m, "aria-valuetext", w.e = O), C !== w.t && Be(m, "max", w.t = C), w;
|
|
1465
1472
|
}, {
|
|
1466
1473
|
e: void 0,
|
|
1467
1474
|
t: void 0
|
|
1468
|
-
}), L(() => m.value =
|
|
1475
|
+
}), L(() => m.value = a()), p;
|
|
1469
1476
|
}
|
|
1470
1477
|
})];
|
|
1471
1478
|
}
|
|
@@ -1473,42 +1480,42 @@ function Pt(e) {
|
|
|
1473
1480
|
}
|
|
1474
1481
|
});
|
|
1475
1482
|
}
|
|
1476
|
-
|
|
1477
|
-
var
|
|
1478
|
-
function
|
|
1479
|
-
const [t, n] = Ee(), [i, r] = Z(), [
|
|
1480
|
-
function
|
|
1481
|
-
r.startAudioContext(),
|
|
1483
|
+
ot(["mousedown", "input"]);
|
|
1484
|
+
var pi = /* @__PURE__ */ A("<button>Pause"), gi = /* @__PURE__ */ A("<div>"), vi = /* @__PURE__ */ A("<button>Play");
|
|
1485
|
+
function Vt(e) {
|
|
1486
|
+
const [t, n] = Ee(), [i, r] = Z(), [s, l] = be();
|
|
1487
|
+
function a() {
|
|
1488
|
+
r.startAudioContext(), s.activeUnitName !== e.unitName && (l.setActiveUnit(e.unitName), n.setupTransportSequence()), n.resetTraversalIfEnd(), r.startTransport();
|
|
1482
1489
|
}
|
|
1483
|
-
return
|
|
1484
|
-
|
|
1490
|
+
return Mt(() => l.registerPlayCallback(a)), P(() => {
|
|
1491
|
+
s.activeUnitName === e.unitName && l.registerPlayCallback(a, !0);
|
|
1485
1492
|
}), (() => {
|
|
1486
|
-
var o =
|
|
1487
|
-
return
|
|
1493
|
+
var o = gi();
|
|
1494
|
+
return _(o, S(lt, {
|
|
1488
1495
|
get when() {
|
|
1489
|
-
return pe(() => !!i.isPlaying)() &&
|
|
1496
|
+
return pe(() => !!i.isPlaying)() && s.activeUnitName === e.unitName;
|
|
1490
1497
|
},
|
|
1491
1498
|
get fallback() {
|
|
1492
1499
|
return (() => {
|
|
1493
|
-
var f =
|
|
1494
|
-
return f.$$click = () =>
|
|
1500
|
+
var f = vi();
|
|
1501
|
+
return f.$$click = () => a(), f;
|
|
1495
1502
|
})();
|
|
1496
1503
|
},
|
|
1497
1504
|
get children() {
|
|
1498
|
-
var f =
|
|
1505
|
+
var f = pi();
|
|
1499
1506
|
return f.$$click = () => r.stopTransport(), f;
|
|
1500
1507
|
}
|
|
1501
1508
|
})), o;
|
|
1502
1509
|
})();
|
|
1503
1510
|
}
|
|
1504
|
-
|
|
1505
|
-
var
|
|
1506
|
-
const
|
|
1511
|
+
ot(["click"]);
|
|
1512
|
+
var hi = /* @__PURE__ */ A("<label> <input readonly>"), yi = /* @__PURE__ */ A("<p><br>playing ");
|
|
1513
|
+
const Si = N.div`
|
|
1507
1514
|
margin-bottom: 1em;
|
|
1508
1515
|
`;
|
|
1509
|
-
function
|
|
1516
|
+
function bi(e) {
|
|
1510
1517
|
function t() {
|
|
1511
|
-
return S(
|
|
1518
|
+
return S(Si, {
|
|
1512
1519
|
get children() {
|
|
1513
1520
|
return S(ie, {
|
|
1514
1521
|
get each() {
|
|
@@ -1516,13 +1523,13 @@ function gi(e) {
|
|
|
1516
1523
|
},
|
|
1517
1524
|
children: ([i, r]) => {
|
|
1518
1525
|
if (r) {
|
|
1519
|
-
const
|
|
1520
|
-
if (
|
|
1521
|
-
const l =
|
|
1522
|
-
return S(
|
|
1526
|
+
const s = D(e.spec, r.field);
|
|
1527
|
+
if (s) {
|
|
1528
|
+
const l = x(s, r);
|
|
1529
|
+
return S(Pt, {
|
|
1523
1530
|
get children() {
|
|
1524
|
-
var
|
|
1525
|
-
return
|
|
1531
|
+
var a = hi(), o = a.firstChild, f = o.nextSibling;
|
|
1532
|
+
return _(a, i, o), L(() => f.value = K(l)), a;
|
|
1526
1533
|
}
|
|
1527
1534
|
});
|
|
1528
1535
|
}
|
|
@@ -1535,13 +1542,13 @@ function gi(e) {
|
|
|
1535
1542
|
function n() {
|
|
1536
1543
|
const [i, r] = Ee();
|
|
1537
1544
|
return (() => {
|
|
1538
|
-
var
|
|
1539
|
-
return l.nextSibling,
|
|
1545
|
+
var s = yi(), l = s.firstChild;
|
|
1546
|
+
return l.nextSibling, _(s, () => r.describeEncodings(), l), _(s, () => r.describePlaybackOrder(), null), s;
|
|
1540
1547
|
})();
|
|
1541
1548
|
}
|
|
1542
|
-
return Object.keys(e.audioUnitSpec.encoding).length === 0 ? null : S(
|
|
1549
|
+
return Object.keys(e.audioUnitSpec.encoding).length === 0 ? null : S(Ot, {
|
|
1543
1550
|
get children() {
|
|
1544
|
-
return S(
|
|
1551
|
+
return S(ei, {
|
|
1545
1552
|
get spec() {
|
|
1546
1553
|
return e.spec;
|
|
1547
1554
|
},
|
|
@@ -1552,7 +1559,7 @@ function gi(e) {
|
|
|
1552
1559
|
return e.audioUnitSpec;
|
|
1553
1560
|
},
|
|
1554
1561
|
get children() {
|
|
1555
|
-
return S(
|
|
1562
|
+
return S(li, {
|
|
1556
1563
|
get spec() {
|
|
1557
1564
|
return e.spec;
|
|
1558
1565
|
},
|
|
@@ -1567,13 +1574,13 @@ function gi(e) {
|
|
|
1567
1574
|
get each() {
|
|
1568
1575
|
return e.audioUnitSpec.traversal;
|
|
1569
1576
|
},
|
|
1570
|
-
children: (i) => S(
|
|
1577
|
+
children: (i) => S(Rt, {
|
|
1571
1578
|
get spec() {
|
|
1572
1579
|
return e.spec;
|
|
1573
1580
|
},
|
|
1574
1581
|
traversalFieldDef: i
|
|
1575
1582
|
})
|
|
1576
|
-
}), S(
|
|
1583
|
+
}), S(Vt, {
|
|
1577
1584
|
get unitName() {
|
|
1578
1585
|
return e.audioUnitSpec.name;
|
|
1579
1586
|
}
|
|
@@ -1585,51 +1592,51 @@ function gi(e) {
|
|
|
1585
1592
|
}
|
|
1586
1593
|
});
|
|
1587
1594
|
}
|
|
1588
|
-
function
|
|
1589
|
-
const [t, n] = se(), [i, r] = be(), [
|
|
1595
|
+
function wi(e) {
|
|
1596
|
+
const [t, n] = se(), [i, r] = be(), [s, l] = Z(), [a, o] = V(), f = () => {
|
|
1590
1597
|
const g = speechSynthesis.getVoices(), v = g.find((F) => F.name === "Samantha"), h = g.find((F) => F.localService && F.default), U = g.find((F) => F.default);
|
|
1591
1598
|
o(v ?? h ?? U);
|
|
1592
1599
|
};
|
|
1593
|
-
f(), speechSynthesis.addEventListener("voiceschanged", f),
|
|
1600
|
+
f(), speechSynthesis.addEventListener("voiceschanged", f), X(() => speechSynthesis.removeEventListener("voiceschanged", f));
|
|
1594
1601
|
const d = () => e.units[0], u = () => d().traversal, c = () => ({
|
|
1595
1602
|
traversalState: Object.fromEntries(u().map((g) => [g.field, 0]))
|
|
1596
|
-
}), [p, m] = ye(c()), y =
|
|
1603
|
+
}), [p, m] = ye(c()), y = T(() => {
|
|
1597
1604
|
const g = i.selection;
|
|
1598
1605
|
return e.units.map((v) => {
|
|
1599
|
-
const h =
|
|
1606
|
+
const h = Ce(e.spec, v), U = g ? Le(e.data, g) : e.data, F = Ie(e.spec, e.data, U, h), I = Oe(U, h, F), ee = Tt(e.spec, e.data, v);
|
|
1600
1607
|
return {
|
|
1601
1608
|
unit: v,
|
|
1602
1609
|
derivedData: I,
|
|
1603
1610
|
scales: ee
|
|
1604
1611
|
};
|
|
1605
1612
|
});
|
|
1606
|
-
}), w =
|
|
1613
|
+
}), w = T(() => {
|
|
1607
1614
|
const g = y().flatMap((v) => v.derivedData);
|
|
1608
1615
|
return Object.fromEntries(u().map((v) => {
|
|
1609
|
-
const h = D(e.spec, v.field), U =
|
|
1616
|
+
const h = D(e.spec, v.field), U = x(h, v);
|
|
1610
1617
|
return [v.field, re(U, g, !0)];
|
|
1611
1618
|
}));
|
|
1612
|
-
}), O =
|
|
1619
|
+
}), O = T(() => Object.fromEntries(u().map((g) => [g.field, kt(e.spec, e.data, g.field)]))), C = (g, v, h) => ({
|
|
1613
1620
|
spec: e.spec,
|
|
1614
1621
|
audioUnitSpec: g,
|
|
1615
1622
|
derivedData: v,
|
|
1616
1623
|
fieldDomains: w(),
|
|
1617
1624
|
axisTicks: O(),
|
|
1618
1625
|
scales: h,
|
|
1619
|
-
pauseBetweenSections:
|
|
1620
|
-
}),
|
|
1626
|
+
pauseBetweenSections: s.pauseBetweenSections
|
|
1627
|
+
}), R = T(() => {
|
|
1621
1628
|
const g = y()[0];
|
|
1622
|
-
return
|
|
1623
|
-
}),
|
|
1629
|
+
return C(g.unit, g.derivedData, g.scales);
|
|
1630
|
+
}), k = T(() => y().map((g, v) => ({
|
|
1624
1631
|
voiceId: g.unit.name,
|
|
1625
|
-
instrument: g.unit.instrument ??
|
|
1626
|
-
notes:
|
|
1627
|
-
}))), z =
|
|
1632
|
+
instrument: g.unit.instrument ?? Wn(v),
|
|
1633
|
+
notes: xt(C(g.unit, g.derivedData, g.scales))
|
|
1634
|
+
}))), z = T(() => ci(k().map((g) => ({
|
|
1628
1635
|
voiceId: g.voiceId,
|
|
1629
1636
|
notes: g.notes
|
|
1630
|
-
})))), Ue = (g) => z().find((v) => Object.entries(g).every(([h, U]) => v.state[h] === U)), q =
|
|
1637
|
+
})))), Ue = (g) => z().find((v) => Object.entries(g).every(([h, U]) => v.state[h] === U)), q = T(() => _t(R(), p.traversalState)), oe = () => w(), Ae = (g, v) => we(R(), g, v), Q = () => i.activeUnitName === e.groupName;
|
|
1631
1638
|
P(() => {
|
|
1632
|
-
|
|
1639
|
+
s.isPlaying && n.setSelection({
|
|
1633
1640
|
source: "sonification",
|
|
1634
1641
|
predicate: q()
|
|
1635
1642
|
});
|
|
@@ -1644,7 +1651,7 @@ function vi(e) {
|
|
|
1644
1651
|
return Object.entries(v).forEach(([I, ee]) => {
|
|
1645
1652
|
const te = h[I], ue = (g?.[I] ?? ee)[te];
|
|
1646
1653
|
if (ue !== void 0) {
|
|
1647
|
-
const De = ee.findIndex((
|
|
1654
|
+
const De = ee.findIndex((It) => It === ue);
|
|
1648
1655
|
De !== te && (F[I] = De !== -1 ? De : 0, U = !0);
|
|
1649
1656
|
}
|
|
1650
1657
|
}), U && (m((I) => ({
|
|
@@ -1652,7 +1659,7 @@ function vi(e) {
|
|
|
1652
1659
|
traversalState: F
|
|
1653
1660
|
})), Q() && b.setupTransportSequence()), v;
|
|
1654
1661
|
}), P((g) => (g !== e.units && b.setupTransportSequence(), e.units));
|
|
1655
|
-
const ce = () =>
|
|
1662
|
+
const ce = () => k().forEach(({
|
|
1656
1663
|
voiceId: g,
|
|
1657
1664
|
instrument: v
|
|
1658
1665
|
}) => l.ensureVoice(g, v)), G = (g) => {
|
|
@@ -1680,65 +1687,70 @@ function vi(e) {
|
|
|
1680
1687
|
predicate: q()
|
|
1681
1688
|
}), ce();
|
|
1682
1689
|
const h = Ue(p.traversalState);
|
|
1683
|
-
h && (
|
|
1690
|
+
h && (s.transport.seconds = h.time, E(h));
|
|
1684
1691
|
},
|
|
1685
1692
|
getTraversalIndex: (g) => p.traversalState[g],
|
|
1686
1693
|
getFieldDomains: oe,
|
|
1687
|
-
getDerivedData: () =>
|
|
1694
|
+
getDerivedData: () => R().derivedData,
|
|
1688
1695
|
getDomainValue: Ae,
|
|
1689
|
-
|
|
1690
|
-
|
|
1696
|
+
// untrack: this is an imperative scheduling action, not a derivation. Effects
|
|
1697
|
+
// that call it must not subscribe to the signals it reads (traversal state,
|
|
1698
|
+
// grid, ...) — otherwise every step callback's state update re-runs the
|
|
1699
|
+
// effect mid-playback, rewinding the transport onto the slot that just fired
|
|
1700
|
+
// and re-triggering its announcement and notes.
|
|
1701
|
+
setupTransportSequence: () => ct(() => {
|
|
1702
|
+
s.transport.cancel(), s.transport.bpm.value = ae, ce();
|
|
1691
1703
|
const g = z();
|
|
1692
1704
|
g.forEach((h) => {
|
|
1693
|
-
Object.entries(h.state).every(([U, F]) => p.traversalState[U] === F) && (
|
|
1694
|
-
if (
|
|
1705
|
+
Object.entries(h.state).every(([U, F]) => p.traversalState[U] === F) && (s.transport.seconds = h.time), s.transport.schedule(() => {
|
|
1706
|
+
if (s.isPlaying)
|
|
1695
1707
|
if (m((U) => ({
|
|
1696
1708
|
...U,
|
|
1697
1709
|
traversalState: h.state
|
|
1698
|
-
})), h.speakBefore &&
|
|
1699
|
-
|
|
1710
|
+
})), h.speakBefore && s.speakAxisTicks && !s.muted) {
|
|
1711
|
+
s.transport.pause(), l.releaseSynth(), speechSynthesis.cancel();
|
|
1700
1712
|
const U = new SpeechSynthesisUtterance(h.speakBefore);
|
|
1701
|
-
U.voice =
|
|
1702
|
-
|
|
1713
|
+
U.voice = a() ?? null, U.rate = s.speechRate / 25, U.onend = () => {
|
|
1714
|
+
s.isPlaying && (G(h), s.transport.start());
|
|
1703
1715
|
}, speechSynthesis.speak(U);
|
|
1704
1716
|
} else
|
|
1705
1717
|
G(h);
|
|
1706
|
-
}, h.time), h.pauseAfter &&
|
|
1718
|
+
}, h.time), h.pauseAfter && s.transport.schedule(() => l.releaseSynth(), h.time + h.slotDuration);
|
|
1707
1719
|
});
|
|
1708
1720
|
const v = g[g.length - 1];
|
|
1709
|
-
v &&
|
|
1710
|
-
},
|
|
1721
|
+
v && s.transport.schedule(() => l.stopTransport(), v.time + v.slotDuration), s.transport.bpm.value = ae * s.playbackRate;
|
|
1722
|
+
}),
|
|
1711
1723
|
resetTraversalIfEnd: () => {
|
|
1712
1724
|
const g = w();
|
|
1713
|
-
u().every((h) => p.traversalState[h.field] === g[h.field].length - 1) && (m(c()),
|
|
1725
|
+
u().every((h) => p.traversalState[h.field] === g[h.field].length - 1) && (m(c()), s.transport.seconds = 0);
|
|
1714
1726
|
},
|
|
1715
|
-
describeEncodings: () => e.units.map((g, v) => `layer ${v + 1}: ${
|
|
1716
|
-
describePlaybackOrder: () =>
|
|
1727
|
+
describeEncodings: () => e.units.map((g, v) => `layer ${v + 1}: ${Nt(C(g, y()[v].derivedData, y()[v].scales))}`).join("; "),
|
|
1728
|
+
describePlaybackOrder: () => Ft(R())
|
|
1717
1729
|
};
|
|
1718
|
-
return S(
|
|
1730
|
+
return S(qe.Provider, {
|
|
1719
1731
|
value: [p, b],
|
|
1720
1732
|
get children() {
|
|
1721
1733
|
return e.children;
|
|
1722
1734
|
}
|
|
1723
1735
|
});
|
|
1724
1736
|
}
|
|
1725
|
-
var
|
|
1726
|
-
const
|
|
1727
|
-
function
|
|
1737
|
+
var Ei = /* @__PURE__ */ A("<p><br>playing ");
|
|
1738
|
+
const at = "layer-group";
|
|
1739
|
+
function Ui() {
|
|
1728
1740
|
const [e, t] = Ee();
|
|
1729
1741
|
return (() => {
|
|
1730
|
-
var n =
|
|
1731
|
-
return i.nextSibling,
|
|
1742
|
+
var n = Ei(), i = n.firstChild;
|
|
1743
|
+
return i.nextSibling, _(n, () => t.describeEncodings(), i), _(n, () => t.describePlaybackOrder(), null), n;
|
|
1732
1744
|
})();
|
|
1733
1745
|
}
|
|
1734
|
-
function
|
|
1735
|
-
const t = () => e.units.filter((i) => Object.keys(i.encoding).length > 0);
|
|
1746
|
+
function Ai(e) {
|
|
1747
|
+
const t = T(() => e.units.filter((i) => Object.keys(i.encoding).length > 0));
|
|
1736
1748
|
if (t().length === 0)
|
|
1737
1749
|
return null;
|
|
1738
1750
|
const n = () => t()[0].traversal;
|
|
1739
|
-
return S(
|
|
1751
|
+
return S(Ot, {
|
|
1740
1752
|
get children() {
|
|
1741
|
-
return S(
|
|
1753
|
+
return S(wi, {
|
|
1742
1754
|
get spec() {
|
|
1743
1755
|
return e.spec;
|
|
1744
1756
|
},
|
|
@@ -1748,93 +1760,93 @@ function Si(e) {
|
|
|
1748
1760
|
get units() {
|
|
1749
1761
|
return t();
|
|
1750
1762
|
},
|
|
1751
|
-
groupName:
|
|
1763
|
+
groupName: at,
|
|
1752
1764
|
get children() {
|
|
1753
|
-
return [S(
|
|
1765
|
+
return [S(Ui, {}), S(ie, {
|
|
1754
1766
|
get each() {
|
|
1755
1767
|
return n();
|
|
1756
1768
|
},
|
|
1757
|
-
children: (i) => S(
|
|
1769
|
+
children: (i) => S(Rt, {
|
|
1758
1770
|
get spec() {
|
|
1759
1771
|
return e.spec;
|
|
1760
1772
|
},
|
|
1761
1773
|
traversalFieldDef: i
|
|
1762
1774
|
})
|
|
1763
|
-
}), S(
|
|
1764
|
-
unitName:
|
|
1775
|
+
}), S(Vt, {
|
|
1776
|
+
unitName: at
|
|
1765
1777
|
})];
|
|
1766
1778
|
}
|
|
1767
1779
|
});
|
|
1768
1780
|
}
|
|
1769
1781
|
});
|
|
1770
1782
|
}
|
|
1771
|
-
var
|
|
1772
|
-
const
|
|
1783
|
+
var Di = /* @__PURE__ */ A("<div><label>Playback rate <input type=number min=0.1 max=4 step=0.1 id=rate>x"), $i = /* @__PURE__ */ A("<label><input type=checkbox>Speak axis ticks"), Ti = /* @__PURE__ */ A("<label><input type=number min=1 max=100 step=10 id=speechRate>speech rate"), ki = /* @__PURE__ */ A("<div><label><input type=checkbox aria-live=polite>");
|
|
1784
|
+
const _i = N.div`
|
|
1773
1785
|
margin-top: 1rem;
|
|
1774
|
-
`,
|
|
1786
|
+
`, xi = N.div`
|
|
1775
1787
|
display: flex;
|
|
1776
1788
|
gap: 3px;
|
|
1777
1789
|
`;
|
|
1778
|
-
function
|
|
1790
|
+
function Ni(e) {
|
|
1779
1791
|
const [t, n] = Z();
|
|
1780
|
-
return S(
|
|
1792
|
+
return S(_i, {
|
|
1781
1793
|
get children() {
|
|
1782
1794
|
return [(() => {
|
|
1783
|
-
var i =
|
|
1784
|
-
return l.addEventListener("change", (
|
|
1785
|
-
})(), S(
|
|
1795
|
+
var i = Di(), r = i.firstChild, s = r.firstChild, l = s.nextSibling;
|
|
1796
|
+
return l.addEventListener("change", (a) => n.setPlaybackRate(Number(a.target.value))), L(() => l.value = t.playbackRate), i;
|
|
1797
|
+
})(), S(xi, {
|
|
1786
1798
|
get children() {
|
|
1787
1799
|
return [(() => {
|
|
1788
|
-
var i =
|
|
1789
|
-
return r.addEventListener("change", (
|
|
1800
|
+
var i = $i(), r = i.firstChild;
|
|
1801
|
+
return r.addEventListener("change", (s) => n.setSpeakAxisTicks(s.target.checked)), L(() => r.checked = t.speakAxisTicks), i;
|
|
1790
1802
|
})(), (() => {
|
|
1791
|
-
var i =
|
|
1792
|
-
return r.addEventListener("change", (
|
|
1803
|
+
var i = Ti(), r = i.firstChild;
|
|
1804
|
+
return r.addEventListener("change", (s) => n.setSpeechRate(Number(s.target.value))), L(() => r.value = t.speechRate), i;
|
|
1793
1805
|
})()];
|
|
1794
1806
|
}
|
|
1795
1807
|
}), (() => {
|
|
1796
|
-
var i =
|
|
1797
|
-
return
|
|
1808
|
+
var i = ki(), r = i.firstChild, s = r.firstChild;
|
|
1809
|
+
return s.addEventListener("change", (l) => n.setMuted(l.target.checked)), _(r, () => t.muted ? "Muted" : "Unmuted", null), L(() => s.checked = t.muted), i;
|
|
1798
1810
|
})()];
|
|
1799
1811
|
}
|
|
1800
1812
|
});
|
|
1801
1813
|
}
|
|
1802
|
-
function
|
|
1814
|
+
function Fi() {
|
|
1803
1815
|
const e = document.activeElement;
|
|
1804
1816
|
if (!e) return !1;
|
|
1805
1817
|
const t = e.tagName.toLowerCase();
|
|
1806
1818
|
return t === "input" || t === "select" || t === "textarea" || e.isContentEditable;
|
|
1807
1819
|
}
|
|
1808
|
-
function
|
|
1820
|
+
function Pi(e, t) {
|
|
1809
1821
|
const n = (i) => {
|
|
1810
|
-
if (
|
|
1822
|
+
if (Fi()) return;
|
|
1811
1823
|
const r = e[i.key];
|
|
1812
1824
|
r && (i.preventDefault(), r());
|
|
1813
1825
|
};
|
|
1814
1826
|
P(() => {
|
|
1815
1827
|
const i = t ? t() : document;
|
|
1816
|
-
i && (i.addEventListener("keydown", n),
|
|
1828
|
+
i && (i.addEventListener("keydown", n), X(() => i.removeEventListener("keydown", n)));
|
|
1817
1829
|
});
|
|
1818
1830
|
}
|
|
1819
|
-
function
|
|
1831
|
+
function Oi(e) {
|
|
1820
1832
|
const [t, n] = Z(), [i, r] = be();
|
|
1821
|
-
return
|
|
1833
|
+
return Pi({
|
|
1822
1834
|
p: () => {
|
|
1823
1835
|
t.isPlaying ? n.stopTransport() : r.triggerPlay();
|
|
1824
1836
|
}
|
|
1825
1837
|
}, e.target), null;
|
|
1826
1838
|
}
|
|
1827
|
-
function
|
|
1839
|
+
function Ri(e) {
|
|
1828
1840
|
const t = () => e.spec.audio.composition === "layer" && e.spec.audio.units.length > 1;
|
|
1829
|
-
return S(
|
|
1841
|
+
return S(Gn, {
|
|
1830
1842
|
get children() {
|
|
1831
|
-
return S(
|
|
1843
|
+
return S(Yn, {
|
|
1832
1844
|
get children() {
|
|
1833
|
-
return [S(
|
|
1845
|
+
return [S(Oi, {
|
|
1834
1846
|
get target() {
|
|
1835
1847
|
return e.keyEventTarget;
|
|
1836
1848
|
}
|
|
1837
|
-
}), S(
|
|
1849
|
+
}), S(lt, {
|
|
1838
1850
|
get when() {
|
|
1839
1851
|
return t();
|
|
1840
1852
|
},
|
|
@@ -1843,7 +1855,7 @@ function _i(e) {
|
|
|
1843
1855
|
get each() {
|
|
1844
1856
|
return e.spec.audio.units;
|
|
1845
1857
|
},
|
|
1846
|
-
children: (n) => S(
|
|
1858
|
+
children: (n) => S(bi, {
|
|
1847
1859
|
get spec() {
|
|
1848
1860
|
return e.spec;
|
|
1849
1861
|
},
|
|
@@ -1855,7 +1867,7 @@ function _i(e) {
|
|
|
1855
1867
|
});
|
|
1856
1868
|
},
|
|
1857
1869
|
get children() {
|
|
1858
|
-
return S(
|
|
1870
|
+
return S(Ai, {
|
|
1859
1871
|
get spec() {
|
|
1860
1872
|
return e.spec;
|
|
1861
1873
|
},
|
|
@@ -1867,34 +1879,34 @@ function _i(e) {
|
|
|
1867
1879
|
}
|
|
1868
1880
|
});
|
|
1869
1881
|
}
|
|
1870
|
-
}), S(
|
|
1882
|
+
}), S(Ni, {})];
|
|
1871
1883
|
}
|
|
1872
1884
|
});
|
|
1873
1885
|
}
|
|
1874
1886
|
});
|
|
1875
1887
|
}
|
|
1876
|
-
var
|
|
1877
|
-
function
|
|
1878
|
-
const [t, n] =
|
|
1888
|
+
var Vi = /* @__PURE__ */ A("<h2>Visualization"), Ci = /* @__PURE__ */ A("<h2>Description"), Ii = /* @__PURE__ */ A("<h2>Sonification"), Li = /* @__PURE__ */ A('<div><div class=uw-viewer role=region aria-label="Umwelt Viewer">');
|
|
1889
|
+
function ji(e) {
|
|
1890
|
+
const [t, n] = V();
|
|
1879
1891
|
return (() => {
|
|
1880
|
-
var i =
|
|
1881
|
-
return Ne(n, r),
|
|
1892
|
+
var i = Li(), r = i.firstChild;
|
|
1893
|
+
return Ne(n, r), _(r, S(Cn, {
|
|
1882
1894
|
get children() {
|
|
1883
|
-
return [
|
|
1895
|
+
return [Vi(), S(Mn, {
|
|
1884
1896
|
get spec() {
|
|
1885
1897
|
return e.spec;
|
|
1886
1898
|
},
|
|
1887
1899
|
get data() {
|
|
1888
1900
|
return e.data;
|
|
1889
1901
|
}
|
|
1890
|
-
}),
|
|
1902
|
+
}), Ci(), S(zn, {
|
|
1891
1903
|
get spec() {
|
|
1892
1904
|
return e.spec;
|
|
1893
1905
|
},
|
|
1894
1906
|
get data() {
|
|
1895
1907
|
return e.data;
|
|
1896
1908
|
}
|
|
1897
|
-
}),
|
|
1909
|
+
}), Ii(), S(Ri, {
|
|
1898
1910
|
get spec() {
|
|
1899
1911
|
return e.spec;
|
|
1900
1912
|
},
|
|
@@ -1904,26 +1916,26 @@ function Ci(e) {
|
|
|
1904
1916
|
keyEventTarget: t
|
|
1905
1917
|
})];
|
|
1906
1918
|
}
|
|
1907
|
-
})), L(() =>
|
|
1919
|
+
})), L(() => Lt(i, fn.Viewer)), i;
|
|
1908
1920
|
})();
|
|
1909
1921
|
}
|
|
1910
|
-
function
|
|
1911
|
-
const i = n.getItem(e) ? JSON.parse(n.getItem(e)) : t, [r,
|
|
1912
|
-
return [r, ((
|
|
1913
|
-
if (
|
|
1914
|
-
const o = a
|
|
1922
|
+
function st(e, t, n = localStorage) {
|
|
1923
|
+
const i = n.getItem(e) ? JSON.parse(n.getItem(e)) : t, [r, s] = V(i);
|
|
1924
|
+
return [r, ((a) => {
|
|
1925
|
+
if (a) {
|
|
1926
|
+
const o = s(a);
|
|
1915
1927
|
return n.setItem(e, JSON.stringify(o)), o;
|
|
1916
1928
|
}
|
|
1917
1929
|
})];
|
|
1918
1930
|
}
|
|
1919
|
-
const Ct =
|
|
1920
|
-
function
|
|
1921
|
-
const t = e.persist !== !1, [n, i] = t ?
|
|
1931
|
+
const Ct = W();
|
|
1932
|
+
function qi(e) {
|
|
1933
|
+
const t = e.persist !== !1, [n, i] = t ? st("umweltDatastore", {}) : V({}), [r, s] = t ? st("umweltSessionDatastore", {}, sessionStorage) : V({}), l = () => ({
|
|
1922
1934
|
...n(),
|
|
1923
1935
|
...r()
|
|
1924
|
-
}),
|
|
1936
|
+
}), a = {
|
|
1925
1937
|
setDataset: (o, f, d, u) => {
|
|
1926
|
-
u?.session ?
|
|
1938
|
+
u?.session ? s((c) => ({
|
|
1927
1939
|
...c,
|
|
1928
1940
|
[o]: {
|
|
1929
1941
|
data: f,
|
|
@@ -1943,10 +1955,10 @@ function Ri(e) {
|
|
|
1943
1955
|
...f
|
|
1944
1956
|
};
|
|
1945
1957
|
return delete d[o], d;
|
|
1946
|
-
}),
|
|
1958
|
+
}), a.removeSessionDataset(o);
|
|
1947
1959
|
},
|
|
1948
1960
|
removeSessionDataset: (o) => {
|
|
1949
|
-
|
|
1961
|
+
s((f) => {
|
|
1950
1962
|
const d = {
|
|
1951
1963
|
...f
|
|
1952
1964
|
};
|
|
@@ -1955,21 +1967,21 @@ function Ri(e) {
|
|
|
1955
1967
|
}
|
|
1956
1968
|
};
|
|
1957
1969
|
return S(Ct.Provider, {
|
|
1958
|
-
value: [l,
|
|
1970
|
+
value: [l, a],
|
|
1959
1971
|
get children() {
|
|
1960
1972
|
return e.children;
|
|
1961
1973
|
}
|
|
1962
1974
|
});
|
|
1963
1975
|
}
|
|
1964
|
-
function
|
|
1965
|
-
const e =
|
|
1976
|
+
function Mi() {
|
|
1977
|
+
const e = Y(Ct);
|
|
1966
1978
|
if (e === void 0)
|
|
1967
1979
|
throw new Error("useUmweltDatastore must be used within a UmweltDatastoreProvider");
|
|
1968
1980
|
return e;
|
|
1969
1981
|
}
|
|
1970
|
-
var
|
|
1971
|
-
function
|
|
1972
|
-
const [t, n] =
|
|
1982
|
+
var Bi = /* @__PURE__ */ A("<div>"), zi = /* @__PURE__ */ A("<div>Loading..."), Gi = /* @__PURE__ */ A("<div role=alert>");
|
|
1983
|
+
function Ki(e) {
|
|
1984
|
+
const [t, n] = Mi(), [i, r] = V(), [s, l] = V(!0), [a, o] = V(), f = () => {
|
|
1973
1985
|
const d = i();
|
|
1974
1986
|
return d ? t()[d.data.name]?.data || [] : [];
|
|
1975
1987
|
};
|
|
@@ -1977,7 +1989,7 @@ function qi(e) {
|
|
|
1977
1989
|
const d = e.exportableSpec;
|
|
1978
1990
|
l(!0), o(void 0);
|
|
1979
1991
|
try {
|
|
1980
|
-
const u = await
|
|
1992
|
+
const u = await Nn(d, t(), n.setDataset);
|
|
1981
1993
|
u ? r(u) : o("Failed to load Umwelt spec: the spec is invalid or its data source could not be resolved.");
|
|
1982
1994
|
} catch (u) {
|
|
1983
1995
|
console.error("Error loading spec:", u), o(`Failed to load Umwelt spec: ${u}`);
|
|
@@ -1985,19 +1997,19 @@ function qi(e) {
|
|
|
1985
1997
|
l(!1);
|
|
1986
1998
|
}
|
|
1987
1999
|
}), (() => {
|
|
1988
|
-
var d =
|
|
1989
|
-
return
|
|
1990
|
-
var u = pe(() => !!
|
|
1991
|
-
return () => u() &&
|
|
1992
|
-
})(), null),
|
|
1993
|
-
var u = pe(() => !!(!
|
|
2000
|
+
var d = Bi();
|
|
2001
|
+
return _(d, (() => {
|
|
2002
|
+
var u = pe(() => !!s());
|
|
2003
|
+
return () => u() && zi();
|
|
2004
|
+
})(), null), _(d, (() => {
|
|
2005
|
+
var u = pe(() => !!(!s() && a()));
|
|
1994
2006
|
return () => u() && (() => {
|
|
1995
|
-
var c =
|
|
1996
|
-
return
|
|
2007
|
+
var c = Gi();
|
|
2008
|
+
return _(c, a), c;
|
|
1997
2009
|
})();
|
|
1998
|
-
})(), null),
|
|
1999
|
-
var u = pe(() => !!(!
|
|
2000
|
-
return () => u() && S(
|
|
2010
|
+
})(), null), _(d, (() => {
|
|
2011
|
+
var u = pe(() => !!(!s() && !a() && i()));
|
|
2012
|
+
return () => u() && S(ji, {
|
|
2001
2013
|
get spec() {
|
|
2002
2014
|
return i();
|
|
2003
2015
|
},
|
|
@@ -2008,11 +2020,11 @@ function qi(e) {
|
|
|
2008
2020
|
})(), null), d;
|
|
2009
2021
|
})();
|
|
2010
2022
|
}
|
|
2011
|
-
function
|
|
2012
|
-
return S(
|
|
2023
|
+
function Hi(e) {
|
|
2024
|
+
return S(qi, {
|
|
2013
2025
|
persist: !1,
|
|
2014
2026
|
get children() {
|
|
2015
|
-
return S(
|
|
2027
|
+
return S(Ki, {
|
|
2016
2028
|
get exportableSpec() {
|
|
2017
2029
|
return e.exportableSpec;
|
|
2018
2030
|
}
|
|
@@ -2020,7 +2032,7 @@ function Mi(e) {
|
|
|
2020
2032
|
}
|
|
2021
2033
|
});
|
|
2022
2034
|
}
|
|
2023
|
-
class
|
|
2035
|
+
class Xi {
|
|
2024
2036
|
constructor(t) {
|
|
2025
2037
|
this.options = t, this.mount();
|
|
2026
2038
|
}
|
|
@@ -2029,7 +2041,7 @@ class Bi {
|
|
|
2029
2041
|
mount() {
|
|
2030
2042
|
if (this.isDestroyed)
|
|
2031
2043
|
throw new Error("Cannot mount a destroyed UmweltViewer. Create a new instance.");
|
|
2032
|
-
this.disposal =
|
|
2044
|
+
this.disposal = jt(() => Hi({ exportableSpec: this.options.spec }), this.options.container);
|
|
2033
2045
|
}
|
|
2034
2046
|
/**
|
|
2035
2047
|
* Update the viewer with a new specification.
|
|
@@ -2069,10 +2081,10 @@ class Bi {
|
|
|
2069
2081
|
return this.isDestroyed;
|
|
2070
2082
|
}
|
|
2071
2083
|
}
|
|
2072
|
-
function
|
|
2073
|
-
return new
|
|
2084
|
+
function gr(e, t) {
|
|
2085
|
+
return new Xi({ spec: e, container: t });
|
|
2074
2086
|
}
|
|
2075
2087
|
export {
|
|
2076
|
-
|
|
2077
|
-
|
|
2088
|
+
Xi as UmweltViewer,
|
|
2089
|
+
gr as createViewer
|
|
2078
2090
|
};
|