@norskvideo/norsk-studio-built-ins 1.12.0-2025-02-04-9551fc82 → 1.12.0-2025-02-07-f7d8ed22

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 (36) hide show
  1. package/client/info.js +206 -166
  2. package/lib/input.rtmp/info.js +8 -8
  3. package/lib/input.rtmp/info.js.map +1 -1
  4. package/lib/input.silence/info.js +7 -7
  5. package/lib/input.silence/info.js.map +1 -1
  6. package/lib/input.srt-caller/info.js +8 -8
  7. package/lib/input.srt-caller/info.js.map +1 -1
  8. package/lib/input.srt-listener/info.js +7 -7
  9. package/lib/input.srt-listener/info.js.map +1 -1
  10. package/lib/input.udp-ts/info.js +2 -2
  11. package/lib/input.udp-ts/info.js.map +1 -1
  12. package/lib/input.videoTestCard/info.js +4 -7
  13. package/lib/input.videoTestCard/info.js.map +1 -1
  14. package/lib/output.autoCmaf/info.js +9 -7
  15. package/lib/output.autoCmaf/info.js.map +1 -1
  16. package/lib/output.autoCmaf/runtime.d.ts +5 -8
  17. package/lib/output.autoCmaf/runtime.js +18 -31
  18. package/lib/output.autoCmaf/runtime.js.map +1 -1
  19. package/lib/output.autoCmaf/summary-view.d.ts +4 -0
  20. package/lib/output.autoCmaf/summary-view.js +24 -0
  21. package/lib/output.autoCmaf/summary-view.js.map +1 -0
  22. package/lib/output.preview/info.js +5 -8
  23. package/lib/output.preview/info.js.map +1 -1
  24. package/lib/output.rtmp/info.js +5 -2
  25. package/lib/output.rtmp/info.js.map +1 -1
  26. package/lib/output.srt/info.js +5 -2
  27. package/lib/output.srt/info.js.map +1 -1
  28. package/lib/output.udpTs/info.js +4 -1
  29. package/lib/output.udpTs/info.js.map +1 -1
  30. package/lib/output.whep/info.js +5 -2
  31. package/lib/output.whep/info.js.map +1 -1
  32. package/lib/output.whep/runtime.js +0 -21
  33. package/lib/output.whep/runtime.js.map +1 -1
  34. package/lib/test/auto-cmaf.js +138 -1
  35. package/lib/test/auto-cmaf.js.map +1 -1
  36. package/package.json +3 -3
package/client/info.js CHANGED
@@ -493,6 +493,39 @@ var require_config = __commonJS({
493
493
  }
494
494
  });
495
495
 
496
+ // build/output.autoCmaf/summary-view.js
497
+ var summary_view_exports3 = {};
498
+ __export(summary_view_exports3, {
499
+ default: () => summary_view_default3
500
+ });
501
+ function SummaryView5({ state, sendCommand }) {
502
+ const handleEnableOutput = () => {
503
+ void enableOutput();
504
+ };
505
+ const enableOutput = async () => {
506
+ sendCommand({
507
+ type: "enable-output"
508
+ });
509
+ };
510
+ const handleDisableOutput = () => {
511
+ void disableOutput();
512
+ };
513
+ const disableOutput = async () => {
514
+ sendCommand({
515
+ type: "disable-output"
516
+ });
517
+ };
518
+ return (0, import_jsx_runtime6.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime6.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime6.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime6.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime6.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_runtime6.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
519
+ }
520
+ var import_jsx_runtime6, summary_view_default3;
521
+ var init_summary_view3 = __esm({
522
+ "build/output.autoCmaf/summary-view.js"() {
523
+ "use strict";
524
+ import_jsx_runtime6 = __toESM(require_jsx_runtime());
525
+ summary_view_default3 = SummaryView5;
526
+ }
527
+ });
528
+
496
529
  // external-global-plugin:hls.js
497
530
  var require_hls = __commonJS({
498
531
  "external-global-plugin:hls.js"(exports, module) {
@@ -521,16 +554,16 @@ function FullscreenView({ state, config }) {
521
554
  }
522
555
  }, [state.url]);
523
556
  if (!url)
524
- return (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, { children: "..." });
557
+ return (0, import_jsx_runtime7.jsx)(import_jsx_runtime7.Fragment, { children: "..." });
525
558
  {
526
559
  }
527
- return (0, import_jsx_runtime6.jsx)("div", { children: (0, import_jsx_runtime6.jsx)("video", { controls: true, autoPlay: true, muted: true, id: `${id}-video` }) });
560
+ return (0, import_jsx_runtime7.jsx)("div", { children: (0, import_jsx_runtime7.jsx)("video", { controls: true, autoPlay: true, muted: true, id: `${id}-video` }) });
528
561
  }
529
- var import_jsx_runtime6, import_react4, import_hls, fullscreen_default;
562
+ var import_jsx_runtime7, import_react4, import_hls, fullscreen_default;
530
563
  var init_fullscreen = __esm({
531
564
  "build/output.autoCmaf/fullscreen.js"() {
532
565
  "use strict";
533
- import_jsx_runtime6 = __toESM(require_jsx_runtime());
566
+ import_jsx_runtime7 = __toESM(require_jsx_runtime());
534
567
  import_react4 = __toESM(require_react());
535
568
  import_hls = __toESM(require_hls());
536
569
  fullscreen_default = FullscreenView;
@@ -544,16 +577,16 @@ __export(form_views_exports, {
544
577
  SegmentConfiguration: () => SegmentConfiguration
545
578
  });
546
579
  function S3Destination(destination) {
547
- return (0, import_jsx_runtime7.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime7.jsx)("div", { className: "col-span-1", children: "Host" }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-2", children: destination.host }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-1", children: "Path" }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-2", children: destination.prefix }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-1", children: "Include Ads" }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-2", children: destination.includeAdInsertions ? "yes" : "no" })] });
580
+ return (0, import_jsx_runtime8.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Host" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.host }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Path" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.prefix }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Include Ads" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.includeAdInsertions ? "yes" : "no" })] });
548
581
  }
549
582
  function SegmentConfiguration(cfg) {
550
- return (0, import_jsx_runtime7.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime7.jsx)("div", { className: "col-span-1", children: "Segments" }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-2", children: cfg.defaultSegmentCount == 0 ? "all" : cfg.defaultSegmentCount }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-1", children: "Segment Target" }), (0, import_jsx_runtime7.jsxs)("div", { className: "col-span-2", children: [cfg.targetSegmentDuration, "s"] }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-1", children: "Part Target" }), (0, import_jsx_runtime7.jsxs)("div", { className: "col-span-2", children: [cfg.targetPartDuration, "s"] }), (0, import_jsx_runtime7.jsx)("div", { className: "col-span-1", children: "Retention" }), (0, import_jsx_runtime7.jsxs)("div", { className: "col-span-2", children: [cfg.retentionPeriod, "s"] })] });
583
+ return (0, import_jsx_runtime8.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Segments" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: cfg.defaultSegmentCount == 0 ? "all" : cfg.defaultSegmentCount }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Segment Target" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.targetSegmentDuration, "s"] }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Part Target" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.targetPartDuration, "s"] }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Retention" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.retentionPeriod, "s"] })] });
551
584
  }
552
- var import_jsx_runtime7;
585
+ var import_jsx_runtime8;
553
586
  var init_form_views = __esm({
554
587
  "build/output.autoCmaf/form-views.js"() {
555
588
  "use strict";
556
- import_jsx_runtime7 = __toESM(require_jsx_runtime());
589
+ import_jsx_runtime8 = __toESM(require_jsx_runtime());
557
590
  }
558
591
  });
559
592
 
@@ -611,7 +644,7 @@ function InlineView5({ state, config, raise }) {
611
644
  }, [config.showPreview]);
612
645
  raise && (0, import_react6.useEffect)(raise, []);
613
646
  if (!url)
