@norskvideo/norsk-studio-built-ins 1.27.0-2025-03-27-419657f2 → 1.27.0-2025-03-27-1a33b215

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/client/info.js +205 -148
  2. package/lib/output.rtmp/info.js +8 -1
  3. package/lib/output.rtmp/info.js.map +1 -1
  4. package/lib/output.rtmp/inline-view.js +5 -1
  5. package/lib/output.rtmp/inline-view.js.map +1 -1
  6. package/lib/output.rtmp/runtime.d.ts +6 -0
  7. package/lib/output.rtmp/runtime.js +8 -0
  8. package/lib/output.rtmp/runtime.js.map +1 -1
  9. package/lib/output.srt-caller/info.js +6 -1
  10. package/lib/output.srt-caller/info.js.map +1 -1
  11. package/lib/output.srt-caller/inline-view.js +5 -1
  12. package/lib/output.srt-caller/inline-view.js.map +1 -1
  13. package/lib/output.srt-caller/runtime.d.ts +5 -0
  14. package/lib/output.srt-caller/runtime.js +5 -0
  15. package/lib/output.srt-caller/runtime.js.map +1 -1
  16. package/lib/output.srt-listener/info.js +6 -1
  17. package/lib/output.srt-listener/info.js.map +1 -1
  18. package/lib/output.srt-listener/inline-view.d.ts +3 -4
  19. package/lib/output.srt-listener/inline-view.js +5 -1
  20. package/lib/output.srt-listener/inline-view.js.map +1 -1
  21. package/lib/output.srt-listener/runtime.d.ts +5 -0
  22. package/lib/output.srt-listener/runtime.js +5 -0
  23. package/lib/output.srt-listener/runtime.js.map +1 -1
  24. package/lib/output.udpTs/info.d.ts +2 -2
  25. package/lib/output.udpTs/info.js +24 -0
  26. package/lib/output.udpTs/info.js.map +1 -1
  27. package/lib/output.udpTs/inline-view.d.ts +6 -0
  28. package/lib/output.udpTs/inline-view.js +12 -0
  29. package/lib/output.udpTs/inline-view.js.map +1 -0
  30. package/lib/output.udpTs/runtime.d.ts +25 -5
  31. package/lib/output.udpTs/runtime.js +36 -4
  32. package/lib/output.udpTs/runtime.js.map +1 -1
  33. package/lib/shared/jitter-buffer-inline.d.ts +15 -0
  34. package/lib/shared/jitter-buffer-inline.js +26 -0
  35. package/lib/shared/jitter-buffer-inline.js.map +1 -0
  36. package/lib/shared/stream-statistics-view.d.ts +1 -1
  37. package/lib/shared/stream-statistics-view.js +9 -41
  38. package/lib/shared/stream-statistics-view.js.map +1 -1
  39. package/lib/test/udp-output.js +1 -1
  40. package/lib/test/udp-output.js.map +1 -1
  41. package/package.json +2 -2
