umwelt-js 0.1.0 → 0.2.0

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