614
- return (0, import_jsx_runtime8.jsx)(import_jsx_runtime8.Fragment, { children: "..." });
647
+ return (0, import_jsx_runtime9.jsx)(import_jsx_runtime9.Fragment, { children: "..." });
615
648
  function percentage(levels) {
616
649
  if (!levels) {
617
650
  return 0;
@@ -621,15 +654,15 @@ function InlineView5({ state, config, raise }) {
621
654
  const snapped = Math.floor(capped * 10) * 10;
622
655
  return Math.max(0, 100 - snapped);
623
656
  }
624
- return (0, import_jsx_runtime8.jsxs)("div", { className: "preview-outer-container", children: [(0, import_jsx_runtime8.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime8.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime8.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime8.jsx)("div", { className: "preview-video", id: `preview-${id}`, children: (0, import_jsx_runtime8.jsx)("style", { children: `
657
+ return (0, import_jsx_runtime9.jsxs)("div", { className: "preview-outer-container", children: [(0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime9.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime9.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime9.jsx)("div", { className: "preview-video", id: `preview-${id}`, children: (0, import_jsx_runtime9.jsx)("style", { children: `
625
658
  #preview-${id} video::-webkit-media-controls-play-button { display: none; },
626
- ` }) }) : (0, import_jsx_runtime8.jsx)("div", { className: "preview-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" }), (0, import_jsx_runtime8.jsx)("div", { className: "preview-levels", children: (0, import_jsx_runtime8.jsx)("div", { className: `preview-level clip-${percentage(state.levels)}-preview` }) })] });
659
+ ` }) }) : (0, import_jsx_runtime9.jsx)("div", { className: "preview-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" }), (0, import_jsx_runtime9.jsx)("div", { className: "preview-levels", children: (0, import_jsx_runtime9.jsx)("div", { className: `preview-level clip-${percentage(state.levels)}-preview` }) })] });
627
660
  }
628
- var import_jsx_runtime8, import_react6, import_webrtc_client, inline_view_default3;
661
+ var import_jsx_runtime9, import_react6, import_webrtc_client, inline_view_default3;
629
662
  var init_inline_view3 = __esm({
630
663
  "build/output.preview/inline-view.js"() {
631
664
  "use strict";
632
- import_jsx_runtime8 = __toESM(require_jsx_runtime());
665
+ import_jsx_runtime9 = __toESM(require_jsx_runtime());
633
666
  import_react6 = __toESM(require_react());
634
667
  import_webrtc_client = __toESM(require_webrtc_client());
635
668
  inline_view_default3 = InlineView5;
@@ -642,15 +675,15 @@ __export(inline_view_exports4, {
642
675
  default: () => inline_view_default4
643
676
  });
644
677
  function InlineView6({ state, config }) {
645
- const connected = (0, import_jsx_runtime9.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected and publishing" });
646
- const disconnected = (0, import_jsx_runtime9.jsxs)("div", { className: "inactive text-orange-500 dark:text-orange-300", children: ["Disconnected ", state.connectRetries > 0 ? `- retrying(${state.connectRetries})` : ""] });
647
- return (0, import_jsx_runtime9.jsx)("div", { className: "rtmp-output", id: `rtmp-output-${config.id}`, children: state.connected ? connected : disconnected });
678
+ const connected = (0, import_jsx_runtime10.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected and publishing" });
679
+ const disconnected = (0, import_jsx_runtime10.jsxs)("div", { className: "inactive text-orange-500 dark:text-orange-300", children: ["Disconnected ", state.connectRetries > 0 ? `- retrying(${state.connectRetries})` : ""] });
680
+ return (0, import_jsx_runtime10.jsx)("div", { className: "rtmp-output", id: `rtmp-output-${config.id}`, children: state.connected ? connected : disconnected });
648
681
  }
649
- var import_jsx_runtime9, inline_view_default4;
682
+ var import_jsx_runtime10, inline_view_default4;
650
683
  var init_inline_view4 = __esm({
651
684
  "build/output.rtmp/inline-view.js"() {
652
685
  "use strict";
653
- import_jsx_runtime9 = __toESM(require_jsx_runtime());
686
+ import_jsx_runtime10 = __toESM(require_jsx_runtime());
654
687
  inline_view_default4 = InlineView6;
655
688
  }
656
689
  });
@@ -737,23 +770,23 @@ __export(inline_view_exports5, {
737
770
  });
738
771
  function InlineView7({ state }) {
739
772
  if (!state.previous)
740
- return (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, {});
773
+ return (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, {});
741
774
  const format = (stat) => Math.floor(stat).toLocaleString("en-US", { maximumFractionDigits: 0 });
742
- return (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, { children: state.previous.allStreams.map((s, i) => {
775
+ return (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, { children: state.previous.allStreams.map((s, i) => {
743
776
  const metaCase = s.metadata.case;
744
777
  switch (metaCase) {
745
778
  case "audio":
746
- return (0, import_jsx_runtime10.jsxs)("div", { children: [(0, import_jsx_runtime10.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime10.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
779
+ return (0, import_jsx_runtime11.jsxs)("div", { children: [(0, import_jsx_runtime11.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime11.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
747
780
  case "video":
748
- return (0, import_jsx_runtime10.jsxs)("div", { children: [(0, import_jsx_runtime10.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime10.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
781
+ return (0, import_jsx_runtime11.jsxs)("div", { children: [(0, import_jsx_runtime11.jsxs)("div", { children: ["StreamKey: ", streamKey(s.streamKey)] }), (0, import_jsx_runtime11.jsxs)("div", { children: ["Bitrate: ", format(s.bitrate), "bps"] })] }, i);
749
782
  case "ancillary":
750
- return (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, {});
783
+ return (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, {});
751
784
  case "subtitle":
752
- return (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, {});
785
+ return (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, {});
753
786
  case "playlist":
754
- return (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, {});
787
+ return (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, {});
755
788
  case void 0:
756
- return (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, {});
789
+ return (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, {});
757
790
  default:
758
791
  assertUnreachable7(metaCase);
759
792
  }
@@ -762,11 +795,11 @@ function InlineView7({ state }) {
762
795
  function streamKey(streamKey2) {
763
796
  return streamKey2.streamId.toString();
764
797
  }
765
- var import_jsx_runtime10, inline_view_default5;
798
+ var import_jsx_runtime11, inline_view_default5;
766
799
  var init_inline_view5 = __esm({
767
800
  "build/output.statistics/inline-view.js"() {
768
801
  "use strict";
769
- import_jsx_runtime10 = __toESM(require_jsx_runtime());
802
+ import_jsx_runtime11 = __toESM(require_jsx_runtime());
770
803
  init_info();
771
804
  inline_view_default5 = InlineView7;
772
805
  }
@@ -824,11 +857,11 @@ var init_info = __esm({
824
857
  });
825
858
 
826
859
  // build/output.whep/summary-view.js
827
- var summary_view_exports3 = {};
828
- __export(summary_view_exports3, {
829
- default: () => summary_view_default3
860
+ var summary_view_exports4 = {};
861
+ __export(summary_view_exports4, {
862
+ default: () => summary_view_default4
830
863
  });
831
- function SummaryView5({ state, sendCommand }) {
864
+ function SummaryView6({ state, sendCommand }) {
832
865
  const handleEnableOutput = () => {
833
866
  void enableOutput();
834
867
  };
@@ -845,14 +878,14 @@ function SummaryView5({ state, sendCommand }) {
845
878
  type: "disable-output"
846
879
  });
847
880
  };
848
- return (0, import_jsx_runtime11.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime11.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime11.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime11.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime11.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_runtime11.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
881
+ return (0, import_jsx_runtime12.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime12.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime12.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime12.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime12.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_runtime12.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
849
882
  }
850
- var import_jsx_runtime11, summary_view_default3;
851
- var init_summary_view3 = __esm({
883
+ var import_jsx_runtime12, summary_view_default4;
884
+ var init_summary_view4 = __esm({
852
885
  "build/output.whep/summary-view.js"() {
853
886
  "use strict";
854
- import_jsx_runtime11 = __toESM(require_jsx_runtime());
855
- summary_view_default3 = SummaryView5;
887
+ import_jsx_runtime12 = __toESM(require_jsx_runtime());
888
+ summary_view_default4 = SummaryView6;
856
889
  }
857
890
  });
858
891
 
@@ -903,19 +936,19 @@ function InlineView8({ state, config, raise }) {
903
936
  }, [config.showPreview]);
904
937
  raise && (0, import_react11.useEffect)(raise, []);
905
938
  if (!url)
906
- return (0, import_jsx_runtime12.jsx)(import_jsx_runtime12.Fragment, { children: "..." });
939
+ return (0, import_jsx_runtime13.jsx)(import_jsx_runtime13.Fragment, { children: "..." });
907
940
  const videoStyles = `
908
941
  #whep-${id} video::-webkit-media-controls-play-button {
909
942
  display: none;
910
943
  }
911
944
  `;
912
- return (0, import_jsx_runtime12.jsxs)("div", { className: "whep-container", children: [(0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime12.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime12.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime12.jsx)("div", { className: "whep-video", id: `whep-${id}`, children: (0, import_jsx_runtime12.jsx)("style", { children: videoStyles }) }) : (0, import_jsx_runtime12.jsx)("div", { className: "whep-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" })] });
945
+ return (0, import_jsx_runtime13.jsxs)("div", { className: "whep-container", children: [(0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime13.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime13.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime13.jsx)("div", { className: "whep-video", id: `whep-${id}`, children: (0, import_jsx_runtime13.jsx)("style", { children: videoStyles }) }) : (0, import_jsx_runtime13.jsx)("div", { className: "whep-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" })] });
913
946
  }
914
- var import_jsx_runtime12, import_react11, import_webrtc_client2, inline_view_default6;
947
+ var import_jsx_runtime13, import_react11, import_webrtc_client2, inline_view_default6;
915
948
  var init_inline_view6 = __esm({
916
949
  "build/output.whep/inline-view.js"() {
917
950
  "use strict";
918
- import_jsx_runtime12 = __toESM(require_jsx_runtime());
951
+ import_jsx_runtime13 = __toESM(require_jsx_runtime());
919
952
  import_react11 = __toESM(require_react());
920
953
  import_webrtc_client2 = __toESM(require_webrtc_client());
921
954
  inline_view_default6 = InlineView8;
@@ -923,18 +956,18 @@ var init_inline_view6 = __esm({
923
956
  });
924
957
 
925
958
  // build/processor.browserOverlay/summary-view.js
926
- var summary_view_exports4 = {};
927
- __export(summary_view_exports4, {
928
- default: () => summary_view_default4
959
+ var summary_view_exports5 = {};
960
+ __export(summary_view_exports5, {
961
+ default: () => summary_view_default5
929
962
  });
930
- function SummaryView7({ state, sendCommand }) {
963
+ function SummaryView8({ state, sendCommand }) {
931
964
  const [url, setUrl] = (0, import_react13.useState)(state.currentUrl);
932
965
  const [enabled, setEnabled] = (0, import_react13.useState)(state.enabled);
933
966
  const stateChanged = (0, import_react13.useMemo)(() => {
934
967
  return url !== state.currentUrl || enabled !== state.enabled;
935
968
  }, [url, enabled]);
936
969
  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";
937
- return (0, import_jsx_runtime13.jsxs)("div", { className: "space-y-3 mb-5", children: [(0, import_jsx_runtime13.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime13.jsxs)("div", { className: "mb-5", children: [(0, import_jsx_runtime13.jsx)("label", { htmlFor: "url", className: "mb-2 mr-2 text-sm font-medium text-gray-900 dark:text-white", children: "URL" }), (0, import_jsx_runtime13.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_runtime13.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime13.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime13.jsx)("span", { className: "me-3 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Enabled" }), (0, import_jsx_runtime13.jsx)("input", { type: "checkbox", checked: enabled, onChange: (e) => setEnabled(e.target.checked), className: "sr-only peer" }), (0, import_jsx_runtime13.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_runtime13.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, disabled: !stateChanged, onClick: () => {
970
+ return (0, import_jsx_runtime14.jsxs)("div", { className: "space-y-3 mb-5", children: [(0, import_jsx_runtime14.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime14.jsxs)("div", { className: "mb-5", children: [(0, import_jsx_runtime14.jsx)("label", { htmlFor: "url", className: "mb-2 mr-2 text-sm font-medium text-gray-900 dark:text-white", children: "URL" }), (0, import_jsx_runtime14.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_runtime14.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime14.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime14.jsx)("span", { className: "me-3 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Enabled" }), (0, import_jsx_runtime14.jsx)("input", { type: "checkbox", checked: enabled, onChange: (e) => setEnabled(e.target.checked), className: "sr-only peer" }), (0, import_jsx_runtime14.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_runtime14.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, disabled: !stateChanged, onClick: () => {
938
971
  if (url !== state.currentUrl) {
939
972
  sendCommand({ type: "change-url", url });
940
973
  }
@@ -947,13 +980,13 @@ function SummaryView7({ state, sendCommand }) {
947
980
  }
948
981
  }, children: "Commit" })] });
949
982
  }
950
- var import_jsx_runtime13, import_react13, summary_view_default4;
951
- var init_summary_view4 = __esm({
983
+ var import_jsx_runtime14, import_react13, summary_view_default5;
984
+ var init_summary_view5 = __esm({
952
985
  "build/processor.browserOverlay/summary-view.js"() {
953
986
  "use strict";
954
- import_jsx_runtime13 = __toESM(require_jsx_runtime());
987
+ import_jsx_runtime14 = __toESM(require_jsx_runtime());
955
988
  import_react13 = __toESM(require_react());
956
- summary_view_default4 = SummaryView7;
989
+ summary_view_default5 = SummaryView8;
957
990
  }
958
991
  });
959
992
 
@@ -963,13 +996,13 @@ __export(inline_view_exports7, {
963
996
  default: () => inline_view_default7
964
997
  });
965
998
  function InlineView9({ state, config }) {
966
- return (0, import_jsx_runtime14.jsx)("div", { id: `browser-overlay-${config.id}`, children: (0, import_jsx_runtime14.jsxs)("div", { className: "w-64 grid grid-cols-[min-content,1fr] gap-2", children: [(0, import_jsx_runtime14.jsx)("div", { children: "URL:" }), (0, import_jsx_runtime14.jsx)("div", { className: "truncate", children: state.currentUrl }), (0, import_jsx_runtime14.jsx)("div", { children: "Enabled:" }), (0, import_jsx_runtime14.jsx)("div", { children: (0, import_jsx_runtime14.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime14.jsx)("input", { type: "checkbox", checked: state.enabled, disabled: true, className: "sr-only peer" }), (0, import_jsx_runtime14.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" })] }) })] }) });
999
+ return (0, import_jsx_runtime15.jsx)("div", { id: `browser-overlay-${config.id}`, children: (0, import_jsx_runtime15.jsxs)("div", { className: "w-64 grid grid-cols-[min-content,1fr] gap-2", children: [(0, import_jsx_runtime15.jsx)("div", { children: "URL:" }), (0, import_jsx_runtime15.jsx)("div", { className: "truncate", children: state.currentUrl }), (0, import_jsx_runtime15.jsx)("div", { children: "Enabled:" }), (0, import_jsx_runtime15.jsx)("div", { children: (0, import_jsx_runtime15.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime15.jsx)("input", { type: "checkbox", checked: state.enabled, disabled: true, className: "sr-only peer" }), (0, import_jsx_runtime15.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" })] }) })] }) });
967
1000
  }
968
- var import_jsx_runtime14, inline_view_default7;
1001
+ var import_jsx_runtime15, inline_view_default7;
969
1002
  var init_inline_view7 = __esm({
970
1003
  "build/processor.browserOverlay/inline-view.js"() {
971
1004
  "use strict";
972
- import_jsx_runtime14 = __toESM(require_jsx_runtime());
1005
+ import_jsx_runtime15 = __toESM(require_jsx_runtime());
973
1006
  inline_view_default7 = InlineView9;
974
1007
  }
975
1008
  });
@@ -985,10 +1018,10 @@ function OrderInput(props) {
985
1018
  }, [props.defaultValue]);
986
1019
  const [value, setValue] = (0, import_react15.useState)(props.defaultValue ?? []);
987
1020
  if (value.length == 0) {
988
- return (0, import_jsx_runtime15.jsx)("p", { className: "node-editor-helper-text", children: "Sources will appear here when subscriptions have been added to this node" });
1021
+ return (0, import_jsx_runtime16.jsx)("p", { className: "node-editor-helper-text", children: "Sources will appear here when subscriptions have been added to this node" });
989
1022
  } else {
990
- return (0, import_jsx_runtime15.jsx)("div", { id: props.id, children: (0, import_jsx_runtime15.jsx)("ul", { children: value.map((v, ix) => {
991
- return (0, import_jsx_runtime15.jsxs)("li", { className: "flex", children: [(0, import_jsx_runtime15.jsx)("span", { className: "node-editor-label flex-grow", children: v }), ix == 0 ? (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, {}) : (0, import_jsx_runtime15.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_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18" }) }), ix == value.length - 1 ? (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, {}) : (0, import_jsx_runtime15.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_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3" }) })] }, v);
1023
+ return (0, import_jsx_runtime16.jsx)("div", { id: props.id, children: (0, import_jsx_runtime16.jsx)("ul", { children: value.map((v, ix) => {
1024
+ return (0, import_jsx_runtime16.jsxs)("li", { className: "flex", children: [(0, import_jsx_runtime16.jsx)("span", { className: "node-editor-label flex-grow", children: v }), ix == 0 ? (0, import_jsx_runtime16.jsx)(import_jsx_runtime16.Fragment, {}) : (0, import_jsx_runtime16.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_runtime16.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18" }) }), ix == value.length - 1 ? (0, import_jsx_runtime16.jsx)(import_jsx_runtime16.Fragment, {}) : (0, import_jsx_runtime16.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_runtime16.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3" }) })] }, v);
992
1025
  }) }) });
993
1026
  }
994
1027
  function moveUp(ix) {
@@ -1010,11 +1043,11 @@ function OrderInput(props) {
1010
1043
  };
1011
1044
  }
1012
1045
  }
1013
- var import_jsx_runtime15, import_react15, source_selection_default;
1046
+ var import_jsx_runtime16, import_react15, source_selection_default;
1014
1047
  var init_source_selection = __esm({
1015
1048
  "build/processor.cascadingSwitch/source-selection.js"() {
1016
1049
  "use strict";
1017
- import_jsx_runtime15 = __toESM(require_jsx_runtime());
1050
+ import_jsx_runtime16 = __toESM(require_jsx_runtime());
1018
1051
  import_react15 = __toESM(require_react());
1019
1052
  source_selection_default = OrderInput;
1020
1053
  }
@@ -1026,13 +1059,13 @@ __export(inline_view_exports8, {
1026
1059
  default: () => inline_view_default8
1027
1060
  });
1028
1061
  function InlineView11({ state, config }) {
1029
- return (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [(0, import_jsx_runtime16.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime16.jsxs)("ul", { children: [config.sources.map((s, i) => state.activeSource == s ? (0, import_jsx_runtime16.jsxs)("li", { className: activeClasses, children: [s, " <--"] }, i) : state.availableSources.includes(s) ? (0, import_jsx_runtime16.jsxs)("li", { className: availableClasses, children: [s, " (available)"] }, i) : (0, import_jsx_runtime16.jsxs)("li", { className: inactiveClasses, children: [s, " (inactive)"] }, i)), (0, import_jsx_runtime16.jsx)("li", { className: state.activeSource == "fallback" ? activeClasses : availableClasses, children: "fallback" }, "fallback")] })] });
1062
+ return (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [(0, import_jsx_runtime17.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime17.jsxs)("ul", { children: [config.sources.map((s, i) => state.activeSource == s ? (0, import_jsx_runtime17.jsxs)("li", { className: activeClasses, children: [s, " <--"] }, i) : state.availableSources.includes(s) ? (0, import_jsx_runtime17.jsxs)("li", { className: availableClasses, children: [s, " (available)"] }, i) : (0, import_jsx_runtime17.jsxs)("li", { className: inactiveClasses, children: [s, " (inactive)"] }, i)), (0, import_jsx_runtime17.jsx)("li", { className: state.activeSource == "fallback" ? activeClasses : availableClasses, children: "fallback" }, "fallback")] })] });
1030
1063
  }
1031
- var import_jsx_runtime16, activeClasses, availableClasses, inactiveClasses, inline_view_default8;
1064
+ var import_jsx_runtime17, activeClasses, availableClasses, inactiveClasses, inline_view_default8;
1032
1065
  var init_inline_view8 = __esm({
1033
1066
  "build/processor.cascadingSwitch/inline-view.js"() {
1034
1067
  "use strict";
1035
- import_jsx_runtime16 = __toESM(require_jsx_runtime());
1068
+ import_jsx_runtime17 = __toESM(require_jsx_runtime());
1036
1069
  activeClasses = "active text-green-500 dark:text-green-300";
1037
1070
  availableClasses = "available text-green-500 dark:text-green-300";
1038
1071
  inactiveClasses = "inactive text-orange-500 dark:text-orange-300";
@@ -1046,13 +1079,13 @@ __export(rung_view_exports, {
1046
1079
  default: () => rung_view_default
1047
1080
  });
1048
1081
  function rung_view_default(rung) {
1049
- return (0, import_jsx_runtime17.jsx)("div", { className: "text-gray-900 dark:text-white", children: rung.name });
1082
+ return (0, import_jsx_runtime18.jsx)("div", { className: "text-gray-900 dark:text-white", children: rung.name });
1050
1083
  }
1051
- var import_jsx_runtime17;
1084
+ var import_jsx_runtime18;
1052
1085
  var init_rung_view = __esm({
1053
1086
  "build/processor.fixedLadder/rung-view.js"() {
1054
1087
  "use strict";
1055
- import_jsx_runtime17 = __toESM(require_jsx_runtime());
1088
+ import_jsx_runtime18 = __toESM(require_jsx_runtime());
1056
1089
  }
1057
1090
  });
1058
1091
 
@@ -1075,7 +1108,7 @@ function CodecEditor(props) {
1075
1108
  target.style.height = target.scrollHeight + "px";
1076
1109
  }
1077
1110
  }, []);
1078
- return (0, import_jsx_runtime18.jsx)("textarea", { ref: textAreaRef, className: "w-full min-h-fit bg-white text-gray-900 dark:text-white dark:bg-black", onChange: (e) => {
1111
+ return (0, import_jsx_runtime19.jsx)("textarea", { ref: textAreaRef, className: "w-full min-h-fit bg-white text-gray-900 dark:text-white dark:bg-black", onChange: (e) => {
1079
1112
  const target = e.currentTarget;
1080
1113
  try {
1081
1114
  const codec = JSON.parse(target.value);
@@ -1085,11 +1118,11 @@ function CodecEditor(props) {
1085
1118
  }
1086
1119
  }, defaultValue: JSON.stringify(value, void 0, 2) });
1087
1120
  }
1088
- var import_jsx_runtime18, import_react16;
1121
+ var import_jsx_runtime19, import_react16;
1089
1122
  var init_codec_editor = __esm({
1090
1123
  "build/processor.fixedLadder/codec-editor.js"() {
1091
1124
  "use strict";
1092
- import_jsx_runtime18 = __toESM(require_jsx_runtime());
1125
+ import_jsx_runtime19 = __toESM(require_jsx_runtime());
1093
1126
  import_react16 = __toESM(require_react());
1094
1127
  }
1095
1128
  });
@@ -1100,13 +1133,13 @@ __export(codec_view_exports, {
1100
1133
  default: () => CodecEditor2
1101
1134
  });
1102
1135
  function CodecEditor2(props) {
1103
- return (0, import_jsx_runtime19.jsxs)("div", { className: "text-gray-900 dark:text-white", children: [props.width, "x", props.height] });
1136
+ return (0, import_jsx_runtime20.jsxs)("div", { className: "text-gray-900 dark:text-white", children: [props.width, "x", props.height] });
1104
1137
  }
1105
- var import_jsx_runtime19;
1138
+ var import_jsx_runtime20;
1106
1139
  var init_codec_view = __esm({
1107
1140
  "build/processor.fixedLadder/codec-view.js"() {
1108
1141
  "use strict";
1109
- import_jsx_runtime19 = __toESM(require_jsx_runtime());
1142
+ import_jsx_runtime20 = __toESM(require_jsx_runtime());
1110
1143
  }
1111
1144
  });
1112
1145
 
@@ -1135,34 +1168,34 @@ function GraphicSelection(props) {
1135
1168
  }, []);
1136
1169
  const [graphcs, setGraphics] = (0, import_react18.useState)([]);
1137
1170
  if (loading) {
1138
- return (0, import_jsx_runtime20.jsx)("div", { children: "Loading.." });
1171
+ return (0, import_jsx_runtime21.jsx)("div", { children: "Loading.." });
1139
1172
  }
1140
1173
  if (graphcs.length == 0) {
1141
- return (0, import_jsx_runtime20.jsx)("div", { children: "No graphics loaded" });
1174
+ return (0, import_jsx_runtime21.jsx)("div", { children: "No graphics loaded" });
1142
1175
  }
1143
- return (0, import_jsx_runtime20.jsx)("div", { children: (0, import_jsx_runtime20.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime20.jsx)("option", { value: "", children: "---" }, "empty"), graphcs.map((o, i) => {
1144
- return (0, import_jsx_runtime20.jsx)("option", { value: o, children: o }, i);
1176
+ return (0, import_jsx_runtime21.jsx)("div", { children: (0, import_jsx_runtime21.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime21.jsx)("option", { value: "", children: "---" }, "empty"), graphcs.map((o, i) => {
1177
+ return (0, import_jsx_runtime21.jsx)("option", { value: o, children: o }, i);
1145
1178
  })] }) });
1146
1179
  function myOnChange(e) {
1147
1180
  props.onChanged(e.target.value);
1148
1181
  }
1149
1182
  }
1150
- var import_jsx_runtime20, import_react18, image_selection_default;
1183
+ var import_jsx_runtime21, import_react18, image_selection_default;
1151
1184
  var init_image_selection = __esm({
1152
1185
  "build/processor.onscreenGraphic/image-selection.js"() {
1153
1186
  "use strict";
1154
- import_jsx_runtime20 = __toESM(require_jsx_runtime());
1187
+ import_jsx_runtime21 = __toESM(require_jsx_runtime());
1155
1188
  import_react18 = __toESM(require_react());
1156
1189
  image_selection_default = GraphicSelection;
1157
1190
  }
1158
1191
  });
1159
1192
 
1160
1193
  // build/processor.onscreenGraphic/summary-view.js
1161
- var summary_view_exports5 = {};
1162
- __export(summary_view_exports5, {
1163
- default: () => summary_view_default5
1194
+ var summary_view_exports6 = {};
1195
+ __export(summary_view_exports6, {
1196
+ default: () => summary_view_default6
1164
1197
  });
1165
- function SummaryView9({ state, sendCommand, urls }) {
1198
+ function SummaryView10({ state, sendCommand, urls }) {
1166
1199
  const [graphic, setGraphic] = (0, import_react19.useState)(state.activeGraphic?.file);
1167
1200
  const [position, setPosition] = (0, import_react19.useState)(state.activeGraphic?.position ?? { type: "named", position: "topleft" });
1168
1201
  const [graphics, setGraphics] = (0, import_react19.useState)([]);
@@ -1297,7 +1330,7 @@ function SummaryView9({ state, sendCommand, urls }) {
1297
1330
  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";
1298
1331
  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";
1299
1332
  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";
1300
- return (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime21.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsx)("label", { htmlFor: "select-graphic", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime21.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_runtime21.jsx)("option", { value: "", children: "---" }), graphics.map((s) => (0, import_jsx_runtime21.jsx)("option", { value: s, children: s }, s))] })] }), graphic && (0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Graphic position" }), (0, import_jsx_runtime21.jsx)(PositionSelector, { initialPosition: position, onChange: setPosition, graphicChanged, ...state })] }), (0, import_jsx_runtime21.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_runtime21.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Graphic" }), showFileInput && (0, import_jsx_runtime21.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime21.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime21.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime21.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Graphics" }), showDeleteDropdown && (0, import_jsx_runtime21.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime21.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Graphic to Delete" }), (0, import_jsx_runtime21.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: graphicToDelete, onChange: (e) => setGraphicToDelete(e.target.value), children: [(0, import_jsx_runtime21.jsx)("option", { value: "", children: " Select a graphic" }), graphics.map((graphicName) => (0, import_jsx_runtime21.jsx)("option", { value: graphicName, children: graphicName }, graphicName))] }), (0, import_jsx_runtime21.jsx)("button", { onClick: deleteBug, disabled: !graphicToDelete, className: `${deleteButtonClass} ${!graphicToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Graphic" })] }), uploadStatus.message && (0, import_jsx_runtime21.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
1333
+ return (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime22.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime22.jsxs)("div", { children: [(0, import_jsx_runtime22.jsx)("label", { htmlFor: "select-graphic", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime22.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_runtime22.jsx)("option", { value: "", children: "---" }), graphics.map((s) => (0, import_jsx_runtime22.jsx)("option", { value: s, children: s }, s))] })] }), graphic && (0, import_jsx_runtime22.jsxs)("div", { children: [(0, import_jsx_runtime22.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Graphic position" }), (0, import_jsx_runtime22.jsx)(PositionSelector, { initialPosition: position, onChange: setPosition, graphicChanged, ...state })] }), (0, import_jsx_runtime22.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_runtime22.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Graphic" }), showFileInput && (0, import_jsx_runtime22.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime22.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime22.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime22.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Graphics" }), showDeleteDropdown && (0, import_jsx_runtime22.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime22.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Graphic to Delete" }), (0, import_jsx_runtime22.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: graphicToDelete, onChange: (e) => setGraphicToDelete(e.target.value), children: [(0, import_jsx_runtime22.jsx)("option", { value: "", children: " Select a graphic" }), graphics.map((graphicName) => (0, import_jsx_runtime22.jsx)("option", { value: graphicName, children: graphicName }, graphicName))] }), (0, import_jsx_runtime22.jsx)("button", { onClick: deleteBug, disabled: !graphicToDelete, className: `${deleteButtonClass} ${!graphicToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Graphic" })] }), uploadStatus.message && (0, import_jsx_runtime22.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
1301
1334
  }
1302
1335
  function convertPosition(givenPosition, currentVideo, currentGraphic) {
1303
1336
  if (!givenPosition)
@@ -1343,11 +1376,11 @@ function clamp(min, num, max) {
1343
1376
  function assertUnreachable12(_) {
1344
1377
  throw new Error("Didn't expect to get here");
1345
1378
  }
1346
- var import_jsx_runtime21, import_react19, PositionSelector, summary_view_default5;
1347
- var init_summary_view5 = __esm({
1379
+ var import_jsx_runtime22, import_react19, PositionSelector, summary_view_default6;
1380
+ var init_summary_view6 = __esm({
1348
1381
  "build/processor.onscreenGraphic/summary-view.js"() {
1349
1382
  "use strict";
1350
- import_jsx_runtime21 = __toESM(require_jsx_runtime());
1383
+ import_jsx_runtime22 = __toESM(require_jsx_runtime());
1351
1384
  import_react19 = __toESM(require_react());
1352
1385
  PositionSelector = ({ initialPosition: givenPosition = { type: "named", position: "topleft" }, onChange, currentVideo, currentGraphic, graphicChanged }) => {
1353
1386
  const convertPos = (pos) => convertPosition(pos, currentVideo, currentGraphic);
@@ -1415,7 +1448,7 @@ var init_summary_view5 = __esm({
1415
1448
  window.removeEventListener("mouseup", handleMouseUp);
1416
1449
  };
1417
1450
  }, [isDragging]);
1418
- return (0, import_jsx_runtime21.jsxs)("div", { className: "relative w-full max-w-lg mx-auto mt-4 mb-8", children: [(0, import_jsx_runtime21.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime21.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Type:" }), (0, import_jsx_runtime21.jsxs)("select", { value: position.type, onChange: (e) => {
1451
+ return (0, import_jsx_runtime22.jsxs)("div", { className: "relative w-full max-w-lg mx-auto mt-4 mb-8", children: [(0, import_jsx_runtime22.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime22.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Type:" }), (0, import_jsx_runtime22.jsxs)("select", { value: position.type, onChange: (e) => {
1419
1452
  const newType = e.target.value;
1420
1453
  if (newType === "named") {
1421
1454
  setPosition(convertPos({ type: "named", position: "topleft" }));
@@ -1423,12 +1456,12 @@ var init_summary_view5 = __esm({
1423
1456
  setPositionUnit("%");
1424
1457
  setPosition({ ...convertPos(position), type: "percentage" });
1425
1458
  }
1426
- }, className: "node-editor-select-input", children: [(0, import_jsx_runtime21.jsx)("option", { value: "coordinate", children: "Custom Position" }), (0, import_jsx_runtime21.jsx)("option", { value: "named", children: "Preset Position" })] })] }), position.type === "named" ? (0, import_jsx_runtime21.jsx)("div", { className: "mb-4", children: (0, import_jsx_runtime21.jsxs)("select", { value: position.position, onChange: (e) => {
1459
+ }, className: "node-editor-select-input", children: [(0, import_jsx_runtime22.jsx)("option", { value: "coordinate", children: "Custom Position" }), (0, import_jsx_runtime22.jsx)("option", { value: "named", children: "Preset Position" })] })] }), position.type === "named" ? (0, import_jsx_runtime22.jsx)("div", { className: "mb-4", children: (0, import_jsx_runtime22.jsxs)("select", { value: position.position, onChange: (e) => {
1427
1460
  setPosition(convertPos({
1428
1461
  type: "named",
1429
1462
  position: e.target.value
1430
1463
  }));
1431
- }, className: "w-full node-editor-select-input", children: [(0, import_jsx_runtime21.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime21.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime21.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime21.jsx)("option", { value: "bottomright", children: "Bottom Right" }), (0, import_jsx_runtime21.jsx)("option", { value: "center", children: "Centered" })] }) }) : (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [(0, import_jsx_runtime21.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime21.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Unit:" }), (0, import_jsx_runtime21.jsxs)("select", { value: positionUnit, onChange: (e) => {
1464
+ }, className: "w-full node-editor-select-input", children: [(0, import_jsx_runtime22.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime22.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime22.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime22.jsx)("option", { value: "bottomright", children: "Bottom Right" }), (0, import_jsx_runtime22.jsx)("option", { value: "center", children: "Centered" })] }) }) : (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [(0, import_jsx_runtime22.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime22.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Unit:" }), (0, import_jsx_runtime22.jsxs)("select", { value: positionUnit, onChange: (e) => {
1432
1465
  setPositionUnit(e.target.value);
1433
1466
  if (e.target.value === "px" && position.type !== "coordinate" && currentVideo && currentGraphic) {
1434
1467
  const { width: videoWidth, height: videoHeight } = currentVideo;
@@ -1453,18 +1486,18 @@ var init_summary_view5 = __esm({
1453
1486
  yStr: void 0
1454
1487
  });
1455
1488
  }
1456
- }, className: "node-editor-select-input", children: [(0, import_jsx_runtime21.jsx)("option", { value: "px", children: "Pixels" }), (0, import_jsx_runtime21.jsx)("option", { value: "%", children: "Percentage" })] })] }), (0, import_jsx_runtime21.jsxs)("div", { className: "relative bg-gray-200 dark:bg-gray-700 rounded-lg", style: {
1489
+ }, className: "node-editor-select-input", children: [(0, import_jsx_runtime22.jsx)("option", { value: "px", children: "Pixels" }), (0, import_jsx_runtime22.jsx)("option", { value: "%", children: "Percentage" })] })] }), (0, import_jsx_runtime22.jsxs)("div", { className: "relative bg-gray-200 dark:bg-gray-700 rounded-lg", style: {
1457
1490
  width: "100%",
1458
1491
  userSelect: "none",
1459
1492
  aspectRatio: currentVideo ? `${currentVideo.width} / ${currentVideo.height}` : `3 / 2`
1460
- }, ref: previewAreaRef, children: [(0, import_jsx_runtime21.jsxs)("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-gray-500 dark:text-gray-400", children: [(0, import_jsx_runtime21.jsx)("span", { children: currentVideo ? "Video Preview Area" : "Video Dimensions Unknown" }), " ", currentVideo ? (0, import_jsx_runtime21.jsxs)("span", { children: [currentVideo.width, "x", currentVideo.height, "px"] }) : ""] }), (0, import_jsx_runtime21.jsx)("div", { className: `absolute cursor-move ${currentGraphic && !graphicChanged ? "" : "p-2"} rounded-lg bg-primary-500 bg-opacity-50 hover:bg-opacity-75 transition-colors
1493
+ }, ref: previewAreaRef, children: [(0, import_jsx_runtime22.jsxs)("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-gray-500 dark:text-gray-400", children: [(0, import_jsx_runtime22.jsx)("span", { children: currentVideo ? "Video Preview Area" : "Video Dimensions Unknown" }), " ", currentVideo ? (0, import_jsx_runtime22.jsxs)("span", { children: [currentVideo.width, "x", currentVideo.height, "px"] }) : ""] }), (0, import_jsx_runtime22.jsx)("div", { className: `absolute cursor-move ${currentGraphic && !graphicChanged ? "" : "p-2"} rounded-lg bg-primary-500 bg-opacity-50 hover:bg-opacity-75 transition-colors
1461
1494
  ${isDragging ? "bg-opacity-75" : ""}`, style: {
1462
1495
  left: `${position.xPct}%`,
1463
1496
  top: `${position.yPct}%`,
1464
1497
  transform: `translate(-${position.xPct}%, -${position.yPct}%)`,
1465
1498
  aspectRatio: currentGraphic && !graphicChanged ? `${currentGraphic.width} / ${currentGraphic.height}` : `1`,
1466
1499
  width: currentGraphic && currentVideo && !graphicChanged ? currentGraphic.width / currentVideo.width * 100 + "%" : void 0
1467
- }, onMouseDown: handleMouseDown, ref: previewTargetRef, children: (0, import_jsx_runtime21.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_runtime21.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_runtime21.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_runtime21.jsxs)("div", { className: "mt-2 flex gap-4", children: [(0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["X Position ", positionUnit] }), (0, import_jsx_runtime21.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.xStr ?? (positionUnit === "%" ? position.xPct.toFixed(1) : Math.round(position.x)), onChange: (e) => {
1500
+ }, onMouseDown: handleMouseDown, ref: previewTargetRef, children: (0, import_jsx_runtime22.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_runtime22.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_runtime22.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_runtime22.jsxs)("div", { className: "mt-2 flex gap-4", children: [(0, import_jsx_runtime22.jsxs)("div", { children: [(0, import_jsx_runtime22.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["X Position ", positionUnit] }), (0, import_jsx_runtime22.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.xStr ?? (positionUnit === "%" ? position.xPct.toFixed(1) : Math.round(position.x)), onChange: (e) => {
1468
1501
  const newX = Number(e.target.value);
1469
1502
  setPosition(convertPos({
1470
1503
  type: positionUnit === "%" ? "percentage" : "coordinate",
@@ -1473,7 +1506,7 @@ var init_summary_view5 = __esm({
1473
1506
  y: position.y,
1474
1507
  yStr: position.yStr
1475
1508
  }));
1476
- }, 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_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["Y Position ", positionUnit] }), (0, import_jsx_runtime21.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.yStr ?? (positionUnit === "%" ? position.yPct.toFixed(1) : Math.round(position.y)), onChange: (e) => {
1509
+ }, 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_runtime22.jsxs)("div", { children: [(0, import_jsx_runtime22.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["Y Position ", positionUnit] }), (0, import_jsx_runtime22.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.yStr ?? (positionUnit === "%" ? position.yPct.toFixed(1) : Math.round(position.y)), onChange: (e) => {
1477
1510
  const newY = Number(e.target.value);
1478
1511
  setPosition(convertPos({
1479
1512
  type: positionUnit === "%" ? "percentage" : "coordinate",
@@ -1484,7 +1517,7 @@ var init_summary_view5 = __esm({
1484
1517
  }));
1485
1518
  }, 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" })] })] })] })] });
1486
1519
  };
1487
- summary_view_default5 = SummaryView9;
1520
+ summary_view_default6 = SummaryView10;
1488
1521
  }
1489
1522
  });
1490
1523
 
@@ -15873,13 +15906,13 @@ function InlineView12({ state, config: _2 }) {
15873
15906
  return;
15874
15907
  chartControl.data = makeData(state);
15875
15908
  }, [state]);
15876
- return (0, import_jsx_runtime22.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime22.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
15909
+ return (0, import_jsx_runtime23.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime23.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
15877
15910
  }
15878
- var import_jsx_runtime22, import_react21, inline_view_default9;
15911
+ var import_jsx_runtime23, import_react21, inline_view_default9;
15879
15912
  var init_inline_view9 = __esm({
15880
15913
  "build/util.stats.latency/inline-view.js"() {
15881
15914
  "use strict";
15882
- import_jsx_runtime22 = __toESM(require_jsx_runtime());
15915
+ import_jsx_runtime23 = __toESM(require_jsx_runtime());
15883
15916
  import_react21 = __toESM(require_react());
15884
15917
  init_auto();
15885
15918
  inline_view_default9 = InlineView12;
@@ -15892,22 +15925,22 @@ __export(source_node_selection_exports, {
15892
15925
  default: () => source_node_selection_default
15893
15926
  });
15894
15927
  function SourceNodeSelection(props) {
15895
- return (0, import_jsx_runtime23.jsx)("div", { children: (0, import_jsx_runtime23.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime23.jsx)("option", { value: "", children: "---" }, "empty"), Object.values(props.latestDocument.components).map((o, i) => {
15928
+ return (0, import_jsx_runtime24.jsx)("div", { children: (0, import_jsx_runtime24.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime24.jsx)("option", { value: "", children: "---" }, "empty"), Object.values(props.latestDocument.components).map((o, i) => {
15896
15929
  if (o.id == props.id)
15897
- return (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, {});
15930
+ return (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, {});
15898
15931
  if (o.info.category === "output")
15899
15932
  return;
15900
- return (0, import_jsx_runtime23.jsx)("option", { value: o.id, children: o.config.displayName }, i);
15933
+ return (0, import_jsx_runtime24.jsx)("option", { value: o.id, children: o.config.displayName }, i);
15901
15934
  })] }) });
15902
15935
  function myOnChange(e) {
15903
15936
  props.onChanged(e.target.value);
15904
15937
  }
15905
15938
  }
15906
- var import_jsx_runtime23, source_node_selection_default;
15939
+ var import_jsx_runtime24, source_node_selection_default;
15907
15940
  var init_source_node_selection = __esm({
15908
15941
  "build/util.stats.latency/source-node-selection.js"() {
15909
15942
  "use strict";
15910
- import_jsx_runtime23 = __toESM(require_jsx_runtime());
15943
+ import_jsx_runtime24 = __toESM(require_jsx_runtime());
15911
15944
  source_node_selection_default = SourceNodeSelection;
15912
15945
  }
15913
15946
  });
@@ -15972,13 +16005,6 @@ function info_default({ defineComponent, Av, validation: { Z, Port, SourceName,
15972
16005
  },
15973
16006
  configForm: {
15974
16007
  form: {
15975
- notes: {
15976
- help: "Notes about this component",
15977
- hint: {
15978
- type: "text",
15979
- optional: true
15980
- }
15981
- },
15982
16008
  port: { help: "The port this RTMP input will listen on", hint: { type: "numeric", validation: Port, defaultValue: defaultPort, global: unique("port") } },
15983
16009
  ssl: { help: "Optional: SSL", hint: { type: "boolean", optional: true } },
15984
16010
  appName: { help: "Name of the app", hint: { type: "text", validation: Z.string().min(1), defaultValue: "norsk" } },
@@ -15990,6 +16016,13 @@ function info_default({ defineComponent, Av, validation: { Z, Port, SourceName,
15990
16016
  validation: Z.array(SourceName),
15991
16017
  global: unique("sourceName")
15992
16018
  }
16019
+ },
16020
+ notes: {
16021
+ help: "Additional notes about this component",
16022
+ hint: {
16023
+ type: "text",
16024
+ optional: true
16025
+ }
15993
16026
  }
15994
16027
  }
15995
16028
  }
@@ -16020,13 +16053,6 @@ function info_default2({ defineComponent, Audio }) {
16020
16053
  },
16021
16054
  configForm: {
16022
16055
  form: {
16023
- notes: {
16024
- help: "Notes about this component",
16025
- hint: {
16026
- type: "text",
16027
- optional: true
16028
- }
16029
- },
16030
16056
  sampleRate: {
16031
16057
  help: "Samplerate in Hz of the generated audio",
16032
16058
  hint: {
@@ -16048,6 +16074,13 @@ function info_default2({ defineComponent, Audio }) {
16048
16074
  ],
16049
16075
  defaultValue: "stereo"
16050
16076
  }
16077
+ },
16078
+ notes: {
16079
+ help: "Additional notes about this component",
16080
+ hint: {
16081
+ type: "text",
16082
+ optional: true
16083
+ }
16051
16084
  }
16052
16085
  }
16053
16086
  }
@@ -16127,13 +16160,6 @@ function info_default3({ defineComponent, Av, validation }) {
16127
16160
  },
16128
16161
  configForm: {
16129
16162
  form: {
16130
- notes: {
16131
- help: "Notes about this component",
16132
- hint: {
16133
- type: "text",
16134
- optional: true
16135
- }
16136
- },
16137
16163
  port: { help: "The port this SRT input will connect to", hint: { type: "numeric", validation: Port, defaultValue: 5001 } },
16138
16164
  host: { help: "The IP address/hostname this SRT input will connect to", hint: { type: "text", validation: Hostname, defaultValue: "0.0.0.0" } },
16139
16165
  sourceName: { help: "Source name to identify this by", hint: { type: "text", validation: SourceName, defaultValue: "camera1" } },
@@ -16146,6 +16172,13 @@ function info_default3({ defineComponent, Av, validation }) {
16146
16172
  view: SocketConfiguration2,
16147
16173
  form: srt_socket_options_default(validation)
16148
16174
  }
16175
+ },
16176
+ notes: {
16177
+ help: "Additional notes about this component",
16178
+ hint: {
16179
+ type: "text",
16180
+ optional: true
16181
+ }
16149
16182
  }
16150
16183
  }
16151
16184
  }
@@ -16217,13 +16250,6 @@ function info_default4({ defineComponent, Av, validation }) {
16217
16250
  },
16218
16251
  configForm: {
16219
16252
  form: {
16220
- notes: {
16221
- help: "Notes about this component",
16222
- hint: {
16223
- type: "text",
16224
- optional: true
16225
- }
16226
- },
16227
16253
  port: {
16228
16254
  help: "The port this SRT input will listen on",
16229
16255
  hint: {
@@ -16279,6 +16305,13 @@ function info_default4({ defineComponent, Av, validation }) {
16279
16305
  validation: Z.array(SourceName),
16280
16306
  global: unique("sourceName")
16281
16307
  }
16308
+ },
16309
+ notes: {
16310
+ help: "Additional notes about this component",
16311
+ hint: {
16312
+ type: "text",
16313
+ optional: true
16314
+ }
16282
16315
  }
16283
16316
  }
16284
16317
  }
@@ -16310,13 +16343,13 @@ function info_default5({ defineComponent, Av, validation: { Z, Port, Hostname, S
16310
16343
  },
16311
16344
  configForm: {
16312
16345
  form: {
16313
- notes: { help: "Notes about this component", hint: { type: "text", optional: true } },
16314
16346
  port: { help: "The receiving port", hint: { type: "numeric", validation: Port, defaultValue: 5001, global: unique("port") } },
16315
16347
  host: { help: "The receiving IP address/hostname", hint: { type: "text", validation: Hostname, defaultValue: "127.0.0.1" } },
16316
16348
  sourceName: { help: "Source name to identify this by", hint: { type: "text", validation: SourceName, defaultValue: "udp-ts", global: unique("sourceName") } },
16317
16349
  interface: { help: "Optional interface to bind to", hint: { type: "text", optional: true, validation: Z.union([Z.string().min(2).max(32), Z.string().length(0)]).optional() } },
16318
16350
  timeout: { help: "Timeout in milliseconds before determining the input is closed", hint: { type: "numeric", validation: Z.number().refine((value) => value > 0 && value < 6e5, "Timeout must be less than 10 minutes"), defaultValue: 1e3 } },
16319
- rtpDecapsulate: { help: "Whether to expect the input TS to be encapsulated in RTP via RFC 2250 (default: false)", hint: { type: "boolean" } }
16351
+ rtpDecapsulate: { help: "Whether to expect the input TS to be encapsulated in RTP via RFC 2250 (default: false)", hint: { type: "boolean" } },
16352
+ notes: { help: "Additional notes about this component", hint: { type: "text", optional: true } }
16320
16353
  }
16321
16354
  }
16322
16355
  });
@@ -16345,13 +16378,6 @@ function info_default6({ defineComponent, Video, validation: { SourceName, uniqu
16345
16378
  },
16346
16379
  configForm: {
16347
16380
  form: {
16348
- notes: {
16349
- help: "Notes about this component",
16350
- hint: {
16351
- type: "text",
16352
- optional: true
16353
- }
16354
- },
16355
16381
  resolution: {
16356
16382
  help: "The resolution of the test card stream",
16357
16383
  hint: { type: "select", options: Resolutions, defaultValue: { width: 1280, height: 720 } }
@@ -16375,6 +16401,10 @@ function info_default6({ defineComponent, Video, validation: { SourceName, uniqu
16375
16401
  { value: "smpte100", display: "SMPTE100" }
16376
16402
  ]
16377
16403
  }
16404
+ },
16405
+ notes: {
16406
+ help: "Additional notes about this component",
16407
+ hint: { type: "text", optional: true }
16378
16408
  }
16379
16409
  }
16380
16410
  }
@@ -16386,6 +16416,7 @@ var import_config = __toESM(require_config());
16386
16416
  var import_react5 = __toESM(require_react());
16387
16417
  function info_default7(R) {
16388
16418
  const { defineComponent, All, validation: { Z, Hostname } } = R;
16419
+ const SummaryView11 = import_react5.default.lazy(async () => Promise.resolve().then(() => (init_summary_view3(), summary_view_exports3)));
16389
16420
  const FullscreenView2 = import_react5.default.lazy(async () => Promise.resolve().then(() => (init_fullscreen(), fullscreen_exports)));
16390
16421
  const SegmentConfiguration2 = import_react5.default.lazy(async () => {
16391
16422
  const views = await Promise.resolve().then(() => (init_form_views(), form_views_exports));
@@ -16468,7 +16499,7 @@ function info_default7(R) {
16468
16499
  }
16469
16500
  return { ...state };
16470
16501
  },
16471
- //summary: SummaryView,
16502
+ summary: SummaryView11,
16472
16503
  fullscreen: FullscreenView2
16473
16504
  },
16474
16505
  configForm: {
@@ -16485,13 +16516,6 @@ function info_default7(R) {
16485
16516
  validation: Z.string().min(5).max(15)
16486
16517
  }
16487
16518
  },
16488
- notes: {
16489
- help: "Notes about this component",
16490
- hint: {
16491
- type: "text",
16492
- optional: true
16493
- }
16494
- },
16495
16519
  sessionId: {
16496
16520
  help: "Generate a unique session id per run to avoid cache collisions",
16497
16521
  hint: {
@@ -16612,6 +16636,13 @@ function info_default7(R) {
16612
16636
  }
16613
16637
  ]
16614
16638
  }
16639
+ },
16640
+ notes: {
16641
+ help: "Additional notes about this component",
16642
+ hint: {
16643
+ type: "text",
16644
+ optional: true
16645
+ }
16615
16646
  }
16616
16647
  }
16617
16648
  }
@@ -16685,16 +16716,13 @@ function info_default8(R) {
16685
16716
  hardware: (0, import_config2.HardwareSelection)()
16686
16717
  },
16687
16718
  form: {
16688
- notes: {
16689
- help: "Notes about this component",
16690
- hint: {
16691
- type: "text",
16692
- optional: true
16693
- }
16694
- },
16695
16719
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16696
16720
  skipTranscode: { help: "Skip transcoding for WebRTC-ready streams", hint: { type: "boolean", defaultValue: false } },
16697
- showPreview: { help: "Show video preview", hint: { type: "boolean", defaultValue: true } }
16721
+ showPreview: { help: "Show video preview", hint: { type: "boolean", defaultValue: true } },
16722
+ notes: {
16723
+ help: "Additional notes about this component",
16724
+ hint: { type: "text", optional: true }
16725
+ }
16698
16726
  }
16699
16727
  }
16700
16728
  });
@@ -16749,11 +16777,14 @@ function info_default9({ defineComponent, Av, validation: { Z, JitterBuffer } })
16749
16777
  },
16750
16778
  configForm: {
16751
16779
  form: {
16752
- notes: { help: "Notes about this component", hint: { type: "text", optional: true } },
16753
16780
  url: { help: "The URL of the remote RTMP server to connect to, including the full stream path and credentials", hint: { type: "text", validation: Z.string().min(5) } },
16754
16781
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16755
16782
  avDelayMs: { help: "How many milliseconds to delay A/V to account for subtitles", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 50 } },
16756
- retryConnectionTimeout: { help: "Number of seconds to wait until a retry is attempted to the RTMP server", hint: { type: "numeric", validation: Z.number().min(1).max(10), defaultValue: 5 } }
16783
+ retryConnectionTimeout: { help: "Number of seconds to wait until a retry is attempted to the RTMP server", hint: { type: "numeric", validation: Z.number().min(1).max(10), defaultValue: 5 } },
16784
+ notes: {
16785
+ help: "Additional notes about this component",
16786
+ hint: { type: "text", optional: true }
16787
+ }
16757
16788
  }
16758
16789
  }
16759
16790
  });
@@ -16814,7 +16845,6 @@ function info_default10(registration) {
16814
16845
  },
16815
16846
  configForm: {
16816
16847
  form: {
16817
- notes: { help: "Notes about this component", hint: { type: "text", optional: true } },
16818
16848
  port: {
16819
16849
  help: "The port this SRT output will connect to or listen on",
16820
16850
  hint: {
@@ -16857,6 +16887,10 @@ function info_default10(registration) {
16857
16887
  view: SocketConfiguration2,
16858
16888
  form: srt_socket_options_default(validation)
16859
16889
  }
16890
+ },
16891
+ notes: {
16892
+ help: "Additional notes about this component",
16893
+ hint: { type: "text", optional: true }
16860
16894
  }
16861
16895
  }
16862
16896
  }
@@ -16891,11 +16925,14 @@ function info_default12({ defineComponent, All, validation: { Port, Hostname, Ji
16891
16925
  },
16892
16926
  configForm: {
16893
16927
  form: {
16894
- notes: { help: "Notes about this component", hint: { type: "text", optional: true } },
16895
16928
  port: { help: "The port this UDP TS output will send to", hint: { type: "numeric", validation: Port, defaultValue: 8001 } },
16896
16929
  destinationHost: { help: "The IP address/Hostname this UDP TS output will send to", hint: { type: "text", validation: Hostname, defaultValue: "127.0.0.1" } },
16897
16930
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16898
- interface: { help: "Which interface to bind to for publishing", hint: { type: "text", validation: Z.union([Z.string().length(0), Iface]), defaultValue: "any" } }
16931
+ interface: { help: "Which interface to bind to for publishing", hint: { type: "text", validation: Z.union([Z.string().length(0), Iface]), defaultValue: "any" } },
16932
+ notes: {
16933
+ help: "Additional notes about this component",
16934
+ hint: { type: "text", optional: true }
16935
+ }
16899
16936
  }
16900
16937
  }
16901
16938
  });
@@ -16904,7 +16941,7 @@ function info_default12({ defineComponent, All, validation: { Port, Hostname, Ji
16904
16941
  // build/output.whep/info.js
16905
16942
  var import_config3 = __toESM(require_config());
16906
16943
  var import_react12 = __toESM(require_react());
16907
- var SummaryView6 = import_react12.default.lazy(async () => Promise.resolve().then(() => (init_summary_view3(), summary_view_exports3)));
16944
+ var SummaryView7 = import_react12.default.lazy(async () => Promise.resolve().then(() => (init_summary_view4(), summary_view_exports4)));
16908
16945
  function info_default13(R) {
16909
16946
  const { defineComponent, Av, validation: { JitterBuffer } } = R;
16910
16947
  const InlineView13 = import_react12.default.lazy(async () => Promise.resolve().then(() => (init_inline_view6(), inline_view_exports6)));
@@ -16948,16 +16985,19 @@ function info_default13(R) {
16948
16985
  return { ...state };
16949
16986
  },
16950
16987
  inline: InlineView13,
16951
- summary: SummaryView6
16988
+ summary: SummaryView7
16952
16989
  },
16953
16990
  configForm: {
16954
16991
  global: {
16955
16992
  iceServers: (0, import_config3.GlobalIceServers)(R)
16956
16993
  },
16957
16994
  form: {
16958
- notes: { help: "Notes about this component", hint: { type: "text", optional: true } },
16959
16995
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16960
- showPreview: { help: "Show video preview", hint: { type: "boolean", defaultValue: true } }
16996
+ showPreview: { help: "Show video preview", hint: { type: "boolean", defaultValue: true } },
16997
+ notes: {
16998
+ help: "Additional notes about this component",
16999
+ hint: { type: "text", optional: true }
17000
+ }
16961
17001
  }
16962
17002
  }
16963
17003
  });
@@ -16969,7 +17009,7 @@ function assertUnreachable8(_) {
16969
17009
  // build/processor.browserOverlay/info.js
16970
17010
  var import_config4 = __toESM(require_config());
16971
17011
  var import_react14 = __toESM(require_react());
16972
- var SummaryView8 = import_react14.default.lazy(async () => Promise.resolve().then(() => (init_summary_view4(), summary_view_exports4)));
17012
+ var SummaryView9 = import_react14.default.lazy(async () => Promise.resolve().then(() => (init_summary_view5(), summary_view_exports5)));
16973
17013
  var InlineView10 = import_react14.default.lazy(async () => Promise.resolve().then(() => (init_inline_view7(), inline_view_exports7)));
16974
17014
  function info_default14({ defineComponent, Video, validation: { Z } }) {
16975
17015
  return defineComponent({
@@ -16997,7 +17037,7 @@ function info_default14({ defineComponent, Video, validation: { Z } }) {
16997
17037
  };
16998
17038
  },
16999
17039
  runtime: {
17000
- summary: SummaryView8,
17040
+ summary: SummaryView9,
17001
17041
  inline: InlineView10,
17002
17042
  initialState: () => ({
17003
17043
  currentUrl: "",
@@ -17504,7 +17544,7 @@ var import_config6 = __toESM(require_config());
17504
17544
  var import_react20 = __toESM(require_react());
17505
17545
  function info_default17({ defineComponent, Video }) {
17506
17546
  const GraphicSelection2 = import_react20.default.lazy(async () => Promise.resolve().then(() => (init_image_selection(), image_selection_exports)));
17507
- const SummaryView10 = import_react20.default.lazy(async () => Promise.resolve().then(() => (init_summary_view5(), summary_view_exports5)));
17547
+ const SummaryView11 = import_react20.default.lazy(async () => Promise.resolve().then(() => (init_summary_view6(), summary_view_exports6)));
17508
17548
  return defineComponent({
17509
17549
  identifier: "processor.onscreenGraphic",
17510
17550
  category: "processor",
@@ -17530,7 +17570,7 @@ function info_default17({ defineComponent, Video }) {
17530
17570
  };
17531
17571
  },
17532
17572
  runtime: {
17533
- summary: SummaryView10,
17573
+ summary: SummaryView11,
17534
17574
  initialState: () => ({}),
17535
17575
  handleEvent: (ev, state) => {
17536
17576
  const evType = ev.type;