package/client/info.js CHANGED
@@ -338,7 +338,7 @@ var require_util = __commonJS({
338
338
  exports.getObjectByType = getObjectByType;
339
339
  exports.getObjectByPath = getObjectByPath;
340
340
  exports.displayNodeId = displayNodeId;
341
- exports.assertUnreachable = assertUnreachable17;
341
+ exports.assertUnreachable = assertUnreachable18;
342
342
  exports.waitForCondition = waitForCondition;
343
343
  exports.streamMatchesExpected = streamMatchesExpected;
344
344
  exports.shortStreamNameFromDefinition = shortStreamNameFromDefinition;
@@ -408,7 +408,7 @@ var require_util = __commonJS({
408
408
  }
409
409
  return document2.components[id]?.config?.displayName ?? id;
410
410
  }
411
- function assertUnreachable17(_) {
411
+ function assertUnreachable18(_) {
412
412
  throw new Error("Didn't expect to get here");
413
413
  }
414
414
  async function waitForCondition(condition, timeout, interval) {
@@ -5226,7 +5226,7 @@ var require_client_types = __commonJS({
5226
5226
  return mod && mod.__esModule ? mod : { "default": mod };
5227
5227
  };
5228
5228
  Object.defineProperty(exports, "__esModule", { value: true });
5229
- exports.RegistrationConsts = exports.singleAvStreamMappingForm = exports.Subtitle = exports.Playlist = exports.Video = exports.Audio = exports.Av = exports.All = void 0;
5229
+ exports.RegistrationConsts = exports.singleAvStreamMappingForm = exports.ChartingConsts = exports.Subtitle = exports.Playlist = exports.Video = exports.Audio = exports.Av = exports.All = void 0;
5230
5230
  exports.subscriptionMedia = subscriptionMedia;
5231
5231
  exports.outputMedia = outputMedia;
5232
5232
  exports.simpleToMedia = simpleToMedia;
@@ -5288,6 +5288,40 @@ var require_client_types = __commonJS({
5288
5288
  (0, util_1.assertUnreachable)(t);
5289
5289
  }
5290
5290
  }
5291
+ exports.ChartingConsts = {
5292
+ colours: [
5293
+ "#FF6384",
5294
+ "#36A2EB",
5295
+ "#FFCE56",
5296
+ "#4BC0C0",
5297
+ "#9966FF",
5298
+ "#FF9F40",
5299
+ "#FF8A80",
5300
+ "#82B1FF",
5301
+ "#B9F6CA",
5302
+ "#FFFF8D",
5303
+ "#84FFFF",
5304
+ "#B388FF",
5305
+ "#EA80FC",
5306
+ "#FFD180",
5307
+ "#A7FFEB",
5308
+ "#CCFF90"
5309
+ ],
5310
+ dark: {
5311
+ line: "#00c3ff",
5312
+ background: "rgba(0, 195, 255, 0.1)",
5313
+ grid: "rgba(68, 68, 68, 0.5)",
5314
+ text: "#888",
5315
+ tooltip: "rgba(0, 0, 0, 0.8)"
5316
+ },
5317
+ light: {
5318
+ line: "#007bff",
5319
+ background: "rgba(0, 123, 255, 0.1)",
5320
+ grid: "rgba(0, 0, 0, 0.1)",
5321
+ text: "#333",
5322
+ tooltip: "rgba(255, 255, 255, 0.9)"
5323
+ }
5324
+ };
5291
5325
  function discriminatedForm3(setup) {
5292
5326
  const options = Object.keys(setup).map((k) => ({
5293
5327
  key: k,
@@ -20364,41 +20398,9 @@ function displayStreamKey(streamKey2) {
20364
20398
  return `${streamKey2.sourceName}-${streamKey2.programNumber}-${streamKey2.streamId}-${streamKey2.renditionName}`;
20365
20399
  }
20366
20400
  Chart.register(...registerables);
20367
- function MetricsView2({ metrics, config }) {
20368
- const isDarkMode = true;
20369
- const colors2 = [
20370
- "#FF6384",
20371
- "#36A2EB",
20372
- "#FFCE56",
20373
- "#4BC0C0",
20374
- "#9966FF",
20375
- "#FF9F40",
20376
- "#FF8A80",
20377
- "#82B1FF",
20378
- "#B9F6CA",
20379
- "#FFFF8D",
20380
- "#84FFFF",
20381
- "#B388FF",
20382
- "#EA80FC",
20383
- "#FFD180",
20384
- "#A7FFEB",
20385
- "#CCFF90"
20386
- ];
20387
- const darkModeColors = {
20388
- lineColor: "#00c3ff",
20389
- backgroundColor: "rgba(0, 195, 255, 0.1)",
20390
- gridColor: "rgba(68, 68, 68, 0.5)",
20391
- textColor: "#888",
20392
- tooltipBg: "rgba(0, 0, 0, 0.8)"
20393
- };
20394
- const lightModeColors = {
20395
- lineColor: "#007bff",
20396
- backgroundColor: "rgba(0, 123, 255, 0.1)",
20397
- gridColor: "rgba(0, 0, 0, 0.1)",
20398
- textColor: "#333",
20399
- tooltipBg: "rgba(255, 255, 255, 0.9)"
20400
- };
20401
- const themeColors = isDarkMode ? darkModeColors : lightModeColors;
20401
+ function MetricsView2({ metrics, config, global, charting }) {
20402
+ const { isDarkMode } = global;
20403
+ const themeColors = isDarkMode ? charting.dark : charting.light;
20402
20404
  const cpuChartOptions = {
20403
20405
  responsive: false,
20404
20406
  maintainAspectRatio: false,
@@ -20439,7 +20441,7 @@ function MetricsView2({ metrics, config }) {
20439
20441
  // font: { size: 11 },
20440
20442
  // },
20441
20443
  grid: {
20442
- color: themeColors.gridColor,
20444
+ color: themeColors.grid,
20443
20445
  drawTicks: false
20444
20446
  },
20445
20447
  border: { display: false },
@@ -20466,10 +20468,10 @@ function MetricsView2({ metrics, config }) {
20466
20468
  return `${seconds} second${seconds !== 1 ? "s" : ""} ago`;
20467
20469
  }
20468
20470
  },
20469
- backgroundColor: themeColors.tooltipBg,
20470
- titleColor: themeColors.lineColor,
20471
- bodyColor: themeColors.textColor,
20472
- borderColor: themeColors.lineColor,
20471
+ backgroundColor: themeColors.tooltip,
20472
+ titleColor: themeColors.line,
20473
+ bodyColor: themeColors.text,
20474
+ borderColor: themeColors.line,
20473
20475
  borderWidth: 1,
20474
20476
  padding: 10
20475
20477
  }
@@ -20504,7 +20506,7 @@ function MetricsView2({ metrics, config }) {
20504
20506
  const bitrates = {
20505
20507
  labels: Array(50).fill(null).map((_, index2) => index2),
20506
20508
  datasets: allBitrates.map((b, i) => {
20507
- return createInitialDataset(`${displayStreamKey(b.streamKey)}`, colors2[i], b.history[0]?.value ?? 0);
20509
+ return createInitialDataset(`${displayStreamKey(b.streamKey)}`, charting.colours[i], b.history[0]?.value ?? 0);
20508
20510
  })
20509
20511
  };
20510
20512
  allBitrates.forEach((b, bi) => {
@@ -21363,14 +21365,25 @@ function SummaryView4({ state, sendCommand }) {
21363
21365
  var summary_view_default4 = SummaryView4;
21364
21366
 
21365
21367
  // build/output.rtmp/inline-view.js
21368
+ var import_jsx_runtime16 = __toESM(require_jsx_runtime());
21369
+
21370
+ // build/shared/jitter-buffer-inline.js
21366
21371
  var import_jsx_runtime15 = __toESM(require_jsx_runtime());
21372
+ function initialJitterBufferState() {
21373
+ return { target: 0, value: 0, percentage: 0 };
21374
+ }
21375
+ function JitterBufferInline(jb) {
21376
+ return (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, { children: (0, import_jsx_runtime15.jsxs)("div", { children: ["Buffer: ", (0, import_jsx_runtime15.jsx)("meter", { value: jb.percentage, max: 100, high: 50, low: 25 })] }) });
21377
+ }
21378
+
21379
+ // build/output.rtmp/inline-view.js
21367
21380
  function InlineView5({ state, config }) {
21368
21381
  if (!state.enabled) {
21369
- return (0, import_jsx_runtime15.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" });
21382
+ return (0, import_jsx_runtime16.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" });
21370
21383
  }
21371
- const connected = (0, import_jsx_runtime15.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected and publishing" });
21372
- const disconnected = (0, import_jsx_runtime15.jsxs)("div", { className: "inactive text-orange-500 dark:text-orange-300", children: ["Disconnected ", state.connectRetries > 0 ? `- retrying(${state.connectRetries})` : ""] });
21373
- return (0, import_jsx_runtime15.jsx)("div", { className: "rtmp-output", id: `rtmp-output-${config.id}`, children: state.connected ? connected : disconnected });
21384
+ const connected = (0, import_jsx_runtime16.jsxs)("div", { children: [(0, import_jsx_runtime16.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected and publishing" }), (0, import_jsx_runtime16.jsx)(JitterBufferInline, { ...state.jitterBuffer })] });
21385
+ const disconnected = (0, import_jsx_runtime16.jsxs)("div", { className: "inactive text-orange-500 dark:text-orange-300", children: ["Disconnected ", state.connectRetries > 0 ? `- retrying(${state.connectRetries})` : ""] });
21386
+ return (0, import_jsx_runtime16.jsx)("div", { className: "rtmp-output", id: `rtmp-output-${config.id}`, children: state.connected ? connected : disconnected });
21374
21387
  }
21375
21388
  var inline_view_default5 = InlineView5;
21376
21389
 
@@ -21414,7 +21427,12 @@ function defineRtmpOutputComponent({ defineComponent }, settings) {
21414
21427
  };
21415
21428
  },
21416
21429
  runtime: {
21417
- initialState: () => ({ connected: false, connectRetries: 0, enabled: true }),
21430
+ initialState: () => ({
21431
+ connected: false,
21432
+ connectRetries: 0,
21433
+ enabled: true,
21434
+ jitterBuffer: initialJitterBufferState()
21435
+ }),
21418
21436
  handleEvent: (ev, state) => {
21419
21437
  const evType = ev.type;
21420
21438
  switch (evType) {
@@ -21431,6 +21449,9 @@ function defineRtmpOutputComponent({ defineComponent }, settings) {
21431
21449
  case "output-disabled":
21432
21450
  state.enabled = false;
21433
21451
  break;
21452
+ case "jitter-buffer-updated":
21453
+ state.jitterBuffer = ev.buffer;
21454
+ break;
21434
21455
  default:
21435
21456
  assertUnreachable5(evType);
21436
21457
  }
@@ -21509,7 +21530,7 @@ function info_default11(r) {
21509
21530
  var import_config2 = __toESM(require_config());
21510
21531
 
21511
21532
  // build/output.preview/inline-view.js
21512
- var import_jsx_runtime16 = __toESM(require_jsx_runtime());
21533
+ var import_jsx_runtime17 = __toESM(require_jsx_runtime());
21513
21534
  var import_react3 = __toESM(require_react());
21514
21535
  var import_webrtc_client = __toESM(require_webrtc_client());
21515
21536
  function InlineView6({ state, config, raise }) {
@@ -21577,7 +21598,7 @@ function InlineView6({ state, config, raise }) {
21577
21598
  }, [config.showPreview]);
21578
21599
  raise && (0, import_react3.useEffect)(raise, []);
21579
21600
  if (!url)
21580
- return (0, import_jsx_runtime16.jsx)(import_jsx_runtime16.Fragment, { children: "..." });
21601
+ return (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: "..." });
21581
21602
  function percentage(levels) {
21582
21603
  if (!levels) {
21583
21604
  return 0;
@@ -21587,9 +21608,9 @@ function InlineView6({ state, config, raise }) {
21587
21608
  const snapped = Math.floor(capped * 10) * 10;
21588
21609
  return Math.max(0, 100 - snapped);
21589
21610
  }
21590
- return (0, import_jsx_runtime16.jsxs)("div", { className: "preview-outer-container", children: [(0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime16.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime16.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime16.jsx)("div", { className: "preview-video", id: `preview-${id}`, children: (0, import_jsx_runtime16.jsx)("style", { children: `
21611
+ return (0, import_jsx_runtime17.jsxs)("div", { className: "preview-outer-container", children: [(0, import_jsx_runtime17.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime17.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime17.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime17.jsx)("div", { className: "preview-video", id: `preview-${id}`, children: (0, import_jsx_runtime17.jsx)("style", { children: `
21591
21612
  #preview-${id} video::-webkit-media-controls-play-button { display: none; },
21592
- ` }) }) : (0, import_jsx_runtime16.jsx)("div", { className: "preview-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" }), (0, import_jsx_runtime16.jsx)("div", { className: "preview-levels", children: (0, import_jsx_runtime16.jsx)("div", { className: `preview-level clip-${percentage(state.levels)}-preview` }) })] });
21613
+ ` }) }) : (0, import_jsx_runtime17.jsx)("div", { className: "preview-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" }), (0, import_jsx_runtime17.jsx)("div", { className: "preview-levels", children: (0, import_jsx_runtime17.jsx)("div", { className: `preview-level clip-${percentage(state.levels)}-preview` }) })] });
21593
21614
  }
21594
21615
  var inline_view_default6 = InlineView6;
21595
21616
 
@@ -21676,7 +21697,7 @@ function assertUnreachable6(_) {
21676
21697
  var import_util2 = __toESM(require_util());
21677
21698
 
21678
21699
  // build/output.srt-caller/summary-view.js
21679
- var import_jsx_runtime17 = __toESM(require_jsx_runtime());
21700
+ var import_jsx_runtime18 = __toESM(require_jsx_runtime());
21680
21701
  function SummaryView5({ state, sendCommand }) {
21681
21702
  const handleEnableOutput = () => {
21682
21703
  void enableOutput();
@@ -21694,14 +21715,14 @@ function SummaryView5({ state, sendCommand }) {
21694
21715
  type: "disable-output"
21695
21716
  });
21696
21717
  };
21697
- return (0, import_jsx_runtime17.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime17.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime17.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime17.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-green-500" : "bg-red-500"}` }), (0, import_jsx_runtime17.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime17.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime17.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime17.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-green-700 text-white rounded", children: "Enable Output" }) })] }) });
21718
+ return (0, import_jsx_runtime18.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime18.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-green-500" : "bg-red-500"}` }), (0, import_jsx_runtime18.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime18.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime18.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime18.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-green-700 text-white rounded", children: "Enable Output" }) })] }) });
21698
21719
  }
21699
21720
  var summary_view_default5 = SummaryView5;
21700
21721
 
21701
21722
  // build/output.srt-caller/inline-view.js
21702
- var import_jsx_runtime18 = __toESM(require_jsx_runtime());
21723
+ var import_jsx_runtime19 = __toESM(require_jsx_runtime());
21703
21724
  function InlineView7({ state }) {
21704
- return (0, import_jsx_runtime18.jsx)("div", { className: "srt-output", children: state.enabled ? (0, import_jsx_runtime18.jsx)("div", { children: state.metrics.connectionCount == 0 ? (0, import_jsx_runtime18.jsx)("div", { className: "active text-red-300 dark:text-red-300", children: "Not Connected" }) : (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [(0, import_jsx_runtime18.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected" }), (0, import_jsx_runtime18.jsxs)("div", { children: ["Sent: ", state.metrics.packetsSent] }), (0, import_jsx_runtime18.jsxs)("div", { children: ["Lost/Resent: ", state.metrics.packetsLost, "/", state.metrics.packetsResent] })] }) }) : (0, import_jsx_runtime18.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" }) });
21725
+ return (0, import_jsx_runtime19.jsx)("div", { className: "srt-output", children: state.enabled ? (0, import_jsx_runtime19.jsx)("div", { children: state.metrics.connectionCount == 0 ? (0, import_jsx_runtime19.jsx)("div", { className: "active text-red-300 dark:text-red-300", children: "Not Connected" }) : (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [(0, import_jsx_runtime19.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected" }), (0, import_jsx_runtime19.jsxs)("div", { children: ["Sent: ", state.metrics.packetsSent] }), (0, import_jsx_runtime19.jsxs)("div", { children: ["Lost/Resent: ", state.metrics.packetsLost, "/", state.metrics.packetsResent] }), (0, import_jsx_runtime19.jsx)(JitterBufferInline, { ...state.jitterBuffer })] }) }) : (0, import_jsx_runtime19.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" }) });
21705
21726
  }
21706
21727
  var inline_view_default7 = InlineView7;
21707
21728
 
@@ -21739,7 +21760,8 @@ function info_default13(registration) {
21739
21760
  packetsResent: 0,
21740
21761
  packetsSent: 0,
21741
21762
  packetsReceived: 0
21742
- }
21763
+ },
21764
+ jitterBuffer: initialJitterBufferState()
21743
21765
  }),
21744
21766
  handleEvent(ev, state) {
21745
21767
  const evType = ev.type;
@@ -21753,6 +21775,9 @@ function info_default13(registration) {
21753
21775
  case "metrics-updated":
21754
21776
  state.metrics = ev.metrics;
21755
21777
  break;
21778
+ case "jitter-buffer-updated":
21779
+ state.jitterBuffer = ev.buffer;
21780
+ break;
21756
21781
  default:
21757
21782
  (0, import_util2.assertUnreachable)(evType);
21758
21783
  }
@@ -21803,7 +21828,7 @@ function info_default13(registration) {
21803
21828
  var import_util3 = __toESM(require_util());
21804
21829
 
21805
21830
  // build/output.srt-listener/summary-view.js
21806
- var import_jsx_runtime19 = __toESM(require_jsx_runtime());
21831
+ var import_jsx_runtime20 = __toESM(require_jsx_runtime());
21807
21832
  function SummaryView6({ state, sendCommand }) {
21808
21833
  const handleEnableOutput = () => {
21809
21834
  void enableOutput();
@@ -21821,14 +21846,14 @@ function SummaryView6({ state, sendCommand }) {
21821
21846
  type: "disable-output"
21822
21847
  });
21823
21848
  };
21824
- return (0, import_jsx_runtime19.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime19.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime19.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime19.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-green-500" : "bg-red-500"}` }), (0, import_jsx_runtime19.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime19.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime19.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime19.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-green-700 text-white rounded", children: "Enable Output" }) })] }) });
21849
+ return (0, import_jsx_runtime20.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime20.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime20.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime20.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-green-500" : "bg-red-500"}` }), (0, import_jsx_runtime20.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime20.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime20.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime20.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-green-700 text-white rounded", children: "Enable Output" }) })] }) });
21825
21850
  }
