umwelt-js 0.2.1 → 0.2.2

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