relly-ui 1.0.1 → 1.1.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.
@@ -1,23 +1,23 @@
1
- var pe = Object.defineProperty;
2
- var ue = (y, i, e) => i in y ? pe(y, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : y[i] = e;
3
- var a = (y, i, e) => ue(y, typeof i != "symbol" ? i + "" : i, e);
4
- class C {
1
+ var ge = Object.defineProperty;
2
+ var be = (f, i, e) => i in f ? ge(f, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : f[i] = e;
3
+ var l = (f, i, e) => be(f, typeof i != "symbol" ? i + "" : i, e);
4
+ class E {
5
5
  constructor(i, e, t, n, s) {
6
- a(this, "element");
7
- a(this, "labelEl");
8
- a(this, "controlEl");
9
- a(this, "label");
10
- a(this, "tooltipText");
11
- a(this, "tooltipEl");
12
- a(this, "conditionPredicate");
13
- a(this, "targetObject");
14
- a(this, "property");
15
- a(this, "initialValue");
16
- a(this, "prevValue");
17
- a(this, "onChangeCallback");
18
- a(this, "isListening", !1);
19
- a(this, "contextMenuItems");
20
- a(this, "disabled", !1);
6
+ l(this, "element");
7
+ l(this, "labelEl");
8
+ l(this, "controlEl");
9
+ l(this, "label");
10
+ l(this, "tooltipText");
11
+ l(this, "tooltipEl");
12
+ l(this, "conditionPredicate");
13
+ l(this, "targetObject");
14
+ l(this, "property");
15
+ l(this, "initialValue");
16
+ l(this, "prevValue");
17
+ l(this, "onChangeCallback");
18
+ l(this, "isListening", !1);
19
+ l(this, "contextMenuItems");
20
+ l(this, "disabled", !1);
21
21
  if (this.bindingEngine = n, this.presetManager = s, this.label = i, this.targetObject = e, this.property = t, this.targetObject && this.property) {
22
22
  this.prevValue = this.targetObject[this.property];
23
23
  try {
@@ -101,24 +101,24 @@ class C {
101
101
  this.isListening && this.bindingEngine && (this.bindingEngine.unregister(this), this.isListening = !1), this.presetManager && this.presetManager.unregister(this), this.element.remove();
102
102
  }
103
103
  }
104
- class L extends C {
105
- constructor(e, t, n, s, r, l) {
104
+ class I extends E {
105
+ constructor(e, t, n, s, r, o) {
106
106
  super(e, t, n, s, r);
107
- a(this, "wrapperEl");
108
- a(this, "boxEl");
109
- a(this, "soundEngine");
110
- this.soundEngine = l, this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-checkbox-wrapper", this.wrapperEl.setAttribute("role", "checkbox"), this.wrapperEl.setAttribute("tabindex", "0"), this.boxEl = document.createElement("div"), this.boxEl.className = "relly-checkbox-box", this.boxEl.innerHTML = `
107
+ l(this, "wrapperEl");
108
+ l(this, "boxEl");
109
+ l(this, "soundEngine");
110
+ this.soundEngine = o, this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-checkbox-wrapper", this.wrapperEl.setAttribute("role", "checkbox"), this.wrapperEl.setAttribute("tabindex", "0"), this.boxEl = document.createElement("div"), this.boxEl.className = "relly-checkbox-box", this.boxEl.innerHTML = `
111
111
  <svg class="relly-checkbox-icon" viewBox="0 0 12 10">
112
112
  <polyline points="1.5 5 4.5 8.5 10.5 1.5"></polyline>
113
113
  </svg>
114
114
  `, this.wrapperEl.appendChild(this.boxEl), this.controlEl.appendChild(this.wrapperEl), this.wrapperEl.addEventListener("click", () => {
115
115
  var h;
116
- const o = !this.getValue();
117
- (h = this.soundEngine) == null || h.playToggle(o), this.setValue(o);
118
- }), this.wrapperEl.addEventListener("keydown", (o) => {
116
+ const a = !this.getValue();
117
+ (h = this.soundEngine) == null || h.playToggle(a), this.setValue(a);
118
+ }), this.wrapperEl.addEventListener("keydown", (a) => {
119
119
  var h;
120
- if (o.key === " " || o.key === "Enter") {
121
- o.preventDefault();
120
+ if (a.key === " " || a.key === "Enter") {
121
+ a.preventDefault();
122
122
  const c = !this.getValue();
123
123
  (h = this.soundEngine) == null || h.playToggle(c), this.setValue(c);
124
124
  }
@@ -133,41 +133,41 @@ class L extends C {
133
133
  return this.wrapperEl.setAttribute("aria-checked", e ? "true" : "false"), e ? this.wrapperEl.classList.add("relly-checked") : this.wrapperEl.classList.remove("relly-checked"), this;
134
134
  }
135
135
  }
136
- class V extends C {
137
- constructor(e, t, n, s, r, l) {
136
+ class V extends E {
137
+ constructor(e, t, n, s, r, o) {
138
138
  super(e, t, n, s, r);
139
- a(this, "containerEl");
140
- a(this, "rangeInput");
141
- a(this, "numberInput");
142
- a(this, "soundEngine");
143
- a(this, "lastSoundTime", 0);
144
- a(this, "min", 0);
145
- a(this, "max", 100);
146
- a(this, "step", 1);
147
- this.soundEngine = l, this.containerEl = document.createElement("div"), this.containerEl.className = "relly-slider-container", this.rangeInput = document.createElement("input"), this.rangeInput.type = "range", this.rangeInput.className = "relly-slider-range", this.numberInput = document.createElement("input"), this.numberInput.type = "number", this.numberInput.className = "relly-slider-number", this.numberInput.title = "Drag horizontally to scrub value, or type directly", this.containerEl.appendChild(this.rangeInput), this.containerEl.appendChild(this.numberInput), this.controlEl.appendChild(this.containerEl), this.applyConstraints(), this.rangeInput.addEventListener("input", () => {
148
- const o = parseFloat(this.rangeInput.value);
149
- this.triggerSound(), this.setValue(o);
139
+ l(this, "containerEl");
140
+ l(this, "rangeInput");
141
+ l(this, "numberInput");
142
+ l(this, "soundEngine");
143
+ l(this, "lastSoundTime", 0);
144
+ l(this, "min", 0);
145
+ l(this, "max", 100);
146
+ l(this, "step", 1);
147
+ this.soundEngine = o, this.containerEl = document.createElement("div"), this.containerEl.className = "relly-slider-container", this.rangeInput = document.createElement("input"), this.rangeInput.type = "range", this.rangeInput.className = "relly-slider-range", this.numberInput = document.createElement("input"), this.numberInput.type = "number", this.numberInput.className = "relly-slider-number", this.numberInput.title = "Drag horizontally to scrub value, or type directly", this.containerEl.appendChild(this.rangeInput), this.containerEl.appendChild(this.numberInput), this.controlEl.appendChild(this.containerEl), this.applyConstraints(), this.rangeInput.addEventListener("input", () => {
148
+ const a = parseFloat(this.rangeInput.value);
149
+ this.triggerSound(), this.setValue(a);
150
150
  }), this.numberInput.addEventListener("change", () => {
151
- let o = parseFloat(this.numberInput.value);
152
- isNaN(o) && (o = this.min), o = Math.max(this.min, Math.min(this.max, o)), this.triggerSound(), this.setValue(o);
151
+ let a = parseFloat(this.numberInput.value);
152
+ isNaN(a) && (a = this.min), a = Math.max(this.min, Math.min(this.max, a)), this.triggerSound(), this.setValue(a);
153
153
  }), this.setupJogScrubbing(), this.update();
154
154
  }
155
155
  setupJogScrubbing() {
156
156
  let e = !1, t = 0, n = 0;
157
- const s = (l) => {
158
- const o = l.clientX - t;
159
- if (!e && Math.abs(o) > 3 && (e = !0, typeof document < "u" && document.body.classList.add("relly-jog-scrubbing")), e) {
160
- const h = l.shiftKey ? 10 : l.altKey ? 0.1 : 1, c = this.step * h, u = o * c;
161
- let p = n + u;
157
+ const s = (o) => {
158
+ const a = o.clientX - t;
159
+ if (!e && Math.abs(a) > 3 && (e = !0, typeof document < "u" && document.body.classList.add("relly-jog-scrubbing")), e) {
160
+ const h = o.shiftKey ? 10 : o.altKey ? 0.1 : 1, c = this.step * h, m = a * c;
161
+ let p = n + m;
162
162
  p = Math.max(this.min, Math.min(this.max, p));
163
- const d = (this.step.toString().split(".")[1] || "").length;
164
- p = parseFloat(p.toFixed(Math.max(d, 2))), this.triggerSound(), this.setValue(p), l.preventDefault();
163
+ const d = (c.toString().split(".")[1] || "").length, y = 1 / c;
164
+ p = Math.round(p * y) / y, p = parseFloat(p.toFixed(Math.min(d, 4))), this.triggerSound(), this.setValue(p), o.preventDefault();
165
165
  }
166
166
  }, r = () => {
167
167
  e && typeof document < "u" && document.body.classList.remove("relly-jog-scrubbing"), typeof window < "u" && (window.removeEventListener("mousemove", s), window.removeEventListener("mouseup", r));
168
168
  };
169
- this.numberInput.addEventListener("mousedown", (l) => {
170
- t = l.clientX, n = parseFloat(this.numberInput.value) || 0, e = !1, typeof window < "u" && (window.addEventListener("mousemove", s), window.addEventListener("mouseup", r));
169
+ this.numberInput.addEventListener("mousedown", (o) => {
170
+ t = o.clientX, n = parseFloat(this.numberInput.value) || 0, e = !1, typeof window < "u" && (window.addEventListener("mousemove", s), window.addEventListener("mouseup", r));
171
171
  });
172
172
  }
173
173
  triggerSound() {
@@ -196,12 +196,12 @@ class V extends C {
196
196
  return this.rangeInput.value = e.toString(), this.numberInput.value = e.toString(), this;
197
197
  }
198
198
  }
199
- class A extends C {
199
+ class A extends E {
200
200
  constructor(e, t, n) {
201
201
  super(e);
202
- a(this, "buttonEl");
203
- a(this, "clickHandler");
204
- a(this, "soundEngine");
202
+ l(this, "buttonEl");
203
+ l(this, "clickHandler");
204
+ l(this, "soundEngine");
205
205
  this.soundEngine = n, this.labelEl.style.display = "none", this.controlEl.style.flex = "1", this.buttonEl = document.createElement("button"), this.buttonEl.className = "relly-btn", this.buttonEl.textContent = e, this.controlEl.appendChild(this.buttonEl), t && this.onClick(t), this.buttonEl.addEventListener("click", (s) => {
206
206
  var r;
207
207
  (r = this.soundEngine) == null || r.playClick(), this.clickHandler && this.clickHandler(s);
@@ -220,13 +220,13 @@ class A extends C {
220
220
  return this;
221
221
  }
222
222
  }
223
- class z extends C {
224
- constructor(e, t, n, s, r, l) {
225
- super(e, t, n, r, l);
226
- a(this, "selectEl");
227
- a(this, "optionsMap", /* @__PURE__ */ new Map());
223
+ class z extends E {
224
+ constructor(e, t, n, s, r, o) {
225
+ super(e, t, n, r, o);
226
+ l(this, "selectEl");
227
+ l(this, "optionsMap", /* @__PURE__ */ new Map());
228
228
  this.selectEl = document.createElement("select"), this.selectEl.className = "relly-select-input", this.controlEl.appendChild(this.selectEl), s && this.setOptions(s), this.selectEl.addEventListener("change", () => {
229
- const o = this.selectEl.value, h = this.optionsMap.has(o) ? this.optionsMap.get(o) : o;
229
+ const a = this.selectEl.value, h = this.optionsMap.has(a) ? this.optionsMap.get(a) : a;
230
230
  this.setValue(h);
231
231
  }), this.update();
232
232
  }
@@ -255,11 +255,11 @@ class z extends C {
255
255
  return this.selectEl.value = String(e), this;
256
256
  }
257
257
  }
258
- class B extends C {
258
+ class B extends E {
259
259
  constructor(e, t, n, s) {
260
260
  super(e, t, n, s);
261
- a(this, "valueBadge");
262
- a(this, "formatter", (e) => String(e ?? ""));
261
+ l(this, "valueBadge");
262
+ l(this, "formatter", (e) => String(e ?? ""));
263
263
  this.valueBadge = document.createElement("span"), this.valueBadge.className = "relly-dynamic-value", this.controlEl.appendChild(this.valueBadge), this.update();
264
264
  }
265
265
  setFormat(e) {
@@ -270,52 +270,52 @@ class B extends C {
270
270
  return this.valueBadge.textContent = this.formatter(e), this;
271
271
  }
272
272
  }
273
- class N extends C {
273
+ class N extends E {
274
274
  constructor(e, t, n, s, r) {
275
275
  super(e, t, n, s);
276
- a(this, "canvasContainer");
277
- a(this, "canvas");
278
- a(this, "ctx", null);
279
- a(this, "statsEl");
280
- a(this, "graphTooltipEl");
281
- a(this, "legendEl");
282
- a(this, "primarySeries");
283
- a(this, "seriesList", []);
284
- a(this, "seriesMap", /* @__PURE__ */ new Map());
285
- a(this, "bufferSize", 60);
286
- a(this, "min", 0);
287
- a(this, "max", 100);
288
- a(this, "autoRange", !0);
289
- a(this, "smoothCurves", !0);
290
- a(this, "isPaused", !1);
291
- a(this, "formatter", (e) => typeof e == "number" && !isNaN(e) ? e.toFixed(1) : "0");
292
- a(this, "cssWidth", 280);
293
- a(this, "cssHeight", 90);
294
- a(this, "sampleInterval", 50);
295
- a(this, "lastSampleTime", 0);
296
- a(this, "hoverIndex", null);
297
- a(this, "resizeObserver", null);
298
- a(this, "mediaQueryList", null);
299
- a(this, "soundEngine");
300
- a(this, "onResolutionChange", () => {
276
+ l(this, "canvasContainer");
277
+ l(this, "canvas");
278
+ l(this, "ctx", null);
279
+ l(this, "statsEl");
280
+ l(this, "graphTooltipEl");
281
+ l(this, "legendEl");
282
+ l(this, "primarySeries");
283
+ l(this, "seriesList", []);
284
+ l(this, "seriesMap", /* @__PURE__ */ new Map());
285
+ l(this, "bufferSize", 60);
286
+ l(this, "min", 0);
287
+ l(this, "max", 100);
288
+ l(this, "autoRange", !0);
289
+ l(this, "smoothCurves", !0);
290
+ l(this, "isPaused", !1);
291
+ l(this, "formatter", (e) => typeof e == "number" && !isNaN(e) ? e.toFixed(1) : "0");
292
+ l(this, "cssWidth", 280);
293
+ l(this, "cssHeight", 90);
294
+ l(this, "sampleInterval", 50);
295
+ l(this, "lastSampleTime", 0);
296
+ l(this, "hoverIndex", null);
297
+ l(this, "resizeObserver", null);
298
+ l(this, "mediaQueryList", null);
299
+ l(this, "soundEngine");
300
+ l(this, "onResolutionChange", () => {
301
301
  this.updateDPRListener(), this.resizeCanvas(), this.draw();
302
302
  });
303
- a(this, "onMouseMove", (e) => {
303
+ l(this, "onMouseMove", (e) => {
304
304
  const t = this.canvas.getBoundingClientRect(), n = e.clientX - t.left, s = this.cssWidth;
305
305
  if (s <= 0) return;
306
- const r = s / Math.max(1, this.bufferSize - 1), l = Math.round(n / r), o = Math.max(0, Math.min(this.bufferSize - 1, l));
307
- o !== this.hoverIndex && (this.hoverIndex = o, this.updateTooltip(n), this.draw());
306
+ const r = s / Math.max(1, this.bufferSize - 1), o = Math.round(n / r), a = Math.max(0, Math.min(this.bufferSize - 1, o));
307
+ a !== this.hoverIndex && (this.hoverIndex = a, this.updateTooltip(n), this.draw());
308
308
  });
309
- a(this, "onMouseLeave", () => {
309
+ l(this, "onMouseLeave", () => {
310
310
  this.hoverIndex = null, this.graphTooltipEl.classList.remove("relly-tooltip-show"), this.draw();
311
311
  });
312
- a(this, "onCanvasClick", () => {
312
+ l(this, "onCanvasClick", () => {
313
313
  var e;
314
314
  (e = this.soundEngine) == null || e.playClick(), this.isPaused = !this.isPaused, this.isPaused ? this.canvasContainer.classList.add("relly-graph-paused") : this.canvasContainer.classList.remove("relly-graph-paused"), this.updateStats(), this.draw();
315
315
  });
316
316
  this.soundEngine = r, this.element.className = "relly-graph-row", this.element.innerHTML = "";
317
- const l = document.createElement("div");
318
- l.className = "relly-graph-header", this.labelEl = document.createElement("span"), this.labelEl.className = "relly-graph-label", this.labelEl.textContent = e, this.statsEl = document.createElement("div"), this.statsEl.className = "relly-graph-stats", this.statsEl.innerHTML = '<span class="relly-graph-val">0</span>', l.appendChild(this.labelEl), l.appendChild(this.statsEl), this.element.appendChild(l), this.legendEl = document.createElement("div"), this.legendEl.className = "relly-graph-legend", this.element.appendChild(this.legendEl), this.canvasContainer = document.createElement("div"), this.canvasContainer.className = "relly-graph-canvas-container", this.canvasContainer.title = "Click to pause/freeze data stream for inspection", this.canvas = document.createElement("canvas"), this.canvas.className = "relly-graph-canvas", this.canvasContainer.appendChild(this.canvas), this.graphTooltipEl = document.createElement("div"), this.graphTooltipEl.className = "relly-graph-tooltip", this.canvasContainer.appendChild(this.graphTooltipEl), this.element.appendChild(this.canvasContainer), this.ctx = this.canvas.getContext("2d"), this.primarySeries = {
317
+ const o = document.createElement("div");
318
+ o.className = "relly-graph-header", this.labelEl = document.createElement("span"), this.labelEl.className = "relly-graph-label", this.labelEl.textContent = e, this.statsEl = document.createElement("div"), this.statsEl.className = "relly-graph-stats", this.statsEl.innerHTML = '<span class="relly-graph-val">0</span>', o.appendChild(this.labelEl), o.appendChild(this.statsEl), this.element.appendChild(o), this.legendEl = document.createElement("div"), this.legendEl.className = "relly-graph-legend", this.element.appendChild(this.legendEl), this.canvasContainer = document.createElement("div"), this.canvasContainer.className = "relly-graph-canvas-container", this.canvasContainer.title = "Click to pause/freeze data stream for inspection", this.canvas = document.createElement("canvas"), this.canvas.className = "relly-graph-canvas", this.canvasContainer.appendChild(this.canvas), this.graphTooltipEl = document.createElement("div"), this.graphTooltipEl.className = "relly-graph-tooltip", this.canvasContainer.appendChild(this.graphTooltipEl), this.element.appendChild(this.canvasContainer), this.ctx = this.canvas.getContext("2d"), this.primarySeries = {
319
319
  id: "default",
320
320
  label: e,
321
321
  color: "#38bdf8",
@@ -346,9 +346,9 @@ class N extends C {
346
346
  if (this.hoverIndex === null) return;
347
347
  let t = "";
348
348
  for (const r of this.seriesList) {
349
- const l = this.bufferSize - r.buffer.length, o = this.hoverIndex - l;
350
- if (o >= 0 && o < r.buffer.length) {
351
- const h = r.buffer[o];
349
+ const o = this.bufferSize - r.buffer.length, a = this.hoverIndex - o;
350
+ if (a >= 0 && a < r.buffer.length) {
351
+ const h = r.buffer[a];
352
352
  t += `<div><span style="display:inline-block;width:6px;height:6px;border-radius:50%;background:${r.color};margin-right:4px;"></span>${r.label}: <b>${this.formatter(h)}</b></div>`;
353
353
  }
354
354
  }
@@ -382,7 +382,7 @@ class N extends C {
382
382
  checkDirty() {
383
383
  if (this.checkVisibility(), !this.targetObject || !this.property || this.isPaused) return;
384
384
  const e = this.targetObject[this.property], t = typeof performance < "u" ? performance.now() : Date.now();
385
- (t - this.lastSampleTime >= this.sampleInterval || e !== this.prevValue) && (this.lastSampleTime = t, this.prevValue = e, this.update(), this.triggerChange(e, this.prevValue));
385
+ t - this.lastSampleTime >= this.sampleInterval && (this.lastSampleTime = t, this.prevValue = e, this.update(), this.triggerChange(e, this.prevValue));
386
386
  }
387
387
  setSmooth(e) {
388
388
  return this.smoothCurves = e, this.draw(), this;
@@ -447,13 +447,19 @@ class N extends C {
447
447
  if (this.isPaused) return this;
448
448
  if (typeof t != "number" || isNaN(t) || !isFinite(t)) return this;
449
449
  const n = this.seriesMap.get(e);
450
- return n ? (n.buffer.push(t), n.buffer.length > this.bufferSize && n.buffer.shift(), this) : (this.addSeries(e, { color: "#ec4899", label: e }), this.pushSeries(e, t));
450
+ return n ? (n.buffer.push(t), n.buffer.length > this.bufferSize && n.buffer.shift(), this.updateStats(), this.draw(), this) : (this.addSeries(e, { color: "#ec4899", label: e }), this.pushSeries(e, t));
451
+ }
452
+ getLatestValue() {
453
+ if (this.primarySeries.buffer.length > 0)
454
+ return this.primarySeries.buffer[this.primarySeries.buffer.length - 1];
455
+ const e = this.getValue();
456
+ return typeof e == "number" && !isNaN(e) ? e : 0;
451
457
  }
452
458
  updateStats() {
453
459
  const e = this.primarySeries.buffer.length > 0 ? this.primarySeries.buffer[this.primarySeries.buffer.length - 1] : 0;
454
460
  let t = this.min, n = this.max, s = [];
455
- for (const l of this.seriesList)
456
- s = s.concat(l.buffer);
461
+ for (const o of this.seriesList)
462
+ s = s.concat(o.buffer);
457
463
  s.length > 0 && (t = Math.min(...s), n = Math.max(...s));
458
464
  const r = this.isPaused ? '<span class="relly-graph-badge relly-graph-badge--paused">PAUSED</span>' : "";
459
465
  this.statsEl.innerHTML = `
@@ -475,57 +481,57 @@ class N extends C {
475
481
  const e = this.ctx, t = this.cssWidth, n = this.cssHeight;
476
482
  e.clearRect(0, 0, t, n), e.save(), e.setLineDash([2, 4]), e.strokeStyle = "rgba(255, 255, 255, 0.08)", e.lineWidth = 1;
477
483
  for (let d of [0.25, 0.5, 0.75]) {
478
- const f = Math.round(n * d);
479
- e.beginPath(), e.moveTo(0, f), e.lineTo(t, f), e.stroke();
484
+ const y = Math.round(n * d);
485
+ e.beginPath(), e.moveTo(0, y), e.lineTo(t, y), e.stroke();
480
486
  }
481
487
  e.restore();
482
488
  let s = [];
483
489
  for (const d of this.seriesList)
484
490
  s = s.concat(d.buffer);
485
491
  if (s.length === 0) return;
486
- const r = Math.min(...s), l = Math.max(...s);
487
- let o = this.autoRange ? r : this.min, h = this.autoRange ? l : this.max;
488
- l > h && (h = l), r < o && (o = r), o === h && (o -= 1, h += 1);
489
- const c = (h - o) * 0.16 || 1;
490
- o -= c, h += c;
491
- const u = h - o || 1, p = t / Math.max(1, this.bufferSize - 1);
492
+ const r = Math.min(...s), o = Math.max(...s);
493
+ let a = this.autoRange ? r : this.min, h = this.autoRange ? o : this.max;
494
+ o > h && (h = o), r < a && (a = r), a === h && (a -= 1, h += 1);
495
+ const c = (h - a) * 0.16 || 1;
496
+ a -= c, h += c;
497
+ const m = h - a || 1, p = t / Math.max(1, this.bufferSize - 1);
492
498
  for (const d of this.seriesList) {
493
499
  if (d.buffer.length === 0) continue;
494
- const f = d.buffer.length === 1 ? [d.buffer[0], d.buffer[0]] : d.buffer, b = this.bufferSize - f.length, m = [];
495
- for (let g = 0; g < f.length; g++) {
496
- const x = (b + g) * p, w = Math.max(0, Math.min(1, (f[g] - o) / u)), M = Math.max(4, Math.min(n - 4, n - 6 - w * (n - 12)));
497
- m.push({ x, y: M });
500
+ const y = d.buffer.length === 1 ? [d.buffer[0], d.buffer[0]] : d.buffer, x = this.bufferSize - y.length, u = [];
501
+ for (let g = 0; g < y.length; g++) {
502
+ const b = (x + g) * p, C = Math.max(0, Math.min(1, (y[g] - a) / m)), M = Math.max(4, Math.min(n - 4, n - 6 - C * (n - 12)));
503
+ u.push({ x: b, y: M });
498
504
  }
499
- if (e.beginPath(), e.moveTo(m[0].x, n), e.lineTo(m[0].x, m[0].y), this.smoothCurves && m.length > 2)
500
- for (let g = 0; g < m.length - 1; g++) {
501
- const x = m[g], w = m[g + 1], M = (x.x + w.x) / 2;
502
- e.bezierCurveTo(M, x.y, M, w.y, w.x, w.y);
505
+ if (e.beginPath(), e.moveTo(u[0].x, n), e.lineTo(u[0].x, u[0].y), this.smoothCurves && u.length > 2)
506
+ for (let g = 0; g < u.length - 1; g++) {
507
+ const b = u[g], C = u[g + 1], M = (b.x + C.x) / 2;
508
+ e.bezierCurveTo(M, b.y, M, C.y, C.x, C.y);
503
509
  }
504
510
  else
505
- for (let g = 1; g < m.length; g++)
506
- e.lineTo(m[g].x, m[g].y);
507
- e.lineTo(m[m.length - 1].x, n), e.closePath();
511
+ for (let g = 1; g < u.length; g++)
512
+ e.lineTo(u[g].x, u[g].y);
513
+ e.lineTo(u[u.length - 1].x, n), e.closePath();
508
514
  const v = e.createLinearGradient(0, 0, 0, n);
509
- if (v.addColorStop(0, d.fillColor || `${d.color}40`), v.addColorStop(1, "rgba(0, 0, 0, 0)"), e.fillStyle = v, e.fill(), e.beginPath(), e.moveTo(m[0].x, m[0].y), this.smoothCurves && m.length > 2)
510
- for (let g = 0; g < m.length - 1; g++) {
511
- const x = m[g], w = m[g + 1], M = (x.x + w.x) / 2;
512
- e.bezierCurveTo(M, x.y, M, w.y, w.x, w.y);
515
+ if (v.addColorStop(0, d.fillColor || `${d.color}40`), v.addColorStop(1, "rgba(0, 0, 0, 0)"), e.fillStyle = v, e.fill(), e.beginPath(), e.moveTo(u[0].x, u[0].y), this.smoothCurves && u.length > 2)
516
+ for (let g = 0; g < u.length - 1; g++) {
517
+ const b = u[g], C = u[g + 1], M = (b.x + C.x) / 2;
518
+ e.bezierCurveTo(M, b.y, M, C.y, C.x, C.y);
513
519
  }
514
520
  else
515
- for (let g = 1; g < m.length; g++)
516
- e.lineTo(m[g].x, m[g].y);
521
+ for (let g = 1; g < u.length; g++)
522
+ e.lineTo(u[g].x, u[g].y);
517
523
  e.save(), e.strokeStyle = d.color, e.lineWidth = 2, e.shadowColor = d.color, e.shadowBlur = 5, e.stroke(), e.restore();
518
- const E = m[m.length - 1];
519
- E && (e.beginPath(), e.arc(E.x, E.y, 4, 0, Math.PI * 2), e.fillStyle = d.color, e.globalAlpha = 0.35, e.fill(), e.globalAlpha = 1, e.beginPath(), e.arc(E.x, E.y, 2, 0, Math.PI * 2), e.fillStyle = "#ffffff", e.fill());
524
+ const w = u[u.length - 1];
525
+ w && (e.beginPath(), e.arc(w.x, w.y, 4, 0, Math.PI * 2), e.fillStyle = d.color, e.globalAlpha = 0.35, e.fill(), e.globalAlpha = 1, e.beginPath(), e.arc(w.x, w.y, 2, 0, Math.PI * 2), e.fillStyle = "#ffffff", e.fill());
520
526
  }
521
527
  if (this.hoverIndex !== null) {
522
528
  const d = Math.round(this.hoverIndex * p);
523
529
  e.save(), e.setLineDash([3, 3]), e.strokeStyle = "rgba(255, 255, 255, 0.45)", e.lineWidth = 1, e.beginPath(), e.moveTo(d, 0), e.lineTo(d, n), e.stroke(), e.restore();
524
- for (const f of this.seriesList) {
525
- const b = this.bufferSize - f.buffer.length, m = this.hoverIndex - b;
526
- if (m >= 0 && m < f.buffer.length) {
527
- const v = f.buffer[m], E = Math.max(0, Math.min(1, (v - o) / u)), g = Math.max(4, Math.min(n - 4, n - 6 - E * (n - 12)));
528
- e.beginPath(), e.arc(d, g, 4.5, 0, Math.PI * 2), e.fillStyle = f.color, e.fill(), e.beginPath(), e.arc(d, g, 2, 0, Math.PI * 2), e.fillStyle = "#ffffff", e.fill();
530
+ for (const y of this.seriesList) {
531
+ const x = this.bufferSize - y.buffer.length, u = this.hoverIndex - x;
532
+ if (u >= 0 && u < y.buffer.length) {
533
+ const v = y.buffer[u], w = Math.max(0, Math.min(1, (v - a) / m)), g = Math.max(4, Math.min(n - 4, n - 6 - w * (n - 12)));
534
+ e.beginPath(), e.arc(d, g, 4.5, 0, Math.PI * 2), e.fillStyle = y.color, e.fill(), e.beginPath(), e.arc(d, g, 2, 0, Math.PI * 2), e.fillStyle = "#ffffff", e.fill();
529
535
  }
530
536
  }
531
537
  }
@@ -534,19 +540,19 @@ class N extends C {
534
540
  this.resizeObserver && (this.resizeObserver.disconnect(), this.resizeObserver = null), this.mediaQueryList && (this.mediaQueryList.removeEventListener("change", this.onResolutionChange), this.mediaQueryList = null), this.canvas.removeEventListener("mousemove", this.onMouseMove), this.canvas.removeEventListener("mouseleave", this.onMouseLeave), this.canvas.removeEventListener("click", this.onCanvasClick), super.destroy();
535
541
  }
536
542
  }
537
- class R extends C {
538
- constructor(e, t, n, s, r, l) {
543
+ class R extends E {
544
+ constructor(e, t, n, s, r, o) {
539
545
  super(e, t, n, s, r);
540
- a(this, "wrapperEl");
541
- a(this, "previewEl");
542
- a(this, "hexTextEl");
543
- a(this, "nativeColorInput");
544
- a(this, "eyeDropperBtn");
545
- a(this, "swatchesContainer");
546
- a(this, "swatches", []);
547
- a(this, "swatchButtons", /* @__PURE__ */ new Map());
548
- a(this, "soundEngine");
549
- this.soundEngine = l, this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-color-wrapper", this.previewEl = document.createElement("div"), this.previewEl.className = "relly-color-preview", this.previewEl.title = "Click to open color palette", this.hexTextEl = document.createElement("span"), this.hexTextEl.className = "relly-color-text", this.nativeColorInput = document.createElement("input"), this.nativeColorInput.type = "color", this.nativeColorInput.className = "relly-color-native", this.wrapperEl.appendChild(this.previewEl), this.wrapperEl.appendChild(this.hexTextEl), this.wrapperEl.appendChild(this.nativeColorInput), typeof window < "u" && "EyeDropper" in window && (this.eyeDropperBtn = document.createElement("button"), this.eyeDropperBtn.type = "button", this.eyeDropperBtn.className = "relly-eyedropper-btn", this.eyeDropperBtn.title = "Pick color from screen", this.eyeDropperBtn.innerHTML = `
546
+ l(this, "wrapperEl");
547
+ l(this, "previewEl");
548
+ l(this, "hexInputEl");
549
+ l(this, "nativeColorInput");
550
+ l(this, "eyeDropperBtn");
551
+ l(this, "swatchesContainer");
552
+ l(this, "swatches", []);
553
+ l(this, "swatchButtons", /* @__PURE__ */ new Map());
554
+ l(this, "soundEngine");
555
+ this.soundEngine = o, this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-color-wrapper", this.previewEl = document.createElement("div"), this.previewEl.className = "relly-color-preview", this.previewEl.title = "Click to open color palette", this.hexInputEl = document.createElement("input"), this.hexInputEl.type = "text", this.hexInputEl.className = "relly-color-text relly-color-input", this.hexInputEl.spellcheck = !1, this.hexInputEl.maxLength = 9, this.nativeColorInput = document.createElement("input"), this.nativeColorInput.type = "color", this.nativeColorInput.className = "relly-color-native", this.wrapperEl.appendChild(this.previewEl), this.wrapperEl.appendChild(this.hexInputEl), this.wrapperEl.appendChild(this.nativeColorInput), typeof window < "u" && "EyeDropper" in window && (this.eyeDropperBtn = document.createElement("button"), this.eyeDropperBtn.type = "button", this.eyeDropperBtn.className = "relly-eyedropper-btn", this.eyeDropperBtn.title = "Pick color from screen", this.eyeDropperBtn.innerHTML = `
550
556
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
551
557
  <path d="m14 7 3 3m-1-5a2.83 2.83 0 0 1 4 4L7 22H3v-4L16 5Z"></path>
552
558
  </svg>
@@ -558,9 +564,16 @@ class R extends C {
558
564
  }
559
565
  }), this.wrapperEl.appendChild(this.eyeDropperBtn)), this.controlEl.appendChild(this.wrapperEl), this.previewEl.addEventListener("click", () => {
560
566
  this.nativeColorInput.click();
567
+ }), this.hexInputEl.addEventListener("input", () => {
568
+ let a = this.hexInputEl.value.trim();
569
+ !a.startsWith("#") && /^[0-9a-fA-F]{3,8}$/.test(a) && (a = "#" + a), /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(a) && this.setValue(a);
570
+ }), this.hexInputEl.addEventListener("change", () => {
571
+ var h;
572
+ let a = this.hexInputEl.value.trim();
573
+ !a.startsWith("#") && /^[0-9a-fA-F]{3,8}$/.test(a) && (a = "#" + a), /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(a) ? ((h = this.soundEngine) == null || h.playClick(), this.setValue(a)) : this.update();
561
574
  }), this.nativeColorInput.addEventListener("input", () => {
562
- const o = this.nativeColorInput.value;
563
- this.setValue(o);
575
+ const a = this.nativeColorInput.value;
576
+ this.setValue(a);
564
577
  }), this.update();
565
578
  }
566
579
  setSoundEngine(e) {
@@ -581,57 +594,57 @@ class R extends C {
581
594
  return [...this.swatches];
582
595
  }
583
596
  update() {
584
- if (!this.previewEl || !this.hexTextEl) return this;
597
+ if (!this.previewEl || !this.hexInputEl) return this;
585
598
  const e = String(this.getValue() || "#000000");
586
- this.previewEl.style.backgroundColor = e, this.hexTextEl.textContent = e.toUpperCase(), e.startsWith("#") && (e.length === 7 || e.length === 4) && (this.nativeColorInput.value = e.length === 4 ? `#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}` : e);
599
+ this.previewEl.style.backgroundColor = e, document.activeElement !== this.hexInputEl && (this.hexInputEl.value = e.toUpperCase()), e.startsWith("#") && (e.length === 7 || e.length === 4) && (this.nativeColorInput.value = e.length === 4 ? `#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}` : e);
587
600
  const t = e.toLowerCase();
588
601
  for (const [n, s] of this.swatchButtons.entries())
589
602
  n === t ? s.classList.add("relly-swatch-active") : s.classList.remove("relly-swatch-active");
590
603
  return this;
591
604
  }
592
605
  }
593
- class P extends C {
606
+ class P extends E {
594
607
  constructor(e, t, n, s, r) {
595
608
  super(e, t, n, s, r);
596
- a(this, "containerEl");
597
- a(this, "xInput");
598
- a(this, "yInput");
599
- a(this, "min");
600
- a(this, "max");
601
- a(this, "step", 0.1);
609
+ l(this, "containerEl");
610
+ l(this, "xInput");
611
+ l(this, "yInput");
612
+ l(this, "min");
613
+ l(this, "max");
614
+ l(this, "step", 0.1);
602
615
  this.containerEl = document.createElement("div"), this.containerEl.className = "relly-point2d-container";
603
- const l = document.createElement("div");
604
- l.className = "relly-point2d-item";
605
- const o = document.createElement("span");
606
- o.className = "relly-point2d-tag", o.textContent = "X", this.xInput = document.createElement("input"), this.xInput.type = "number", this.xInput.className = "relly-point2d-input", this.xInput.step = String(this.step), l.appendChild(o), l.appendChild(this.xInput);
616
+ const o = document.createElement("div");
617
+ o.className = "relly-point2d-item";
618
+ const a = document.createElement("span");
619
+ a.className = "relly-point2d-tag", a.textContent = "X", this.xInput = document.createElement("input"), this.xInput.type = "number", this.xInput.className = "relly-point2d-input", this.xInput.step = String(this.step), o.appendChild(a), o.appendChild(this.xInput);
607
620
  const h = document.createElement("div");
608
621
  h.className = "relly-point2d-item";
609
622
  const c = document.createElement("span");
610
- c.className = "relly-point2d-tag", c.textContent = "Y", this.yInput = document.createElement("input"), this.yInput.type = "number", this.yInput.className = "relly-point2d-input", this.yInput.step = String(this.step), h.appendChild(c), h.appendChild(this.yInput), this.containerEl.appendChild(l), this.containerEl.appendChild(h), this.controlEl.appendChild(this.containerEl), this.xInput.addEventListener("change", () => this.handleInputChange()), this.yInput.addEventListener("change", () => this.handleInputChange()), this.setupInputScrubbing(this.xInput, "x"), this.setupInputScrubbing(this.yInput, "y"), this.update();
623
+ c.className = "relly-point2d-tag", c.textContent = "Y", this.yInput = document.createElement("input"), this.yInput.type = "number", this.yInput.className = "relly-point2d-input", this.yInput.step = String(this.step), h.appendChild(c), h.appendChild(this.yInput), this.containerEl.appendChild(o), this.containerEl.appendChild(h), this.controlEl.appendChild(this.containerEl), this.xInput.addEventListener("change", () => this.handleInputChange()), this.yInput.addEventListener("change", () => this.handleInputChange()), this.setupInputScrubbing(this.xInput, "x"), this.setupInputScrubbing(this.yInput, "y"), this.update();
611
624
  }
612
625
  setupInputScrubbing(e, t) {
613
626
  let n = !1, s = 0, r = 0;
614
- const l = (h) => {
627
+ const o = (h) => {
615
628
  const c = h.clientX - s;
616
629
  if (!n && Math.abs(c) > 3 && (n = !0, typeof document < "u" && document.body.classList.add("relly-jog-scrubbing")), n) {
617
- const u = h.shiftKey ? 10 : h.altKey ? 0.1 : 1, p = this.step * u;
630
+ const m = h.shiftKey ? 10 : h.altKey ? 0.1 : 1, p = this.step * m;
618
631
  let d = r + c * p;
619
632
  this.min !== void 0 && (d = Math.max(this.min, d)), this.max !== void 0 && (d = Math.min(this.max, d));
620
- const f = (this.step.toString().split(".")[1] || "").length;
621
- d = parseFloat(d.toFixed(Math.max(f, 2)));
622
- const b = this.getValue();
623
- if (Array.isArray(b)) {
624
- const m = [b[0], b[1]];
625
- m[t === "x" ? 0 : 1] = d, this.setValue(m);
633
+ const y = (p.toString().split(".")[1] || "").length, x = 1 / p;
634
+ d = Math.round(d * x) / x, d = parseFloat(d.toFixed(Math.min(y, 4)));
635
+ const u = this.getValue();
636
+ if (Array.isArray(u)) {
637
+ const v = [u[0], u[1]];
638
+ v[t === "x" ? 0 : 1] = d, this.setValue(v);
626
639
  } else
627
- this.setValue({ ...b, [t]: d });
640
+ this.setValue({ ...u, [t]: d });
628
641
  h.preventDefault();
629
642
  }
630
- }, o = () => {
631
- n && typeof document < "u" && document.body.classList.remove("relly-jog-scrubbing"), typeof window < "u" && (window.removeEventListener("mousemove", l), window.removeEventListener("mouseup", o));
643
+ }, a = () => {
644
+ n && typeof document < "u" && document.body.classList.remove("relly-jog-scrubbing"), typeof window < "u" && (window.removeEventListener("mousemove", o), window.removeEventListener("mouseup", a));
632
645
  };
633
646
  e.addEventListener("mousedown", (h) => {
634
- s = h.clientX, r = parseFloat(e.value) || 0, n = !1, typeof window < "u" && (window.addEventListener("mousemove", l), window.addEventListener("mouseup", o));
647
+ s = h.clientX, r = parseFloat(e.value) || 0, n = !1, typeof window < "u" && (window.addEventListener("mousemove", o), window.addEventListener("mouseup", a));
635
648
  });
636
649
  }
637
650
  setMin(e) {
@@ -663,57 +676,57 @@ class P extends C {
663
676
  return Array.isArray(e) ? (t = e[0] || 0, n = e[1] || 0) : typeof e == "object" && e !== null && (t = e.x || 0, n = e.y || 0), this.xInput.value = String(t), this.yInput.value = String(n), this;
664
677
  }
665
678
  }
666
- class D extends C {
679
+ class D extends E {
667
680
  constructor(e, t, n, s, r) {
668
681
  super(e, t, n, s, r);
669
- a(this, "containerEl");
670
- a(this, "xInput");
671
- a(this, "yInput");
672
- a(this, "zInput");
673
- a(this, "min");
674
- a(this, "max");
675
- a(this, "step", 0.1);
682
+ l(this, "containerEl");
683
+ l(this, "xInput");
684
+ l(this, "yInput");
685
+ l(this, "zInput");
686
+ l(this, "min");
687
+ l(this, "max");
688
+ l(this, "step", 0.1);
676
689
  this.containerEl = document.createElement("div"), this.containerEl.className = "relly-point3d-container";
677
- const l = document.createElement("div");
678
- l.className = "relly-point3d-item";
679
- const o = document.createElement("span");
680
- o.className = "relly-point3d-tag relly-point3d-tag--x", o.textContent = "X", this.xInput = document.createElement("input"), this.xInput.type = "number", this.xInput.className = "relly-point3d-input", this.xInput.step = String(this.step), l.appendChild(o), l.appendChild(this.xInput);
690
+ const o = document.createElement("div");
691
+ o.className = "relly-point3d-item";
692
+ const a = document.createElement("span");
693
+ a.className = "relly-point3d-tag relly-point3d-tag--x", a.textContent = "X", this.xInput = document.createElement("input"), this.xInput.type = "number", this.xInput.className = "relly-point3d-input", this.xInput.step = String(this.step), o.appendChild(a), o.appendChild(this.xInput);
681
694
  const h = document.createElement("div");
682
695
  h.className = "relly-point3d-item";
683
696
  const c = document.createElement("span");
684
697
  c.className = "relly-point3d-tag relly-point3d-tag--y", c.textContent = "Y", this.yInput = document.createElement("input"), this.yInput.type = "number", this.yInput.className = "relly-point3d-input", this.yInput.step = String(this.step), h.appendChild(c), h.appendChild(this.yInput);
685
- const u = document.createElement("div");
686
- u.className = "relly-point3d-item";
698
+ const m = document.createElement("div");
699
+ m.className = "relly-point3d-item";
687
700
  const p = document.createElement("span");
688
- p.className = "relly-point3d-tag relly-point3d-tag--z", p.textContent = "Z", this.zInput = document.createElement("input"), this.zInput.type = "number", this.zInput.className = "relly-point3d-input", this.zInput.step = String(this.step), u.appendChild(p), u.appendChild(this.zInput), this.containerEl.appendChild(l), this.containerEl.appendChild(h), this.containerEl.appendChild(u), this.controlEl.appendChild(this.containerEl), this.xInput.addEventListener("change", () => this.handleInputChange()), this.yInput.addEventListener("change", () => this.handleInputChange()), this.zInput.addEventListener("change", () => this.handleInputChange()), this.setupInputScrubbing(this.xInput, "x"), this.setupInputScrubbing(this.yInput, "y"), this.setupInputScrubbing(this.zInput, "z"), this.update();
701
+ p.className = "relly-point3d-tag relly-point3d-tag--z", p.textContent = "Z", this.zInput = document.createElement("input"), this.zInput.type = "number", this.zInput.className = "relly-point3d-input", this.zInput.step = String(this.step), m.appendChild(p), m.appendChild(this.zInput), this.containerEl.appendChild(o), this.containerEl.appendChild(h), this.containerEl.appendChild(m), this.controlEl.appendChild(this.containerEl), this.xInput.addEventListener("change", () => this.handleInputChange()), this.yInput.addEventListener("change", () => this.handleInputChange()), this.zInput.addEventListener("change", () => this.handleInputChange()), this.setupInputScrubbing(this.xInput, "x"), this.setupInputScrubbing(this.yInput, "y"), this.setupInputScrubbing(this.zInput, "z"), this.update();
689
702
  }
690
703
  setupInputScrubbing(e, t) {
691
704
  let n = !1, s = 0, r = 0;
692
- const l = (h) => {
705
+ const o = (h) => {
693
706
  const c = h.clientX - s;
694
707
  if (!n && Math.abs(c) > 3 && (n = !0, typeof document < "u" && document.body.classList.add("relly-jog-scrubbing")), n) {
695
- const u = h.shiftKey ? 10 : h.altKey ? 0.1 : 1, p = this.step * u;
708
+ const m = h.shiftKey ? 10 : h.altKey ? 0.1 : 1, p = this.step * m;
696
709
  let d = r + c * p;
697
710
  this.min !== void 0 && (d = Math.max(this.min, d)), this.max !== void 0 && (d = Math.min(this.max, d));
698
- const f = (this.step.toString().split(".")[1] || "").length;
699
- d = parseFloat(d.toFixed(Math.max(f, 2)));
700
- const b = this.getValue();
701
- if (Array.isArray(b)) {
702
- const m = [
703
- b[0] ?? 0,
704
- b[1] ?? 0,
705
- b[2] ?? 0
706
- ], v = t === "x" ? 0 : t === "y" ? 1 : 2;
707
- m[v] = d, this.setValue(m);
711
+ const y = (p.toString().split(".")[1] || "").length, x = 1 / p;
712
+ d = Math.round(d * x) / x, d = parseFloat(d.toFixed(Math.min(y, 4)));
713
+ const u = this.getValue();
714
+ if (Array.isArray(u)) {
715
+ const v = [
716
+ u[0] ?? 0,
717
+ u[1] ?? 0,
718
+ u[2] ?? 0
719
+ ], w = t === "x" ? 0 : t === "y" ? 1 : 2;
720
+ v[w] = d, this.setValue(v);
708
721
  } else
709
- this.setValue({ ...b, [t]: d });
722
+ this.setValue({ ...u, [t]: d });
710
723
  h.preventDefault();
711
724
  }
712
- }, o = () => {
713
- window.removeEventListener("mousemove", l), window.removeEventListener("mouseup", o), n && (n = !1, typeof document < "u" && document.body.classList.remove("relly-jog-scrubbing"));
725
+ }, a = () => {
726
+ window.removeEventListener("mousemove", o), window.removeEventListener("mouseup", a), n && (n = !1, typeof document < "u" && document.body.classList.remove("relly-jog-scrubbing"));
714
727
  };
715
728
  e.addEventListener("mousedown", (h) => {
716
- h.button === 0 && (s = h.clientX, r = parseFloat(e.value) || 0, window.addEventListener("mousemove", l), window.addEventListener("mouseup", o));
729
+ h.button === 0 && (s = h.clientX, r = parseFloat(e.value) || 0, window.addEventListener("mousemove", o), window.addEventListener("mouseup", a));
717
730
  });
718
731
  }
719
732
  handleInputChange() {
@@ -741,22 +754,22 @@ class D extends C {
741
754
  return Array.isArray(e) ? (t = e[0] || 0, n = e[1] || 0, s = e[2] || 0) : typeof e == "object" && e !== null && (t = e.x || 0, n = e.y || 0, s = e.z || 0), this.xInput.value = String(t), this.yInput.value = String(n), this.zInput.value = String(s), this;
742
755
  }
743
756
  }
744
- class H extends C {
745
- constructor(e, t, n, s, r, l) {
757
+ class j extends E {
758
+ constructor(e, t, n, s, r, o) {
746
759
  super(e, t, n, s, r);
747
- a(this, "wrapperEl");
748
- a(this, "trackEl");
749
- a(this, "barEl");
750
- a(this, "thumbMin");
751
- a(this, "thumbMax");
752
- a(this, "inputMin");
753
- a(this, "inputMax");
754
- a(this, "min", 0);
755
- a(this, "max", 100);
756
- a(this, "step", 1);
757
- a(this, "soundEngine");
758
- a(this, "formatter", (e, t) => `[${e.toFixed(1)}, ${t.toFixed(1)}]`);
759
- this.soundEngine = l, this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-range-wrapper", this.inputMin = document.createElement("input"), this.inputMin.type = "number", this.inputMin.className = "relly-range-input relly-range-input--min", this.trackEl = document.createElement("div"), this.trackEl.className = "relly-range-track", this.barEl = document.createElement("div"), this.barEl.className = "relly-range-bar", this.thumbMin = document.createElement("div"), this.thumbMin.className = "relly-range-thumb relly-range-thumb--min", this.thumbMin.title = "Drag min", this.thumbMax = document.createElement("div"), this.thumbMax.className = "relly-range-thumb relly-range-thumb--max", this.thumbMax.title = "Drag max", this.trackEl.appendChild(this.barEl), this.trackEl.appendChild(this.thumbMin), this.trackEl.appendChild(this.thumbMax), this.inputMax = document.createElement("input"), this.inputMax.type = "number", this.inputMax.className = "relly-range-input relly-range-input--max", this.wrapperEl.appendChild(this.inputMin), this.wrapperEl.appendChild(this.trackEl), this.wrapperEl.appendChild(this.inputMax), this.controlEl.appendChild(this.wrapperEl), this.setupListeners(), this.update();
760
+ l(this, "wrapperEl");
761
+ l(this, "trackEl");
762
+ l(this, "barEl");
763
+ l(this, "thumbMin");
764
+ l(this, "thumbMax");
765
+ l(this, "inputMin");
766
+ l(this, "inputMax");
767
+ l(this, "min", 0);
768
+ l(this, "max", 100);
769
+ l(this, "step", 1);
770
+ l(this, "soundEngine");
771
+ l(this, "formatter", (e, t) => `[${e.toFixed(1)}, ${t.toFixed(1)}]`);
772
+ this.soundEngine = o, this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-range-wrapper", this.inputMin = document.createElement("input"), this.inputMin.type = "number", this.inputMin.className = "relly-range-input relly-range-input--min", this.trackEl = document.createElement("div"), this.trackEl.className = "relly-range-track", this.barEl = document.createElement("div"), this.barEl.className = "relly-range-bar", this.thumbMin = document.createElement("div"), this.thumbMin.className = "relly-range-thumb relly-range-thumb--min", this.thumbMin.title = "Drag min", this.thumbMax = document.createElement("div"), this.thumbMax.className = "relly-range-thumb relly-range-thumb--max", this.thumbMax.title = "Drag max", this.trackEl.appendChild(this.barEl), this.trackEl.appendChild(this.thumbMin), this.trackEl.appendChild(this.thumbMax), this.inputMax = document.createElement("input"), this.inputMax.type = "number", this.inputMax.className = "relly-range-input relly-range-input--max", this.wrapperEl.appendChild(this.inputMin), this.wrapperEl.appendChild(this.trackEl), this.wrapperEl.appendChild(this.inputMax), this.controlEl.appendChild(this.wrapperEl), this.setupListeners(), this.update();
760
773
  }
761
774
  setupListeners() {
762
775
  this.inputMin.addEventListener("change", () => {
@@ -769,42 +782,42 @@ class H extends C {
769
782
  }
770
783
  setupThumbDrag(e, t) {
771
784
  let n = !1;
772
- const s = (l) => {
773
- var f, b;
785
+ const s = (o) => {
786
+ var y, x;
774
787
  if (!n) return;
775
- const o = this.trackEl.getBoundingClientRect(), h = Math.max(0, Math.min(1, (l.clientX - o.left) / o.width)), c = this.min + h * (this.max - this.min), u = this.applyStep(c), [p, d] = this.getCurrentRange();
788
+ const a = this.trackEl.getBoundingClientRect(), h = Math.max(0, Math.min(1, (o.clientX - a.left) / a.width)), c = this.min + h * (this.max - this.min), m = this.applyStep(c), [p, d] = this.getCurrentRange();
776
789
  if (t === "min") {
777
- const m = Math.min(u, d);
778
- m !== p && ((f = this.soundEngine) == null || f.playTick(), this.setRangeValue(m, d));
790
+ const u = Math.min(m, d);
791
+ u !== p && ((y = this.soundEngine) == null || y.playTick(), this.setRangeValue(u, d));
779
792
  } else {
780
- const m = Math.max(u, p);
781
- m !== d && ((b = this.soundEngine) == null || b.playTick(), this.setRangeValue(p, m));
793
+ const u = Math.max(m, p);
794
+ u !== d && ((x = this.soundEngine) == null || x.playTick(), this.setRangeValue(p, u));
782
795
  }
783
796
  }, r = () => {
784
797
  n && (n = !1, window.removeEventListener("mousemove", s), window.removeEventListener("mouseup", r));
785
798
  };
786
- e.addEventListener("mousedown", (l) => {
787
- l.button === 0 && (l.preventDefault(), l.stopPropagation(), n = !0, window.addEventListener("mousemove", s), window.addEventListener("mouseup", r));
799
+ e.addEventListener("mousedown", (o) => {
800
+ o.button === 0 && (o.preventDefault(), o.stopPropagation(), n = !0, window.addEventListener("mousemove", s), window.addEventListener("mouseup", r));
788
801
  });
789
802
  }
790
803
  setupBarDrag() {
791
804
  let e = !1, t = 0, n = 0, s = 0;
792
- const r = (o) => {
805
+ const r = (a) => {
793
806
  var v;
794
807
  if (!e) return;
795
- const h = this.trackEl.getBoundingClientRect(), u = (o.clientX - t) / h.width * (this.max - this.min), p = s - n;
796
- let d = Math.max(this.min, Math.min(this.max - p, n + u));
808
+ const h = this.trackEl.getBoundingClientRect(), m = (a.clientX - t) / h.width * (this.max - this.min), p = s - n;
809
+ let d = Math.max(this.min, Math.min(this.max - p, n + m));
797
810
  d = this.applyStep(d);
798
- const f = this.applyStep(d + p), [b, m] = this.getCurrentRange();
799
- (d !== b || f !== m) && ((v = this.soundEngine) == null || v.playTick(), this.setRangeValue(d, f));
800
- }, l = () => {
801
- e && (e = !1, window.removeEventListener("mousemove", r), window.removeEventListener("mouseup", l));
811
+ const y = this.applyStep(d + p), [x, u] = this.getCurrentRange();
812
+ (d !== x || y !== u) && ((v = this.soundEngine) == null || v.playTick(), this.setRangeValue(d, y));
813
+ }, o = () => {
814
+ e && (e = !1, window.removeEventListener("mousemove", r), window.removeEventListener("mouseup", o));
802
815
  };
803
- this.barEl.addEventListener("mousedown", (o) => {
804
- if (o.button !== 0) return;
805
- o.preventDefault(), o.stopPropagation(), e = !0, t = o.clientX;
816
+ this.barEl.addEventListener("mousedown", (a) => {
817
+ if (a.button !== 0) return;
818
+ a.preventDefault(), a.stopPropagation(), e = !0, t = a.clientX;
806
819
  const [h, c] = this.getCurrentRange();
807
- n = h, s = c, window.addEventListener("mousemove", r), window.addEventListener("mouseup", l);
820
+ n = h, s = c, window.addEventListener("mousemove", r), window.addEventListener("mouseup", o);
808
821
  });
809
822
  }
810
823
  applyStep(e) {
@@ -844,15 +857,15 @@ class H extends C {
844
857
  return this.thumbMin.style.left = `${s}%`, this.thumbMax.style.left = `${r}%`, this.barEl.style.left = `${s}%`, this.barEl.style.width = `${Math.max(0, r - s)}%`, this.barEl.title = this.formatter(e, t), this.inputMin.value = String(e), this.inputMax.value = String(t), this;
845
858
  }
846
859
  }
847
- class j extends C {
848
- constructor(e, t, n, s = [], r, l, o) {
849
- super(e, t, n, r, l);
850
- a(this, "containerEl");
851
- a(this, "gliderEl");
852
- a(this, "buttons", /* @__PURE__ */ new Map());
853
- a(this, "optionsMap", /* @__PURE__ */ new Map());
854
- a(this, "soundEngine");
855
- this.soundEngine = o, this.containerEl = document.createElement("div"), this.containerEl.className = "relly-segmented-container", this.gliderEl = document.createElement("div"), this.gliderEl.className = "relly-segmented-glider", this.containerEl.appendChild(this.gliderEl), this.controlEl.appendChild(this.containerEl), this.setOptions(s);
860
+ class H extends E {
861
+ constructor(e, t, n, s = [], r, o, a) {
862
+ super(e, t, n, r, o);
863
+ l(this, "containerEl");
864
+ l(this, "gliderEl");
865
+ l(this, "buttons", /* @__PURE__ */ new Map());
866
+ l(this, "optionsMap", /* @__PURE__ */ new Map());
867
+ l(this, "soundEngine");
868
+ this.soundEngine = a, this.containerEl = document.createElement("div"), this.containerEl.className = "relly-segmented-container", this.gliderEl = document.createElement("div"), this.gliderEl.className = "relly-segmented-glider", this.containerEl.appendChild(this.gliderEl), this.controlEl.appendChild(this.containerEl), this.setOptions(s);
856
869
  }
857
870
  setOptions(e) {
858
871
  if (this.optionsMap.clear(), this.buttons.clear(), this.containerEl.innerHTML = "", this.containerEl.appendChild(this.gliderEl), Array.isArray(e))
@@ -891,16 +904,16 @@ class j extends C {
891
904
  return this;
892
905
  }
893
906
  }
894
- class F extends C {
907
+ class F extends E {
895
908
  constructor(e, t, n, s) {
896
909
  super(e, t, n, s);
897
- a(this, "wrapperEl");
898
- a(this, "ledEl");
899
- a(this, "badgeEl");
900
- a(this, "detailEl");
901
- a(this, "currentStatus", "online");
902
- a(this, "customBadge");
903
- a(this, "customDetail");
910
+ l(this, "wrapperEl");
911
+ l(this, "ledEl");
912
+ l(this, "badgeEl");
913
+ l(this, "detailEl");
914
+ l(this, "currentStatus", "online");
915
+ l(this, "customBadge");
916
+ l(this, "customDetail");
904
917
  this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-status-wrapper", this.ledEl = document.createElement("div"), this.ledEl.className = "relly-status-led relly-status-led--online", this.ledEl.innerHTML = `
905
918
  <span class="relly-status-pulse-ring"></span>
906
919
  <span class="relly-status-led-core"></span>
@@ -926,10 +939,176 @@ class F extends C {
926
939
  return this.ledEl.className = `relly-status-led relly-status-led--${t}`, this.badgeEl.className = `relly-status-badge relly-status-badge--${t}`, this.badgeEl.textContent = this.customBadge || t.toUpperCase(), this.customDetail ? (this.detailEl.textContent = this.customDetail, this.detailEl.style.display = "inline-block") : this.detailEl.style.display = "none", this;
927
940
  }
928
941
  }
942
+ class q extends E {
943
+ constructor(e, t, n, s = {}, r, o, a) {
944
+ super(e, t, n, r, o);
945
+ l(this, "wrapperEl");
946
+ l(this, "inputEl");
947
+ l(this, "trackEl");
948
+ l(this, "thumbEl");
949
+ l(this, "statusTextEl");
950
+ l(this, "onLabel");
951
+ l(this, "offLabel");
952
+ l(this, "soundEngine");
953
+ this.soundEngine = a, this.onLabel = s.onLabel, this.offLabel = s.offLabel, this.wrapperEl = document.createElement("label"), this.wrapperEl.className = "relly-switch-wrap", this.inputEl = document.createElement("input"), this.inputEl.type = "checkbox", this.inputEl.className = "relly-switch-native", this.trackEl = document.createElement("span"), this.trackEl.className = "relly-switch-track", this.thumbEl = document.createElement("span"), this.thumbEl.className = "relly-switch-thumb", this.trackEl.appendChild(this.thumbEl), this.statusTextEl = document.createElement("span"), this.statusTextEl.className = "relly-switch-text", this.wrapperEl.appendChild(this.inputEl), this.wrapperEl.appendChild(this.trackEl), this.wrapperEl.appendChild(this.statusTextEl), this.controlEl.appendChild(this.wrapperEl), this.inputEl.addEventListener("change", () => {
954
+ var c;
955
+ const h = this.inputEl.checked;
956
+ (c = this.soundEngine) == null || c.playToggle(h), this.setValue(h);
957
+ }), s.disabled && this.setDisabled(!0), s.tooltip && this.setTooltip(s.tooltip), this.update();
958
+ }
959
+ setSoundEngine(e) {
960
+ return this.soundEngine = e, this;
961
+ }
962
+ setOnLabel(e) {
963
+ return this.onLabel = e, this.update(), this;
964
+ }
965
+ setOffLabel(e) {
966
+ return this.offLabel = e, this.update(), this;
967
+ }
968
+ onToggle(e) {
969
+ return this.onChange(e);
970
+ }
971
+ setDisabled(e) {
972
+ return super.setDisabled(e), this.inputEl && (this.inputEl.disabled = e), this;
973
+ }
974
+ update() {
975
+ if (!this.inputEl || !this.trackEl) return this;
976
+ const e = !!this.getValue();
977
+ return this.inputEl.checked = e, e ? this.trackEl.classList.add("relly-switch-track--checked") : this.trackEl.classList.remove("relly-switch-track--checked"), this.onLabel || this.offLabel ? (this.statusTextEl.textContent = e ? this.onLabel || "ON" : this.offLabel || "OFF", this.statusTextEl.style.display = "inline-block") : this.statusTextEl.style.display = "none", this;
978
+ }
979
+ }
980
+ class J extends E {
981
+ constructor(e = [], t) {
982
+ super("");
983
+ l(this, "groupContainerEl");
984
+ l(this, "buttonElements", []);
985
+ l(this, "soundEngine");
986
+ this.soundEngine = t, this.element.className = "relly-row relly-button-group-row", this.element.innerHTML = "", this.groupContainerEl = document.createElement("div"), this.groupContainerEl.className = "relly-button-group", this.element.appendChild(this.groupContainerEl);
987
+ for (const n of e)
988
+ this.addButton(n);
989
+ }
990
+ addButton(e) {
991
+ const t = document.createElement("button");
992
+ return t.type = "button", t.className = "relly-btn relly-btn--group", t.textContent = e.label, e.danger && t.classList.add("relly-btn--danger"), e.primary && t.classList.add("relly-btn--primary"), e.disabled && (t.disabled = !0), e.tooltip && (t.title = e.tooltip), t.addEventListener("click", (n) => {
993
+ var s;
994
+ n.stopPropagation(), (s = this.soundEngine) == null || s.playClick(), e.onClick(t);
995
+ }), this.buttonElements.push(t), this.groupContainerEl.appendChild(t), this;
996
+ }
997
+ setSoundEngine(e) {
998
+ return this.soundEngine = e, this;
999
+ }
1000
+ setDisabled(e) {
1001
+ super.setDisabled(e);
1002
+ for (const t of this.buttonElements)
1003
+ t.disabled = e;
1004
+ return this;
1005
+ }
1006
+ update() {
1007
+ return this;
1008
+ }
1009
+ }
1010
+ class $ extends E {
1011
+ constructor(e, t, n, s = {}, r, o, a) {
1012
+ super(e, t, n, r, o);
1013
+ l(this, "wrapperEl");
1014
+ l(this, "inputEl");
1015
+ l(this, "clearBtn");
1016
+ l(this, "soundEngine");
1017
+ this.soundEngine = a, this.wrapperEl = document.createElement("div"), this.wrapperEl.className = "relly-text-wrap", this.inputEl = document.createElement("input"), this.inputEl.type = "text", this.inputEl.className = "relly-text-input", this.inputEl.spellcheck = !1, s.placeholder && (this.inputEl.placeholder = s.placeholder), s.maxLength && (this.inputEl.maxLength = s.maxLength), s.readOnly && (this.inputEl.readOnly = !0), this.wrapperEl.appendChild(this.inputEl), s.clearable && (this.clearBtn = document.createElement("button"), this.clearBtn.type = "button", this.clearBtn.className = "relly-text-clear", this.clearBtn.innerHTML = "✕", this.clearBtn.title = "Clear text", this.clearBtn.style.display = "none", this.clearBtn.addEventListener("click", (h) => {
1018
+ h.stopPropagation(), this.setValue(""), this.inputEl.focus();
1019
+ }), this.wrapperEl.appendChild(this.clearBtn)), this.controlEl.appendChild(this.wrapperEl), this.inputEl.addEventListener("input", () => {
1020
+ const h = this.inputEl.value;
1021
+ this.setValue(h), this.updateClearBtn(h);
1022
+ }), this.inputEl.addEventListener("change", () => {
1023
+ var h;
1024
+ (h = this.soundEngine) == null || h.playClick(), this.setValue(this.inputEl.value);
1025
+ }), s.disabled && this.setDisabled(!0), s.tooltip && this.setTooltip(s.tooltip), this.update();
1026
+ }
1027
+ setSoundEngine(e) {
1028
+ return this.soundEngine = e, this;
1029
+ }
1030
+ setPlaceholder(e) {
1031
+ return this.inputEl.placeholder = e, this;
1032
+ }
1033
+ setMaxLength(e) {
1034
+ return this.inputEl.maxLength = e, this;
1035
+ }
1036
+ setReadOnly(e) {
1037
+ return this.inputEl.readOnly = e, this;
1038
+ }
1039
+ setDisabled(e) {
1040
+ return super.setDisabled(e), this.inputEl && (this.inputEl.disabled = e), this;
1041
+ }
1042
+ updateClearBtn(e) {
1043
+ this.clearBtn && (this.clearBtn.style.display = e.length > 0 ? "flex" : "none");
1044
+ }
1045
+ update() {
1046
+ if (!this.inputEl) return this;
1047
+ const e = String(this.getValue() ?? "");
1048
+ return document.activeElement !== this.inputEl && (this.inputEl.value = e), this.updateClearBtn(e), this;
1049
+ }
1050
+ }
1051
+ class U extends E {
1052
+ constructor(e, t, n, s = {}, r) {
1053
+ super(e, t, n, r);
1054
+ l(this, "trackEl");
1055
+ l(this, "barEl");
1056
+ l(this, "valueEl");
1057
+ l(this, "min", 0);
1058
+ l(this, "max", 100);
1059
+ l(this, "showValue", !0);
1060
+ l(this, "formatter");
1061
+ this.min = s.min ?? 0, this.max = s.max ?? 100, this.showValue = s.showValue !== !1, this.formatter = s.format || ((a, h) => `${Math.round(h)}%`);
1062
+ const o = document.createElement("div");
1063
+ o.className = "relly-progress-wrap", this.trackEl = document.createElement("div"), this.trackEl.className = "relly-progress-track", this.barEl = document.createElement("div"), this.barEl.className = "relly-progress-bar", s.color && (this.barEl.style.backgroundColor = s.color, this.barEl.style.boxShadow = `0 0 10px ${s.color}88`), this.trackEl.appendChild(this.barEl), this.valueEl = document.createElement("span"), this.valueEl.className = "relly-progress-text", this.valueEl.style.display = this.showValue ? "inline-block" : "none", o.appendChild(this.trackEl), o.appendChild(this.valueEl), this.controlEl.appendChild(o), s.tooltip && this.setTooltip(s.tooltip), this.update();
1064
+ }
1065
+ setMin(e) {
1066
+ return this.min = e, this.update(), this;
1067
+ }
1068
+ setMax(e) {
1069
+ return this.max = e, this.update(), this;
1070
+ }
1071
+ setColor(e) {
1072
+ return this.barEl.style.backgroundColor = e, this.barEl.style.boxShadow = `0 0 10px ${e}88`, this;
1073
+ }
1074
+ setShowValue(e) {
1075
+ return this.showValue = e, this.valueEl.style.display = e ? "inline-block" : "none", this;
1076
+ }
1077
+ setFormat(e) {
1078
+ return this.formatter = e, this.update(), this;
1079
+ }
1080
+ update() {
1081
+ if (!this.barEl || !this.valueEl) return this;
1082
+ const e = Number(this.getValue()) || 0, t = Math.max(this.min, Math.min(this.max, e)), n = this.max - this.min || 1, s = Math.max(0, Math.min(100, (t - this.min) / n * 100));
1083
+ return this.barEl.style.width = `${s}%`, this.valueEl.textContent = this.formatter(e, s), this;
1084
+ }
1085
+ }
1086
+ class Y extends E {
1087
+ constructor(e, t = !1) {
1088
+ super("");
1089
+ l(this, "titleEl");
1090
+ l(this, "lineLeftEl");
1091
+ l(this, "lineRightEl");
1092
+ this.element.className = "relly-separator-row", this.element.innerHTML = "";
1093
+ const n = document.createElement("div");
1094
+ n.className = "relly-separator", t && n.classList.add("relly-separator--dashed"), this.lineLeftEl = document.createElement("span"), this.lineLeftEl.className = "relly-separator-line", n.appendChild(this.lineLeftEl), e && (n.classList.add("relly-separator--has-title"), this.titleEl = document.createElement("span"), this.titleEl.className = "relly-separator-title", this.titleEl.textContent = e, n.appendChild(this.titleEl), this.lineRightEl = document.createElement("span"), this.lineRightEl.className = "relly-separator-line", n.appendChild(this.lineRightEl)), this.element.appendChild(n);
1095
+ }
1096
+ setTitle(e) {
1097
+ if (!this.titleEl) {
1098
+ this.titleEl = document.createElement("span"), this.titleEl.className = "relly-separator-title";
1099
+ const t = this.element.querySelector(".relly-separator");
1100
+ t.classList.add("relly-separator--has-title"), t.appendChild(this.titleEl), this.lineRightEl = document.createElement("span"), this.lineRightEl.className = "relly-separator-line", t.appendChild(this.lineRightEl);
1101
+ }
1102
+ return this.titleEl.textContent = e, this;
1103
+ }
1104
+ update() {
1105
+ return this;
1106
+ }
1107
+ }
929
1108
  class T {
930
1109
  constructor(i, e, t, n) {
931
- a(this, "children", []);
932
- a(this, "accordion", !1);
1110
+ l(this, "children", []);
1111
+ l(this, "accordion", !1);
933
1112
  this.contentEl = i, this.bindingEngine = e, this.presetManager = t, this.soundEngine = n;
934
1113
  }
935
1114
  setAccordion(i) {
@@ -941,11 +1120,11 @@ class T {
941
1120
  onSectionExpanded(i) {
942
1121
  if (this.accordion)
943
1122
  for (const e of this.children)
944
- e instanceof q && e !== i && e.setCollapsed(!0);
1123
+ e instanceof G && e !== i && e.setCollapsed(!0);
945
1124
  }
946
1125
  addCheckbox(i, e) {
947
1126
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
948
- const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), l = new L(
1127
+ const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), o = new I(
949
1128
  r,
950
1129
  s.object,
951
1130
  s.property,
@@ -953,9 +1132,9 @@ class T {
953
1132
  this.presetManager,
954
1133
  this.soundEngine
955
1134
  );
956
- return s.tooltip && l.setTooltip(s.tooltip), (s.onChange || s.onToggle) && l.onChange(s.onChange || s.onToggle), s.listen && l.listen(), s.showIf && l.showIf(s.showIf), this.contentEl.appendChild(l.element), this.children.push(l), l;
1135
+ return s.tooltip && o.setTooltip(s.tooltip), (s.onChange || s.onToggle) && o.onChange(s.onChange || s.onToggle), s.listen && o.listen(), s.showIf && o.showIf(s.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
957
1136
  }
958
- const t = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", n = new L(
1137
+ const t = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", n = new I(
959
1138
  t,
960
1139
  i,
961
1140
  e,
@@ -970,7 +1149,7 @@ class T {
970
1149
  }
971
1150
  addSlider(i, e) {
972
1151
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
973
- const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), l = new V(
1152
+ const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), o = new V(
974
1153
  r,
975
1154
  s.object,
976
1155
  s.property,
@@ -978,7 +1157,7 @@ class T {
978
1157
  this.presetManager,
979
1158
  this.soundEngine
980
1159
  );
981
- return s.min !== void 0 && l.setMin(s.min), s.max !== void 0 && l.setMax(s.max), s.step !== void 0 && l.setStep(s.step), s.tooltip && l.setTooltip(s.tooltip), s.onChange && l.onChange(s.onChange), s.listen && l.listen(), s.showIf && l.showIf(s.showIf), this.contentEl.appendChild(l.element), this.children.push(l), l;
1160
+ return s.min !== void 0 && o.setMin(s.min), s.max !== void 0 && o.setMax(s.max), s.step !== void 0 && o.setStep(s.step), s.tooltip && o.setTooltip(s.tooltip), s.onChange && o.onChange(s.onChange), s.listen && o.listen(), s.showIf && o.showIf(s.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
982
1161
  }
983
1162
  const t = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", n = new V(
984
1163
  t,
@@ -1006,8 +1185,8 @@ class T {
1006
1185
  }
1007
1186
  addSelect(i, e, t) {
1008
1187
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1009
- const r = i, l = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), o = new z(l, r.object, r.property, r.options, this.bindingEngine, this.presetManager);
1010
- return r.tooltip && o.setTooltip(r.tooltip), r.onChange && o.onChange(r.onChange), r.listen && o.listen(), r.showIf && o.showIf(r.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1188
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new z(o, r.object, r.property, r.options, this.bindingEngine, this.presetManager);
1189
+ return r.tooltip && a.setTooltip(r.tooltip), r.onChange && a.onChange(r.onChange), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1011
1190
  }
1012
1191
  const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new z(
1013
1192
  n,
@@ -1024,8 +1203,8 @@ class T {
1024
1203
  }
1025
1204
  addDynamicLabel(i, e) {
1026
1205
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1027
- const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), l = new B(r, s.object, s.property, this.bindingEngine);
1028
- return s.format && l.setFormat(s.format), s.tooltip && l.setTooltip(s.tooltip), s.showIf && l.showIf(s.showIf), this.contentEl.appendChild(l.element), this.children.push(l), l;
1206
+ const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), o = new B(r, s.object, s.property, this.bindingEngine);
1207
+ return s.format && o.setFormat(s.format), s.tooltip && o.setTooltip(s.tooltip), s.showIf && o.showIf(s.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1029
1208
  }
1030
1209
  const t = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", n = new B(t, i, e, this.bindingEngine);
1031
1210
  return this.contentEl.appendChild(n.element), this.children.push(n), n;
@@ -1035,8 +1214,8 @@ class T {
1035
1214
  }
1036
1215
  addGraph(i, e) {
1037
1216
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1038
- const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), l = new N(r, s.object, s.property, this.bindingEngine, this.soundEngine);
1039
- return s.range && l.setRange(s.range[0], s.range[1]), s.color && l.setColor(s.color, s.fillColor), s.bufferSize && l.setBufferSize(s.bufferSize), s.smooth !== void 0 && l.setSmooth(s.smooth), s.height && l.setHeight(s.height), s.format && l.setFormat(s.format), s.tooltip && l.setTooltip(s.tooltip), s.showIf && l.showIf(s.showIf), this.contentEl.appendChild(l.element), this.children.push(l), l;
1217
+ const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), o = new N(r, s.object, s.property, this.bindingEngine, this.soundEngine);
1218
+ return s.range && o.setRange(s.range[0], s.range[1]), s.color && o.setColor(s.color, s.fillColor), s.bufferSize && o.setBufferSize(s.bufferSize), s.smooth !== void 0 && o.setSmooth(s.smooth), s.height && o.setHeight(s.height), s.format && o.setFormat(s.format), s.tooltip && o.setTooltip(s.tooltip), s.showIf && o.showIf(s.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1040
1219
  }
1041
1220
  const t = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", n = new N(t, i, e, this.bindingEngine, this.soundEngine);
1042
1221
  return this.contentEl.appendChild(n.element), this.children.push(n), n;
@@ -1051,10 +1230,10 @@ class T {
1051
1230
  t++, h >= n + 1e3 && (e.fps = Math.round(t * 1e3 / (h - n)), t = 0, n = h), s = requestAnimationFrame(r);
1052
1231
  };
1053
1232
  typeof requestAnimationFrame < "u" && (s = requestAnimationFrame(r));
1054
- const l = this.addGraph(e, "fps").setLabel(i).setRange(0, 120).setColor("#22c55e", "rgba(34, 197, 94, 0.25)").setFormat((h) => `${Math.round(h)} FPS`), o = l.destroy.bind(l);
1055
- return l.destroy = () => {
1056
- typeof cancelAnimationFrame < "u" && s && cancelAnimationFrame(s), o();
1057
- }, l;
1233
+ const o = this.addGraph(e, "fps").setLabel(i).setRange(0, 120).setColor("#22c55e", "rgba(34, 197, 94, 0.25)").setFormat((h) => `${Math.round(h)} FPS`), a = o.destroy.bind(o);
1234
+ return o.destroy = () => {
1235
+ typeof cancelAnimationFrame < "u" && s && cancelAnimationFrame(s), a();
1236
+ }, o;
1058
1237
  }
1059
1238
  createFPSGraph(i = "FPS") {
1060
1239
  return this.addFPSGraph(i);
@@ -1064,13 +1243,13 @@ class T {
1064
1243
  let t;
1065
1244
  const n = () => {
1066
1245
  if (typeof performance < "u" && performance.memory) {
1067
- const l = performance.memory.usedJSHeapSize / 1048576;
1068
- e.mem = Number(l.toFixed(1));
1246
+ const o = performance.memory.usedJSHeapSize / 1048576;
1247
+ e.mem = Number(o.toFixed(1));
1069
1248
  } else
1070
1249
  e.mem = Number((Math.sin(Date.now() / 2500) * 8 + 48).toFixed(1));
1071
1250
  };
1072
1251
  n(), typeof setInterval < "u" && (t = setInterval(n, 1e3));
1073
- const s = this.addGraph(e, "mem").setLabel(i).setAutoRange(!0).setColor("#a855f7", "rgba(168, 85, 247, 0.25)").setFormat((l) => `${l.toFixed(1)} MB`), r = s.destroy.bind(s);
1252
+ const s = this.addGraph(e, "mem").setLabel(i).setAutoRange(!0).setColor("#a855f7", "rgba(168, 85, 247, 0.25)").setFormat((o) => `${o.toFixed(1)} MB`), r = s.destroy.bind(s);
1074
1253
  return s.destroy = () => {
1075
1254
  t && clearInterval(t), r();
1076
1255
  }, s;
@@ -1080,7 +1259,7 @@ class T {
1080
1259
  }
1081
1260
  addColor(i, e) {
1082
1261
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1083
- const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), l = new R(
1262
+ const s = i, r = s.label || s.property.charAt(0).toUpperCase() + s.property.slice(1), o = new R(
1084
1263
  r,
1085
1264
  s.object,
1086
1265
  s.property,
@@ -1088,7 +1267,7 @@ class T {
1088
1267
  this.presetManager,
1089
1268
  this.soundEngine
1090
1269
  );
1091
- return s.tooltip && l.setTooltip(s.tooltip), s.swatches && l.setSwatches(s.swatches), s.onChange && l.onChange(s.onChange), s.listen && l.listen(), s.showIf && l.showIf(s.showIf), this.contentEl.appendChild(l.element), this.children.push(l), l;
1270
+ return s.tooltip && o.setTooltip(s.tooltip), s.swatches && o.setSwatches(s.swatches), s.onChange && o.onChange(s.onChange), s.listen && o.listen(), s.showIf && o.showIf(s.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1092
1271
  }
1093
1272
  const t = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", n = new R(
1094
1273
  t,
@@ -1105,8 +1284,8 @@ class T {
1105
1284
  }
1106
1285
  addPoint2D(i, e, t) {
1107
1286
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1108
- const r = i, l = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), o = new P(l, r.object, r.property, this.bindingEngine, this.presetManager);
1109
- return r.min !== void 0 && o.setMin(r.min), r.max !== void 0 && o.setMax(r.max), r.step !== void 0 && o.setStep(r.step), r.tooltip && o.setTooltip(r.tooltip), r.onChange && o.onChange(r.onChange), r.listen && o.listen(), r.showIf && o.showIf(r.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1287
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new P(o, r.object, r.property, this.bindingEngine, this.presetManager);
1288
+ return r.min !== void 0 && a.setMin(r.min), r.max !== void 0 && a.setMax(r.max), r.step !== void 0 && a.setStep(r.step), r.tooltip && a.setTooltip(r.tooltip), r.onChange && a.onChange(r.onChange), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1110
1289
  }
1111
1290
  const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new P(n, i, e, this.bindingEngine, this.presetManager);
1112
1291
  return (t == null ? void 0 : t.min) !== void 0 && s.setMin(t.min), (t == null ? void 0 : t.max) !== void 0 && s.setMax(t.max), (t == null ? void 0 : t.step) !== void 0 && s.setStep(t.step), this.contentEl.appendChild(s.element), this.children.push(s), s;
@@ -1116,8 +1295,8 @@ class T {
1116
1295
  }
1117
1296
  addPoint3D(i, e, t) {
1118
1297
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1119
- const r = i, l = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), o = new D(l, r.object, r.property, this.bindingEngine, this.presetManager);
1120
- return r.min !== void 0 && o.setMin(r.min), r.max !== void 0 && o.setMax(r.max), r.step !== void 0 && o.setStep(r.step), r.tooltip && o.setTooltip(r.tooltip), r.contextMenu && o.setContextMenu(r.contextMenu), r.onChange && o.onChange(r.onChange), r.listen && o.listen(), r.showIf && o.showIf(r.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1298
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new D(o, r.object, r.property, this.bindingEngine, this.presetManager);
1299
+ return r.min !== void 0 && a.setMin(r.min), r.max !== void 0 && a.setMax(r.max), r.step !== void 0 && a.setStep(r.step), r.tooltip && a.setTooltip(r.tooltip), r.contextMenu && a.setContextMenu(r.contextMenu), r.onChange && a.onChange(r.onChange), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1121
1300
  }
1122
1301
  const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new D(n, i, e, this.bindingEngine, this.presetManager);
1123
1302
  return (t == null ? void 0 : t.min) !== void 0 && s.setMin(t.min), (t == null ? void 0 : t.max) !== void 0 && s.setMax(t.max), (t == null ? void 0 : t.step) !== void 0 && s.setStep(t.step), this.contentEl.appendChild(s.element), this.children.push(s), s;
@@ -1133,17 +1312,17 @@ class T {
1133
1312
  }
1134
1313
  addRange(i, e, t) {
1135
1314
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1136
- const r = i, l = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), o = new H(
1137
- l,
1315
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new j(
1316
+ o,
1138
1317
  r.object,
1139
1318
  r.property,
1140
1319
  this.bindingEngine,
1141
1320
  this.presetManager,
1142
1321
  this.soundEngine
1143
1322
  );
1144
- return r.min !== void 0 && o.setMin(r.min), r.max !== void 0 && o.setMax(r.max), r.step !== void 0 && o.setStep(r.step), r.tooltip && o.setTooltip(r.tooltip), r.contextMenu && o.setContextMenu(r.contextMenu), r.onChange && o.onChange(r.onChange), r.listen && o.listen(), r.showIf && o.showIf(r.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1323
+ return r.min !== void 0 && a.setMin(r.min), r.max !== void 0 && a.setMax(r.max), r.step !== void 0 && a.setStep(r.step), r.tooltip && a.setTooltip(r.tooltip), r.contextMenu && a.setContextMenu(r.contextMenu), r.onChange && a.onChange(r.onChange), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1145
1324
  }
1146
- const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new H(
1325
+ const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new j(
1147
1326
  n,
1148
1327
  i,
1149
1328
  e,
@@ -1158,8 +1337,8 @@ class T {
1158
1337
  }
1159
1338
  addSegmented(i, e, t) {
1160
1339
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1161
- const r = i, l = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), o = new j(
1162
- l,
1340
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new H(
1341
+ o,
1163
1342
  r.object,
1164
1343
  r.property,
1165
1344
  r.options || [],
@@ -1167,9 +1346,9 @@ class T {
1167
1346
  this.presetManager,
1168
1347
  this.soundEngine
1169
1348
  );
1170
- return r.tooltip && o.setTooltip(r.tooltip), r.contextMenu && o.setContextMenu(r.contextMenu), r.onChange && o.onChange(r.onChange), r.listen && o.listen(), r.showIf && o.showIf(r.showIf), this.contentEl.appendChild(o.element), this.children.push(o), o;
1349
+ return r.tooltip && a.setTooltip(r.tooltip), r.contextMenu && a.setContextMenu(r.contextMenu), r.onChange && a.onChange(r.onChange), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1171
1350
  }
1172
- const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new j(
1351
+ const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new H(
1173
1352
  n,
1174
1353
  i,
1175
1354
  e,
@@ -1185,18 +1364,18 @@ class T {
1185
1364
  }
1186
1365
  addStatus(i, e, t = "online", n, s) {
1187
1366
  if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1188
- const c = i, u = c.label || c.property.charAt(0).toUpperCase() + c.property.slice(1), p = new F(
1189
- u,
1367
+ const c = i, m = c.label || c.property.charAt(0).toUpperCase() + c.property.slice(1), p = new F(
1368
+ m,
1190
1369
  c.object,
1191
1370
  c.property,
1192
1371
  this.bindingEngine
1193
1372
  );
1194
1373
  return c.status && p.setStatus(c.status, c.badge, c.detail), c.badge && p.setBadge(c.badge), c.detail && p.setDetail(c.detail), c.tooltip && p.setTooltip(c.tooltip), c.contextMenu && p.setContextMenu(c.contextMenu), c.listen && p.listen(), c.showIf && p.showIf(c.showIf), this.contentEl.appendChild(p.element), this.children.push(p), p;
1195
1374
  }
1196
- const r = e ? e.charAt(0).toUpperCase() + e.slice(1) : typeof i == "string" ? i : "Status", l = typeof i == "string" ? void 0 : i, o = typeof i == "string" ? void 0 : e, h = new F(
1375
+ const r = e ? e.charAt(0).toUpperCase() + e.slice(1) : typeof i == "string" ? i : "Status", o = typeof i == "string" ? void 0 : i, a = typeof i == "string" ? void 0 : e, h = new F(
1197
1376
  r,
1198
- l,
1199
1377
  o,
1378
+ a,
1200
1379
  this.bindingEngine
1201
1380
  );
1202
1381
  return h.setStatus(t, n, s), this.contentEl.appendChild(h.element), this.children.push(h), h;
@@ -1204,8 +1383,107 @@ class T {
1204
1383
  createStatus(i, e, t = "online", n, s) {
1205
1384
  return this.addStatus(i, e, t, n, s);
1206
1385
  }
1386
+ addSwitch(i, e, t) {
1387
+ if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1388
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new q(
1389
+ o,
1390
+ r.object,
1391
+ r.property,
1392
+ r,
1393
+ this.bindingEngine,
1394
+ this.presetManager,
1395
+ this.soundEngine
1396
+ );
1397
+ return r.tooltip && a.setTooltip(r.tooltip), r.contextMenu && a.setContextMenu(r.contextMenu), r.onToggle && a.onToggle(r.onToggle), r.onChange && a.onChange(r.onChange), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1398
+ }
1399
+ const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new q(
1400
+ n,
1401
+ i,
1402
+ e,
1403
+ t || {},
1404
+ this.bindingEngine,
1405
+ this.presetManager,
1406
+ this.soundEngine
1407
+ );
1408
+ return this.contentEl.appendChild(s.element), this.children.push(s), s;
1409
+ }
1410
+ createSwitch(i, e, t) {
1411
+ return this.addSwitch(i, e, t);
1412
+ }
1413
+ addButtonGroup(i) {
1414
+ const e = new J(i, this.soundEngine);
1415
+ return this.contentEl.appendChild(e.element), this.children.push(e), e;
1416
+ }
1417
+ createButtonGroup(i) {
1418
+ return this.addButtonGroup(i);
1419
+ }
1420
+ addText(i, e, t) {
1421
+ if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1422
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new $(
1423
+ o,
1424
+ r.object,
1425
+ r.property,
1426
+ r,
1427
+ this.bindingEngine,
1428
+ this.presetManager,
1429
+ this.soundEngine
1430
+ );
1431
+ return r.tooltip && a.setTooltip(r.tooltip), r.contextMenu && a.setContextMenu(r.contextMenu), r.onChange && a.onChange(r.onChange), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1432
+ }
1433
+ const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new $(
1434
+ n,
1435
+ i,
1436
+ e,
1437
+ t || {},
1438
+ this.bindingEngine,
1439
+ this.presetManager,
1440
+ this.soundEngine
1441
+ );
1442
+ return this.contentEl.appendChild(s.element), this.children.push(s), s;
1443
+ }
1444
+ createText(i, e, t) {
1445
+ return this.addText(i, e, t);
1446
+ }
1447
+ addInput(i, e, t) {
1448
+ return this.addText(i, e, t);
1449
+ }
1450
+ createInput(i, e, t) {
1451
+ return this.addText(i, e, t);
1452
+ }
1453
+ addProgress(i, e, t) {
1454
+ if (typeof i == "object" && i !== null && e === void 0 && "object" in i && "property" in i) {
1455
+ const r = i, o = r.label || r.property.charAt(0).toUpperCase() + r.property.slice(1), a = new U(
1456
+ o,
1457
+ r.object,
1458
+ r.property,
1459
+ r,
1460
+ this.bindingEngine
1461
+ );
1462
+ return r.tooltip && a.setTooltip(r.tooltip), r.listen && a.listen(), r.showIf && a.showIf(r.showIf), this.contentEl.appendChild(a.element), this.children.push(a), a;
1463
+ }
1464
+ const n = e ? e.charAt(0).toUpperCase() + e.slice(1) : "", s = new U(
1465
+ n,
1466
+ i,
1467
+ e,
1468
+ t || {},
1469
+ this.bindingEngine
1470
+ );
1471
+ return this.contentEl.appendChild(s.element), this.children.push(s), s;
1472
+ }
1473
+ createProgress(i, e, t) {
1474
+ return this.addProgress(i, e, t);
1475
+ }
1476
+ addSeparator(i, e = !1) {
1477
+ let t, n = e;
1478
+ typeof i == "object" && i !== null ? (t = i.title, i.dashed !== void 0 && (n = i.dashed)) : t = i;
1479
+ const s = new Y(t, n);
1480
+ return this.contentEl.appendChild(s.element), this.children.push(s), s;
1481
+ }
1482
+ createSeparator(i, e = !1) {
1483
+ return this.addSeparator(i, e);
1484
+ }
1207
1485
  addRow() {
1208
- const i = new K(this.bindingEngine, this.presetManager, this.soundEngine);
1486
+ const i = new _(this.bindingEngine, this.presetManager, this.soundEngine);
1209
1487
  return this.contentEl.appendChild(i.element), this.children.push(i), i;
1210
1488
  }
1211
1489
  createRow() {
@@ -1214,7 +1492,7 @@ class T {
1214
1492
  addSection(i = "Section", e = !1) {
1215
1493
  let t = "", n = e;
1216
1494
  typeof i == "object" && i !== null ? (t = i.label || i.title || "Section", i.collapsed !== void 0 && (n = i.collapsed)) : t = i || "Section";
1217
- const s = new q(t, this.bindingEngine, this.presetManager, n, this.soundEngine);
1495
+ const s = new G(t, this.bindingEngine, this.presetManager, n, this.soundEngine);
1218
1496
  return s.setParentContainer(this), this.contentEl.appendChild(s.element), this.children.push(s), s;
1219
1497
  }
1220
1498
  addFolder(i = "Folder", e = !1) {
@@ -1283,6 +1561,44 @@ class T {
1283
1561
  e = this.addStatus(i.object, i.property, i.status, i.badge, i.detail);
1284
1562
  break;
1285
1563
  }
1564
+ case "switch": {
1565
+ e = this.addSwitch(i.object, i.property, {
1566
+ onLabel: i.onLabel,
1567
+ offLabel: i.offLabel,
1568
+ disabled: i.disabled,
1569
+ tooltip: i.tooltip
1570
+ });
1571
+ break;
1572
+ }
1573
+ case "buttonGroup": {
1574
+ e = this.addButtonGroup(i.buttons || []);
1575
+ break;
1576
+ }
1577
+ case "text": {
1578
+ e = this.addText(i.object, i.property, {
1579
+ placeholder: i.placeholder,
1580
+ maxLength: i.maxLength,
1581
+ readOnly: i.readOnly,
1582
+ clearable: i.clearable,
1583
+ disabled: i.disabled,
1584
+ tooltip: i.tooltip
1585
+ });
1586
+ break;
1587
+ }
1588
+ case "progress": {
1589
+ e = this.addProgress(i.object, i.property, {
1590
+ min: i.min,
1591
+ max: i.max,
1592
+ color: i.color,
1593
+ showValue: i.showValue,
1594
+ tooltip: i.tooltip
1595
+ });
1596
+ break;
1597
+ }
1598
+ case "separator": {
1599
+ e = this.addSeparator(i.title || i.label);
1600
+ break;
1601
+ }
1286
1602
  case "section":
1287
1603
  case "folder": {
1288
1604
  e = this.addSection(t, i.collapsed || !1);
@@ -1299,13 +1615,13 @@ class T {
1299
1615
  this.children = [];
1300
1616
  }
1301
1617
  }
1302
- class K extends T {
1618
+ class _ extends T {
1303
1619
  constructor(e, t, n) {
1304
1620
  const s = document.createElement("div");
1305
1621
  s.className = "relly-multi-row";
1306
1622
  super(s, e, t, n);
1307
- a(this, "element");
1308
- a(this, "disabled", !1);
1623
+ l(this, "element");
1624
+ l(this, "disabled", !1);
1309
1625
  this.element = s;
1310
1626
  }
1311
1627
  setDisabled(e) {
@@ -1318,26 +1634,26 @@ class K extends T {
1318
1634
  this.destroyChildren(), this.element.remove();
1319
1635
  }
1320
1636
  }
1321
- class q extends T {
1637
+ class G extends T {
1322
1638
  constructor(e, t, n, s = !1, r) {
1323
- const l = document.createElement("div");
1324
- l.className = "relly-section-content";
1325
- super(l, t, n, r);
1326
- a(this, "element");
1327
- a(this, "headerEl");
1328
- a(this, "titleEl");
1329
- a(this, "arrowEl");
1330
- a(this, "isCollapsed", !1);
1331
- a(this, "conditionPredicate");
1332
- a(this, "parentContainer");
1333
- a(this, "disabled", !1);
1334
- this.label = e, this.element = document.createElement("div"), this.element.className = "relly-section", this.headerEl = document.createElement("div"), this.headerEl.className = "relly-section-header";
1335
1639
  const o = document.createElement("div");
1336
- o.className = "relly-section-title-wrap", this.arrowEl = document.createElement("span"), this.arrowEl.innerHTML = `
1640
+ o.className = "relly-section-content";
1641
+ super(o, t, n, r);
1642
+ l(this, "element");
1643
+ l(this, "headerEl");
1644
+ l(this, "titleEl");
1645
+ l(this, "arrowEl");
1646
+ l(this, "isCollapsed", !1);
1647
+ l(this, "conditionPredicate");
1648
+ l(this, "parentContainer");
1649
+ l(this, "disabled", !1);
1650
+ this.label = e, this.element = document.createElement("div"), this.element.className = "relly-section", this.headerEl = document.createElement("div"), this.headerEl.className = "relly-section-header";
1651
+ const a = document.createElement("div");
1652
+ a.className = "relly-section-title-wrap", this.arrowEl = document.createElement("span"), this.arrowEl.innerHTML = `
1337
1653
  <svg class="relly-section-arrow" viewBox="0 0 10 10">
1338
1654
  <polygon points="2,1 8,5 2,9"></polygon>
1339
1655
  </svg>
1340
- `, this.titleEl = document.createElement("span"), this.titleEl.textContent = e, o.appendChild(this.arrowEl), o.appendChild(this.titleEl), this.headerEl.appendChild(o), this.element.appendChild(this.headerEl), this.element.appendChild(this.contentEl), this.headerEl.addEventListener("click", () => {
1656
+ `, this.titleEl = document.createElement("span"), this.titleEl.textContent = e, a.appendChild(this.arrowEl), a.appendChild(this.titleEl), this.headerEl.appendChild(a), this.element.appendChild(this.headerEl), this.element.appendChild(this.contentEl), this.headerEl.addEventListener("click", () => {
1341
1657
  var h;
1342
1658
  this.disabled || ((h = this.soundEngine) == null || h.playClick(), this.toggle());
1343
1659
  }), s && this.setCollapsed(!0);
@@ -1378,12 +1694,12 @@ class q extends T {
1378
1694
  this.conditionPredicate && this.bindingEngine.unregister(this), this.destroyChildren(), this.element.remove();
1379
1695
  }
1380
1696
  }
1381
- class G {
1697
+ class Q {
1382
1698
  constructor() {
1383
- a(this, "listeners", /* @__PURE__ */ new Set());
1384
- a(this, "rafId", null);
1385
- a(this, "isRunning", !1);
1386
- a(this, "isPaused", !1);
1699
+ l(this, "listeners", /* @__PURE__ */ new Set());
1700
+ l(this, "rafId", null);
1701
+ l(this, "isRunning", !1);
1702
+ l(this, "isPaused", !1);
1387
1703
  }
1388
1704
  register(i) {
1389
1705
  this.listeners.add(i), !this.isRunning && !this.isPaused && this.start();
@@ -1416,11 +1732,11 @@ class G {
1416
1732
  this.stop(), this.listeners.clear();
1417
1733
  }
1418
1734
  }
1419
- class W {
1735
+ class Z {
1420
1736
  constructor() {
1421
- a(this, "components", /* @__PURE__ */ new Set());
1422
- a(this, "pendingValues", {});
1423
- a(this, "changeCallback");
1737
+ l(this, "components", /* @__PURE__ */ new Set());
1738
+ l(this, "pendingValues", {});
1739
+ l(this, "changeCallback");
1424
1740
  }
1425
1741
  setOnChange(i) {
1426
1742
  this.changeCallback = i;
@@ -1483,7 +1799,7 @@ class W {
1483
1799
  this.components.clear(), this.pendingValues = {};
1484
1800
  }
1485
1801
  }
1486
- const U = {
1802
+ const K = {
1487
1803
  bg: "#1c1d22",
1488
1804
  fg: "#d1d5db",
1489
1805
  headerBg: "#141518",
@@ -1497,7 +1813,7 @@ const U = {
1497
1813
  font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
1498
1814
  fontSize: "11px",
1499
1815
  rowHeight: "26px"
1500
- }, X = {
1816
+ }, O = {
1501
1817
  bg: "#ffffff",
1502
1818
  fg: "#374151",
1503
1819
  headerBg: "#f3f4f6",
@@ -1511,7 +1827,7 @@ const U = {
1511
1827
  font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
1512
1828
  fontSize: "11px",
1513
1829
  rowHeight: "26px"
1514
- }, J = {
1830
+ }, ee = {
1515
1831
  bg: "#0f051d",
1516
1832
  fg: "#e0f2fe",
1517
1833
  headerBg: "#180a33",
@@ -1525,7 +1841,7 @@ const U = {
1525
1841
  font: '"JetBrains Mono", Consolas, monospace',
1526
1842
  fontSize: "11px",
1527
1843
  rowHeight: "26px"
1528
- }, Y = {
1844
+ }, te = {
1529
1845
  bg: "#2e3440",
1530
1846
  fg: "#d8dee9",
1531
1847
  headerBg: "#242933",
@@ -1539,7 +1855,7 @@ const U = {
1539
1855
  font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
1540
1856
  fontSize: "11px",
1541
1857
  rowHeight: "26px"
1542
- }, _ = {
1858
+ }, ie = {
1543
1859
  bg: "#282a36",
1544
1860
  fg: "#f8f8f2",
1545
1861
  headerBg: "#1e1f29",
@@ -1553,7 +1869,7 @@ const U = {
1553
1869
  font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
1554
1870
  fontSize: "11px",
1555
1871
  rowHeight: "26px"
1556
- }, Q = {
1872
+ }, ne = {
1557
1873
  bg: "#1a1b26",
1558
1874
  fg: "#a9b1d6",
1559
1875
  headerBg: "#16161e",
@@ -1567,7 +1883,7 @@ const U = {
1567
1883
  font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
1568
1884
  fontSize: "11px",
1569
1885
  rowHeight: "26px"
1570
- }, Z = {
1886
+ }, se = {
1571
1887
  bg: "#0a0f0d",
1572
1888
  fg: "#00ff66",
1573
1889
  headerBg: "#050a08",
@@ -1581,7 +1897,7 @@ const U = {
1581
1897
  font: '"JetBrains Mono", Consolas, monospace',
1582
1898
  fontSize: "11px",
1583
1899
  rowHeight: "26px"
1584
- }, O = {
1900
+ }, re = {
1585
1901
  bg: "#241b2f",
1586
1902
  fg: "#f8f8f2",
1587
1903
  headerBg: "#191322",
@@ -1596,14 +1912,14 @@ const U = {
1596
1912
  fontSize: "11px",
1597
1913
  rowHeight: "26px"
1598
1914
  };
1599
- class ee {
1915
+ class le {
1600
1916
  constructor(i, e) {
1601
- a(this, "currentTheme");
1602
- a(this, "currentThemeName");
1603
- this.panelElement = i, this.currentTheme = { ...U }, this.currentThemeName = "dark", e ? this.applyTheme(e) : this.applyToDOM(this.currentTheme);
1917
+ l(this, "currentTheme");
1918
+ l(this, "currentThemeName");
1919
+ this.panelElement = i, this.currentTheme = { ...K }, this.currentThemeName = "dark", e ? this.applyTheme(e) : this.applyToDOM(this.currentTheme);
1604
1920
  }
1605
1921
  applyTheme(i) {
1606
- typeof i == "string" && (this.currentThemeName = i), i === "light" ? this.currentTheme = { ...X } : i === "dark" ? this.currentTheme = { ...U } : i === "cyberpunk" ? this.currentTheme = { ...J } : i === "nord" ? this.currentTheme = { ...Y } : i === "dracula" ? this.currentTheme = { ..._ } : i === "tokyo-night" ? this.currentTheme = { ...Q } : i === "matrix" ? this.currentTheme = { ...Z } : i === "synthwave" ? this.currentTheme = { ...O } : typeof i == "object" && (this.currentTheme = { ...this.currentTheme, ...i }, this.currentThemeName = "custom"), this.applyToDOM(this.currentTheme);
1922
+ typeof i == "string" && (this.currentThemeName = i), i === "light" ? this.currentTheme = { ...O } : i === "dark" ? this.currentTheme = { ...K } : i === "cyberpunk" ? this.currentTheme = { ...ee } : i === "nord" ? this.currentTheme = { ...te } : i === "dracula" ? this.currentTheme = { ...ie } : i === "tokyo-night" ? this.currentTheme = { ...ne } : i === "matrix" ? this.currentTheme = { ...se } : i === "synthwave" ? this.currentTheme = { ...re } : typeof i == "object" && (this.currentTheme = { ...this.currentTheme, ...i }, this.currentThemeName = "custom"), this.applyToDOM(this.currentTheme);
1607
1923
  }
1608
1924
  getCurrentThemeName() {
1609
1925
  return this.currentThemeName;
@@ -1616,27 +1932,27 @@ class ee {
1616
1932
  return { ...this.currentTheme };
1617
1933
  }
1618
1934
  }
1619
- class te {
1935
+ class ae {
1620
1936
  constructor(i, e, t) {
1621
- a(this, "isDragging", !1);
1622
- a(this, "startX", 0);
1623
- a(this, "startY", 0);
1624
- a(this, "initialLeft", 0);
1625
- a(this, "initialTop", 0);
1626
- a(this, "wasSnapped", !1);
1627
- a(this, "snapThreshold", 18);
1628
- a(this, "magneticSnap", !0);
1629
- a(this, "onMouseDownBound");
1630
- a(this, "onMouseMoveBound");
1631
- a(this, "onMouseUpBound");
1632
- a(this, "onResizeBound");
1937
+ l(this, "isDragging", !1);
1938
+ l(this, "startX", 0);
1939
+ l(this, "startY", 0);
1940
+ l(this, "initialLeft", 0);
1941
+ l(this, "initialTop", 0);
1942
+ l(this, "wasSnapped", !1);
1943
+ l(this, "snapThreshold", 18);
1944
+ l(this, "magneticSnap", !0);
1945
+ l(this, "onMouseDownBound");
1946
+ l(this, "onMouseMoveBound");
1947
+ l(this, "onMouseUpBound");
1948
+ l(this, "onResizeBound");
1633
1949
  this.handle = i, this.panel = e, this.soundEngine = t, this.onMouseDownBound = this.onMouseDown.bind(this), this.onMouseMoveBound = this.onMouseMove.bind(this), this.onMouseUpBound = this.onMouseUp.bind(this), this.onResizeBound = this.onResize.bind(this), this.handle.addEventListener("mousedown", this.onMouseDownBound), typeof window < "u" && window.addEventListener("resize", this.onResizeBound);
1634
1950
  }
1635
1951
  clampToViewport() {
1636
1952
  if (typeof window > "u") return;
1637
1953
  const i = this.panel.getBoundingClientRect(), e = i.width, t = i.height, n = Math.max(0, window.innerWidth - e), s = Math.max(0, window.innerHeight - t);
1638
- let r = i.left, l = i.top;
1639
- r > n && (r = n), r < 0 && (r = 0), l > s && (l = s), l < 0 && (l = 0), this.panel.style.left = `${Math.round(r)}px`, this.panel.style.top = `${Math.round(l)}px`, this.panel.style.right = "auto", this.panel.style.bottom = "auto";
1954
+ let r = i.left, o = i.top;
1955
+ r > n && (r = n), r < 0 && (r = 0), o > s && (o = s), o < 0 && (o = 0), this.panel.style.left = `${Math.round(r)}px`, this.panel.style.top = `${Math.round(o)}px`, this.panel.style.right = "auto", this.panel.style.bottom = "auto";
1640
1956
  }
1641
1957
  onResize() {
1642
1958
  this.clampToViewport();
@@ -1652,9 +1968,9 @@ class te {
1652
1968
  if (!this.isDragging) return;
1653
1969
  const e = i.clientX - this.startX, t = i.clientY - this.startY;
1654
1970
  let n = this.initialLeft + e, s = this.initialTop + t;
1655
- const r = this.panel.getBoundingClientRect(), l = r.width, o = r.height, h = Math.max(0, window.innerWidth - l), c = Math.max(0, window.innerHeight - o);
1656
- let u = !1;
1657
- this.magneticSnap && (Math.abs(n) < this.snapThreshold ? (n = 0, u = !0) : Math.abs(n - h) < this.snapThreshold && (n = h, u = !0), Math.abs(s) < this.snapThreshold ? (s = 0, u = !0) : Math.abs(s - c) < this.snapThreshold && (s = c, u = !0), u && !this.wasSnapped && ((p = this.soundEngine) == null || p.playSnap()), this.wasSnapped = u), n = Math.max(0, Math.min(n, h)), s = Math.max(0, Math.min(s, c)), this.panel.style.left = `${n}px`, this.panel.style.top = `${s}px`;
1971
+ const r = this.panel.getBoundingClientRect(), o = r.width, a = r.height, h = Math.max(0, window.innerWidth - o), c = Math.max(0, window.innerHeight - a);
1972
+ let m = !1;
1973
+ this.magneticSnap && (Math.abs(n) < this.snapThreshold ? (n = 0, m = !0) : Math.abs(n - h) < this.snapThreshold && (n = h, m = !0), Math.abs(s) < this.snapThreshold ? (s = 0, m = !0) : Math.abs(s - c) < this.snapThreshold && (s = c, m = !0), m && !this.wasSnapped && ((p = this.soundEngine) == null || p.playSnap()), this.wasSnapped = m), n = Math.max(0, Math.min(n, h)), s = Math.max(0, Math.min(s, c)), this.panel.style.left = `${n}px`, this.panel.style.top = `${s}px`;
1658
1974
  }
1659
1975
  onMouseUp() {
1660
1976
  this.isDragging = !1, this.wasSnapped = !1, window.removeEventListener("mousemove", this.onMouseMoveBound), window.removeEventListener("mouseup", this.onMouseUpBound);
@@ -1663,18 +1979,18 @@ class te {
1663
1979
  this.handle.removeEventListener("mousedown", this.onMouseDownBound), typeof window < "u" && (window.removeEventListener("mousemove", this.onMouseMoveBound), window.removeEventListener("mouseup", this.onMouseUpBound), window.removeEventListener("resize", this.onResizeBound));
1664
1980
  }
1665
1981
  }
1666
- class ie {
1982
+ class oe {
1667
1983
  constructor(i, e = 240, t = 120) {
1668
- a(this, "handleEl");
1669
- a(this, "isResizing", !1);
1670
- a(this, "startX", 0);
1671
- a(this, "startY", 0);
1672
- a(this, "initialWidth", 0);
1673
- a(this, "initialHeight", 0);
1674
- a(this, "onMouseDownBound");
1675
- a(this, "onMouseMoveBound");
1676
- a(this, "onMouseUpBound");
1677
- a(this, "onResizeBound");
1984
+ l(this, "handleEl");
1985
+ l(this, "isResizing", !1);
1986
+ l(this, "startX", 0);
1987
+ l(this, "startY", 0);
1988
+ l(this, "initialWidth", 0);
1989
+ l(this, "initialHeight", 0);
1990
+ l(this, "onMouseDownBound");
1991
+ l(this, "onMouseMoveBound");
1992
+ l(this, "onMouseUpBound");
1993
+ l(this, "onResizeBound");
1678
1994
  this.panel = i, this.minWidth = e, this.minHeight = t, this.handleEl = document.createElement("div"), this.handleEl.className = "relly-resize-handle", this.handleEl.title = "Drag to resize panel", this.handleEl.innerHTML = `
1679
1995
  <svg viewBox="0 0 10 10">
1680
1996
  <line x1="8" y1="2" x2="2" y2="8"></line>
@@ -1700,11 +2016,11 @@ class ie {
1700
2016
  }
1701
2017
  onMouseMove(i) {
1702
2018
  if (!this.isResizing) return;
1703
- const e = i.clientX - this.startX, t = i.clientY - this.startY, n = this.panel.getBoundingClientRect(), s = Math.max(this.minWidth, window.innerWidth - n.left - 8), r = Math.max(this.minHeight, window.innerHeight - n.top - 8), l = Math.max(this.minWidth, Math.min(s, this.initialWidth + e)), o = Math.max(
2019
+ const e = i.clientX - this.startX, t = i.clientY - this.startY, n = this.panel.getBoundingClientRect(), s = Math.max(this.minWidth, window.innerWidth - n.left - 8), r = Math.max(this.minHeight, window.innerHeight - n.top - 8), o = Math.max(this.minWidth, Math.min(s, this.initialWidth + e)), a = Math.max(
1704
2020
  this.minHeight,
1705
2021
  Math.min(r, this.initialHeight + t)
1706
2022
  );
1707
- this.panel.style.width = `${Math.round(l)}px`, this.panel.style.height = `${Math.round(o)}px`;
2023
+ this.panel.style.width = `${Math.round(o)}px`, this.panel.style.height = `${Math.round(a)}px`;
1708
2024
  const h = this.panel.querySelector(".relly-body");
1709
2025
  h && (h.style.maxHeight = "none", h.style.flex = "1");
1710
2026
  }
@@ -1715,10 +2031,10 @@ class ie {
1715
2031
  this.handleEl.removeEventListener("mousedown", this.onMouseDownBound), typeof window < "u" && (window.removeEventListener("mousemove", this.onMouseMoveBound), window.removeEventListener("mouseup", this.onMouseUpBound), window.removeEventListener("resize", this.onResizeBound)), this.handleEl.remove();
1716
2032
  }
1717
2033
  }
1718
- class ne {
2034
+ class W {
1719
2035
  constructor(i, e) {
1720
- a(this, "onKeyDownBound");
1721
- this.hotkey = i, this.onToggle = e, this.onKeyDownBound = this.onKeyDown.bind(this), this.hotkey && typeof window < "u" && window.addEventListener("keydown", this.onKeyDownBound);
2036
+ l(this, "onKeyDownBound");
2037
+ this.hotkey = i, this.onToggle = e, this.onKeyDownBound = this.onKeyDown.bind(this), typeof window < "u" && window.addEventListener("keydown", this.onKeyDownBound);
1722
2038
  }
1723
2039
  onKeyDown(i) {
1724
2040
  var n;
@@ -1742,13 +2058,13 @@ class ne {
1742
2058
  typeof window < "u" && window.removeEventListener("keydown", this.onKeyDownBound);
1743
2059
  }
1744
2060
  }
1745
- class se {
2061
+ class he {
1746
2062
  constructor(i, e = {}) {
1747
- a(this, "element");
1748
- a(this, "inputEl");
1749
- a(this, "clearBtn");
1750
- a(this, "ignoreCase");
1751
- a(this, "onGlobalKeyDownBound");
2063
+ l(this, "element");
2064
+ l(this, "inputEl");
2065
+ l(this, "clearBtn");
2066
+ l(this, "ignoreCase");
2067
+ l(this, "onGlobalKeyDownBound");
1752
2068
  this.bodyEl = i, this.ignoreCase = e.ignoreCase !== !1, this.element = document.createElement("div"), this.element.className = "relly-search-bar", this.inputEl = document.createElement("input"), this.inputEl.type = "text", this.inputEl.className = "relly-search-input", this.inputEl.placeholder = e.placeholder || 'Filter settings... (Press "/" to focus)', this.clearBtn = document.createElement("button"), this.clearBtn.className = "relly-search-clear", this.clearBtn.textContent = "✕", this.clearBtn.title = "Clear search", this.clearBtn.style.display = "none", this.element.appendChild(this.inputEl), this.element.appendChild(this.clearBtn), this.inputEl.addEventListener("input", () => {
1753
2069
  this.filter(this.inputEl.value);
1754
2070
  }), this.inputEl.addEventListener("keydown", (t) => {
@@ -1767,8 +2083,8 @@ class se {
1767
2083
  const t = typeof i.composedPath == "function" ? i.composedPath() : [];
1768
2084
  for (const r of t)
1769
2085
  if (r instanceof HTMLElement) {
1770
- const l = r.tagName;
1771
- if (l === "INPUT" || l === "TEXTAREA" || l === "SELECT" || r.isContentEditable || r.classList.contains("relly-search-input"))
2086
+ const o = r.tagName;
2087
+ if (o === "INPUT" || o === "TEXTAREA" || o === "SELECT" || r.isContentEditable || r.classList.contains("relly-search-input"))
1772
2088
  return;
1773
2089
  }
1774
2090
  let n = document.activeElement;
@@ -1784,6 +2100,7 @@ class se {
1784
2100
  return this.inputEl;
1785
2101
  }
1786
2102
  filter(i) {
2103
+ var a;
1787
2104
  const e = i.trim();
1788
2105
  if (!e) {
1789
2106
  this.clearBtn.style.display = "none", this.resetFilter();
@@ -1791,22 +2108,38 @@ class se {
1791
2108
  }
1792
2109
  this.clearBtn.style.display = "block";
1793
2110
  const t = this.ignoreCase ? e.toLowerCase() : e;
1794
- this.bodyEl.querySelectorAll(".relly-row, .relly-graph-row").forEach((r) => {
1795
- const l = r.querySelector(".relly-row-label, .relly-graph-header span"), o = (l == null ? void 0 : l.textContent) || "";
1796
- if ((this.ignoreCase ? o.toLowerCase() : o).includes(t)) {
1797
- r.classList.remove("relly-search-hidden");
1798
- const u = r.closest(".relly-section");
1799
- u && (u.classList.remove("relly-section--collapsed"), u.classList.remove("relly-search-hidden"));
2111
+ this.bodyEl.querySelectorAll(".relly-row, .relly-graph-row").forEach((h) => {
2112
+ const c = h.querySelector(".relly-row-label, .relly-graph-header span"), m = (c == null ? void 0 : c.textContent) || "";
2113
+ if ((this.ignoreCase ? m.toLowerCase() : m).includes(t)) {
2114
+ h.classList.remove("relly-search-hidden");
2115
+ const y = h.closest(".relly-section");
2116
+ y && (y.classList.remove("relly-section--collapsed"), y.classList.remove("relly-search-hidden"));
1800
2117
  } else
1801
- r.classList.add("relly-search-hidden");
1802
- }), this.bodyEl.querySelectorAll(".relly-section").forEach((r) => {
1803
- const l = r.querySelector(".relly-section-title-wrap span:last-child"), o = (l == null ? void 0 : l.textContent) || "";
1804
- (this.ignoreCase ? o.toLowerCase() : o).includes(t) ? (r.classList.remove("relly-search-hidden"), r.classList.remove("relly-section--collapsed"), r.querySelectorAll(".relly-row, .relly-graph-row").forEach((c) => {
1805
- c.classList.remove("relly-search-hidden");
1806
- })) : r.querySelectorAll(
2118
+ h.classList.add("relly-search-hidden");
2119
+ }), this.bodyEl.querySelectorAll(".relly-section").forEach((h) => {
2120
+ const c = h.querySelector(".relly-section-title-wrap span:last-child"), m = (c == null ? void 0 : c.textContent) || "";
2121
+ (this.ignoreCase ? m.toLowerCase() : m).includes(t) ? (h.classList.remove("relly-search-hidden"), h.classList.remove("relly-section--collapsed"), h.querySelectorAll(".relly-row, .relly-graph-row").forEach((d) => {
2122
+ d.classList.remove("relly-search-hidden");
2123
+ })) : h.querySelectorAll(
1807
2124
  ".relly-row:not(.relly-search-hidden), .relly-graph-row:not(.relly-search-hidden)"
1808
- ).length === 0 && r.classList.add("relly-search-hidden");
2125
+ ).length === 0 && h.classList.add("relly-search-hidden");
1809
2126
  });
2127
+ const r = this.bodyEl.querySelector('.relly-tab-content:not([style*="display: none"])'), o = r == null ? void 0 : r.querySelectorAll(
2128
+ ".relly-row:not(.relly-search-hidden), .relly-graph-row:not(.relly-search-hidden)"
2129
+ );
2130
+ if (!o || o.length === 0) {
2131
+ const h = Array.from(this.bodyEl.querySelectorAll(".relly-tab-content"));
2132
+ for (let c = 0; c < h.length; c++)
2133
+ if (h[c].querySelectorAll(
2134
+ ".relly-row:not(.relly-search-hidden), .relly-graph-row:not(.relly-search-hidden)"
2135
+ ).length > 0) {
2136
+ const p = (a = this.bodyEl.parentElement) == null ? void 0 : a.querySelectorAll(".relly-tab-btn");
2137
+ if (p && p[c]) {
2138
+ p[c].click();
2139
+ break;
2140
+ }
2141
+ }
2142
+ }
1810
2143
  }
1811
2144
  clear() {
1812
2145
  this.inputEl.value = "", this.clearBtn.style.display = "none", this.resetFilter();
@@ -1820,12 +2153,12 @@ class se {
1820
2153
  typeof window < "u" && window.removeEventListener("keydown", this.onGlobalKeyDownBound), this.element.remove();
1821
2154
  }
1822
2155
  }
1823
- class re {
2156
+ class ce {
1824
2157
  constructor(i = !0, e = "synth") {
1825
- a(this, "ctx", null);
1826
- a(this, "enabled", !0);
1827
- a(this, "volume", 1);
1828
- a(this, "soundPack", "synth");
2158
+ l(this, "ctx", null);
2159
+ l(this, "enabled", !0);
2160
+ l(this, "volume", 1);
2161
+ l(this, "soundPack", "synth");
1829
2162
  this.enabled = i, this.soundPack = e;
1830
2163
  }
1831
2164
  setEnabled(i) {
@@ -1871,16 +2204,16 @@ class re {
1871
2204
  const t = e.currentTime, n = e.createOscillator(), s = e.createGain();
1872
2205
  if (this.soundPack === "mechanical") {
1873
2206
  n.type = "triangle";
1874
- const r = i ? 2800 : 1800, l = i ? 900 : 400;
1875
- n.frequency.setValueAtTime(r, t), n.frequency.exponentialRampToValueAtTime(l, t + 0.018), s.gain.setValueAtTime(0.055 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.018), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.02);
2207
+ const r = i ? 2800 : 1800, o = i ? 900 : 400;
2208
+ n.frequency.setValueAtTime(r, t), n.frequency.exponentialRampToValueAtTime(o, t + 0.018), s.gain.setValueAtTime(0.055 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.018), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.02);
1876
2209
  } else if (this.soundPack === "bubble") {
1877
2210
  n.type = "sine";
1878
- const r = i ? 380 : 900, l = i ? 1100 : 280;
1879
- n.frequency.setValueAtTime(r, t), n.frequency.exponentialRampToValueAtTime(l, t + 0.028), s.gain.setValueAtTime(0.045 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.028), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.03);
2211
+ const r = i ? 380 : 900, o = i ? 1100 : 280;
2212
+ n.frequency.setValueAtTime(r, t), n.frequency.exponentialRampToValueAtTime(o, t + 0.028), s.gain.setValueAtTime(0.045 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.028), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.03);
1880
2213
  } else if (this.soundPack === "arcade") {
1881
2214
  n.type = "square";
1882
- const r = i ? 523.25 : 659.25, l = i ? 783.99 : 392;
1883
- n.frequency.setValueAtTime(r, t), n.frequency.setValueAtTime(l, t + 0.015), s.gain.setValueAtTime(0.025 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.03), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.032);
2215
+ const r = i ? 523.25 : 659.25, o = i ? 783.99 : 392;
2216
+ n.frequency.setValueAtTime(r, t), n.frequency.setValueAtTime(o, t + 0.015), s.gain.setValueAtTime(0.025 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.03), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.032);
1884
2217
  } else {
1885
2218
  n.type = "triangle";
1886
2219
  const r = i ? 650 : 450;
@@ -1926,8 +2259,8 @@ class re {
1926
2259
  try {
1927
2260
  const t = e.currentTime, n = e.createOscillator(), s = e.createGain();
1928
2261
  n.type = this.soundPack === "arcade" ? "square" : "sine";
1929
- const r = i ? 380 : 640, l = i ? 680 : 340;
1930
- n.frequency.setValueAtTime(r, t), n.frequency.exponentialRampToValueAtTime(l, t + 0.05), s.gain.setValueAtTime(0.03 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.05), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.055);
2262
+ const r = i ? 380 : 640, o = i ? 680 : 340;
2263
+ n.frequency.setValueAtTime(r, t), n.frequency.exponentialRampToValueAtTime(o, t + 0.05), s.gain.setValueAtTime(0.03 * this.volume, t), s.gain.exponentialRampToValueAtTime(1e-4, t + 0.05), n.connect(s), s.connect(e.destination), n.start(t), n.stop(t + 0.055);
1931
2264
  } catch {
1932
2265
  }
1933
2266
  }
@@ -1950,13 +2283,13 @@ class re {
1950
2283
  }
1951
2284
  }
1952
2285
  }
1953
- class ae {
2286
+ class de {
1954
2287
  constructor(i, e) {
1955
- a(this, "element");
1956
- a(this, "textareaEl");
1957
- a(this, "errorEl");
1958
- a(this, "dropzoneEl");
1959
- a(this, "fileInput");
2288
+ l(this, "element");
2289
+ l(this, "textareaEl");
2290
+ l(this, "errorEl");
2291
+ l(this, "dropzoneEl");
2292
+ l(this, "fileInput");
1960
2293
  this.parentEl = i, this.onApply = e, this.element = document.createElement("div"), this.element.className = "relly-modal-backdrop";
1961
2294
  const t = document.createElement("div");
1962
2295
  t.className = "relly-modal";
@@ -1979,12 +2312,12 @@ class ae {
1979
2312
  }), this.dropzoneEl.addEventListener("drop", (c) => {
1980
2313
  c.preventDefault(), this.dropzoneEl.classList.remove("relly-dropzone-drag"), c.dataTransfer && c.dataTransfer.files.length > 0 && this.readFile(c.dataTransfer.files[0]);
1981
2314
  }), t.appendChild(this.dropzoneEl), t.appendChild(this.fileInput), this.textareaEl = document.createElement("textarea"), this.textareaEl.className = "relly-import-textarea", this.textareaEl.placeholder = "Paste JSON configuration here...", t.appendChild(this.textareaEl), this.errorEl = document.createElement("div"), this.errorEl.className = "relly-import-error", t.appendChild(this.errorEl);
1982
- const l = document.createElement("div");
1983
- l.className = "relly-modal-actions";
1984
- const o = document.createElement("button");
1985
- o.className = "relly-btn", o.textContent = "Cancel", o.style.flex = "1", o.addEventListener("click", () => this.hide());
2315
+ const o = document.createElement("div");
2316
+ o.className = "relly-modal-actions";
2317
+ const a = document.createElement("button");
2318
+ a.className = "relly-btn", a.textContent = "Cancel", a.style.flex = "1", a.addEventListener("click", () => this.hide());
1986
2319
  const h = document.createElement("button");
1987
- h.className = "relly-btn relly-btn-primary", h.textContent = "Apply & Load", h.style.flex = "2", h.addEventListener("click", () => this.apply()), l.appendChild(o), l.appendChild(h), t.appendChild(l), this.element.appendChild(t), this.element.addEventListener("click", (c) => {
2320
+ h.className = "relly-btn relly-btn-primary", h.textContent = "Apply & Load", h.style.flex = "2", h.addEventListener("click", () => this.apply()), o.appendChild(a), o.appendChild(h), t.appendChild(o), this.element.appendChild(t), this.element.addEventListener("click", (c) => {
1988
2321
  c.target === this.element && this.hide();
1989
2322
  }), this.parentEl.appendChild(this.element);
1990
2323
  }
@@ -2023,24 +2356,24 @@ class ae {
2023
2356
  this.element.remove();
2024
2357
  }
2025
2358
  }
2026
- class le {
2359
+ class pe {
2027
2360
  static load(i, e) {
2028
2361
  const t = e.target, n = (s, r) => {
2029
- for (const l of r) {
2030
- const o = l.children || l.controls;
2031
- if (l.type === "section") {
2362
+ for (const o of r) {
2363
+ const a = o.children || o.controls;
2364
+ if (o.type === "section") {
2032
2365
  const h = s.addSection(
2033
- l.label || "Section",
2034
- l.collapsed
2366
+ o.label || "Section",
2367
+ o.collapsed
2035
2368
  );
2036
- l.showIf && h.showIf && h.showIf(l.showIf), o && Array.isArray(o) && n(h, o);
2037
- } else if (l.type === "row") {
2369
+ o.showIf && h.showIf && h.showIf(o.showIf), a && Array.isArray(a) && n(h, a);
2370
+ } else if (o.type === "row") {
2038
2371
  const h = s.addRow();
2039
- o && Array.isArray(o) && n(h, o);
2372
+ a && Array.isArray(a) && n(h, a);
2040
2373
  } else {
2041
2374
  const h = {
2042
- ...l,
2043
- object: l.object !== void 0 ? l.object : t
2375
+ ...o,
2376
+ object: o.object !== void 0 ? o.object : t
2044
2377
  };
2045
2378
  s.createComponent(h);
2046
2379
  }
@@ -2049,9 +2382,9 @@ class le {
2049
2382
  e.controls && Array.isArray(e.controls) && n(i, e.controls);
2050
2383
  }
2051
2384
  }
2052
- class oe {
2385
+ class ue {
2053
2386
  constructor(i, e) {
2054
- a(this, "containerEl");
2387
+ l(this, "containerEl");
2055
2388
  this.parentEl = i, this.soundEngine = e, this.containerEl = document.createElement("div"), this.containerEl.className = "relly-toast-container", this.parentEl.appendChild(this.containerEl);
2056
2389
  }
2057
2390
  notify(i, e = "info", t = 2600) {
@@ -2063,18 +2396,18 @@ class oe {
2063
2396
  s.className = "relly-toast-icon", s.innerHTML = this.getIconSvg(e);
2064
2397
  const r = document.createElement("span");
2065
2398
  r.className = "relly-toast-msg", r.textContent = i;
2066
- const l = document.createElement("button");
2067
- l.className = "relly-toast-close", l.innerHTML = "✕", l.title = "Dismiss", n.appendChild(s), n.appendChild(r), n.appendChild(l);
2068
- const o = () => {
2399
+ const o = document.createElement("button");
2400
+ o.className = "relly-toast-close", o.innerHTML = "✕", o.title = "Dismiss", n.appendChild(s), n.appendChild(r), n.appendChild(o);
2401
+ const a = () => {
2069
2402
  n.classList.contains("relly-toast-leave") || (n.classList.add("relly-toast-leave"), setTimeout(() => {
2070
2403
  n.parentElement && n.parentElement.removeChild(n);
2071
2404
  }, 200));
2072
2405
  };
2073
- return l.addEventListener("click", (c) => {
2074
- c.stopPropagation(), o();
2075
- }), n.addEventListener("click", o), this.containerEl.appendChild(n), requestAnimationFrame(() => {
2406
+ return o.addEventListener("click", (c) => {
2407
+ c.stopPropagation(), a();
2408
+ }), n.addEventListener("click", a), this.containerEl.appendChild(n), requestAnimationFrame(() => {
2076
2409
  n.classList.add("relly-toast-enter");
2077
- }), t > 0 && setTimeout(o, t), n;
2410
+ }), t > 0 && setTimeout(a, t), n;
2078
2411
  }
2079
2412
  getIconSvg(i) {
2080
2413
  switch (i) {
@@ -2093,13 +2426,13 @@ class oe {
2093
2426
  this.containerEl.parentElement && this.containerEl.parentElement.removeChild(this.containerEl);
2094
2427
  }
2095
2428
  }
2096
- class he {
2429
+ class me {
2097
2430
  constructor(i, e) {
2098
- a(this, "menuEl");
2099
- a(this, "currentComponent");
2100
- a(this, "onDocClickBound");
2101
- a(this, "onKeyDownBound");
2102
- a(this, "onContextMenu", (i) => {
2431
+ l(this, "menuEl");
2432
+ l(this, "currentComponent");
2433
+ l(this, "onDocClickBound");
2434
+ l(this, "onKeyDownBound");
2435
+ l(this, "onContextMenu", (i) => {
2103
2436
  let e = i.target, t = e == null ? void 0 : e.closest(".relly-row, .relly-graph-row");
2104
2437
  if (!t) return;
2105
2438
  const n = t.__rellyComponent, s = n == null ? void 0 : n.getContextMenu();
@@ -2121,10 +2454,10 @@ class he {
2121
2454
  }
2122
2455
  const c = document.createElement("button");
2123
2456
  c.type = "button", c.className = "relly-context-item", h.danger && c.classList.add("relly-context-item--danger"), h.disabled && (c.disabled = !0);
2124
- let u = "";
2125
- h.icon && (u = `<span class="relly-context-icon">${h.icon}</span>`), c.innerHTML = `${u}<span class="relly-context-label">${h.label}</span>`, c.addEventListener("click", (p) => {
2126
- var f;
2127
- p.stopPropagation(), (f = this.soundEngine) == null || f.playClick();
2457
+ let m = "";
2458
+ h.icon && (m = `<span class="relly-context-icon">${h.icon}</span>`), c.innerHTML = `${m}<span class="relly-context-label">${h.label}</span>`, c.addEventListener("click", (p) => {
2459
+ var y;
2460
+ p.stopPropagation(), (y = this.soundEngine) == null || y.playClick();
2128
2461
  const d = this.currentComponent;
2129
2462
  this.hide(), h.action(d);
2130
2463
  }), this.menuEl.appendChild(c);
@@ -2132,8 +2465,8 @@ class he {
2132
2465
  this.menuEl.style.display = "flex";
2133
2466
  const n = this.panelEl.getBoundingClientRect();
2134
2467
  let s = e - n.left, r = t - n.top;
2135
- const l = 160, o = this.menuEl.offsetHeight || 120;
2136
- s + l > n.width && (s = Math.max(4, n.width - l - 4)), r + o > n.height && (r = Math.max(4, n.height - o - 4)), this.menuEl.style.left = `${s}px`, this.menuEl.style.top = `${r}px`;
2468
+ const o = 160, a = this.menuEl.offsetHeight || 120;
2469
+ s + o > n.width && (s = Math.max(4, n.width - o - 4)), r + a > n.height && (r = Math.max(4, n.height - a - 4)), this.menuEl.style.left = `${s}px`, this.menuEl.style.top = `${r}px`;
2137
2470
  }
2138
2471
  hide() {
2139
2472
  this.menuEl.style.display = "none", this.currentComponent = void 0;
@@ -2142,13 +2475,13 @@ class he {
2142
2475
  typeof window < "u" && (window.removeEventListener("click", this.onDocClickBound), window.removeEventListener("keydown", this.onKeyDownBound)), this.panelEl.removeEventListener("contextmenu", this.onContextMenu), this.menuEl.parentElement && this.menuEl.parentElement.removeChild(this.menuEl);
2143
2476
  }
2144
2477
  }
2145
- class ce extends T {
2478
+ class fe extends T {
2146
2479
  constructor(e, t, n, s) {
2147
2480
  const r = document.createElement("div");
2148
2481
  r.className = "relly-tab-content";
2149
2482
  super(r, t, n, s);
2150
- a(this, "contentEl");
2151
- a(this, "buttonEl");
2483
+ l(this, "contentEl");
2484
+ l(this, "buttonEl");
2152
2485
  this.label = e, this.contentEl = r, this.buttonEl = document.createElement("button"), this.buttonEl.className = "relly-tab-btn", this.buttonEl.textContent = e;
2153
2486
  }
2154
2487
  getLabel() {
@@ -2161,17 +2494,17 @@ class ce extends T {
2161
2494
  this.destroyChildren(), this.buttonEl.remove(), this.contentEl.remove();
2162
2495
  }
2163
2496
  }
2164
- class de {
2497
+ class ye {
2165
2498
  constructor(i, e, t, n, s) {
2166
- a(this, "barEl");
2167
- a(this, "bodyEl");
2168
- a(this, "tabs", []);
2169
- a(this, "activeTab", null);
2499
+ l(this, "barEl");
2500
+ l(this, "bodyEl");
2501
+ l(this, "tabs", []);
2502
+ l(this, "activeTab", null);
2170
2503
  this.bindingEngine = t, this.presetManager = n, this.soundEngine = s, this.barEl = document.createElement("div"), this.barEl.className = "relly-tabs-bar", this.barEl.style.display = "none", this.bodyEl = e, i.insertAdjacentElement("afterend", this.barEl);
2171
2504
  }
2172
2505
  addTab(i) {
2173
2506
  this.barEl.style.display = "flex";
2174
- const e = new ce(i, this.bindingEngine, this.presetManager, this.soundEngine);
2507
+ const e = new fe(i, this.bindingEngine, this.presetManager, this.soundEngine);
2175
2508
  return this.tabs.push(e), this.barEl.appendChild(e.buttonEl), this.bodyEl.appendChild(e.contentEl), e.buttonEl.addEventListener("click", () => {
2176
2509
  this.switchTab(e);
2177
2510
  }), this.tabs.length === 1 && this.switchTab(e, !1), e;
@@ -2185,27 +2518,31 @@ class de {
2185
2518
  getActiveTab() {
2186
2519
  return this.activeTab;
2187
2520
  }
2521
+ getTabs() {
2522
+ return this.tabs;
2523
+ }
2188
2524
  destroy() {
2189
2525
  for (const i of this.tabs)
2190
2526
  i.destroy();
2191
2527
  this.tabs = [], this.barEl.remove();
2192
2528
  }
2193
2529
  }
2194
- const me = ':root{--relly-bg: #1c1d22;--relly-fg: #d1d5db;--relly-header-bg: #141518;--relly-header-fg: #f3f4f6;--relly-accent: #6366f1;--relly-accent-hover: #4f46e5;--relly-border: rgba(255, 255, 255, .08);--relly-input-bg: #26272e;--relly-input-hover: #2f3039;--relly-radius: 6px;--relly-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--relly-font-size: 11px;--relly-row-height: 26px;--relly-ease: cubic-bezier(.16, 1, .3, 1);--relly-transition: all .2s var(--relly-ease)}.relly-host{position:fixed;z-index:999999;pointer-events:none}.relly-panel{position:fixed;z-index:999999;background-color:var(--relly-bg);color:var(--relly-fg);border:1px solid var(--relly-border);border-radius:var(--relly-radius);box-shadow:0 10px 25px -5px #00000080,0 8px 10px -6px #0006;font-family:var(--relly-font);font-size:var(--relly-font-size);-webkit-user-select:none;user-select:none;box-sizing:border-box;overflow:hidden!important;overflow-x:hidden!important;display:flex;flex-direction:column;pointer-events:auto;opacity:1;transform:scale(1) translateY(0);transition:opacity .22s var(--relly-ease),transform .22s var(--relly-ease);min-width:240px;min-height:120px;max-width:calc(100vw - 16px);max-height:calc(100vh - 16px);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}.relly-panel.relly-mini-hud{width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;border-radius:9999px!important;box-shadow:0 4px 20px #0006,0 0 0 1px var(--relly-accent)}.relly-panel.relly-mini-hud .relly-header{border-bottom:none;padding:5px 12px;border-radius:9999px;background-color:var(--relly-bg)}.relly-panel.relly-mini-hud .relly-body,.relly-panel.relly-mini-hud .relly-search-bar,.relly-panel.relly-mini-hud .relly-tabs-bar,.relly-panel.relly-mini-hud .relly-resize-handle,.relly-panel.relly-mini-hud .relly-header-btn:not(.relly-minihud-btn){display:none!important}.relly-panel.relly-mini-hud .relly-header-title:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background-color:var(--relly-accent);box-shadow:0 0 6px var(--relly-accent);margin-right:6px;animation:relly-pulse 2s infinite ease-in-out}@keyframes relly-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.85)}}.relly-panel *{box-sizing:border-box}.relly-panel,.relly-panel *,.relly-body,.relly-tabs-bar,.relly-search-bar{scrollbar-width:none!important;-ms-overflow-style:none!important}.relly-panel *::-webkit-scrollbar,.relly-panel::-webkit-scrollbar,.relly-body::-webkit-scrollbar,.relly-tabs-bar::-webkit-scrollbar{display:none!important;width:0!important;height:0!important}.relly-panel.relly-hidden{opacity:0!important;transform:scale(.95) translateY(-6px)!important;pointer-events:none!important}.relly-header{display:flex;align-items:center;justify-content:space-between;background-color:var(--relly-header-bg);color:var(--relly-header-fg);padding:6px 10px;font-weight:600;border-bottom:1px solid var(--relly-border);cursor:grab;transition:background-color .2s var(--relly-ease);flex-shrink:0}.relly-header:active{cursor:grabbing}.relly-header-title{display:flex;align-items:center;gap:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.relly-header-title svg{width:14px;height:14px;color:var(--relly-accent);transition:transform .2s var(--relly-ease)}.relly-header-title:hover svg{transform:rotate(15deg)}.relly-header-actions{display:flex;align-items:center;gap:4px}.relly-header-btn{background:transparent;border:none;color:var(--relly-fg);opacity:.7;padding:2px 6px;border-radius:4px;cursor:pointer;font-family:inherit;font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center;transition:opacity .15s,background-color .15s,transform .1s var(--relly-ease)}.relly-header-btn:hover{opacity:1;background-color:#ffffff1a;transform:scale(1.08)}.relly-header-btn:active{transform:scale(.92)}.relly-resize-handle{position:absolute;bottom:0;right:0;width:14px;height:14px;cursor:se-resize;display:flex;align-items:center;justify-content:center;opacity:.4;transition:opacity .15s var(--relly-ease);z-index:100}.relly-resize-handle svg{width:9px;height:9px;stroke:var(--relly-fg);stroke-width:1.5}.relly-resize-handle:hover{opacity:1}.relly-search-bar{display:flex;align-items:center;padding:4px 8px;background-color:#0003;border-bottom:1px solid var(--relly-border);gap:6px;flex-shrink:0}.relly-search-input{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:3px 6px;outline:none;transition:border-color .15s var(--relly-ease),background-color .15s}.relly-search-input:focus{border-color:var(--relly-accent);background-color:var(--relly-input-hover)}.relly-search-clear{background:none;border:none;color:var(--relly-fg);cursor:pointer;opacity:.5;font-size:10px;padding:0 4px;transition:opacity .15s}.relly-search-clear:hover{opacity:1}.relly-tabs-bar{display:flex;background-color:var(--relly-header-bg);border-bottom:1px solid var(--relly-border);overflow-x:auto;overflow-y:hidden;flex-shrink:0;scrollbar-width:none!important;-ms-overflow-style:none!important}.relly-tabs-bar::-webkit-scrollbar{display:none!important;width:0!important;height:0!important}.relly-tab-btn{flex:1;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--relly-fg);opacity:.6;padding:5px 8px;font-family:inherit;font-size:11px;cursor:pointer;white-space:nowrap;transition:all .2s var(--relly-ease)}.relly-tab-btn:hover{opacity:.9;background-color:#ffffff08}.relly-tab-btn.relly-tab-active{opacity:1;color:var(--relly-accent);border-bottom-color:var(--relly-accent)}.relly-tab-content{display:none}.relly-tab-content.relly-tab-content--active{display:flex;flex-direction:column}.relly-body{display:flex;flex-direction:column;overflow-y:auto!important;overflow-x:hidden!important;max-height:80vh;flex:1;transition:max-height .25s var(--relly-ease);scrollbar-width:none!important;-ms-overflow-style:none!important}.relly-body::-webkit-scrollbar{display:none!important;width:0!important;height:0!important}.relly-panel.relly-collapsed .relly-body{display:none}.relly-copy-toast{position:absolute;top:36px;right:10px;background:var(--relly-accent);color:#fff;padding:3px 8px;border-radius:4px;font-size:10px;font-weight:600;box-shadow:0 4px 12px #0000004d;pointer-events:none;opacity:0;transform:translateY(-6px);transition:opacity .2s var(--relly-ease),transform .2s var(--relly-ease);z-index:9999999}.relly-copy-toast.relly-toast-show{opacity:1;transform:translateY(0)}.relly-modal-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:999999;display:flex;align-items:center;justify-content:center;padding:12px;opacity:0;pointer-events:none;transition:opacity .2s var(--relly-ease)}.relly-modal-backdrop.relly-modal-show{opacity:1;pointer-events:auto}.relly-modal{width:100%;max-width:320px;background:var(--relly-bg);border:1px solid var(--relly-border);border-radius:var(--relly-radius);box-shadow:0 12px 30px #0009;padding:12px;display:flex;flex-direction:column;gap:8px;transform:scale(.95);transition:transform .2s var(--relly-ease)}.relly-modal-backdrop.relly-modal-show .relly-modal{transform:scale(1)}.relly-modal-header{display:flex;justify-content:space-between;align-items:center;font-weight:600;color:var(--relly-header-fg);font-size:12px}.relly-dropzone{border:1.5px dashed var(--relly-border);border-radius:4px;padding:12px;text-align:center;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--relly-fg);opacity:.8;font-size:11px;background:#00000026;transition:all .2s var(--relly-ease)}.relly-dropzone:hover,.relly-dropzone.relly-dropzone-drag{border-color:var(--relly-accent);opacity:1;background:#6366f114}.relly-import-textarea{width:100%;height:90px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:monospace;font-size:10px;padding:6px;outline:none;resize:vertical}.relly-import-textarea:focus{border-color:var(--relly-accent)}.relly-import-error{color:#ef4444;font-size:10px;min-height:12px}.relly-modal-actions{display:flex;gap:6px}.relly-btn-primary{background:var(--relly-accent)!important;color:#fff!important;border-color:var(--relly-accent)!important}.relly-btn-primary:hover{background:var(--relly-accent-hover)!important}.relly-toast-container{position:absolute;top:36px;right:8px;display:flex;flex-direction:column;gap:6px;z-index:9999999;pointer-events:none;max-width:240px}.relly-toast{display:flex;align-items:center;gap:6px;padding:6px 8px;background:var(--relly-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-size:11px;box-shadow:0 4px 16px #00000073;pointer-events:auto;opacity:0;transform:translateY(-8px) scale(.96);transition:opacity .2s var(--relly-ease),transform .2s var(--relly-ease);cursor:pointer}.relly-toast.relly-toast-enter{opacity:1;transform:translateY(0) scale(1)}.relly-toast.relly-toast-leave{opacity:0;transform:translateY(-6px) scale(.95)}.relly-toast-icon svg{width:14px;height:14px;display:block}.relly-toast--success{border-left:3px solid #22c55e}.relly-toast--success .relly-toast-icon{color:#22c55e}.relly-toast--warning{border-left:3px solid #f59e0b}.relly-toast--warning .relly-toast-icon{color:#f59e0b}.relly-toast--error{border-left:3px solid #ef4444}.relly-toast--error .relly-toast-icon{color:#ef4444}.relly-toast--info{border-left:3px solid var(--relly-accent)}.relly-toast--info .relly-toast-icon{color:var(--relly-accent)}.relly-toast-msg{flex:1;line-height:1.3;overflow:hidden;text-overflow:ellipsis}.relly-toast-close{background:transparent;border:none;color:var(--relly-fg);opacity:.5;cursor:pointer;padding:0 2px;font-size:11px}.relly-toast-close:hover{opacity:1}.relly-context-menu{position:absolute;background:var(--relly-bg);border:1px solid var(--relly-border);border-radius:var(--relly-radius);box-shadow:0 8px 24px #0000008c;padding:4px;display:flex;flex-direction:column;min-width:140px;z-index:99999999;animation:relly-menu-in .15s var(--relly-ease)}@keyframes relly-menu-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.relly-context-item{display:flex;align-items:center;gap:6px;background:transparent;border:none;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:5px 8px;border-radius:3px;cursor:pointer;text-align:left;transition:background-color .12s var(--relly-ease),color .12s}.relly-context-item:hover:not(:disabled){background-color:var(--relly-accent);color:#fff}.relly-context-item:disabled{opacity:.4;cursor:not-allowed}.relly-context-item--danger:hover:not(:disabled){background-color:#ef4444!important;color:#fff!important}.relly-context-separator{height:1px;background-color:var(--relly-border);margin:3px 0}.relly-row{display:flex;align-items:center;justify-content:space-between;min-height:var(--relly-row-height);padding:3px 10px;border-bottom:1px solid var(--relly-border);position:relative;transition:background-color .15s var(--relly-ease),opacity .2s var(--relly-ease)}.relly-row:hover{background-color:#ffffff08}.relly-row.relly-search-hidden{display:none!important}.relly-row-label{flex:0 0 40%;max-width:40%;color:var(--relly-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--relly-font-size);cursor:default;position:relative}.relly-row-control{flex:1;display:flex;align-items:center;justify-content:flex-end;gap:6px;min-width:0}.relly-multi-row{display:flex;align-items:stretch;width:100%;border-bottom:1px solid var(--relly-border)}.relly-multi-row .relly-row{flex:1;border-bottom:none;border-right:1px solid var(--relly-border);padding:3px 6px}.relly-multi-row .relly-row:last-child{border-right:none}.relly-multi-row .relly-row-label{flex:0 0 auto;max-width:none;margin-right:4px}.relly-tooltip{position:absolute;bottom:calc(100% + 4px);left:10px;background-color:#111216;color:#f3f4f6;padding:4px 8px;border-radius:4px;font-size:10px;line-height:1.3;white-space:nowrap;box-shadow:0 4px 12px #00000080;border:1px solid var(--relly-border);pointer-events:none;opacity:0;transform:translateY(4px);transition:opacity .18s var(--relly-ease),transform .18s var(--relly-ease);z-index:99999999}.relly-row:hover .relly-tooltip{opacity:1;transform:translateY(0)}.relly-checkbox-wrapper{display:flex;align-items:center;cursor:pointer;gap:6px}.relly-checkbox-box{width:16px;height:16px;border-radius:4px;background-color:var(--relly-input-bg);border:1px solid var(--relly-border);display:flex;align-items:center;justify-content:center;transition:background-color .18s var(--relly-ease),border-color .18s var(--relly-ease),transform .15s var(--relly-ease)}.relly-checkbox-wrapper:hover .relly-checkbox-box{border-color:var(--relly-accent);transform:scale(1.05)}.relly-checkbox-wrapper:active .relly-checkbox-box{transform:scale(.95)}.relly-checkbox-wrapper.relly-checked .relly-checkbox-box{background-color:var(--relly-accent);border-color:var(--relly-accent);animation:relly-pop .25s var(--relly-ease)}@keyframes relly-pop{0%{transform:scale(.85)}60%{transform:scale(1.15)}to{transform:scale(1)}}.relly-checkbox-icon{display:none;width:10px;height:10px;stroke:#fff;stroke-width:2.5;fill:none}.relly-checkbox-wrapper.relly-checked .relly-checkbox-icon{display:block}.relly-slider-container{display:flex;align-items:center;gap:8px;width:100%}.relly-slider-range{flex:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:4px;border-radius:2px;background:var(--relly-input-bg);outline:none;cursor:pointer;transition:background-color .15s var(--relly-ease)}.relly-slider-range::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:var(--relly-accent);cursor:pointer;box-shadow:0 1px 3px #0000004d;transition:transform .15s var(--relly-ease),background-color .15s}.relly-slider-range::-webkit-slider-thumb:hover{transform:scale(1.25);background:var(--relly-accent-hover)}.relly-slider-range::-webkit-slider-thumb:active{transform:scale(1.35)}.relly-slider-number{width:50px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right;outline:none;transition:border-color .15s var(--relly-ease),background-color .15s}.relly-slider-number:focus{border-color:var(--relly-accent);background:var(--relly-input-hover)}.relly-btn{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;font-weight:500;padding:4px 10px;cursor:pointer;transition:background-color .15s var(--relly-ease),border-color .15s,color .15s,transform .1s var(--relly-ease);text-align:center}.relly-btn:hover{background-color:var(--relly-input-hover);border-color:var(--relly-accent);color:#fff;transform:translateY(-1px)}.relly-btn:active{transform:translateY(1px) scale(.98)}.relly-select-input{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:3px 6px;outline:none;cursor:pointer;transition:border-color .15s var(--relly-ease),background-color .15s}.relly-select-input:focus{border-color:var(--relly-accent);background:var(--relly-input-hover)}.relly-dynamic-value{color:var(--relly-accent);font-weight:500;font-family:monospace;font-size:11px;background:#6366f11a;padding:2px 6px;border-radius:4px;border:1px solid rgba(99,102,241,.2);transition:all .2s var(--relly-ease)}.relly-color-wrapper{display:flex;align-items:center;gap:6px;width:100%;justify-content:flex-end}.relly-color-preview{width:20px;height:20px;border-radius:4px;border:1px solid var(--relly-border);cursor:pointer;box-shadow:inset 0 0 2px #0006;transition:transform .15s var(--relly-ease),border-color .15s}.relly-color-preview:hover{transform:scale(1.15);border-color:#fff}.relly-eyedropper-btn{background:transparent;border:none;color:var(--relly-fg);cursor:pointer;opacity:.7;padding:2px 4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:opacity .15s var(--relly-ease),transform .1s var(--relly-ease)}.relly-eyedropper-btn svg{width:13px;height:13px}.relly-eyedropper-btn:hover{opacity:1;color:var(--relly-accent);transform:scale(1.15)}.relly-color-native{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.relly-color-text{font-family:monospace;font-size:11px;color:var(--relly-fg)}.relly-color-swatches{display:flex;align-items:center;gap:3px;flex-wrap:wrap;margin-right:4px}.relly-color-swatch{width:14px;height:14px;border-radius:3px;border:1px solid rgba(255,255,255,.2);cursor:pointer;padding:0;box-sizing:border-box;transition:transform .12s var(--relly-ease),border-color .12s;box-shadow:inset 0 0 2px #00000059}.relly-color-swatch:hover{transform:scale(1.25);border-color:#fff;z-index:2}.relly-color-swatch.relly-swatch-active{border:1.5px solid #fff;box-shadow:0 0 4px var(--relly-accent)}.relly-point2d-container{display:flex;align-items:center;gap:4px;width:100%}.relly-point2d-item{display:flex;align-items:center;gap:2px;flex:1}.relly-point2d-tag{font-size:10px;font-weight:600;color:var(--relly-accent);font-family:monospace}.relly-point2d-input{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right;outline:none;transition:border-color .15s var(--relly-ease)}.relly-point2d-input:focus{border-color:var(--relly-accent)}.relly-graph-row{display:flex;flex-direction:column;padding:6px 10px;border-bottom:1px solid var(--relly-border);gap:5px;transition:opacity .2s var(--relly-ease)}.relly-graph-row.relly-search-hidden{display:none!important}.relly-graph-header{display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--relly-fg)}.relly-graph-label{font-weight:500;opacity:.85}.relly-graph-stats{display:flex;align-items:center;gap:5px;font-family:monospace;font-size:10px}.relly-graph-badge{opacity:.55;font-size:9px}.relly-graph-badge--paused{opacity:1!important;color:#f59e0b;background:#f59e0b2e;font-weight:700;border-radius:3px;padding:1px 4px;border:1px solid rgba(245,158,11,.4);letter-spacing:.5px}.relly-graph-val{color:var(--relly-accent);font-weight:600;background:#6366f11f;padding:1px 4px;border-radius:3px;border:1px solid rgba(99,102,241,.2)}.relly-graph-legend{display:none;align-items:center;gap:8px;font-size:9px;font-family:monospace;opacity:.75;margin-top:-2px}.relly-graph-legend-item{display:flex;align-items:center;gap:4px}.relly-graph-legend-dot{width:6px;height:6px;border-radius:50%;display:inline-block}.relly-graph-canvas-container{width:100%;height:90px;background:var(--relly-input-bg);border-radius:4px;border:1px solid var(--relly-border);overflow:hidden;position:relative;box-shadow:inset 0 2px 6px #00000040;cursor:crosshair;transition:border-color .2s ease,box-shadow .2s ease}.relly-graph-canvas-container.relly-graph-paused{border-color:#f59e0b;box-shadow:inset 0 2px 6px #00000040,0 0 10px #f59e0b40}.relly-graph-canvas{width:100%;height:100%;display:block}.relly-graph-tooltip{position:absolute;pointer-events:none;background:#0f172aeb;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:1px solid var(--relly-border);border-radius:4px;padding:3px 6px;font-size:9px;font-family:monospace;color:#fff;white-space:nowrap;z-index:10;transform:translate(-50%);opacity:0;transition:opacity .12s ease;box-shadow:0 4px 12px #00000080}.relly-graph-tooltip.relly-tooltip-show{opacity:1}.relly-section{display:flex;flex-direction:column;border-bottom:1px solid var(--relly-border);transition:opacity .2s var(--relly-ease)}.relly-section.relly-search-hidden{display:none!important}.relly-section-header{display:flex;align-items:center;justify-content:space-between;padding:5px 10px;background-color:#ffffff05;cursor:pointer;font-weight:600;color:var(--relly-header-fg);transition:background-color .15s var(--relly-ease)}.relly-section-header:hover{background-color:#ffffff0d}.relly-section-title-wrap{display:flex;align-items:center;gap:6px}.relly-section-arrow{width:12px;height:12px;transition:transform .22s var(--relly-ease);fill:currentColor}.relly-section.relly-section--collapsed .relly-section-arrow{transform:rotate(-90deg)}.relly-section-content{display:flex;flex-direction:column;padding-left:6px;border-left:2px solid var(--relly-accent);transition:opacity .2s var(--relly-ease)}.relly-section.relly-section--collapsed .relly-section-content{display:none}.relly-disabled,.relly-component-row.relly-disabled,.relly-section.relly-disabled{opacity:.42!important;pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important;filter:grayscale(.5)}.relly-jog-scrubbing,.relly-jog-scrubbing *{cursor:ew-resize!important;-webkit-user-select:none!important;user-select:none!important}.relly-mini-sparkline{width:48px;height:16px;display:inline-block;vertical-align:middle;margin-left:6px;border-radius:3px;background:#00000040}.relly-point3d-container{display:flex;align-items:center;gap:4px;width:100%}.relly-point3d-item{display:flex;align-items:center;gap:2px;flex:1;min-width:0}.relly-point3d-tag{font-size:9px;font-weight:700;line-height:1;padding:2px 4px;border-radius:3px;text-transform:uppercase}.relly-point3d-tag--x{background-color:#ef444433;color:#ef4444;border:1px solid rgba(239,68,68,.4)}.relly-point3d-tag--y{background-color:#22c55e33;color:#22c55e;border:1px solid rgba(34,197,94,.4)}.relly-point3d-tag--z{background-color:#3b82f633;color:#3b82f6;border:1px solid rgba(59,130,246,.4)}.relly-point3d-input{width:100%;min-width:24px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:3px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right;cursor:ew-resize}.relly-range-wrapper{display:flex;align-items:center;gap:6px;width:100%}.relly-range-track{flex:1;height:6px;background:var(--relly-input-bg);border-radius:9999px;position:relative;cursor:pointer;box-shadow:inset 0 1px 2px #0000004d}.relly-range-bar{position:absolute;top:0;bottom:0;background:var(--relly-accent);border-radius:9999px;cursor:grab;transition:background-color .15s}.relly-range-bar:active{cursor:grabbing;background:var(--relly-accent-hover)}.relly-range-thumb{position:absolute;top:50%;width:12px;height:12px;border-radius:50%;background:#fff;border:2px solid var(--relly-accent);transform:translate(-50%,-50%);cursor:grab;z-index:2;transition:transform .1s var(--relly-ease),box-shadow .15s;box-shadow:0 1px 4px #0006}.relly-range-thumb:hover{transform:translate(-50%,-50%) scale(1.2);box-shadow:0 0 6px var(--relly-accent)}.relly-range-thumb:active{cursor:grabbing;transform:translate(-50%,-50%) scale(1.25)}.relly-range-input{width:38px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:3px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right}.relly-segmented-container{display:flex;position:relative;background:var(--relly-input-bg);border-radius:4px;border:1px solid var(--relly-border);padding:2px;width:100%;overflow:hidden}.relly-segmented-glider{position:absolute;top:2px;bottom:2px;background:var(--relly-accent);border-radius:3px;box-shadow:0 1px 4px #00000059;transition:transform .2s var(--relly-ease),width .2s var(--relly-ease),opacity .15s;pointer-events:none;z-index:1}.relly-segmented-btn{flex:1;position:relative;background:transparent;border:none;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:3px 6px;cursor:pointer;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;z-index:2;transition:color .15s var(--relly-ease)}.relly-segmented-btn:hover{color:#fff}.relly-segmented-btn.relly-segmented-btn--active{color:#fff;font-weight:600}.relly-status-wrapper{display:flex;align-items:center;gap:8px;width:100%;justify-content:flex-end}.relly-status-led{position:relative;width:8px;height:8px;display:flex;align-items:center;justify-content:center}.relly-status-led-core{width:7px;height:7px;border-radius:50%;background-color:#22c55e;position:relative;z-index:2}.relly-status-pulse-ring{position:absolute;width:100%;height:100%;border-radius:50%;background-color:inherit;opacity:.75;animation:relly-status-pulse 2s cubic-bezier(.24,0,.38,1) infinite;z-index:1}@keyframes relly-status-pulse{0%{transform:scale(.95);opacity:.8}70%{transform:scale(2.4);opacity:0}to{transform:scale(2.4);opacity:0}}.relly-status-led--online .relly-status-led-core,.relly-status-led--online .relly-status-pulse-ring{background-color:#22c55e}.relly-status-led--busy .relly-status-led-core,.relly-status-led--busy .relly-status-pulse-ring{background-color:#f59e0b}.relly-status-led--offline .relly-status-led-core,.relly-status-led--offline .relly-status-pulse-ring{background-color:#ef4444}.relly-status-led--info .relly-status-led-core,.relly-status-led--info .relly-status-pulse-ring{background-color:#3b82f6}.relly-status-led--ready .relly-status-led-core,.relly-status-led--ready .relly-status-pulse-ring{background-color:#a855f7}.relly-status-badge{font-size:10px;font-weight:700;padding:1px 6px;border-radius:9999px;text-transform:uppercase;letter-spacing:.04em;background:#ffffff14}.relly-status-badge--online{color:#22c55e;background:#22c55e26}.relly-status-badge--busy{color:#f59e0b;background:#f59e0b26}.relly-status-badge--offline{color:#ef4444;background:#ef444426}.relly-status-badge--info{color:#3b82f6;background:#3b82f626}.relly-status-badge--ready{color:#a855f7;background:#a855f726}.relly-status-detail{font-size:10px;color:var(--relly-fg);opacity:.7;font-family:monospace}', I = "relly-ui-stylesheet";
2195
- function $(y) {
2196
- const i = y || (typeof document < "u" ? document : null);
2197
- if (!i || "getElementById" in i && i.getElementById(I) || "querySelector" in i && i.querySelector(`#${I}`)) return;
2530
+ const xe = ':root{--relly-bg: #1c1d22;--relly-fg: #d1d5db;--relly-header-bg: #141518;--relly-header-fg: #f3f4f6;--relly-accent: #6366f1;--relly-accent-hover: #4f46e5;--relly-border: rgba(255, 255, 255, .08);--relly-input-bg: #26272e;--relly-input-hover: #2f3039;--relly-radius: 6px;--relly-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--relly-font-size: 11px;--relly-row-height: 26px;--relly-ease: cubic-bezier(.16, 1, .3, 1);--relly-transition: all .2s var(--relly-ease)}.relly-host{position:fixed;z-index:999999;pointer-events:none}.relly-panel{position:fixed;z-index:999999;background-color:var(--relly-bg);color:var(--relly-fg);border:1px solid var(--relly-border);border-radius:var(--relly-radius);box-shadow:0 10px 25px -5px #00000080,0 8px 10px -6px #0006;font-family:var(--relly-font);font-size:var(--relly-font-size);-webkit-user-select:none;user-select:none;box-sizing:border-box;overflow:hidden!important;overflow-x:hidden!important;display:flex;flex-direction:column;pointer-events:auto;opacity:1;transform:scale(1) translateY(0);transition:opacity .22s var(--relly-ease),transform .22s var(--relly-ease);min-width:240px;min-height:120px;max-width:calc(100vw - 16px);max-height:calc(100vh - 16px);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}.relly-panel.relly-mini-hud{width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;border-radius:9999px!important;box-shadow:0 4px 20px #0006,0 0 0 1px var(--relly-accent)}.relly-panel.relly-mini-hud .relly-header{border-bottom:none;padding:5px 12px;border-radius:9999px;background-color:var(--relly-bg)}.relly-panel.relly-mini-hud .relly-body,.relly-panel.relly-mini-hud .relly-search-bar,.relly-panel.relly-mini-hud .relly-tabs-bar,.relly-panel.relly-mini-hud .relly-resize-handle,.relly-panel.relly-mini-hud .relly-header-btn:not(.relly-minihud-btn){display:none!important}.relly-panel.relly-mini-hud .relly-header-title:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background-color:var(--relly-accent);box-shadow:0 0 6px var(--relly-accent);margin-right:6px;animation:relly-pulse 2s infinite ease-in-out}@keyframes relly-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.85)}}.relly-panel *{box-sizing:border-box}.relly-panel,.relly-panel *,.relly-body,.relly-tabs-bar,.relly-search-bar{scrollbar-width:none!important;-ms-overflow-style:none!important}.relly-panel *::-webkit-scrollbar,.relly-panel::-webkit-scrollbar,.relly-body::-webkit-scrollbar,.relly-tabs-bar::-webkit-scrollbar{display:none!important;width:0!important;height:0!important}.relly-panel.relly-hidden{opacity:0!important;transform:scale(.95) translateY(-6px)!important;pointer-events:none!important}.relly-header{display:flex;align-items:center;justify-content:space-between;background-color:var(--relly-header-bg);color:var(--relly-header-fg);padding:6px 10px;font-weight:600;border-bottom:1px solid var(--relly-border);cursor:grab;transition:background-color .2s var(--relly-ease);flex-shrink:0}.relly-header:active{cursor:grabbing}.relly-header-title{display:flex;align-items:center;gap:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.relly-header-title svg{width:14px;height:14px;color:var(--relly-accent);transition:transform .2s var(--relly-ease)}.relly-header-title:hover svg{transform:rotate(15deg)}.relly-header-actions{display:flex;align-items:center;gap:4px}.relly-header-btn{background:transparent;border:none;color:var(--relly-fg);opacity:.7;padding:2px 6px;border-radius:4px;cursor:pointer;font-family:inherit;font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center;transition:opacity .15s,background-color .15s,transform .1s var(--relly-ease)}.relly-header-btn:hover{opacity:1;background-color:#ffffff1a;transform:scale(1.08)}.relly-header-btn:active{transform:scale(.92)}.relly-resize-handle{position:absolute;bottom:0;right:0;width:14px;height:14px;cursor:se-resize;display:flex;align-items:center;justify-content:center;opacity:.4;transition:opacity .15s var(--relly-ease);z-index:100}.relly-resize-handle svg{width:9px;height:9px;stroke:var(--relly-fg);stroke-width:1.5}.relly-resize-handle:hover{opacity:1}.relly-search-bar{display:flex;align-items:center;padding:4px 8px;background-color:#0003;border-bottom:1px solid var(--relly-border);gap:6px;flex-shrink:0}.relly-search-input{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:3px 6px;outline:none;transition:border-color .15s var(--relly-ease),background-color .15s}.relly-search-input:focus{border-color:var(--relly-accent);background-color:var(--relly-input-hover)}.relly-search-clear{background:none;border:none;color:var(--relly-fg);cursor:pointer;opacity:.5;font-size:10px;padding:0 4px;transition:opacity .15s}.relly-search-clear:hover{opacity:1}.relly-tabs-bar{display:flex;background-color:var(--relly-header-bg);border-bottom:1px solid var(--relly-border);overflow-x:auto;overflow-y:hidden;flex-shrink:0;scrollbar-width:none!important;-ms-overflow-style:none!important}.relly-tabs-bar::-webkit-scrollbar{display:none!important;width:0!important;height:0!important}.relly-tab-btn{flex:1;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--relly-fg);opacity:.6;padding:5px 8px;font-family:inherit;font-size:11px;cursor:pointer;white-space:nowrap;transition:all .2s var(--relly-ease)}.relly-tab-btn:hover{opacity:.9;background-color:#ffffff08}.relly-tab-btn.relly-tab-active{opacity:1;color:var(--relly-accent);border-bottom-color:var(--relly-accent)}.relly-tab-content{display:none}.relly-tab-content.relly-tab-content--active{display:flex;flex-direction:column}.relly-body{display:flex;flex-direction:column;overflow-y:auto!important;overflow-x:hidden!important;max-height:80vh;flex:1;transition:max-height .25s var(--relly-ease);scrollbar-width:none!important;-ms-overflow-style:none!important}.relly-body::-webkit-scrollbar{display:none!important;width:0!important;height:0!important}.relly-panel.relly-collapsed .relly-body{display:none}.relly-copy-toast{position:absolute;top:36px;right:10px;background:var(--relly-accent);color:#fff;padding:3px 8px;border-radius:4px;font-size:10px;font-weight:600;box-shadow:0 4px 12px #0000004d;pointer-events:none;opacity:0;transform:translateY(-6px);transition:opacity .2s var(--relly-ease),transform .2s var(--relly-ease);z-index:9999999}.relly-copy-toast.relly-toast-show{opacity:1;transform:translateY(0)}.relly-modal-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:999999;display:flex;align-items:center;justify-content:center;padding:12px;opacity:0;pointer-events:none;transition:opacity .2s var(--relly-ease)}.relly-modal-backdrop.relly-modal-show{opacity:1;pointer-events:auto}.relly-modal{width:100%;max-width:320px;background:var(--relly-bg);border:1px solid var(--relly-border);border-radius:var(--relly-radius);box-shadow:0 12px 30px #0009;padding:12px;display:flex;flex-direction:column;gap:8px;transform:scale(.95);transition:transform .2s var(--relly-ease)}.relly-modal-backdrop.relly-modal-show .relly-modal{transform:scale(1)}.relly-modal-header{display:flex;justify-content:space-between;align-items:center;font-weight:600;color:var(--relly-header-fg);font-size:12px}.relly-dropzone{border:1.5px dashed var(--relly-border);border-radius:4px;padding:12px;text-align:center;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--relly-fg);opacity:.8;font-size:11px;background:#00000026;transition:all .2s var(--relly-ease)}.relly-dropzone:hover,.relly-dropzone.relly-dropzone-drag{border-color:var(--relly-accent);opacity:1;background:#6366f114}.relly-import-textarea{width:100%;height:90px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:monospace;font-size:10px;padding:6px;outline:none;resize:vertical}.relly-import-textarea:focus{border-color:var(--relly-accent)}.relly-import-error{color:#ef4444;font-size:10px;min-height:12px}.relly-modal-actions{display:flex;gap:6px}.relly-btn-primary{background:var(--relly-accent)!important;color:#fff!important;border-color:var(--relly-accent)!important}.relly-btn-primary:hover{background:var(--relly-accent-hover)!important}.relly-toast-container{position:absolute;top:36px;right:8px;display:flex;flex-direction:column;gap:6px;z-index:9999999;pointer-events:none;max-width:240px}.relly-toast{display:flex;align-items:center;gap:6px;padding:6px 8px;background:var(--relly-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-size:11px;box-shadow:0 4px 16px #00000073;pointer-events:auto;opacity:0;transform:translateY(-8px) scale(.96);transition:opacity .2s var(--relly-ease),transform .2s var(--relly-ease);cursor:pointer}.relly-toast.relly-toast-enter{opacity:1;transform:translateY(0) scale(1)}.relly-toast.relly-toast-leave{opacity:0;transform:translateY(-6px) scale(.95)}.relly-toast-icon svg{width:14px;height:14px;display:block}.relly-toast--success{border-left:3px solid #22c55e}.relly-toast--success .relly-toast-icon{color:#22c55e}.relly-toast--warning{border-left:3px solid #f59e0b}.relly-toast--warning .relly-toast-icon{color:#f59e0b}.relly-toast--error{border-left:3px solid #ef4444}.relly-toast--error .relly-toast-icon{color:#ef4444}.relly-toast--info{border-left:3px solid var(--relly-accent)}.relly-toast--info .relly-toast-icon{color:var(--relly-accent)}.relly-toast-msg{flex:1;line-height:1.3;overflow:hidden;text-overflow:ellipsis}.relly-toast-close{background:transparent;border:none;color:var(--relly-fg);opacity:.5;cursor:pointer;padding:0 2px;font-size:11px}.relly-toast-close:hover{opacity:1}.relly-context-menu{position:absolute;background:var(--relly-bg);border:1px solid var(--relly-border);border-radius:var(--relly-radius);box-shadow:0 8px 24px #0000008c;padding:4px;display:flex;flex-direction:column;min-width:140px;z-index:99999999;animation:relly-menu-in .15s var(--relly-ease)}@keyframes relly-menu-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.relly-context-item{display:flex;align-items:center;gap:6px;background:transparent;border:none;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:5px 8px;border-radius:3px;cursor:pointer;text-align:left;transition:background-color .12s var(--relly-ease),color .12s}.relly-context-item:hover:not(:disabled){background-color:var(--relly-accent);color:#fff}.relly-context-item:disabled{opacity:.4;cursor:not-allowed}.relly-context-item--danger:hover:not(:disabled){background-color:#ef4444!important;color:#fff!important}.relly-context-separator{height:1px;background-color:var(--relly-border);margin:3px 0}.relly-row{display:flex;align-items:center;justify-content:space-between;min-height:var(--relly-row-height);padding:3px 10px;border-bottom:1px solid var(--relly-border);position:relative;transition:background-color .15s var(--relly-ease),opacity .2s var(--relly-ease)}.relly-row:hover{background-color:#ffffff08}.relly-row.relly-search-hidden{display:none!important}.relly-row-label{flex:0 0 40%;max-width:40%;color:var(--relly-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--relly-font-size);cursor:default;position:relative}.relly-row-control{flex:1;display:flex;align-items:center;justify-content:flex-end;gap:6px;min-width:0}.relly-multi-row{display:flex;align-items:stretch;width:100%;border-bottom:1px solid var(--relly-border)}.relly-multi-row .relly-row{flex:1;border-bottom:none;border-right:1px solid var(--relly-border);padding:3px 6px}.relly-multi-row .relly-row:last-child{border-right:none}.relly-multi-row .relly-row-label{flex:0 0 auto;max-width:none;margin-right:4px}.relly-tooltip{position:absolute;bottom:calc(100% + 4px);left:10px;background-color:#111216;color:#f3f4f6;padding:4px 8px;border-radius:4px;font-size:10px;line-height:1.3;white-space:nowrap;box-shadow:0 4px 12px #00000080;border:1px solid var(--relly-border);pointer-events:none;opacity:0;transform:translateY(4px);transition:opacity .18s var(--relly-ease),transform .18s var(--relly-ease);z-index:99999999}.relly-row:hover .relly-tooltip{opacity:1;transform:translateY(0)}.relly-checkbox-wrapper{display:flex;align-items:center;cursor:pointer;gap:6px}.relly-checkbox-box{width:16px;height:16px;border-radius:4px;background-color:var(--relly-input-bg);border:1px solid var(--relly-border);display:flex;align-items:center;justify-content:center;transition:background-color .18s var(--relly-ease),border-color .18s var(--relly-ease),transform .15s var(--relly-ease)}.relly-checkbox-wrapper:hover .relly-checkbox-box{border-color:var(--relly-accent);transform:scale(1.05)}.relly-checkbox-wrapper:active .relly-checkbox-box{transform:scale(.95)}.relly-checkbox-wrapper.relly-checked .relly-checkbox-box{background-color:var(--relly-accent);border-color:var(--relly-accent);animation:relly-pop .25s var(--relly-ease)}@keyframes relly-pop{0%{transform:scale(.85)}60%{transform:scale(1.15)}to{transform:scale(1)}}.relly-checkbox-icon{display:none;width:10px;height:10px;stroke:#fff;stroke-width:2.5;fill:none}.relly-checkbox-wrapper.relly-checked .relly-checkbox-icon{display:block}.relly-slider-container{display:flex;align-items:center;gap:8px;width:100%}.relly-slider-range{flex:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:4px;border-radius:2px;background:var(--relly-input-bg);outline:none;cursor:pointer;transition:background-color .15s var(--relly-ease)}.relly-slider-range::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:var(--relly-accent);cursor:pointer;box-shadow:0 1px 3px #0000004d;transition:transform .15s var(--relly-ease),background-color .15s}.relly-slider-range::-webkit-slider-thumb:hover{transform:scale(1.25);background:var(--relly-accent-hover)}.relly-slider-range::-webkit-slider-thumb:active{transform:scale(1.35)}.relly-slider-number{width:50px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right;outline:none;transition:border-color .15s var(--relly-ease),background-color .15s}.relly-slider-number:focus{border-color:var(--relly-accent);background:var(--relly-input-hover)}.relly-btn{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;font-weight:500;padding:4px 10px;cursor:pointer;transition:background-color .15s var(--relly-ease),border-color .15s,color .15s,transform .1s var(--relly-ease);text-align:center}.relly-btn:hover{background-color:var(--relly-input-hover);border-color:var(--relly-accent);color:#fff;transform:translateY(-1px)}.relly-btn:active{transform:translateY(1px) scale(.98)}.relly-select-input{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:3px 6px;outline:none;cursor:pointer;transition:border-color .15s var(--relly-ease),background-color .15s}.relly-select-input:focus{border-color:var(--relly-accent);background:var(--relly-input-hover)}.relly-dynamic-value{color:var(--relly-accent);font-weight:500;font-family:monospace;font-size:11px;background:#6366f11a;padding:2px 6px;border-radius:4px;border:1px solid rgba(99,102,241,.2);transition:all .2s var(--relly-ease)}.relly-color-wrapper{display:flex;align-items:center;gap:6px;width:100%;justify-content:flex-end}.relly-color-preview{width:20px;height:20px;border-radius:4px;border:1px solid var(--relly-border);cursor:pointer;box-shadow:inset 0 0 2px #0006;transition:transform .15s var(--relly-ease),border-color .15s}.relly-color-preview:hover{transform:scale(1.15);border-color:#fff}.relly-eyedropper-btn{background:transparent;border:none;color:var(--relly-fg);cursor:pointer;opacity:.7;padding:2px 4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:opacity .15s var(--relly-ease),transform .1s var(--relly-ease)}.relly-eyedropper-btn svg{width:13px;height:13px}.relly-eyedropper-btn:hover{opacity:1;color:var(--relly-accent);transform:scale(1.15)}.relly-color-native{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.relly-color-text{font-family:monospace;font-size:11px;color:var(--relly-fg);background:transparent;border:1px solid transparent;border-radius:var(--relly-radius);padding:2px 4px;width:72px;text-transform:uppercase;transition:all .15s ease}.relly-color-text:hover{border-color:#fff3;background:var(--relly-input-bg)}.relly-color-text:focus{outline:none;border-color:var(--relly-accent);background:var(--relly-input-bg);box-shadow:0 0 0 2px #38bdf833}.relly-color-swatches{display:flex;align-items:center;gap:3px;flex-wrap:wrap;margin-right:4px}.relly-color-swatch{width:14px;height:14px;border-radius:3px;border:1px solid rgba(255,255,255,.2);cursor:pointer;padding:0;box-sizing:border-box;transition:transform .12s var(--relly-ease),border-color .12s;box-shadow:inset 0 0 2px #00000059}.relly-color-swatch:hover{transform:scale(1.25);border-color:#fff;z-index:2}.relly-color-swatch.relly-swatch-active{border:1.5px solid #fff;box-shadow:0 0 4px var(--relly-accent)}.relly-point2d-container{display:flex;align-items:center;gap:4px;width:100%}.relly-point2d-item{display:flex;align-items:center;gap:2px;flex:1}.relly-point2d-tag{font-size:10px;font-weight:600;color:var(--relly-accent);font-family:monospace}.relly-point2d-input{width:100%;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:4px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right;outline:none;transition:border-color .15s var(--relly-ease)}.relly-point2d-input:focus{border-color:var(--relly-accent)}.relly-graph-row{display:flex;flex-direction:column;padding:6px 10px;border-bottom:1px solid var(--relly-border);gap:5px;transition:opacity .2s var(--relly-ease)}.relly-graph-row.relly-search-hidden{display:none!important}.relly-graph-header{display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--relly-fg)}.relly-graph-label{font-weight:500;opacity:.85}.relly-graph-stats{display:flex;align-items:center;gap:5px;font-family:monospace;font-size:10px}.relly-graph-badge{opacity:.55;font-size:9px}.relly-graph-badge--paused{opacity:1!important;color:#f59e0b;background:#f59e0b2e;font-weight:700;border-radius:3px;padding:1px 4px;border:1px solid rgba(245,158,11,.4);letter-spacing:.5px}.relly-graph-val{color:var(--relly-accent);font-weight:600;background:#6366f11f;padding:1px 4px;border-radius:3px;border:1px solid rgba(99,102,241,.2)}.relly-graph-legend{display:none;align-items:center;gap:8px;font-size:9px;font-family:monospace;opacity:.75;margin-top:-2px}.relly-graph-legend-item{display:flex;align-items:center;gap:4px}.relly-graph-legend-dot{width:6px;height:6px;border-radius:50%;display:inline-block}.relly-graph-canvas-container{width:100%;height:90px;background:var(--relly-input-bg);border-radius:4px;border:1px solid var(--relly-border);overflow:hidden;position:relative;box-shadow:inset 0 2px 6px #00000040;cursor:crosshair;transition:border-color .2s ease,box-shadow .2s ease}.relly-graph-canvas-container.relly-graph-paused{border-color:#f59e0b;box-shadow:inset 0 2px 6px #00000040,0 0 10px #f59e0b40}.relly-graph-canvas{width:100%;height:100%;display:block}.relly-graph-tooltip{position:absolute;pointer-events:none;background:#0f172aeb;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:1px solid var(--relly-border);border-radius:4px;padding:3px 6px;font-size:9px;font-family:monospace;color:#fff;white-space:nowrap;z-index:10;transform:translate(-50%);opacity:0;transition:opacity .12s ease;box-shadow:0 4px 12px #00000080}.relly-graph-tooltip.relly-tooltip-show{opacity:1}.relly-section{display:flex;flex-direction:column;border-bottom:1px solid var(--relly-border);transition:opacity .2s var(--relly-ease)}.relly-section.relly-search-hidden{display:none!important}.relly-section-header{display:flex;align-items:center;justify-content:space-between;padding:5px 10px;background-color:#ffffff05;cursor:pointer;font-weight:600;color:var(--relly-header-fg);transition:background-color .15s var(--relly-ease)}.relly-section-header:hover{background-color:#ffffff0d}.relly-section-title-wrap{display:flex;align-items:center;gap:6px}.relly-section-arrow{width:12px;height:12px;transition:transform .22s var(--relly-ease);fill:currentColor}.relly-section.relly-section--collapsed .relly-section-arrow{transform:rotate(-90deg)}.relly-section-content{display:flex;flex-direction:column;padding-left:6px;border-left:2px solid var(--relly-accent);transition:opacity .2s var(--relly-ease)}.relly-section.relly-section--collapsed .relly-section-content{display:none}.relly-disabled,.relly-component-row.relly-disabled,.relly-section.relly-disabled{opacity:.42!important;pointer-events:none!important;-webkit-user-select:none!important;user-select:none!important;filter:grayscale(.5)}.relly-jog-scrubbing,.relly-jog-scrubbing *{cursor:ew-resize!important;-webkit-user-select:none!important;user-select:none!important}.relly-mini-sparkline{width:48px;height:16px;display:inline-block;vertical-align:middle;margin-left:6px;border-radius:3px;background:#00000040}.relly-point3d-container{display:flex;align-items:center;gap:4px;width:100%}.relly-point3d-item{display:flex;align-items:center;gap:2px;flex:1;min-width:0}.relly-point3d-tag{font-size:9px;font-weight:700;line-height:1;padding:2px 4px;border-radius:3px;text-transform:uppercase}.relly-point3d-tag--x{background-color:#ef444433;color:#ef4444;border:1px solid rgba(239,68,68,.4)}.relly-point3d-tag--y{background-color:#22c55e33;color:#22c55e;border:1px solid rgba(34,197,94,.4)}.relly-point3d-tag--z{background-color:#3b82f633;color:#3b82f6;border:1px solid rgba(59,130,246,.4)}.relly-point3d-input{width:100%;min-width:24px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:3px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right;cursor:ew-resize}.relly-range-wrapper{display:flex;align-items:center;gap:6px;width:100%}.relly-range-track{flex:1;height:6px;background:var(--relly-input-bg);border-radius:9999px;position:relative;cursor:pointer;box-shadow:inset 0 1px 2px #0000004d}.relly-range-bar{position:absolute;top:0;bottom:0;background:var(--relly-accent);border-radius:9999px;cursor:grab;transition:background-color .15s}.relly-range-bar:active{cursor:grabbing;background:var(--relly-accent-hover)}.relly-range-thumb{position:absolute;top:50%;width:12px;height:12px;border-radius:50%;background:#fff;border:2px solid var(--relly-accent);transform:translate(-50%,-50%);cursor:grab;z-index:2;transition:transform .1s var(--relly-ease),box-shadow .15s;box-shadow:0 1px 4px #0006}.relly-range-thumb:hover{transform:translate(-50%,-50%) scale(1.2);box-shadow:0 0 6px var(--relly-accent)}.relly-range-thumb:active{cursor:grabbing;transform:translate(-50%,-50%) scale(1.25)}.relly-range-input{width:38px;background:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:3px;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:2px 4px;text-align:right}.relly-segmented-container{display:flex;position:relative;background:var(--relly-input-bg);border-radius:4px;border:1px solid var(--relly-border);padding:2px;width:100%;overflow:hidden}.relly-segmented-glider{position:absolute;top:2px;bottom:2px;background:var(--relly-accent);border-radius:3px;box-shadow:0 1px 4px #00000059;transition:transform .2s var(--relly-ease),width .2s var(--relly-ease),opacity .15s;pointer-events:none;z-index:1}.relly-segmented-btn{flex:1;position:relative;background:transparent;border:none;color:var(--relly-fg);font-family:inherit;font-size:11px;padding:3px 6px;cursor:pointer;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;z-index:2;transition:color .15s var(--relly-ease)}.relly-segmented-btn:hover{color:#fff}.relly-segmented-btn.relly-segmented-btn--active{color:#fff;font-weight:600}.relly-status-wrapper{display:flex;align-items:center;gap:8px;width:100%;justify-content:flex-end}.relly-status-led{position:relative;width:8px;height:8px;display:flex;align-items:center;justify-content:center}.relly-status-led-core{width:7px;height:7px;border-radius:50%;background-color:#22c55e;position:relative;z-index:2}.relly-status-pulse-ring{position:absolute;width:100%;height:100%;border-radius:50%;background-color:inherit;opacity:.75;animation:relly-status-pulse 2s cubic-bezier(.24,0,.38,1) infinite;z-index:1}@keyframes relly-status-pulse{0%{transform:scale(.95);opacity:.8}70%{transform:scale(2.4);opacity:0}to{transform:scale(2.4);opacity:0}}.relly-status-led--online .relly-status-led-core,.relly-status-led--online .relly-status-pulse-ring{background-color:#22c55e}.relly-status-led--busy .relly-status-led-core,.relly-status-led--busy .relly-status-pulse-ring{background-color:#f59e0b}.relly-status-led--offline .relly-status-led-core,.relly-status-led--offline .relly-status-pulse-ring{background-color:#ef4444}.relly-status-led--info .relly-status-led-core,.relly-status-led--info .relly-status-pulse-ring{background-color:#3b82f6}.relly-status-led--ready .relly-status-led-core,.relly-status-led--ready .relly-status-pulse-ring{background-color:#a855f7}.relly-status-badge{font-size:10px;font-weight:700;padding:1px 6px;border-radius:9999px;text-transform:uppercase;letter-spacing:.04em;background:#ffffff14}.relly-status-badge--online{color:#22c55e;background:#22c55e26}.relly-status-badge--busy{color:#f59e0b;background:#f59e0b26}.relly-status-badge--offline{color:#ef4444;background:#ef444426}.relly-status-badge--info{color:#3b82f6;background:#3b82f626}.relly-status-badge--ready{color:#a855f7;background:#a855f726}.relly-status-detail{font-size:10px;color:var(--relly-fg);opacity:.7;font-family:monospace}.relly-switch-wrap{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.relly-switch-native{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.relly-switch-track{position:relative;width:34px;height:18px;border-radius:9999px;background-color:#ffffff29;border:1px solid rgba(255,255,255,.12);transition:all .22s cubic-bezier(.4,0,.2,1);display:inline-block}.relly-switch-wrap:hover .relly-switch-track{background-color:#ffffff3d;border-color:#fff3}.relly-switch-thumb{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background-color:#fff;box-shadow:0 1px 3px #0006;transition:transform .22s cubic-bezier(.34,1.56,.64,1),background-color .2s}.relly-switch-track--checked{background-color:var(--relly-accent);border-color:var(--relly-accent);box-shadow:0 0 10px var(--relly-accent)}.relly-switch-track--checked .relly-switch-thumb{transform:translate(16px);background-color:#fff}.relly-switch-text{font-size:10px;font-family:monospace;font-weight:700;color:var(--relly-fg);opacity:.8}.relly-button-group-row{padding:3px 0}.relly-button-group{display:flex;width:100%;gap:4px}.relly-btn--group{flex:1;min-width:0;padding:5px 8px;font-size:11px;font-weight:600;text-align:center;border-radius:var(--relly-radius);background-color:var(--relly-input-bg);color:var(--relly-fg);border:1px solid var(--relly-border);cursor:pointer;transition:all .16s var(--relly-ease)}.relly-btn--group:hover{background-color:var(--relly-input-hover);border-color:var(--relly-accent);transform:translateY(-1px)}.relly-btn--group:active{transform:translateY(1px)}.relly-btn--group.relly-btn--primary{background-color:var(--relly-accent);color:#0f172a;border-color:var(--relly-accent)}.relly-btn--group.relly-btn--primary:hover{filter:brightness(1.15);box-shadow:0 0 10px var(--relly-accent)}.relly-btn--group.relly-btn--danger{color:#f87171;border-color:#ef444459}.relly-btn--group.relly-btn--danger:hover{background-color:#ef44442e;border-color:#ef4444}.relly-text-wrap{position:relative;display:flex;align-items:center;width:100%}.relly-text-input{width:100%;background-color:var(--relly-input-bg);border:1px solid var(--relly-border);border-radius:var(--relly-radius);color:var(--relly-fg);font-size:11px;padding:4px 24px 4px 8px;outline:none;transition:all .15s ease}.relly-text-input:hover{background-color:var(--relly-input-hover);border-color:#fff3}.relly-text-input:focus{border-color:var(--relly-accent);background-color:var(--relly-input-hover);box-shadow:0 0 0 2px #38bdf833}.relly-text-clear{position:absolute;right:6px;background:none;border:none;color:var(--relly-fg);opacity:.45;cursor:pointer;font-size:10px;padding:2px 4px;line-height:1;transition:opacity .15s}.relly-text-clear:hover{opacity:1}.relly-progress-wrap{display:flex;align-items:center;gap:8px;width:100%}.relly-progress-track{flex:1;height:6px;border-radius:9999px;background-color:#ffffff1a;overflow:hidden;position:relative}.relly-progress-bar{height:100%;border-radius:9999px;background:linear-gradient(90deg,var(--relly-accent),#38bdf8);box-shadow:0 0 8px var(--relly-accent);transition:width .18s ease-out;width:0%}.relly-progress-text{font-size:10px;font-family:monospace;font-weight:700;color:var(--relly-fg);opacity:.8;min-width:32px;text-align:right}.relly-separator-row{padding:6px 0}.relly-separator{display:flex;align-items:center;gap:8px;width:100%}.relly-separator-line{flex:1;height:1px;background-color:#ffffff1f}.relly-separator--dashed .relly-separator-line{background:none;border-bottom:1px dashed rgba(255,255,255,.2);height:0}.relly-separator-title{font-size:9px;text-transform:uppercase;letter-spacing:.08em;font-weight:700;color:var(--relly-fg);opacity:.55;white-space:nowrap}', L = "relly-ui-stylesheet";
2531
+ function X(f) {
2532
+ const i = f || (typeof document < "u" ? document : null);
2533
+ if (!i || "getElementById" in i && i.getElementById(L) || "querySelector" in i && i.querySelector(`#${L}`)) return;
2198
2534
  const e = document.createElement("style");
2199
- e.id = I, e.textContent = me, "head" in i && i.head ? i.head.appendChild(e) : i.appendChild(e);
2535
+ e.id = L, e.textContent = xe, "head" in i && i.head ? i.head.appendChild(e) : i.appendChild(e);
2200
2536
  }
2201
2537
  const S = class S extends T {
2538
+ // Calm, readable telemetry rate (~5.5 samples per sec)
2202
2539
  constructor(e = {}) {
2203
- const t = e.shadowDOM !== !1, n = new G(), s = new W(), r = new re(e.sound !== !1, e.soundPack || "synth"), l = document.createElement("div");
2204
- l.className = "relly-panel";
2205
- const o = e.width ?? 280;
2206
- if (l.style.width = typeof o == "number" ? `${o}px` : o, e.height) {
2207
- const x = e.height;
2208
- l.style.height = typeof x == "number" ? `${x}px` : x;
2540
+ const t = e.shadowDOM !== !1, n = new Q(), s = new Z(), r = new ce(e.sound !== !1, e.soundPack || "synth"), o = document.createElement("div");
2541
+ o.className = "relly-panel";
2542
+ const a = e.width ?? 280;
2543
+ if (o.style.width = typeof a == "number" ? `${a}px` : a, e.height) {
2544
+ const b = e.height;
2545
+ o.style.height = typeof b == "number" ? `${b}px` : b;
2209
2546
  }
2210
2547
  const h = document.createElement("div");
2211
2548
  h.className = "relly-header";
@@ -2217,8 +2554,8 @@ const S = class S extends T {
2217
2554
  <line x1="9" y1="21" x2="9" y2="9"></line>
2218
2555
  </svg>
2219
2556
  `;
2220
- const u = document.createElement("span");
2221
- u.textContent = e.title || "RellyUI", c.appendChild(u);
2557
+ const m = document.createElement("span");
2558
+ m.textContent = e.title || "RellyUI", c.appendChild(m);
2222
2559
  const p = document.createElement("div");
2223
2560
  p.className = "relly-header-actions";
2224
2561
  const d = document.createElement("button");
@@ -2228,69 +2565,71 @@ const S = class S extends T {
2228
2565
  <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
2229
2566
  </svg>
2230
2567
  `, p.appendChild(d);
2231
- const f = document.createElement("button");
2232
- f.className = "relly-header-btn", f.title = "Import settings from JSON", f.innerHTML = `
2568
+ const y = document.createElement("button");
2569
+ y.className = "relly-header-btn", y.title = "Import settings from JSON", y.innerHTML = `
2233
2570
  <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
2234
2571
  <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
2235
2572
  <polyline points="7 10 12 15 17 10"></polyline>
2236
2573
  <line x1="12" y1="15" x2="12" y2="3"></line>
2237
2574
  </svg>
2238
- `, p.appendChild(f);
2239
- const b = document.createElement("button");
2240
- b.className = "relly-header-btn relly-minihud-btn", b.title = "Toggle Mini-HUD pill (or double-click header)", b.textContent = "⤢", p.appendChild(b);
2241
- const m = document.createElement("button");
2242
- m.className = "relly-header-btn", m.title = "Collapse/Expand", m.textContent = "_", p.appendChild(m), h.appendChild(c), h.appendChild(p), l.appendChild(h);
2575
+ `, p.appendChild(y);
2576
+ const x = document.createElement("button");
2577
+ x.className = "relly-header-btn relly-minihud-btn", x.title = "Toggle Mini-HUD pill (or double-click header)", x.textContent = "⤢", p.appendChild(x);
2578
+ const u = document.createElement("button");
2579
+ u.className = "relly-header-btn", u.title = "Collapse/Expand", u.textContent = "_", p.appendChild(u), h.appendChild(c), h.appendChild(p), o.appendChild(h);
2243
2580
  const v = document.createElement("div");
2244
- v.className = "relly-copy-toast", v.textContent = "JSON Copied!", l.appendChild(v);
2245
- const E = document.createElement("div");
2246
- E.className = "relly-body", e.height && (E.style.maxHeight = "none", E.style.flex = "1"), l.appendChild(E);
2247
- super(E, n, s, r);
2248
- a(this, "hostEl");
2249
- a(this, "shadowRoot", null);
2250
- a(this, "panelEl");
2251
- a(this, "headerEl");
2252
- a(this, "titleEl");
2253
- a(this, "collapseBtn");
2254
- a(this, "copyToastEl");
2255
- a(this, "themeManager");
2256
- a(this, "soundEngine");
2257
- a(this, "draggableInstance");
2258
- a(this, "resizableInstance");
2259
- a(this, "hotkeyInstance");
2260
- a(this, "searchBarInstance");
2261
- a(this, "tabsManagerInstance");
2262
- a(this, "importModalInstance");
2263
- a(this, "toastManager");
2264
- a(this, "contextMenuManager");
2265
- a(this, "isPanelCollapsed", !1);
2266
- a(this, "isPanelHidden", !1);
2267
- a(this, "isMiniHud", !1);
2268
- a(this, "ghostOnIdle", !1);
2269
- a(this, "idleOpacity", 0.38);
2270
- a(this, "onResizeBound");
2271
- a(this, "autoSave", !1);
2272
- a(this, "autoSaveKey", "relly-ui-session");
2273
- a(this, "autoSaveTimeout", null);
2274
- a(this, "sparklineCtx");
2275
- a(this, "sparklineData", [12, 14, 15, 18, 16, 20, 22, 21, 24, 25, 28, 30]);
2276
- a(this, "sparklineAnimId");
2277
- this.panelEl = l, this.headerEl = h, this.titleEl = u, this.collapseBtn = m, this.copyToastEl = v, this.soundEngine = r, this.onResizeBound = () => this.clampToViewport(), e.searchBar && (this.searchBarInstance = new se(E, e.searchOptions), h.insertAdjacentElement("afterend", this.searchBarInstance.element)), this.themeManager = new ee(this.panelEl, e.theme), this.mount(e, t), e.autoInjectStyles !== !1 && (this.shadowRoot ? $(this.shadowRoot) : $()), e.draggable !== !1 && (this.draggableInstance = new te(this.headerEl, this.panelEl, this.soundEngine)), e.resizable !== !1 && (this.resizableInstance = new ie(this.panelEl)), this.toastManager = new oe(this.panelEl, this.soundEngine), this.contextMenuManager = new he(this.panelEl, this.soundEngine), this.importModalInstance = new ae(this.panelEl, (x) => {
2278
- this.importJSON(x);
2581
+ v.className = "relly-copy-toast", v.textContent = "JSON Copied!", o.appendChild(v);
2582
+ const w = document.createElement("div");
2583
+ w.className = "relly-body", e.height && (w.style.maxHeight = "none", w.style.flex = "1"), o.appendChild(w);
2584
+ super(w, n, s, r);
2585
+ l(this, "hostEl");
2586
+ l(this, "shadowRoot", null);
2587
+ l(this, "panelEl");
2588
+ l(this, "headerEl");
2589
+ l(this, "titleEl");
2590
+ l(this, "collapseBtn");
2591
+ l(this, "copyToastEl");
2592
+ l(this, "themeManager");
2593
+ l(this, "soundEngine");
2594
+ l(this, "draggableInstance");
2595
+ l(this, "resizableInstance");
2596
+ l(this, "hotkeyInstance");
2597
+ l(this, "searchBarInstance");
2598
+ l(this, "tabsManagerInstance");
2599
+ l(this, "importModalInstance");
2600
+ l(this, "toastManager");
2601
+ l(this, "contextMenuManager");
2602
+ l(this, "isPanelCollapsed", !1);
2603
+ l(this, "isPanelHidden", !1);
2604
+ l(this, "isMiniHud", !1);
2605
+ l(this, "ghostOnIdle", !1);
2606
+ l(this, "idleOpacity", 0.38);
2607
+ l(this, "onResizeBound");
2608
+ l(this, "autoSave", !1);
2609
+ l(this, "autoSaveKey", "relly-ui-session");
2610
+ l(this, "autoSaveTimeout", null);
2611
+ l(this, "sparklineCtx");
2612
+ l(this, "sparklineData", [16, 17, 18, 17, 19, 20, 21, 20, 22, 23, 22, 24, 25, 24, 25, 26]);
2613
+ l(this, "sparklineAnimId");
2614
+ l(this, "lastSparklineTime", 0);
2615
+ l(this, "sparklineInterval", 180);
2616
+ this.panelEl = o, this.headerEl = h, this.titleEl = m, this.collapseBtn = u, this.copyToastEl = v, this.soundEngine = r, this.onResizeBound = () => this.clampToViewport(), e.searchBar && (this.searchBarInstance = new he(w, e.searchOptions), h.insertAdjacentElement("afterend", this.searchBarInstance.element)), this.themeManager = new le(this.panelEl, e.theme), this.mount(e, t), e.autoInjectStyles !== !1 && (this.shadowRoot ? X(this.shadowRoot) : X()), e.draggable !== !1 && (this.draggableInstance = new ae(this.headerEl, this.panelEl, this.soundEngine)), e.resizable !== !1 && (this.resizableInstance = new oe(this.panelEl)), this.toastManager = new ue(this.panelEl, this.soundEngine), this.contextMenuManager = new me(this.panelEl, this.soundEngine), this.importModalInstance = new de(this.panelEl, (b) => {
2617
+ this.importJSON(b);
2279
2618
  });
2280
2619
  const g = e.hotkey === void 0 ? "KeyH" : e.hotkey;
2281
- g && (this.hotkeyInstance = new ne(g, () => {
2620
+ g && (this.hotkeyInstance = new W(g, () => {
2282
2621
  this.toggle();
2283
- })), b.addEventListener("click", (x) => {
2284
- x.stopPropagation(), this.toggleMiniHud();
2285
- }), this.headerEl.addEventListener("dblclick", (x) => {
2286
- x.target.closest(".relly-header-btn") || this.toggleMiniHud();
2287
- }), this.collapseBtn.addEventListener("click", (x) => {
2288
- x.stopPropagation(), this.soundEngine.playClick(), this.toggleCollapse();
2289
- }), d.addEventListener("click", (x) => {
2290
- x.stopPropagation(), this.soundEngine.playClick(), this.copyJSON();
2291
- }), f.addEventListener("click", (x) => {
2292
- var w;
2293
- x.stopPropagation(), this.soundEngine.playClick(), (w = this.importModalInstance) == null || w.show();
2622
+ })), x.addEventListener("click", (b) => {
2623
+ b.stopPropagation(), this.toggleMiniHud();
2624
+ }), this.headerEl.addEventListener("dblclick", (b) => {
2625
+ b.target.closest(".relly-header-btn") || this.toggleMiniHud();
2626
+ }), this.collapseBtn.addEventListener("click", (b) => {
2627
+ b.stopPropagation(), this.soundEngine.playClick(), this.toggleCollapse();
2628
+ }), d.addEventListener("click", (b) => {
2629
+ b.stopPropagation(), this.soundEngine.playClick(), this.copyJSON();
2630
+ }), y.addEventListener("click", (b) => {
2631
+ var C;
2632
+ b.stopPropagation(), this.soundEngine.playClick(), (C = this.importModalInstance) == null || C.show();
2294
2633
  }), e.soundVolume !== void 0 && this.soundEngine.setVolume(e.soundVolume), e.accordion && this.setAccordion(!0), e.ghostOnIdle && this.setGhostMode(!0, e.idleOpacity), this.initSparkline(c), this.panelEl.addEventListener("mouseenter", () => {
2295
2634
  this.ghostOnIdle && (this.panelEl.style.opacity = "1");
2296
2635
  }), this.panelEl.addEventListener("mouseleave", () => {
@@ -2318,7 +2657,7 @@ const S = class S extends T {
2318
2657
  }
2319
2658
  }
2320
2659
  addTab(e) {
2321
- return this.tabsManagerInstance || (this.tabsManagerInstance = new de(
2660
+ return this.tabsManagerInstance || (this.tabsManagerInstance = new ye(
2322
2661
  this.headerEl,
2323
2662
  this.contentEl,
2324
2663
  this.bindingEngine,
@@ -2357,7 +2696,7 @@ const S = class S extends T {
2357
2696
  return this;
2358
2697
  }
2359
2698
  loadSchema(e) {
2360
- return e.title && this.setTitle(e.title), le.load(this, e), this;
2699
+ return e.title && this.setTitle(e.title), pe.load(this, e), this;
2361
2700
  }
2362
2701
  setTitle(e) {
2363
2702
  return this.titleEl.textContent = e, this;
@@ -2398,30 +2737,51 @@ const S = class S extends T {
2398
2737
  initSparkline(e) {
2399
2738
  const t = document.createElement("canvas");
2400
2739
  t.className = "relly-mini-sparkline", t.width = 48, t.height = 16, e.appendChild(t), this.sparklineCtx = t.getContext("2d");
2401
- const n = () => {
2402
- this.isMiniHud && this.sparklineCtx && this.drawSparkline(), typeof requestAnimationFrame < "u" && (this.sparklineAnimId = requestAnimationFrame(n));
2740
+ const n = (s) => {
2741
+ this.isMiniHud && this.sparklineCtx && (!this.lastSparklineTime || s - this.lastSparklineTime >= this.sparklineInterval) && (this.lastSparklineTime = s, this.updateSparklinePoint(), this.drawSparkline()), typeof requestAnimationFrame < "u" && (this.sparklineAnimId = requestAnimationFrame(n));
2403
2742
  };
2404
2743
  typeof requestAnimationFrame < "u" && (this.sparklineAnimId = requestAnimationFrame(n));
2405
2744
  }
2745
+ findActiveGraphValue() {
2746
+ for (const e of this.children)
2747
+ if (typeof e.getLatestValue == "function")
2748
+ return e.getLatestValue();
2749
+ if (this.tabsManagerInstance) {
2750
+ for (const e of this.tabsManagerInstance.getTabs())
2751
+ for (const t of e.children || [])
2752
+ if (typeof t.getLatestValue == "function")
2753
+ return t.getLatestValue();
2754
+ }
2755
+ return null;
2756
+ }
2757
+ updateSparklinePoint() {
2758
+ let e;
2759
+ const t = this.findActiveGraphValue();
2760
+ if (t !== null && !isNaN(t) && isFinite(t))
2761
+ e = t;
2762
+ else {
2763
+ const n = this.sparklineData[this.sparklineData.length - 1] ?? 20;
2764
+ e = Math.max(8, Math.min(28, n + (Math.random() - 0.49) * 2.2));
2765
+ }
2766
+ this.sparklineData.push(e), this.sparklineData.length > 20 && this.sparklineData.shift();
2767
+ }
2406
2768
  drawSparkline() {
2407
2769
  const e = this.sparklineCtx;
2408
2770
  if (!e) return;
2409
2771
  const t = 48, n = 16;
2410
- e.clearRect(0, 0, t, n);
2411
- const s = this.sparklineData[this.sparklineData.length - 1], r = Math.max(8, Math.min(26, s + (Math.random() - 0.48) * 3));
2412
- this.sparklineData.push(r), this.sparklineData.length > 14 && this.sparklineData.shift();
2413
- const l = Math.min(...this.sparklineData) - 1, h = Math.max(...this.sparklineData) + 1 - l || 1, c = t / (this.sparklineData.length - 1);
2772
+ if (e.clearRect(0, 0, t, n), this.sparklineData.length < 2) return;
2773
+ const s = Math.min(...this.sparklineData) - 1, o = Math.max(...this.sparklineData) + 1 - s || 1, a = t / (this.sparklineData.length - 1);
2414
2774
  e.beginPath(), e.moveTo(0, n);
2415
- for (let u = 0; u < this.sparklineData.length; u++) {
2416
- const p = u * c, d = n - (this.sparklineData[u] - l) / h * (n - 2) - 1;
2417
- e.lineTo(p, d);
2775
+ for (let h = 0; h < this.sparklineData.length; h++) {
2776
+ const c = h * a, m = n - (this.sparklineData[h] - s) / o * (n - 3) - 1.5;
2777
+ e.lineTo(c, m);
2418
2778
  }
2419
- e.lineTo(t, n), e.closePath(), e.fillStyle = "rgba(56, 189, 248, 0.25)", e.fill(), e.beginPath();
2420
- for (let u = 0; u < this.sparklineData.length; u++) {
2421
- const p = u * c, d = n - (this.sparklineData[u] - l) / h * (n - 2) - 1;
2422
- u === 0 ? e.moveTo(p, d) : e.lineTo(p, d);
2779
+ e.lineTo(t, n), e.closePath(), e.fillStyle = "rgba(56, 189, 248, 0.2)", e.fill(), e.beginPath();
2780
+ for (let h = 0; h < this.sparklineData.length; h++) {
2781
+ const c = h * a, m = n - (this.sparklineData[h] - s) / o * (n - 3) - 1.5;
2782
+ h === 0 ? e.moveTo(c, m) : e.lineTo(c, m);
2423
2783
  }
2424
- e.strokeStyle = "#38bdf8", e.lineWidth = 1.4, e.stroke();
2784
+ e.strokeStyle = "#38bdf8", e.lineWidth = 1.3, e.stroke();
2425
2785
  }
2426
2786
  clampToViewport() {
2427
2787
  var e, t;
@@ -2430,6 +2790,9 @@ const S = class S extends T {
2430
2790
  toggleCollapse() {
2431
2791
  return this.setCollapsed(!this.isPanelCollapsed);
2432
2792
  }
2793
+ setHotkey(e) {
2794
+ return this.hotkeyInstance ? this.hotkeyInstance.setHotkey(e) : this.hotkeyInstance = new W(e, () => this.toggle()), this;
2795
+ }
2433
2796
  setCollapsed(e) {
2434
2797
  return this.isPanelCollapsed = e, this.isPanelCollapsed ? (this.panelEl.classList.add("relly-collapsed"), this.collapseBtn.textContent = "+", this.bindingEngine.pause()) : (this.panelEl.classList.remove("relly-collapsed"), this.collapseBtn.textContent = "_", this.bindingEngine.resume()), this.autoSave && this.queueAutoSave(), this;
2435
2798
  }
@@ -2520,10 +2883,10 @@ const S = class S extends T {
2520
2883
  typeof window < "u" && (window.removeEventListener("resize", this.onResizeBound), this.sparklineAnimId && cancelAnimationFrame(this.sparklineAnimId)), this.draggableInstance && this.draggableInstance.destroy(), this.resizableInstance && this.resizableInstance.destroy(), this.hotkeyInstance && this.hotkeyInstance.destroy(), this.searchBarInstance && this.searchBarInstance.destroy(), this.tabsManagerInstance && this.tabsManagerInstance.destroy(), this.importModalInstance && this.importModalInstance.destroy(), this.toastManager.destroy(), this.contextMenuManager.destroy(), this.bindingEngine.destroy(), this.destroyChildren(), this.hostEl ? this.hostEl.remove() : this.panelEl.remove();
2521
2884
  }
2522
2885
  };
2523
- a(S, "version", "1.0.0");
2886
+ l(S, "version", "1.1.0");
2524
2887
  let k = S;
2525
2888
  Object.assign(k, {
2526
- Checkbox: L,
2889
+ Checkbox: I,
2527
2890
  Slider: V,
2528
2891
  Button: A,
2529
2892
  Select: z,
@@ -2532,78 +2895,88 @@ Object.assign(k, {
2532
2895
  ColorPicker: R,
2533
2896
  Point2D: P,
2534
2897
  Point3D: D,
2535
- RangeSlider: H,
2536
- Segmented: j,
2898
+ RangeSlider: j,
2899
+ Segmented: H,
2537
2900
  StatusIndicator: F,
2538
- Section: q,
2539
- Row: K,
2540
- Tab: ce,
2541
- TabsManager: de,
2542
- BaseComponent: C,
2543
- BindingEngine: G,
2544
- PresetManager: W,
2545
- ThemeManager: ee,
2546
- DARK_THEME: U,
2547
- LIGHT_THEME: X,
2548
- CYBERPUNK_THEME: J,
2549
- NORD_THEME: Y,
2550
- DRACULA_THEME: _,
2551
- TOKYO_NIGHT_THEME: Q,
2552
- MATRIX_THEME: Z,
2553
- SYNTHWAVE_THEME: O,
2554
- Draggable: te,
2555
- Resizable: ie,
2556
- HotkeyManager: ne,
2557
- SearchBar: se,
2558
- SoundEngine: re,
2559
- ImportModal: ae,
2560
- ToastManager: oe,
2561
- ContextMenuManager: he,
2562
- SchemaLoader: le,
2901
+ Switch: q,
2902
+ ButtonGroup: J,
2903
+ TextInput: $,
2904
+ Progress: U,
2905
+ Separator: Y,
2906
+ Section: G,
2907
+ Row: _,
2908
+ Tab: fe,
2909
+ TabsManager: ye,
2910
+ BaseComponent: E,
2911
+ BindingEngine: Q,
2912
+ PresetManager: Z,
2913
+ ThemeManager: le,
2914
+ DARK_THEME: K,
2915
+ LIGHT_THEME: O,
2916
+ CYBERPUNK_THEME: ee,
2917
+ NORD_THEME: te,
2918
+ DRACULA_THEME: ie,
2919
+ TOKYO_NIGHT_THEME: ne,
2920
+ MATRIX_THEME: se,
2921
+ SYNTHWAVE_THEME: re,
2922
+ Draggable: ae,
2923
+ Resizable: oe,
2924
+ HotkeyManager: W,
2925
+ SearchBar: he,
2926
+ SoundEngine: ce,
2927
+ ImportModal: de,
2928
+ ToastManager: ue,
2929
+ ContextMenuManager: me,
2930
+ SchemaLoader: pe,
2563
2931
  ContainerHelper: T,
2564
2932
  RellyUI: k
2565
2933
  });
2566
2934
  typeof window < "u" && (window.RellyUI = k);
2567
2935
  export {
2568
- C as BaseComponent,
2569
- G as BindingEngine,
2936
+ E as BaseComponent,
2937
+ Q as BindingEngine,
2570
2938
  A as Button,
2571
- J as CYBERPUNK_THEME,
2572
- L as Checkbox,
2939
+ J as ButtonGroup,
2940
+ ee as CYBERPUNK_THEME,
2941
+ I as Checkbox,
2573
2942
  R as ColorPicker,
2574
2943
  T as ContainerHelper,
2575
- he as ContextMenuManager,
2576
- U as DARK_THEME,
2577
- _ as DRACULA_THEME,
2578
- te as Draggable,
2944
+ me as ContextMenuManager,
2945
+ K as DARK_THEME,
2946
+ ie as DRACULA_THEME,
2947
+ ae as Draggable,
2579
2948
  B as DynamicLabel,
2580
2949
  N as Graph,
2581
- ne as HotkeyManager,
2582
- ae as ImportModal,
2583
- X as LIGHT_THEME,
2584
- Z as MATRIX_THEME,
2585
- Y as NORD_THEME,
2950
+ W as HotkeyManager,
2951
+ de as ImportModal,
2952
+ O as LIGHT_THEME,
2953
+ se as MATRIX_THEME,
2954
+ te as NORD_THEME,
2586
2955
  P as Point2D,
2587
2956
  D as Point3D,
2588
- W as PresetManager,
2589
- H as RangeSlider,
2957
+ Z as PresetManager,
2958
+ U as Progress,
2959
+ j as RangeSlider,
2590
2960
  k as RellyUI,
2591
- ie as Resizable,
2592
- K as Row,
2593
- O as SYNTHWAVE_THEME,
2594
- le as SchemaLoader,
2595
- se as SearchBar,
2596
- q as Section,
2597
- j as Segmented,
2961
+ oe as Resizable,
2962
+ _ as Row,
2963
+ re as SYNTHWAVE_THEME,
2964
+ pe as SchemaLoader,
2965
+ he as SearchBar,
2966
+ G as Section,
2967
+ H as Segmented,
2598
2968
  z as Select,
2969
+ Y as Separator,
2599
2970
  V as Slider,
2600
- re as SoundEngine,
2971
+ ce as SoundEngine,
2601
2972
  F as StatusIndicator,
2602
- Q as TOKYO_NIGHT_THEME,
2603
- ce as Tab,
2604
- de as TabsManager,
2605
- ee as ThemeManager,
2606
- oe as ToastManager,
2973
+ q as Switch,
2974
+ ne as TOKYO_NIGHT_THEME,
2975
+ fe as Tab,
2976
+ ye as TabsManager,
2977
+ $ as TextInput,
2978
+ le as ThemeManager,
2979
+ ue as ToastManager,
2607
2980
  k as default
2608
2981
  };
2609
2982
  //# sourceMappingURL=relly-ui.es.js.map