21826
21851
  var summary_view_default6 = SummaryView6;
21827
21852
 
21828
21853
  // build/output.srt-listener/inline-view.js
21829
- var import_jsx_runtime20 = __toESM(require_jsx_runtime());
21854
+ var import_jsx_runtime21 = __toESM(require_jsx_runtime());
21830
21855
  function InlineView8({ state }) {
21831
- return (0, import_jsx_runtime20.jsx)("div", { className: "srt-output", children: state.enabled ? state.metrics.connectionCount == 0 ? (0, import_jsx_runtime20.jsx)("div", { className: "active text-red-300 dark:text-red-300", children: "No connections" }) : (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [(0, import_jsx_runtime20.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Output enabled" }), (0, import_jsx_runtime20.jsxs)("div", { children: ["Connections: ", state.metrics.connectionCount] }), (0, import_jsx_runtime20.jsxs)("div", { children: ["Sent: ", state.metrics.packetsSent.reduce((a, i) => a + i, 0)] }), (0, import_jsx_runtime20.jsxs)("div", { children: ["Lost/Resent: ", state.metrics.packetsLost.reduce((a, i) => a + i, 0), "/", state.metrics.packetsResent.reduce((a, i) => a + i, 0)] })] }) : (0, import_jsx_runtime20.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" }) });
21856
+ return (0, import_jsx_runtime21.jsx)("div", { className: "srt-output", children: state.enabled ? state.metrics.connectionCount == 0 ? (0, import_jsx_runtime21.jsx)("div", { className: "active text-red-300 dark:text-red-300", children: "No connections" }) : (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [(0, import_jsx_runtime21.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Output enabled" }), (0, import_jsx_runtime21.jsxs)("div", { children: ["Connections: ", state.metrics.connectionCount] }), (0, import_jsx_runtime21.jsxs)("div", { children: ["Sent: ", state.metrics.packetsSent.reduce((a, i) => a + i, 0)] }), (0, import_jsx_runtime21.jsxs)("div", { children: ["Lost/Resent: ", state.metrics.packetsLost.reduce((a, i) => a + i, 0), "/", state.metrics.packetsResent.reduce((a, i) => a + i, 0)] }), (0, import_jsx_runtime21.jsx)(JitterBufferInline, { ...state.jitterBuffer })] }) : (0, import_jsx_runtime21.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" }) });
21832
21857
  }
21833
21858
  var inline_view_default8 = InlineView8;
21834
21859
 
@@ -21864,7 +21889,8 @@ function info_default14(registration) {
21864
21889
  packetsResent: [],
21865
21890
  packetsSent: [],
21866
21891
  packetsReceived: []
21867
- }
21892
+ },
21893
+ jitterBuffer: initialJitterBufferState()
21868
21894
  }),
21869
21895
  handleEvent(ev, state) {
21870
21896
  const evType = ev.type;
@@ -21878,6 +21904,9 @@ function info_default14(registration) {
21878
21904
  case "metrics-updated":
21879
21905
  state.metrics = ev.metrics;
21880
21906
  break;
21907
+ case "jitter-buffer-updated":
21908
+ state.jitterBuffer = ev.buffer;
21909
+ break;
21881
21910
  default:
21882
21911
  (0, import_util3.assertUnreachable)(evType);
21883
21912
  }
@@ -21926,26 +21955,26 @@ function info_default14(registration) {
21926
21955
  }
21927
21956
 
21928
21957
  // build/output.statistics/inline-view.js
21929
- var import_jsx_runtime21 = __toESM(require_jsx_runtime());
21958
+ var import_jsx_runtime22 = __toESM(require_jsx_runtime());
21930
21959
  function InlineView9({ state }) {
21931
21960
  if (!state.previous)
21932
- return (0, import_jsx_runtime21.jsx)(import_jsx_runtime21.Fragment, {});
21961
+ return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, {});
21933
21962
  const format = (stat) => Math.floor(stat).toLocaleString("en-US", { maximumFractionDigits: 0 });
21934
- return (0, import_jsx_runtime21.jsx)(import_jsx_runtime21.Fragment, { children: state.previous.allStreams.map((s, i) => {
21963
+ return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, { children: state.previous.allStreams.map((s, i) => {
21935
21964
  const metaCase = s.metadata.case;
21936
21965
  switch (metaCase) {
21937
21966
  case "audio":
21938
- return (0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime21.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
21967
+ return (0, import_jsx_runtime22.jsxs)("div", { children: [(0, import_jsx_runtime22.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime22.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
21939
21968
  case "video":
21940
- return (0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime21.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
21969
+ return (0, import_jsx_runtime22.jsxs)("div", { children: [(0, import_jsx_runtime22.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime22.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
21941
21970
  case "ancillary":
21942
- return (0, import_jsx_runtime21.jsx)(import_jsx_runtime21.Fragment, {});
21971
+ return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, {});
21943
21972
  case "subtitle":
21944
- return (0, import_jsx_runtime21.jsx)(import_jsx_runtime21.Fragment, {});
21973
+ return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, {});
21945
21974
  case "playlist":
21946
- return (0, import_jsx_runtime21.jsx)(import_jsx_runtime21.Fragment, {});
21975
+ return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, {});
21947
21976
  case void 0:
21948
- return (0, import_jsx_runtime21.jsx)(import_jsx_runtime21.Fragment, {});
21977
+ return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, {});
21949
21978
  default:
21950
21979
  assertUnreachable9(metaCase);
21951
21980
  }
@@ -22031,7 +22060,17 @@ function info_default16(r) {
22031
22060
  }
22032
22061
 
22033
22062
  // build/output.udpTs/info.js
22063
+ var import_util4 = __toESM(require_util());
22034
22064
  var import_FaNetworkWired2 = __toESM(require_FaNetworkWired());
22065
+
22066
+ // build/output.udpTs/inline-view.js
22067
+ var import_jsx_runtime23 = __toESM(require_jsx_runtime());
22068
+ function InlineView10({ state }) {
22069
+ return (0, import_jsx_runtime23.jsx)("div", { className: "srt-output", children: (0, import_jsx_runtime23.jsx)("div", { children: (0, import_jsx_runtime23.jsx)(JitterBufferInline, { ...state.jitterBuffer }) }) });
22070
+ }
22071
+ var inline_view_default10 = InlineView10;
22072
+
22073
+ // build/output.udpTs/info.js
22035
22074
  function info_default17({ defineComponent, All, validation: { Port, Hostname, JitterBuffer, Iface, Z } }) {
22036
22075
  return defineComponent({
22037
22076
  identifier: "output.udpTs",
@@ -22046,6 +22085,24 @@ function info_default17({ defineComponent, All, validation: { Port, Hostname, Ji
22046
22085
  streams: () => All.map((media) => ({ media }))
22047
22086
  }
22048
22087
  },
22088
+ runtime: {
22089
+ initialState: () => ({
22090
+ jitterBuffer: initialJitterBufferState()
22091
+ }),
22092
+ handleEvent(ev, state) {
22093
+ const evType = ev.type;
22094
+ switch (evType) {
22095
+ case "jitter-buffer-updated":
22096
+ state.jitterBuffer = ev.buffer;
22097
+ break;
22098
+ default:
22099
+ (0, import_util4.assertUnreachable)(evType);
22100
+ }
22101
+ return { ...state };
22102
+ },
22103
+ inline: inline_view_default10,
22104
+ metrics: []
22105
+ },
22049
22106
  display: (desc) => {
22050
22107
  return {
22051
22108
  port: desc.config.port.toString(),
@@ -22073,10 +22130,10 @@ function info_default17({ defineComponent, All, validation: { Port, Hostname, Ji
22073
22130
  var import_config3 = __toESM(require_config());
22074
22131
 
22075
22132
  // build/output.whep/inline-view.js
22076
- var import_jsx_runtime22 = __toESM(require_jsx_runtime());
22133
+ var import_jsx_runtime24 = __toESM(require_jsx_runtime());
22077
22134
  var import_react4 = __toESM(require_react());
22078
22135
  var import_webrtc_client2 = __toESM(require_webrtc_client());
22079
- function InlineView10({ state, config, raise }) {
22136
+ function InlineView11({ state, config, raise }) {
22080
22137
  const url = state.url;
22081
22138
  const id = config.id;
22082
22139
  const [showPreview, setShowPreview] = (0, import_react4.useState)(config.showPreview ?? true);
@@ -22118,18 +22175,18 @@ function InlineView10({ state, config, raise }) {
22118
22175
  }, [config.showPreview]);
22119
22176
  raise && (0, import_react4.useEffect)(raise, []);
22120
22177
  if (!url)
22121
- return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, { children: "..." });
22178
+ return (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, { children: "..." });
22122
22179
  const videoStyles = `
22123
22180
  #whep-${id} video::-webkit-media-controls-play-button {
22124
22181
  display: none;
22125
22182
  }
22126
22183
  `;
22127
- return (0, import_jsx_runtime22.jsxs)("div", { className: "whep-container", children: [(0, import_jsx_runtime22.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime22.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime22.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime22.jsx)("div", { className: "whep-video", id: `whep-${id}`, children: (0, import_jsx_runtime22.jsx)("style", { children: videoStyles }) }) : (0, import_jsx_runtime22.jsx)("div", { className: "whep-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" })] });
22184
+ return (0, import_jsx_runtime24.jsxs)("div", { className: "whep-container", children: [(0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime24.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime24.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime24.jsx)("div", { className: "whep-video", id: `whep-${id}`, children: (0, import_jsx_runtime24.jsx)("style", { children: videoStyles }) }) : (0, import_jsx_runtime24.jsx)("div", { className: "whep-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" })] });
22128
22185
  }
22129
- var inline_view_default10 = InlineView10;
22186
+ var inline_view_default11 = InlineView11;
22130
22187
 
22131
22188
  // build/output.whep/summary-view.js
22132
- var import_jsx_runtime23 = __toESM(require_jsx_runtime());
22189
+ var import_jsx_runtime25 = __toESM(require_jsx_runtime());
22133
22190
  function SummaryView7({ state, sendCommand }) {
22134
22191
  const handleEnableOutput = () => {
22135
22192
  void enableOutput();
@@ -22147,7 +22204,7 @@ function SummaryView7({ state, sendCommand }) {
22147
22204
  type: "disable-output"
22148
22205
  });
22149
22206
  };
22150
- return (0, import_jsx_runtime23.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime23.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime23.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime23.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime23.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime23.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime23.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
22207
+ return (0, import_jsx_runtime25.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime25.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime25.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime25.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime25.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime25.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime25.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
22151
22208
  }
22152
22209
  var summary_view_default7 = SummaryView7;
22153
22210
 
@@ -22187,11 +22244,11 @@ function info_default18(R) {
22187
22244
  state.enabled = false;
22188
22245
  break;
22189
22246
  default:
22190
- assertUnreachable10(evType);
22247
+ assertUnreachable11(evType);
22191
22248
  }
22192
22249
  return { ...state };
22193
22250
  },
22194
- inline: inline_view_default10,
22251
+ inline: inline_view_default11,
22195
22252
  summary: summary_view_default7
22196
22253
  },
22197
22254
  configForm: {
@@ -22209,7 +22266,7 @@ function info_default18(R) {
22209
22266
  }
22210
22267
  });
22211
22268
  }
22212
- function assertUnreachable10(_) {
22269
+ function assertUnreachable11(_) {
22213
22270
  throw new Error("Didn't expect to get here");
22214
22271
  }
22215
22272
 
@@ -22247,9 +22304,9 @@ function info_default19(r) {
22247
22304
  var import_client_types2 = __toESM(require_client_types());
22248
22305
 
22249
22306
  // build/processor.audioEncoder/form-views.js
22250
- var import_jsx_runtime24 = __toESM(require_jsx_runtime());
22307
+ var import_jsx_runtime26 = __toESM(require_jsx_runtime());
22251
22308
  function CodecConfiguration(cfg) {
22252
- return (0, import_jsx_runtime24.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime24.jsx)("div", { className: "col-span-1", children: "Codec" }), (0, import_jsx_runtime24.jsx)("div", { className: "col-span-2", children: cfg.kind }), cfg.kind === "aac" ? (0, import_jsx_runtime24.jsxs)(import_jsx_runtime24.Fragment, { children: [(0, import_jsx_runtime24.jsx)("div", { className: "col-span-1", children: "Profile" }), (0, import_jsx_runtime24.jsx)("div", { className: "col-span-2", children: cfg.profile }), (0, import_jsx_runtime24.jsx)("div", { className: "col-span-1", children: "Sample Rate" }), (0, import_jsx_runtime24.jsx)("div", { className: "col-span-2", children: cfg.sampleRate })] }) : null] });
22309
+ return (0, import_jsx_runtime26.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime26.jsx)("div", { className: "col-span-1", children: "Codec" }), (0, import_jsx_runtime26.jsx)("div", { className: "col-span-2", children: cfg.kind }), cfg.kind === "aac" ? (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [(0, import_jsx_runtime26.jsx)("div", { className: "col-span-1", children: "Profile" }), (0, import_jsx_runtime26.jsx)("div", { className: "col-span-2", children: cfg.profile }), (0, import_jsx_runtime26.jsx)("div", { className: "col-span-1", children: "Sample Rate" }), (0, import_jsx_runtime26.jsx)("div", { className: "col-span-2", children: cfg.sampleRate })] }) : null] });
22253
22310
  }
22254
22311
 
22255
22312
  // build/processor.audioEncoder/info.js
@@ -22389,7 +22446,7 @@ var import_config4 = __toESM(require_config());
22389
22446
  var import_FaWindowRestore = __toESM(require_FaWindowRestore());
22390
22447
 
22391
22448
  // build/processor.browserOverlay/summary-view.js
22392
- var import_jsx_runtime25 = __toESM(require_jsx_runtime());
22449
+ var import_jsx_runtime27 = __toESM(require_jsx_runtime());
22393
22450
  var import_react5 = __toESM(require_react());
22394
22451
  function SummaryView8({ state, sendCommand }) {
22395
22452
  const [url, setUrl] = (0, import_react5.useState)(state.currentUrl);
@@ -22398,7 +22455,7 @@ function SummaryView8({ state, sendCommand }) {
22398
22455
  return url !== state.currentUrl || enabled !== state.enabled;
22399
22456
  }, [url, enabled]);
22400
22457
  const buttonClass = "mt-2 mb-5 text-white w-full justify-center bg-primary-700 hover:bg-primary-800 focus:ring-4 focus:outline-none focus:ring-primary-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800";
22401
- return (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-3 mb-5", children: [(0, import_jsx_runtime25.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime25.jsxs)("div", { className: "mb-5", children: [(0, import_jsx_runtime25.jsx)("label", { htmlFor: "url", className: "mb-2 mr-2 text-sm font-medium text-gray-900 dark:text-white", children: "URL" }), (0, import_jsx_runtime25.jsx)("input", { type: "email", id: "url", className: "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500", value: url, onChange: (e) => setUrl(e.target.value), required: true })] }), (0, import_jsx_runtime25.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime25.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime25.jsx)("span", { className: "me-3 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Enabled" }), (0, import_jsx_runtime25.jsx)("input", { type: "checkbox", checked: enabled, onChange: (e) => setEnabled(e.target.checked), className: "sr-only peer" }), (0, import_jsx_runtime25.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) }), (0, import_jsx_runtime25.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, disabled: !stateChanged, onClick: () => {
22458
+ return (0, import_jsx_runtime27.jsxs)("div", { className: "space-y-3 mb-5", children: [(0, import_jsx_runtime27.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime27.jsxs)("div", { className: "mb-5", children: [(0, import_jsx_runtime27.jsx)("label", { htmlFor: "url", className: "mb-2 mr-2 text-sm font-medium text-gray-900 dark:text-white", children: "URL" }), (0, import_jsx_runtime27.jsx)("input", { type: "email", id: "url", className: "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500", value: url, onChange: (e) => setUrl(e.target.value), required: true })] }), (0, import_jsx_runtime27.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime27.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime27.jsx)("span", { className: "me-3 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Enabled" }), (0, import_jsx_runtime27.jsx)("input", { type: "checkbox", checked: enabled, onChange: (e) => setEnabled(e.target.checked), className: "sr-only peer" }), (0, import_jsx_runtime27.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) }), (0, import_jsx_runtime27.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, disabled: !stateChanged, onClick: () => {
22402
22459
  if (url !== state.currentUrl) {
22403
22460
  sendCommand({ type: "change-url", url });
22404
22461
  }
@@ -22414,11 +22471,11 @@ function SummaryView8({ state, sendCommand }) {
22414
22471
  var summary_view_default8 = SummaryView8;
22415
22472
 
22416
22473
  // build/processor.browserOverlay/inline-view.js
22417
- var import_jsx_runtime26 = __toESM(require_jsx_runtime());
22418
- function InlineView11({ state, config }) {
22419
- return (0, import_jsx_runtime26.jsx)("div", { id: `browser-overlay-${config.id}`, children: (0, import_jsx_runtime26.jsxs)("div", { className: "w-64 grid grid-cols-[min-content,1fr] gap-2", children: [(0, import_jsx_runtime26.jsx)("div", { children: "URL:" }), (0, import_jsx_runtime26.jsx)("div", { className: "truncate", children: state.currentUrl }), (0, import_jsx_runtime26.jsx)("div", { children: "Enabled:" }), (0, import_jsx_runtime26.jsx)("div", { children: (0, import_jsx_runtime26.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime26.jsx)("input", { type: "checkbox", checked: state.enabled, disabled: true, className: "sr-only peer" }), (0, import_jsx_runtime26.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) })] }) });
22474
+ var import_jsx_runtime28 = __toESM(require_jsx_runtime());
22475
+ function InlineView12({ state, config }) {
22476
+ return (0, import_jsx_runtime28.jsx)("div", { id: `browser-overlay-${config.id}`, children: (0, import_jsx_runtime28.jsxs)("div", { className: "w-64 grid grid-cols-[min-content,1fr] gap-2", children: [(0, import_jsx_runtime28.jsx)("div", { children: "URL:" }), (0, import_jsx_runtime28.jsx)("div", { className: "truncate", children: state.currentUrl }), (0, import_jsx_runtime28.jsx)("div", { children: "Enabled:" }), (0, import_jsx_runtime28.jsx)("div", { children: (0, import_jsx_runtime28.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime28.jsx)("input", { type: "checkbox", checked: state.enabled, disabled: true, className: "sr-only peer" }), (0, import_jsx_runtime28.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) })] }) });
22420
22477
  }
22421
- var inline_view_default11 = InlineView11;
22478
+ var inline_view_default12 = InlineView12;
22422
22479
 
22423
22480
  // build/processor.browserOverlay/info.js
22424
22481
  function info_default21({ defineComponent, validation: { Z } }) {
@@ -22449,7 +22506,7 @@ function info_default21({ defineComponent, validation: { Z } }) {
22449
22506
  },
22450
22507
  runtime: {
22451
22508
  summary: summary_view_default8,
22452
- inline: inline_view_default11,
22509
+ inline: inline_view_default12,
22453
22510
  initialState: () => ({
22454
22511
  currentUrl: "",
22455
22512
  enabled: true
@@ -22464,7 +22521,7 @@ function info_default21({ defineComponent, validation: { Z } }) {
22464
22521
  case "disabled":
22465
22522
  return { ...state, enabled: false };
22466
22523
  default:
22467
- assertUnreachable11(evType);
22524
+ assertUnreachable12(evType);
22468
22525
  }
22469
22526
  }
22470
22527
  },
@@ -22479,12 +22536,12 @@ function info_default21({ defineComponent, validation: { Z } }) {
22479
22536
  }
22480
22537
  });
22481
22538
  }
22482
- function assertUnreachable11(_) {
22539
+ function assertUnreachable12(_) {
22483
22540
  throw new Error("Didn't expect to get here");
22484
22541
  }
22485
22542
 
22486
22543
  // build/processor.cascadingSwitch/source-selection.js
22487
- var import_jsx_runtime27 = __toESM(require_jsx_runtime());
22544
+ var import_jsx_runtime29 = __toESM(require_jsx_runtime());
22488
22545
  var import_react6 = __toESM(require_react());
22489
22546
  function OrderInput(props) {
22490
22547
  (0, import_react6.useEffect)(() => {
@@ -22492,10 +22549,10 @@ function OrderInput(props) {
22492
22549
  }, [props.defaultValue]);
22493
22550
  const [value, setValue] = (0, import_react6.useState)(props.defaultValue ?? []);
22494
22551
  if (value.length == 0) {
22495
- return (0, import_jsx_runtime27.jsx)("p", { className: "node-editor-helper-text", children: "Sources will appear here when subscriptions have been added to this node" });
22552
+ return (0, import_jsx_runtime29.jsx)("p", { className: "node-editor-helper-text", children: "Sources will appear here when subscriptions have been added to this node" });
22496
22553
  } else {
22497
- return (0, import_jsx_runtime27.jsx)("div", { id: props.id, children: (0, import_jsx_runtime27.jsx)("ul", { children: value.map((v, ix) => {
22498
- return (0, import_jsx_runtime27.jsxs)("li", { className: "flex", children: [(0, import_jsx_runtime27.jsx)("span", { className: "node-editor-label flex-grow", children: v }), ix == 0 ? (0, import_jsx_runtime27.jsx)(import_jsx_runtime27.Fragment, {}) : (0, import_jsx_runtime27.jsx)("svg", { onClick: moveUp(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime27.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18" }) }), ix == value.length - 1 ? (0, import_jsx_runtime27.jsx)(import_jsx_runtime27.Fragment, {}) : (0, import_jsx_runtime27.jsx)("svg", { onClick: moveDown(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime27.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3" }) })] }, v);
22554
+ return (0, import_jsx_runtime29.jsx)("div", { id: props.id, children: (0, import_jsx_runtime29.jsx)("ul", { children: value.map((v, ix) => {
22555
+ return (0, import_jsx_runtime29.jsxs)("li", { className: "flex", children: [(0, import_jsx_runtime29.jsx)("span", { className: "node-editor-label flex-grow", children: v }), ix == 0 ? (0, import_jsx_runtime29.jsx)(import_jsx_runtime29.Fragment, {}) : (0, import_jsx_runtime29.jsx)("svg", { onClick: moveUp(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime29.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18" }) }), ix == value.length - 1 ? (0, import_jsx_runtime29.jsx)(import_jsx_runtime29.Fragment, {}) : (0, import_jsx_runtime29.jsx)("svg", { onClick: moveDown(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime29.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3" }) })] }, v);
22499
22556
  }) }) });
22500
22557
  }
22501
22558
  function moveUp(ix) {
@@ -22520,14 +22577,14 @@ function OrderInput(props) {
22520
22577
  var source_selection_default = OrderInput;
22521
22578
 
22522
22579
  // build/processor.cascadingSwitch/inline-view.js
22523
- var import_jsx_runtime28 = __toESM(require_jsx_runtime());
22580
+ var import_jsx_runtime30 = __toESM(require_jsx_runtime());
22524
22581
  var activeClasses = "active text-green-500 dark:text-green-300";
22525
22582
  var availableClasses = "available text-green-500 dark:text-green-300";
22526
22583
  var inactiveClasses = "inactive text-orange-500 dark:text-orange-300";
22527
- function InlineView12({ state, config }) {
22528
- return (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [(0, import_jsx_runtime28.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime28.jsxs)("ul", { children: [config.sources.map((s, i) => state.activeSource == s ? (0, import_jsx_runtime28.jsxs)("li", { className: activeClasses, children: [s, " <--"] }, i) : state.availableSources.includes(s) ? (0, import_jsx_runtime28.jsxs)("li", { className: availableClasses, children: [s, " (available)"] }, i) : (0, import_jsx_runtime28.jsxs)("li", { className: inactiveClasses, children: [s, " (inactive)"] }, i)), (0, import_jsx_runtime28.jsx)("li", { className: state.activeSource == "fallback" ? activeClasses : availableClasses, children: "fallback" }, "fallback")] })] });
22584
+ function InlineView13({ state, config }) {
22585
+ return (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [(0, import_jsx_runtime30.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime30.jsxs)("ul", { children: [config.sources.map((s, i) => state.activeSource == s ? (0, import_jsx_runtime30.jsxs)("li", { className: activeClasses, children: [s, " <--"] }, i) : state.availableSources.includes(s) ? (0, import_jsx_runtime30.jsxs)("li", { className: availableClasses, children: [s, " (available)"] }, i) : (0, import_jsx_runtime30.jsxs)("li", { className: inactiveClasses, children: [s, " (inactive)"] }, i)), (0, import_jsx_runtime30.jsx)("li", { className: state.activeSource == "fallback" ? activeClasses : availableClasses, children: "fallback" }, "fallback")] })] });
22529
22586
  }
22530
- var inline_view_default12 = InlineView12;
22587
+ var inline_view_default13 = InlineView13;
22531
22588
 
22532
22589
  // build/processor.cascadingSwitch/info.js
22533
22590
  var import_FaSlidersH = __toESM(require_FaSlidersH());
@@ -22611,12 +22668,12 @@ function info_default22({ defineComponent, Av, common: { Resolutions, FrameRates
22611
22668
  state.availableSources.splice(state.availableSources.indexOf(ev.source), 1);
22612
22669
  return { ...state };
22613
22670
  default:
22614
- assertUnreachable12(evType);
22671
+ assertUnreachable13(evType);
22615
22672
  }
22616
22673
  },
22617
- inline: inline_view_default12,
22618
- summary: inline_view_default12,
22619
- fullscreen: inline_view_default12
22674
+ inline: inline_view_default13,
22675
+ summary: inline_view_default13,
22676
+ fullscreen: inline_view_default13
22620
22677
  },
22621
22678
  configForm: {
22622
22679
  form: {
@@ -22663,7 +22720,7 @@ function info_default22({ defineComponent, Av, common: { Resolutions, FrameRates
22663
22720
  }
22664
22721
  });
22665
22722
  }
22666
- function assertUnreachable12(_) {
22723
+ function assertUnreachable13(_) {
22667
22724
  throw new Error("Didn't expect to get here");
22668
22725
  }
22669
22726
 
@@ -22671,13 +22728,13 @@ function assertUnreachable12(_) {
22671
22728
  var import_config5 = __toESM(require_config());
22672
22729
 
22673
22730
  // build/processor.fixedLadder/rung-view.js
22674
- var import_jsx_runtime29 = __toESM(require_jsx_runtime());
22731
+ var import_jsx_runtime31 = __toESM(require_jsx_runtime());
22675
22732
  function rung_view_default(rung) {
22676
- return (0, import_jsx_runtime29.jsx)("div", { className: "text-gray-900 dark:text-white", children: rung.name });
22733
+ return (0, import_jsx_runtime31.jsx)("div", { className: "text-gray-900 dark:text-white", children: rung.name });
22677
22734
  }
22678
22735
 
22679
22736
  // build/processor.fixedLadder/codec-editor.js
22680
- var import_jsx_runtime30 = __toESM(require_jsx_runtime());
22737
+ var import_jsx_runtime32 = __toESM(require_jsx_runtime());
22681
22738
  var import_react7 = __toESM(require_react());
22682
22739
  function CodecEditor(props) {
22683
22740
  (0, import_react7.useEffect)(() => {
@@ -22693,7 +22750,7 @@ function CodecEditor(props) {
22693
22750
  target.style.height = target.scrollHeight + "px";
22694
22751
  }
22695
22752
  }, []);
22696
- return (0, import_jsx_runtime30.jsx)("textarea", { ref: textAreaRef, className: "w-full min-h-fit bg-white text-gray-900 dark:text-white dark:bg-black", id: props.id, onChange: (e) => {
22753
+ return (0, import_jsx_runtime32.jsx)("textarea", { ref: textAreaRef, className: "w-full min-h-fit bg-white text-gray-900 dark:text-white dark:bg-black", id: props.id, onChange: (e) => {
22697
22754
  const target = e.currentTarget;
22698
22755
  try {
22699
22756
  const codec = JSON.parse(target.value);
@@ -22705,9 +22762,9 @@ function CodecEditor(props) {
22705
22762
  }
22706
22763
 
22707
22764
  // build/processor.fixedLadder/codec-view.js
22708
- var import_jsx_runtime31 = __toESM(require_jsx_runtime());
22765
+ var import_jsx_runtime33 = __toESM(require_jsx_runtime());
22709
22766
  function CodecEditor2(props) {
22710
- return (0, import_jsx_runtime31.jsxs)("div", { className: "text-gray-900 dark:text-white", children: [props?.width, "x", props?.height] });
22767
+ return (0, import_jsx_runtime33.jsxs)("div", { className: "text-gray-900 dark:text-white", children: [props?.width, "x", props?.height] });
22711
22768
  }
22712
22769
 
22713
22770
  // build/processor.fixedLadder/info.js
@@ -22874,7 +22931,7 @@ function createSoftwareRung(rung) {
22874
22931
  case "h264_320x180":
22875
22932
  return createRungImpl({ name: rung, threads: 1, bitrate: 800 });
22876
22933
  default:
22877
- return assertUnreachable13(rung);
22934
+ return assertUnreachable14(rung);
22878
22935
  }
22879
22936
  }
22880
22937
  function createMa35dRung(rung) {
@@ -22888,7 +22945,7 @@ function createMa35dRung(rung) {
22888
22945
  case "h264_320x180":
22889
22946
  return createMa35DH264RungImpl({ name: rung, bitrate: 1e3 });
22890
22947
  default:
22891
- return assertUnreachable13(rung);
22948
+ return assertUnreachable14(rung);
22892
22949
  }
22893
22950
  }
22894
22951
  function createNvidiaRung(rung) {
@@ -22902,7 +22959,7 @@ function createNvidiaRung(rung) {
22902
22959
  case "h264_320x180":
22903
22960
  return createNvidiaRungImpl({ name: rung, bitrate: 8e5 });
22904
22961
  default:
22905
- return assertUnreachable13(rung);
22962
+ return assertUnreachable14(rung);
22906
22963
  }
22907
22964
  }
22908
22965
  function createQuadraRung(rung) {
@@ -22916,7 +22973,7 @@ function createQuadraRung(rung) {
22916
22973
  case "h264_320x180":
22917
22974
  return createQuadraRungImpl({ name: rung, bitrate: 8e5 });
22918
22975
  default:
22919
- return assertUnreachable13(rung);
22976
+ return assertUnreachable14(rung);
22920
22977
  }
22921
22978
  }
22922
22979
  function createLoganRung(rung) {
@@ -22930,7 +22987,7 @@ function createLoganRung(rung) {
22930
22987
  case "h264_320x180":
22931
22988
  return createLoganRungImpl({ name: rung, bitrate: 8e5 });
22932
22989
  default:
22933
- return assertUnreachable13(rung);
22990
+ return assertUnreachable14(rung);
22934
22991
  }
22935
22992
  }
22936
22993
  function createRungImpl({ name, threads, bitrate }) {
@@ -23031,7 +23088,7 @@ function rungWidth(rungName) {
23031
23088
  function rungHeight(rungName) {
23032
23089
  return parseInt(rungName.split("_")[1].split(`x`)[1]);
23033
23090
  }
23034
- function assertUnreachable13(_) {
23091
+ function assertUnreachable14(_) {
23035
23092
  throw new Error("Didn't expect to get here");
23036
23093
  }
23037
23094
 
@@ -23245,7 +23302,7 @@ function info_default25({ defineComponent, Video, Audio, validation: { Z } }) {
23245
23302
  var import_config6 = __toESM(require_config());
23246
23303
 
23247
23304
  // build/processor.onscreenGraphic/image-selection.js
23248
- var import_jsx_runtime32 = __toESM(require_jsx_runtime());
23305
+ var import_jsx_runtime34 = __toESM(require_jsx_runtime());
23249
23306
  var import_react8 = __toESM(require_react());
23250
23307
  function GraphicSelection(props) {
23251
23308
  const [loading, setLoading] = (0, import_react8.useState)(true);
@@ -23269,13 +23326,13 @@ function GraphicSelection(props) {
23269
23326
  }, [props.urls?.staticUrl?.toString()]);
23270
23327
  const [graphcs, setGraphics] = (0, import_react8.useState)([]);
23271
23328
  if (loading) {
23272
- return (0, import_jsx_runtime32.jsx)("div", { children: "Loading.." });
23329
+ return (0, import_jsx_runtime34.jsx)("div", { children: "Loading.." });
23273
23330
  }
23274
23331
  if (graphcs.length == 0) {
23275
- return (0, import_jsx_runtime32.jsx)("div", { children: "No graphics loaded" });
23332
+ return (0, import_jsx_runtime34.jsx)("div", { children: "No graphics loaded" });
23276
23333
  }
23277
- return (0, import_jsx_runtime32.jsx)("div", { children: (0, import_jsx_runtime32.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime32.jsx)("option", { value: "", children: "---" }, "empty"), graphcs.map((o, i) => {
23278
- return (0, import_jsx_runtime32.jsx)("option", { value: o, children: o }, i);
23334
+ return (0, import_jsx_runtime34.jsx)("div", { children: (0, import_jsx_runtime34.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime34.jsx)("option", { value: "", children: "---" }, "empty"), graphcs.map((o, i) => {
23335
+ return (0, import_jsx_runtime34.jsx)("option", { value: o, children: o }, i);
23279
23336
  })] }) });
23280
23337
  function myOnChange(e) {
23281
23338
  props.onChanged(e.target.value);
@@ -23284,7 +23341,7 @@ function GraphicSelection(props) {
23284
23341
  var image_selection_default = GraphicSelection;
23285
23342
 
23286
23343
  // build/processor.onscreenGraphic/summary-view.js
23287
- var import_jsx_runtime33 = __toESM(require_jsx_runtime());
23344
+ var import_jsx_runtime35 = __toESM(require_jsx_runtime());
23288
23345
  var import_react9 = __toESM(require_react());
23289
23346
  function SummaryView9({ state, sendCommand, urls }) {
23290
23347
  const [graphic, setGraphic] = (0, import_react9.useState)(state.activeGraphic?.file);
@@ -23421,7 +23478,7 @@ function SummaryView9({ state, sendCommand, urls }) {
23421
23478
  const buttonClass = "mt-2 mb-5 text-white w-full justify-center bg-primary-700 hover:bg-primary-800 focus:ring-4 focus:outline-none focus:ring-primary-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800";
23422
23479
  const deleteButtonClass = "mt-2 text-white w-full justify-center bg-red-600 hover:bg-red-700 focus:ring-4 focus:outline-none focus:ring-red-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-red-700 dark:hover:bg-red-800 dark:focus:ring-red-900";
23423
23480
  const fileInputClass = "block w-full text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400";
23424
- return (0, import_jsx_runtime33.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime33.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime33.jsxs)("div", { children: [(0, import_jsx_runtime33.jsx)("label", { htmlFor: "select-graphic", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime33.jsxs)("select", { id: "select-graphic", className: "w-full node-editor-select-input", value: graphic || "", onChange: (e) => setGraphic(e.target.value || void 0), children: [(0, import_jsx_runtime33.jsx)("option", { value: "", children: "---" }), graphics.map((s) => (0, import_jsx_runtime33.jsx)("option", { value: s, children: s }, s))] })] }), graphic && (0, import_jsx_runtime33.jsxs)("div", { children: [(0, import_jsx_runtime33.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Graphic position" }), (0, import_jsx_runtime33.jsx)(PositionSelector, { initialPosition: position, onChange: setPosition, graphicChanged, ...state })] }), (0, import_jsx_runtime33.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, onClick: () => sendCommand({ type: "change-graphic", file: graphic, position }), disabled: !stateChanged, children: "Commit" }), !showFileInput && !uploadStatus.success && (0, import_jsx_runtime33.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Graphic" }), showFileInput && (0, import_jsx_runtime33.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime33.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime33.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime33.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Graphics" }), showDeleteDropdown && (0, import_jsx_runtime33.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime33.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Graphic to Delete" }), (0, import_jsx_runtime33.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: graphicToDelete, onChange: (e) => setGraphicToDelete(e.target.value), children: [(0, import_jsx_runtime33.jsx)("option", { value: "", children: " Select a graphic" }), graphics.map((graphicName) => (0, import_jsx_runtime33.jsx)("option", { value: graphicName, children: graphicName }, graphicName))] }), (0, import_jsx_runtime33.jsx)("button", { onClick: deleteBug, disabled: !graphicToDelete, className: `${deleteButtonClass} ${!graphicToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Graphic" })] }), uploadStatus.message && (0, import_jsx_runtime33.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
23481
+ return (0, import_jsx_runtime35.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime35.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime35.jsxs)("div", { children: [(0, import_jsx_runtime35.jsx)("label", { htmlFor: "select-graphic", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime35.jsxs)("select", { id: "select-graphic", className: "w-full node-editor-select-input", value: graphic || "", onChange: (e) => setGraphic(e.target.value || void 0), children: [(0, import_jsx_runtime35.jsx)("option", { value: "", children: "---" }), graphics.map((s) => (0, import_jsx_runtime35.jsx)("option", { value: s, children: s }, s))] })] }), graphic && (0, import_jsx_runtime35.jsxs)("div", { children: [(0, import_jsx_runtime35.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Graphic position" }), (0, import_jsx_runtime35.jsx)(PositionSelector, { initialPosition: position, onChange: setPosition, graphicChanged, ...state })] }), (0, import_jsx_runtime35.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, onClick: () => sendCommand({ type: "change-graphic", file: graphic, position }), disabled: !stateChanged, children: "Commit" }), !showFileInput && !uploadStatus.success && (0, import_jsx_runtime35.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Graphic" }), showFileInput && (0, import_jsx_runtime35.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime35.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime35.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime35.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Graphics" }), showDeleteDropdown && (0, import_jsx_runtime35.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime35.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Graphic to Delete" }), (0, import_jsx_runtime35.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: graphicToDelete, onChange: (e) => setGraphicToDelete(e.target.value), children: [(0, import_jsx_runtime35.jsx)("option", { value: "", children: " Select a graphic" }), graphics.map((graphicName) => (0, import_jsx_runtime35.jsx)("option", { value: graphicName, children: graphicName }, graphicName))] }), (0, import_jsx_runtime35.jsx)("button", { onClick: deleteBug, disabled: !graphicToDelete, className: `${deleteButtonClass} ${!graphicToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Graphic" })] }), uploadStatus.message && (0, import_jsx_runtime35.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
23425
23482
  }
23426
23483
  function fromLocalPosition(pos) {
23427
23484
  if (pos.type === "named")
@@ -23430,7 +23487,7 @@ function fromLocalPosition(pos) {
23430
23487
  return { type: pos.type, x: pos.x, y: pos.y };
23431
23488
  if (pos.type === "percentage")
23432
23489
  return { type: pos.type, x: pos.x, y: pos.y };
23433
- assertUnreachable14(pos);
23490
+ assertUnreachable15(pos);
23434
23491
  }
23435
23492
  function convertPosition(givenPosition, currentVideo, currentGraphic) {
23436
23493
  if (!givenPosition)
@@ -23448,7 +23505,7 @@ function convertPosition(givenPosition, currentVideo, currentGraphic) {
23448
23505
  } else if (givenPosition.position === "center") {
23449
23506
  xy = { x: 50, y: 50 };
23450
23507
  } else {
23451
- assertUnreachable14(givenPosition.position);
23508
+ assertUnreachable15(givenPosition.position);
23452
23509
  }
23453
23510
  return { ...givenPosition, ...xy, xPct: xy.x, yPct: xy.y };
23454
23511
  }
@@ -23536,7 +23593,7 @@ var PositionSelector = ({ initialPosition: givenPosition = { type: "named", posi
23536
23593
  window.removeEventListener("mouseup", handleMouseUp);
23537
23594
  };
23538
23595
  }, [isDragging]);
23539
- return (0, import_jsx_runtime33.jsxs)("div", { className: "relative w-full max-w-lg mx-auto mt-4 mb-8", children: [(0, import_jsx_runtime33.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime33.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Type:" }), (0, import_jsx_runtime33.jsxs)("select", { value: position.type, onChange: (e) => {
23596
+ return (0, import_jsx_runtime35.jsxs)("div", { className: "relative w-full max-w-lg mx-auto mt-4 mb-8", children: [(0, import_jsx_runtime35.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime35.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Type:" }), (0, import_jsx_runtime35.jsxs)("select", { value: position.type, onChange: (e) => {
23540
23597
  const newType = e.target.value;
23541
23598
  if (newType === "named") {
23542
23599
  setPosition(convertPos({ type: "named", position: "topleft" }));
@@ -23544,12 +23601,12 @@ var PositionSelector = ({ initialPosition: givenPosition = { type: "named", posi
23544
23601
  setPositionUnit("%");
23545
23602
  setPosition({ ...convertPos(position), type: "percentage" });
23546
23603
  }
23547
- }, className: "node-editor-select-input", children: [(0, import_jsx_runtime33.jsx)("option", { value: "coordinate", children: "Custom Position" }), (0, import_jsx_runtime33.jsx)("option", { value: "named", children: "Preset Position" })] })] }), position.type === "named" ? (0, import_jsx_runtime33.jsx)("div", { className: "mb-4", children: (0, import_jsx_runtime33.jsxs)("select", { value: position.position, onChange: (e) => {
23604
+ }, className: "node-editor-select-input", children: [(0, import_jsx_runtime35.jsx)("option", { value: "coordinate", children: "Custom Position" }), (0, import_jsx_runtime35.jsx)("option", { value: "named", children: "Preset Position" })] })] }), position.type === "named" ? (0, import_jsx_runtime35.jsx)("div", { className: "mb-4", children: (0, import_jsx_runtime35.jsxs)("select", { value: position.position, onChange: (e) => {
23548
23605
  setPosition(convertPos({
23549
23606
  type: "named",
23550
23607
  position: e.target.value
23551
23608
  }));
23552
- }, className: "w-full node-editor-select-input", children: [(0, import_jsx_runtime33.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime33.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime33.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime33.jsx)("option", { value: "bottomright", children: "Bottom Right" }), (0, import_jsx_runtime33.jsx)("option", { value: "center", children: "Centered" })] }) }) : (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [(0, import_jsx_runtime33.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime33.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Unit:" }), (0, import_jsx_runtime33.jsxs)("select", { value: positionUnit, onChange: (e) => {
23609
+ }, className: "w-full node-editor-select-input", children: [(0, import_jsx_runtime35.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime35.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime35.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime35.jsx)("option", { value: "bottomright", children: "Bottom Right" }), (0, import_jsx_runtime35.jsx)("option", { value: "center", children: "Centered" })] }) }) : (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [(0, import_jsx_runtime35.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime35.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Unit:" }), (0, import_jsx_runtime35.jsxs)("select", { value: positionUnit, onChange: (e) => {
23553
23610
  setPositionUnit(e.target.value);
23554
23611
  if (e.target.value === "px" && position.type !== "coordinate" && currentVideo && currentGraphic) {
23555
23612
  const { width: videoWidth, height: videoHeight } = currentVideo;
@@ -23574,18 +23631,18 @@ var PositionSelector = ({ initialPosition: givenPosition = { type: "named", posi
23574
23631
  yStr: void 0
23575
23632
  });
23576
23633
  }
23577
- }, className: "node-editor-select-input", children: [(0, import_jsx_runtime33.jsx)("option", { value: "px", children: "Pixels" }), (0, import_jsx_runtime33.jsx)("option", { value: "%", children: "Percentage" })] })] }), (0, import_jsx_runtime33.jsxs)("div", { className: "relative bg-gray-200 dark:bg-gray-700 rounded-lg", style: {
23634
+ }, className: "node-editor-select-input", children: [(0, import_jsx_runtime35.jsx)("option", { value: "px", children: "Pixels" }), (0, import_jsx_runtime35.jsx)("option", { value: "%", children: "Percentage" })] })] }), (0, import_jsx_runtime35.jsxs)("div", { className: "relative bg-gray-200 dark:bg-gray-700 rounded-lg", style: {
23578
23635
  width: "100%",
23579
23636
  userSelect: "none",
23580
23637
  aspectRatio: currentVideo ? `${currentVideo.width} / ${currentVideo.height}` : `3 / 2`
23581
- }, ref: previewAreaRef, children: [(0, import_jsx_runtime33.jsxs)("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-gray-500 dark:text-gray-400", children: [(0, import_jsx_runtime33.jsx)("span", { children: currentVideo ? "Video Preview Area" : "Video Dimensions Unknown" }), " ", currentVideo ? (0, import_jsx_runtime33.jsxs)("span", { children: [currentVideo.width, "x", currentVideo.height, "px"] }) : ""] }), (0, import_jsx_runtime33.jsx)("div", { className: `absolute cursor-move ${currentGraphic && !graphicChanged ? "" : "p-2"} rounded-lg bg-primary-500 bg-opacity-50 hover:bg-opacity-75 transition-colors
23638
+ }, ref: previewAreaRef, children: [(0, import_jsx_runtime35.jsxs)("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-gray-500 dark:text-gray-400", children: [(0, import_jsx_runtime35.jsx)("span", { children: currentVideo ? "Video Preview Area" : "Video Dimensions Unknown" }), " ", currentVideo ? (0, import_jsx_runtime35.jsxs)("span", { children: [currentVideo.width, "x", currentVideo.height, "px"] }) : ""] }), (0, import_jsx_runtime35.jsx)("div", { className: `absolute cursor-move ${currentGraphic && !graphicChanged ? "" : "p-2"} rounded-lg bg-primary-500 bg-opacity-50 hover:bg-opacity-75 transition-colors
23582
23639
  ${isDragging ? "bg-opacity-75" : ""}`, style: {
23583
23640
  left: `${position.xPct}%`,
23584
23641
  top: `${position.yPct}%`,
23585
23642
  transform: `translate(-${position.xPct}%, -${position.yPct}%)`,
23586
23643
  aspectRatio: currentGraphic && !graphicChanged ? `${currentGraphic.width} / ${currentGraphic.height}` : `1`,
23587
23644
  width: currentGraphic && currentVideo && !graphicChanged ? currentGraphic.width / currentVideo.width * 100 + "%" : void 0
23588
- }, onMouseDown: handleMouseDown, ref: previewTargetRef, children: (0, import_jsx_runtime33.jsx)("svg", { className: `${currentGraphic && !graphicChanged ? "w-full h-full" : "w-6 h-6"} text-white`, "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: (0, import_jsx_runtime33.jsx)("path", { stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 6v12m-6-6h12m-6-6 1.5 1.5M12 6l-1.5 1.5m1.5 10.5L10.5 16.5M12 18l1.5-1.5M6 12l1.5-1.5M7.5 13.5 6 12m12 0-1.5-1.5M16.5 13.5 18 12" }) }) })] }), (0, import_jsx_runtime33.jsxs)("div", { className: "mt-2 text-sm text-gray-600 dark:text-gray-300 text-center", children: ["Position:", " ", position.type === "percentage" ? `${position.xPct.toFixed(1)}%, ${position.yPct.toFixed(1)}%` : `${Math.round(position.x)}px, ${Math.round(position.y)}px`] }), (0, import_jsx_runtime33.jsxs)("div", { className: "mt-2 flex gap-4", children: [(0, import_jsx_runtime33.jsxs)("div", { children: [(0, import_jsx_runtime33.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["X Position ", positionUnit] }), (0, import_jsx_runtime33.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.xStr ?? (positionUnit === "%" ? position.xPct.toFixed(1) : Math.round(position.x)), onChange: (e) => {
23645
+ }, onMouseDown: handleMouseDown, ref: previewTargetRef, children: (0, import_jsx_runtime35.jsx)("svg", { className: `${currentGraphic && !graphicChanged ? "w-full h-full" : "w-6 h-6"} text-white`, "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: (0, import_jsx_runtime35.jsx)("path", { stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 6v12m-6-6h12m-6-6 1.5 1.5M12 6l-1.5 1.5m1.5 10.5L10.5 16.5M12 18l1.5-1.5M6 12l1.5-1.5M7.5 13.5 6 12m12 0-1.5-1.5M16.5 13.5 18 12" }) }) })] }), (0, import_jsx_runtime35.jsxs)("div", { className: "mt-2 text-sm text-gray-600 dark:text-gray-300 text-center", children: ["Position:", " ", position.type === "percentage" ? `${position.xPct.toFixed(1)}%, ${position.yPct.toFixed(1)}%` : `${Math.round(position.x)}px, ${Math.round(position.y)}px`] }), (0, import_jsx_runtime35.jsxs)("div", { className: "mt-2 flex gap-4", children: [(0, import_jsx_runtime35.jsxs)("div", { children: [(0, import_jsx_runtime35.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["X Position ", positionUnit] }), (0, import_jsx_runtime35.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.xStr ?? (positionUnit === "%" ? position.xPct.toFixed(1) : Math.round(position.x)), onChange: (e) => {
23589
23646
  const newX = Number(e.target.value);
23590
23647
  setPosition(convertPos({
23591
23648
  type: positionUnit === "%" ? "percentage" : "coordinate",
@@ -23594,7 +23651,7 @@ var PositionSelector = ({ initialPosition: givenPosition = { type: "named", posi
23594
23651
  y: position.y,
23595
23652
  yStr: position.yStr
23596
23653
  }));
23597
- }, className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm dark:bg-gray-700 dark:border-gray-600" })] }), (0, import_jsx_runtime33.jsxs)("div", { children: [(0, import_jsx_runtime33.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["Y Position ", positionUnit] }), (0, import_jsx_runtime33.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.yStr ?? (positionUnit === "%" ? position.yPct.toFixed(1) : Math.round(position.y)), onChange: (e) => {
23654
+ }, className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm dark:bg-gray-700 dark:border-gray-600" })] }), (0, import_jsx_runtime35.jsxs)("div", { children: [(0, import_jsx_runtime35.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["Y Position ", positionUnit] }), (0, import_jsx_runtime35.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.yStr ?? (positionUnit === "%" ? position.yPct.toFixed(1) : Math.round(position.y)), onChange: (e) => {
23598
23655
  const newY = Number(e.target.value);
23599
23656
  setPosition(convertPos({
23600
23657
  type: positionUnit === "%" ? "percentage" : "coordinate",
@@ -23608,7 +23665,7 @@ var PositionSelector = ({ initialPosition: givenPosition = { type: "named", posi
23608
23665
  function clamp(min, num, max) {
23609
23666
  return num < min ? min : num > max ? max : num;
23610
23667
  }
23611
- function assertUnreachable14(_) {
23668
+ function assertUnreachable15(_) {
23612
23669
  throw new Error("Didn't expect to get here");
23613
23670
  }
23614
23671
  var summary_view_default9 = SummaryView9;
@@ -23654,7 +23711,7 @@ function info_default26({ defineComponent }) {
23654
23711
  case "graphic-loaded":
23655
23712
  return { ...state, currentGraphic: ev.currentGraphic };
23656
23713
  default:
23657
- assertUnreachable15(evType);
23714
+ assertUnreachable16(evType);
23658
23715
  }
23659
23716
  }
23660
23717
  },
@@ -23690,7 +23747,7 @@ function info_default26({ defineComponent }) {
23690
23747
  }
23691
23748
  });
23692
23749
  }
23693
- function assertUnreachable15(_) {
23750
+ function assertUnreachable16(_) {
23694
23751
  throw new Error("Didn't expect to get here");
23695
23752
  }
23696
23753
 
@@ -23837,7 +23894,7 @@ function info_default28({ defineComponent }) {
23837
23894
  }
23838
23895
 
23839
23896
  // build/util.stats.latency/inline-view.js
23840
- var import_jsx_runtime34 = __toESM(require_jsx_runtime());
23897
+ var import_jsx_runtime36 = __toESM(require_jsx_runtime());
23841
23898
  var import_react10 = __toESM(require_react());
23842
23899
 
23843
23900
  // ../../node_modules/chart.js/auto/auto.js
@@ -23845,7 +23902,7 @@ Chart.register(...registerables);
23845
23902
  var auto_default = Chart;
23846
23903
 
23847
23904
  // build/util.stats.latency/inline-view.js
23848
- function InlineView13({ state, config: _2 }) {
23905
+ function InlineView14({ state, config: _2 }) {
23849
23906
  const chartContainer = (0, import_react10.useRef)(null);
23850
23907
  const [chartControl, setChartControl] = (0, import_react10.useState)(void 0);
23851
23908
  function makeDataSet(key, color2, values) {
@@ -23907,19 +23964,19 @@ function InlineView13({ state, config: _2 }) {
23907
23964
  return;
23908
23965
  chartControl.data = makeData(state);
23909
23966
  }, [state]);
23910
- return (0, import_jsx_runtime34.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime34.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
23967
+ return (0, import_jsx_runtime36.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime36.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
23911
23968
  }
23912
- var inline_view_default13 = InlineView13;
23969
+ var inline_view_default14 = InlineView14;
23913
23970
 
23914
23971
  // build/util.stats.latency/source-node-selection.js
23915
- var import_jsx_runtime35 = __toESM(require_jsx_runtime());
23972
+ var import_jsx_runtime37 = __toESM(require_jsx_runtime());
23916
23973
  function SourceNodeSelection(props) {
23917
- return (0, import_jsx_runtime35.jsx)("div", { children: (0, import_jsx_runtime35.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime35.jsx)("option", { value: "", children: "---" }, "empty"), Object.values(props.latestDocument.components).map((o, i) => {
23974
+ return (0, import_jsx_runtime37.jsx)("div", { children: (0, import_jsx_runtime37.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime37.jsx)("option", { value: "", children: "---" }, "empty"), Object.values(props.latestDocument.components).map((o, i) => {
23918
23975
  if (o.id == props.id)
23919
- return (0, import_jsx_runtime35.jsx)(import_jsx_runtime35.Fragment, {});
23976
+ return (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, {});
23920
23977
  if (o.info.category === "output")
23921
23978
  return;
23922
- return (0, import_jsx_runtime35.jsx)("option", { value: o.id, children: o.config.displayName }, i);
23979
+ return (0, import_jsx_runtime37.jsx)("option", { value: o.id, children: o.config.displayName }, i);
23923
23980
  })] }) });
23924
23981
  function myOnChange(e) {
23925
23982
  props.onChanged(e.target.value);
@@ -23959,11 +24016,11 @@ function info_default29(R) {
23959
24016
  break;
23960
24017
  }
23961
24018
  default:
23962
- assertUnreachable16(evType);
24019
+ assertUnreachable17(evType);
23963
24020
  }
23964
24021
  return { ...state };
23965
24022
  },
23966
- inline: inline_view_default13
24023
+ inline: inline_view_default14
23967
24024
  },
23968
24025
  configForm: {
23969
24026
  form: {
@@ -24014,7 +24071,7 @@ function info_default29(R) {
24014
24071
  }
24015
24072
  });
24016
24073
  }
24017
- function assertUnreachable16(_) {
24074
+ function assertUnreachable17(_) {
24018
24075
  throw new Error("Didn't expect to get here");
24019
24076
  }
24020
24077