@arcanewizards/timecode-toolbox 0.1.4 → 0.1.5

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.
@@ -15972,7 +15972,7 @@ import {
15972
15972
  useCallback as useCallback24,
15973
15973
  useContext as useContext17,
15974
15974
  useEffect as useEffect34,
15975
- useMemo as useMemo17,
15975
+ useMemo as useMemo19,
15976
15976
  useState as useState36
15977
15977
  } from "react";
15978
15978
 
@@ -16016,6 +16016,10 @@ var STRINGS = {
16016
16016
  },
16017
16017
  inputs: {
16018
16018
  title: "INPUTS",
16019
+ unnamed: "Unnamed Input",
16020
+ enable: "Enable Input",
16021
+ disable: "Disable Input",
16022
+ edit: "Edit Input",
16019
16023
  noChildren: "No inputs yet. Please add one using the buttons below.",
16020
16024
  addButton: (protocol) => `Add ${protocol}`,
16021
16025
  addDialog: (protocol) => `Add ${protocol} Input`,
@@ -16039,6 +16043,8 @@ var STRINGS = {
16039
16043
  delay: (delayMs) => `Delay: ${MS_FORMAT.format(delayMs)}`,
16040
16044
  generators: {
16041
16045
  title: "GENERATORS",
16046
+ unnamed: "Unnamed Generator",
16047
+ edit: "Edit Generator",
16042
16048
  noChildren: "No generators yet. Please add one using the buttons below.",
16043
16049
  type: {
16044
16050
  clock: "Clock"
@@ -16050,6 +16056,11 @@ var STRINGS = {
16050
16056
  },
16051
16057
  outputs: {
16052
16058
  title: "OUTPUTS",
16059
+ unnamed: "Unnamed Output",
16060
+ enable: "Enable Output",
16061
+ disable: "Disable Output",
16062
+ link: "Link Output",
16063
+ edit: "Edit Output",
16053
16064
  noChildren: "No outputs yet. Please add one using the buttons below.",
16054
16065
  addButton: (protocol) => `Add ${protocol}`,
16055
16066
  addDialog: (protocol) => `Add ${protocol} Output`,
@@ -16394,7 +16405,9 @@ var TimecodeDisplay = ({
16394
16405
  id,
16395
16406
  timecode: { state, metadata },
16396
16407
  config,
16397
- headerComponents
16408
+ headerComponents,
16409
+ disabled,
16410
+ rootState
16398
16411
  }) => {
16399
16412
  const { handlers, callHandler } = useApplicationHandlers();
16400
16413
  const hooks = id && getTreeValue(handlers, id);
@@ -16445,29 +16458,41 @@ var TimecodeDisplay = ({
16445
16458
  )
16446
16459
  ),
16447
16460
  children: [
16448
- headerComponents && /* @__PURE__ */ jsx26("div", { className: "flex flex-wrap gap-0.25", children: headerComponents }),
16461
+ headerComponents && /* @__PURE__ */ jsx26("div", { className: "flex gap-0.25", children: headerComponents }),
16449
16462
  /* @__PURE__ */ jsx26(
16450
16463
  SizeAwareDiv,
16451
16464
  {
16452
- className: cn(
16453
- "relative min-h-timecode-min-height grow",
16454
- cnd(state?.state === "stopped", "opacity-50"),
16455
- cnd(
16456
- hooks?.play && hooks?.pause,
16457
- `
16458
- cursor-pointer
16459
- hover:opacity-100
16460
- `
16461
- )
16462
- ),
16465
+ className: "relative min-h-timecode-min-height grow",
16463
16466
  onClick: toggle,
16464
- children: /* @__PURE__ */ jsx26("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx26("span", { className: cn("font-mono text-timecode-adaptive"), children: state.state === "none" ? "--:--:--:---" : state.state === "stopped" ? displayMillis(state.positionMillis) : /* @__PURE__ */ jsx26(
16465
- ActiveTimecodeText,
16467
+ children: disabled ? /* @__PURE__ */ jsx26(
16468
+ SizeAwareDiv,
16469
+ {
16470
+ className: "\n pointer-events-none absolute inset-0 flex items-center\n justify-center\n ",
16471
+ children: /* @__PURE__ */ jsx26(Icon2, { icon: "pause", className: "text-timecode-adaptive" })
16472
+ }
16473
+ ) : /* @__PURE__ */ jsx26(
16474
+ "div",
16466
16475
  {
16467
- effectiveStartTimeMillis: state.effectiveStartTimeMillis,
16468
- speed: state.speed
16476
+ className: cn(
16477
+ "absolute inset-0 flex items-center justify-center",
16478
+ cnd(state?.state === "stopped", "opacity-50"),
16479
+ cnd(
16480
+ hooks?.play && hooks?.pause,
16481
+ `
16482
+ cursor-pointer
16483
+ hover:opacity-100
16484
+ `
16485
+ )
16486
+ ),
16487
+ children: /* @__PURE__ */ jsx26("span", { className: cn("font-mono text-timecode-adaptive"), children: state.state === "none" ? "--:--:--:---" : state.state === "stopped" ? displayMillis(state.positionMillis) : /* @__PURE__ */ jsx26(
16488
+ ActiveTimecodeText,
16489
+ {
16490
+ effectiveStartTimeMillis: state.effectiveStartTimeMillis,
16491
+ speed: state.speed
16492
+ }
16493
+ ) })
16469
16494
  }
16470
- ) }) })
16495
+ )
16471
16496
  }
16472
16497
  ),
16473
16498
  hooks?.pause || hooks?.play ? /* @__PURE__ */ jsxs9("div", { className: "flex justify-center gap-px", children: [
@@ -16555,9 +16580,53 @@ var TimecodeDisplay = ({
16555
16580
  metadata.artist && /* @__PURE__ */ jsx26("div", { className: "grow truncate bg-sigil-bg-light p-0.5", children: metadata.artist })
16556
16581
  ] })
16557
16582
  }
16558
- ) : null
16583
+ ) : null,
16584
+ rootState.errors.length > 0 && /* @__PURE__ */ jsx26("div", { className: "flex gap-px", children: rootState.errors.map((error, index2) => /* @__PURE__ */ jsx26(
16585
+ "div",
16586
+ {
16587
+ className: "\n grow truncate bg-sigil-usage-red-background p-0.5\n text-sigil-usage-red-text\n ",
16588
+ children: error
16589
+ },
16590
+ index2
16591
+ )) }),
16592
+ rootState.warnings.length > 0 && /* @__PURE__ */ jsx26("div", { className: "flex gap-px", children: rootState.warnings.map((warning, index2) => /* @__PURE__ */ jsx26(
16593
+ "div",
16594
+ {
16595
+ className: "\n grow truncate bg-sigil-usage-orange-background p-0.5\n text-sigil-usage-orange-text\n ",
16596
+ children: warning
16597
+ },
16598
+ index2
16599
+ )) })
16559
16600
  ] });
16560
16601
  };
16602
+ var getLinkedSourceInfo = (link, config) => {
16603
+ if (!link) {
16604
+ return void 0;
16605
+ }
16606
+ let info = void 0;
16607
+ if (link[0] === "input") {
16608
+ const input = config.inputs?.[link[1]];
16609
+ if (input) {
16610
+ info = {
16611
+ color: input.color,
16612
+ type: STRINGS.protocols[input.definition.type].short,
16613
+ name: input.name ? [input.name] : [],
16614
+ namePlaceholder: STRINGS.inputs.unnamed
16615
+ };
16616
+ }
16617
+ } else if (link[0] === "generator") {
16618
+ const generator = config.generators?.[link[1]];
16619
+ if (generator) {
16620
+ info = {
16621
+ color: generator.color,
16622
+ type: STRINGS.generators.type[generator.definition.type],
16623
+ name: generator.name ? [generator.name] : [],
16624
+ namePlaceholder: STRINGS.generators.unnamed
16625
+ };
16626
+ }
16627
+ }
16628
+ return info;
16629
+ };
16561
16630
  var EMPTY_TIMECODE = {
16562
16631
  name: null,
16563
16632
  state: {
@@ -16576,8 +16645,10 @@ var TimecodeTreeDisplay = ({
16576
16645
  id,
16577
16646
  type,
16578
16647
  name,
16648
+ link,
16579
16649
  color,
16580
16650
  timecode,
16651
+ rootState,
16581
16652
  namePlaceholder,
16582
16653
  buttons,
16583
16654
  assignToOutput
@@ -16591,8 +16662,8 @@ var TimecodeTreeDisplay = ({
16591
16662
  });
16592
16663
  }
16593
16664
  }, [id, openNewWidow]);
16594
- name = timecode?.name ? [...name, timecode.name] : name;
16595
- if (isTimecodeGroup(timecode) && Object.values(timecode.timecodes).length) {
16665
+ name = timecode !== "disabled" && timecode?.name ? [...name, timecode.name] : name;
16666
+ if (timecode !== "disabled" && isTimecodeGroup(timecode) && Object.values(timecode.timecodes).length) {
16596
16667
  return Object.entries(timecode.timecodes).map(([key, child]) => /* @__PURE__ */ jsx26(
16597
16668
  TimecodeTreeDisplay,
16598
16669
  {
@@ -16602,6 +16673,7 @@ var TimecodeTreeDisplay = ({
16602
16673
  name,
16603
16674
  color: timecode.color ?? color,
16604
16675
  timecode: child,
16676
+ rootState,
16605
16677
  namePlaceholder,
16606
16678
  buttons,
16607
16679
  assignToOutput
@@ -16619,28 +16691,67 @@ var TimecodeTreeDisplay = ({
16619
16691
  TimecodeDisplay,
16620
16692
  {
16621
16693
  id,
16622
- timecode: isTimecodeInstance(timecode) ? timecode : EMPTY_TIMECODE,
16694
+ timecode: timecode !== "disabled" && isTimecodeInstance(timecode) ? timecode : EMPTY_TIMECODE,
16695
+ rootState,
16696
+ disabled: timecode === "disabled",
16623
16697
  config,
16624
16698
  headerComponents: /* @__PURE__ */ jsxs9(Fragment8, { children: [
16625
- /* @__PURE__ */ jsxs9("div", { className: "flex grow items-start gap-0.25", children: [
16626
- /* @__PURE__ */ jsx26(
16627
- "div",
16628
- {
16629
- className: "\n m-0.25 rounded-md border border-sigil-bg-light\n bg-timecode-usage-foreground px-1 py-0.25 text-sigil-control\n text-timecode-usage-text\n ",
16630
- children: type
16631
- }
16632
- ),
16633
- /* @__PURE__ */ jsx26(
16699
+ /* @__PURE__ */ jsx26("div", { className: "flex grow basis-0 items-start gap-0.25", children: /* @__PURE__ */ jsxs9("div", { className: "grow", children: [
16700
+ /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-0.25", children: [
16701
+ /* @__PURE__ */ jsx26(
16702
+ "div",
16703
+ {
16704
+ className: "\n m-0.25 rounded-md border border-sigil-bg-light\n bg-timecode-usage-foreground px-1 py-0.25\n text-sigil-control text-timecode-usage-text\n ",
16705
+ children: type
16706
+ }
16707
+ ),
16708
+ /* @__PURE__ */ jsx26(
16709
+ "div",
16710
+ {
16711
+ className: cn(
16712
+ "w-0 grow truncate p-0.5",
16713
+ cnd(name.length, "font-bold", "italic opacity-50")
16714
+ ),
16715
+ children: name.length ? name.join(" / ") : namePlaceholder
16716
+ }
16717
+ )
16718
+ ] }),
16719
+ link && /* @__PURE__ */ jsxs9(
16634
16720
  "div",
16635
16721
  {
16636
- className: cn(
16637
- "grow basis-0 truncate p-0.5",
16638
- cnd(name.length, "font-bold", "italic opacity-50")
16722
+ className: "\n flex items-center gap-0.25 text-timecode-usage-foreground\n ",
16723
+ style: cssSigilColorUsageVariables(
16724
+ "timecode-usage",
16725
+ // Override timecode color with the user hint preferences
16726
+ // when no color is specified
16727
+ // as that will be what's used by the linked input/generator
16728
+ sigilColorUsage(link.color ?? "hint")
16639
16729
  ),
16640
- children: name.length ? name.join(" / ") : namePlaceholder
16730
+ children: [
16731
+ /* @__PURE__ */ jsxs9(
16732
+ "div",
16733
+ {
16734
+ className: "\n m-0.25 flex items-center gap-0.25 rounded-md border\n border-sigil-bg-light bg-timecode-usage-foreground px-1\n py-0.25 text-sigil-control text-timecode-usage-text\n ",
16735
+ children: [
16736
+ /* @__PURE__ */ jsx26(Icon2, { icon: "link", className: "text-[120%]" }),
16737
+ /* @__PURE__ */ jsx26("span", { children: link.type })
16738
+ ]
16739
+ }
16740
+ ),
16741
+ /* @__PURE__ */ jsx26(
16742
+ "div",
16743
+ {
16744
+ className: cn(
16745
+ "w-0 grow truncate p-0.5",
16746
+ cnd(link.name.length, "font-bold", "italic opacity-50")
16747
+ ),
16748
+ children: link.name.length ? link.name.join(" / ") : link.namePlaceholder
16749
+ }
16750
+ )
16751
+ ]
16641
16752
  }
16642
16753
  )
16643
- ] }),
16754
+ ] }) }),
16644
16755
  /* @__PURE__ */ jsxs9(ControlButtonGroup, { className: "rounded-md bg-sigil-bg-light", children: [
16645
16756
  /* @__PURE__ */ jsx26(
16646
16757
  ControlButton,
@@ -16678,7 +16789,7 @@ var FullscreenTimecodeDisplay = ({
16678
16789
  return getTimecodeInstance(applicationState, id);
16679
16790
  } else {
16680
16791
  const c = config.outputs[id[1]];
16681
- if (!c) {
16792
+ if (!c || !c.enabled) {
16682
16793
  return null;
16683
16794
  }
16684
16795
  return augmentUpstreamTimecodeWithOutputMetadata(
@@ -16687,6 +16798,15 @@ var FullscreenTimecodeDisplay = ({
16687
16798
  );
16688
16799
  }
16689
16800
  }, [applicationState, id, config.outputs]);
16801
+ const linkedSourceInfo = useMemo13(() => {
16802
+ if (isOutputInstanceId(id)) {
16803
+ const c = config.outputs[id[1]];
16804
+ if (c?.link) {
16805
+ return getLinkedSourceInfo(c.link, config);
16806
+ }
16807
+ }
16808
+ return void 0;
16809
+ }, [id, config]);
16690
16810
  const instanceConfig = useMemo13(() => {
16691
16811
  if (isInputInstanceId(id)) {
16692
16812
  const c = config.inputs[id[1]];
@@ -16698,7 +16818,8 @@ var FullscreenTimecodeDisplay = ({
16698
16818
  type: STRINGS.protocols[c.definition.type].short,
16699
16819
  name: c.name ? [c.name] : [],
16700
16820
  color: c.color,
16701
- namePlaceholder: `Unnamed Input`
16821
+ namePlaceholder: STRINGS.inputs.unnamed,
16822
+ disabled: !c.enabled
16702
16823
  };
16703
16824
  } else if (isGeneratorInstanceId(id)) {
16704
16825
  const c = config.generators[id[1]];
@@ -16710,7 +16831,8 @@ var FullscreenTimecodeDisplay = ({
16710
16831
  type: STRINGS.generators.type[c.definition.type],
16711
16832
  name: c.name ? [c.name] : [],
16712
16833
  color: c.color,
16713
- namePlaceholder: `Unnamed Generator`
16834
+ namePlaceholder: STRINGS.generators.unnamed,
16835
+ disabled: false
16714
16836
  };
16715
16837
  } else {
16716
16838
  const c = config.outputs[id[1]];
@@ -16722,10 +16844,29 @@ var FullscreenTimecodeDisplay = ({
16722
16844
  type: STRINGS.protocols[c.definition.type].short,
16723
16845
  name: c.name ? [c.name] : [],
16724
16846
  color: c.color,
16725
- namePlaceholder: `Unnamed Output`
16847
+ namePlaceholder: STRINGS.outputs.unnamed,
16848
+ disabled: !c.enabled
16726
16849
  };
16727
16850
  }
16728
16851
  }, [id, config]);
16852
+ const rootState = useMemo13(() => {
16853
+ if (isInputInstanceId(id)) {
16854
+ return {
16855
+ errors: applicationState.inputs?.[id[1]]?.errors ?? [],
16856
+ warnings: applicationState.inputs?.[id[1]]?.warnings ?? []
16857
+ };
16858
+ } else if (isGeneratorInstanceId(id)) {
16859
+ return {
16860
+ errors: [],
16861
+ warnings: []
16862
+ };
16863
+ } else {
16864
+ return {
16865
+ errors: applicationState.outputs?.[id[1]]?.errors ?? [],
16866
+ warnings: applicationState.outputs?.[id[1]]?.warnings ?? []
16867
+ };
16868
+ }
16869
+ }, [id, applicationState]);
16729
16870
  if (!instanceConfig) {
16730
16871
  return /* @__PURE__ */ jsxs9(
16731
16872
  SizeAwareDiv,
@@ -16746,9 +16887,11 @@ var FullscreenTimecodeDisplay = ({
16746
16887
  TimecodeTreeDisplay,
16747
16888
  {
16748
16889
  id,
16749
- timecode,
16890
+ timecode: instanceConfig.disabled ? "disabled" : timecode,
16891
+ rootState,
16750
16892
  assignToOutput: null,
16751
16893
  buttons: null,
16894
+ link: linkedSourceInfo,
16752
16895
  ...instanceConfig
16753
16896
  }
16754
16897
  )
@@ -17186,7 +17329,7 @@ var OutputDisplay = ({
17186
17329
  setAssignToOutput
17187
17330
  }) => {
17188
17331
  const applicationState = useApplicationState();
17189
- const { updateConfig } = useContext10(ConfigContext);
17332
+ const { config: allConfig, updateConfig } = useContext10(ConfigContext);
17190
17333
  const clearLink = useCallback14(() => {
17191
17334
  updateConfig((current) => {
17192
17335
  const currentOutput = current.outputs?.[uuid];
@@ -17214,6 +17357,10 @@ var OutputDisplay = ({
17214
17357
  const tc = config.link && getTimecodeInstance(applicationState, config.link);
17215
17358
  return augmentUpstreamTimecodeWithOutputMetadata(tc, config);
17216
17359
  }, [applicationState, config]);
17360
+ const link = useMemo14(
17361
+ () => getLinkedSourceInfo(config.link, allConfig),
17362
+ [config.link, allConfig]
17363
+ );
17217
17364
  const toggleEnabled = useCallback14(() => {
17218
17365
  updateConfig((current) => {
17219
17366
  const existing = current.outputs?.[uuid];
@@ -17232,6 +17379,13 @@ var OutputDisplay = ({
17232
17379
  };
17233
17380
  });
17234
17381
  }, [uuid, updateConfig]);
17382
+ const rootState = useMemo14(
17383
+ () => ({
17384
+ errors: applicationState.outputs[uuid]?.errors ?? [],
17385
+ warnings: applicationState.outputs[uuid]?.warnings ?? []
17386
+ }),
17387
+ [applicationState.outputs, uuid]
17388
+ );
17235
17389
  return /* @__PURE__ */ jsxs11(
17236
17390
  "div",
17237
17391
  {
@@ -17250,23 +17404,25 @@ var OutputDisplay = ({
17250
17404
  type: STRINGS.protocols[config.definition.type].short,
17251
17405
  name: config.name ? [config.name] : [],
17252
17406
  color: config.color,
17253
- timecode: config.enabled ? timecode : null,
17254
- namePlaceholder: `Unnamed Output`,
17407
+ timecode: config.enabled ? timecode : "disabled",
17408
+ rootState,
17409
+ namePlaceholder: STRINGS.outputs.unnamed,
17410
+ link,
17255
17411
  buttons: /* @__PURE__ */ jsxs11(Fragment9, { children: [
17256
17412
  /* @__PURE__ */ jsx28(
17257
17413
  ControlButton,
17258
17414
  {
17259
17415
  variant: "large",
17260
- title: config.enabled ? "Stop Input" : "Start Input",
17416
+ title: config.enabled ? STRINGS.outputs.disable : STRINGS.outputs.enable,
17261
17417
  onClick: toggleEnabled,
17262
- icon: config.enabled ? "stop" : "play_arrow"
17418
+ icon: config.enabled ? "pause" : "play_arrow"
17263
17419
  }
17264
17420
  ),
17265
17421
  /* @__PURE__ */ jsx28(
17266
17422
  ControlButton,
17267
17423
  {
17268
17424
  variant: "large",
17269
- title: "Link Output",
17425
+ title: STRINGS.outputs.link,
17270
17426
  active: assignToOutput === uuid,
17271
17427
  onClick: linkCallback,
17272
17428
  icon: config.link ? "link" : "link_off"
@@ -17276,7 +17432,7 @@ var OutputDisplay = ({
17276
17432
  ControlButton,
17277
17433
  {
17278
17434
  variant: "large",
17279
- title: "Edit Output",
17435
+ title: STRINGS.outputs.edit,
17280
17436
  onClick: () => setDialogMode({
17281
17437
  section: { type: "outputs", output: config.definition.type },
17282
17438
  target: { type: "edit", uuid }
@@ -17346,7 +17502,7 @@ var OutputsSection = ({
17346
17502
  };
17347
17503
 
17348
17504
  // src/components/frontend/toolbox/generators.tsx
17349
- import { useCallback as useCallback15, useContext as useContext11, useState as useState26 } from "react";
17505
+ import { useCallback as useCallback15, useContext as useContext11, useMemo as useMemo15, useState as useState26 } from "react";
17350
17506
  import { Fragment as Fragment10, jsx as jsx29, jsxs as jsxs12 } from "react/jsx-runtime";
17351
17507
  var ClockSpecificSettings = ({
17352
17508
  data,
@@ -17534,6 +17690,7 @@ var GeneratorDisplay = ({
17534
17690
  }) => {
17535
17691
  const { generators } = useApplicationState();
17536
17692
  const state = generators[uuid];
17693
+ const rootState = useMemo15(() => ({ errors: [], warnings: [] }), []);
17537
17694
  return /* @__PURE__ */ jsx29(
17538
17695
  TimecodeTreeDisplay,
17539
17696
  {
@@ -17543,12 +17700,13 @@ var GeneratorDisplay = ({
17543
17700
  name: config.name ? [config.name] : [],
17544
17701
  color: config.color,
17545
17702
  timecode: state?.timecode ?? null,
17546
- namePlaceholder: `Unnamed Generator`,
17703
+ rootState,
17704
+ namePlaceholder: STRINGS.generators.unnamed,
17547
17705
  buttons: /* @__PURE__ */ jsx29(Fragment10, { children: /* @__PURE__ */ jsx29(
17548
17706
  ControlButton,
17549
17707
  {
17550
17708
  variant: "large",
17551
- title: "Edit Generator",
17709
+ title: STRINGS.generators.edit,
17552
17710
  onClick: () => setDialogMode({
17553
17711
  section: {
17554
17712
  type: "generators",
@@ -17606,7 +17764,13 @@ var GeneratorsSection = ({
17606
17764
  };
17607
17765
 
17608
17766
  // src/components/frontend/toolbox/inputs.tsx
17609
- import { useCallback as useCallback16, useContext as useContext12, useEffect as useEffect27, useState as useState27 } from "react";
17767
+ import {
17768
+ useCallback as useCallback16,
17769
+ useContext as useContext12,
17770
+ useEffect as useEffect27,
17771
+ useMemo as useMemo16,
17772
+ useState as useState27
17773
+ } from "react";
17610
17774
  import { Fragment as Fragment11, jsx as jsx30, jsxs as jsxs13 } from "react/jsx-runtime";
17611
17775
  var DmxConnectionSettings2 = ({
17612
17776
  data,
@@ -17937,6 +18101,10 @@ var InputDisplay = ({
17937
18101
  };
17938
18102
  });
17939
18103
  }, [uuid, updateConfig]);
18104
+ const rootState = useMemo16(
18105
+ () => ({ errors: state?.errors ?? [], warnings: state?.warnings ?? [] }),
18106
+ [state?.errors, state?.warnings]
18107
+ );
17940
18108
  return /* @__PURE__ */ jsx30(
17941
18109
  TimecodeTreeDisplay,
17942
18110
  {
@@ -17945,23 +18113,24 @@ var InputDisplay = ({
17945
18113
  type: STRINGS.protocols[config.definition.type].short,
17946
18114
  name: config.name ? [config.name] : [],
17947
18115
  color: config.color,
17948
- timecode: state?.timecode ?? null,
17949
- namePlaceholder: `Unnamed Input`,
18116
+ timecode: config.enabled ? state?.timecode ?? null : "disabled",
18117
+ rootState,
18118
+ namePlaceholder: STRINGS.inputs.unnamed,
17950
18119
  buttons: /* @__PURE__ */ jsxs13(Fragment11, { children: [
17951
18120
  /* @__PURE__ */ jsx30(
17952
18121
  ControlButton,
17953
18122
  {
17954
18123
  variant: "large",
17955
- title: config.enabled ? "Stop Input" : "Start Input",
18124
+ title: config.enabled ? STRINGS.inputs.disable : STRINGS.inputs.enable,
17956
18125
  onClick: toggleEnabled,
17957
- icon: config.enabled ? "stop" : "play_arrow"
18126
+ icon: config.enabled ? "pause" : "play_arrow"
17958
18127
  }
17959
18128
  ),
17960
18129
  /* @__PURE__ */ jsx30(
17961
18130
  ControlButton,
17962
18131
  {
17963
18132
  variant: "large",
17964
- title: "Edit Input",
18133
+ title: STRINGS.inputs.edit,
17965
18134
  onClick: () => setDialogMode({
17966
18135
  section: { type: "inputs", input: config.definition.type },
17967
18136
  target: { type: "edit", uuid }
@@ -18104,7 +18273,7 @@ import {
18104
18273
  useCallback as useCallback18,
18105
18274
  useContext as useContext13,
18106
18275
  useEffect as useEffect29,
18107
- useMemo as useMemo15,
18276
+ useMemo as useMemo17,
18108
18277
  useRef as useRef17,
18109
18278
  useState as useState29
18110
18279
  } from "react";
@@ -18281,7 +18450,7 @@ var AppPortConfig = () => {
18281
18450
  const currentPortString = !port ? "" : typeof port === "string" ? port : portString(port);
18282
18451
  const hasNetworkChanges = nextPort !== null || nextInterface !== null;
18283
18452
  const nextUrlRef = useRef17(null);
18284
- const validatedPort = useMemo15(() => {
18453
+ const validatedPort = useMemo17(() => {
18285
18454
  if (nextPort === null) {
18286
18455
  return { type: "unchanged" };
18287
18456
  }
@@ -19157,7 +19326,7 @@ var TooltipWrapper2 = ({
19157
19326
  };
19158
19327
 
19159
19328
  // ../../packages/sigil/src/frontend/input.ts
19160
- import { useMemo as useMemo16, useState as useState34 } from "react";
19329
+ import { useMemo as useMemo18, useState as useState34 } from "react";
19161
19330
  var usePressable3 = (click) => {
19162
19331
  const [touching, setTouching] = useState34(false);
19163
19332
  return {
@@ -19185,7 +19354,7 @@ var useLongPressable3 = ({
19185
19354
  onRelease
19186
19355
  }) => {
19187
19356
  const [touching, setTouching] = useState34(false);
19188
- return useMemo16(
19357
+ return useMemo18(
19189
19358
  () => ({
19190
19359
  touching,
19191
19360
  handlers: {
@@ -19703,7 +19872,7 @@ var ToolboxRoot = ({ info }) => {
19703
19872
  },
19704
19873
  [sendMessage, info.key, config]
19705
19874
  );
19706
- const configContext = useMemo17(
19875
+ const configContext = useMemo19(
19707
19876
  () => ({
19708
19877
  config,
19709
19878
  network: info.network,
@@ -19722,12 +19891,12 @@ var ToolboxRoot = ({ info }) => {
19722
19891
  action: "toolbox-root-get-network-interfaces"
19723
19892
  });
19724
19893
  }, [call, info.key]);
19725
- const networkContextValue = useMemo17(() => {
19894
+ const networkContextValue = useMemo19(() => {
19726
19895
  return {
19727
19896
  getNetworkInterfaces
19728
19897
  };
19729
19898
  }, [getNetworkInterfaces]);
19730
- const assignToOutputCallback = useMemo17(() => {
19899
+ const assignToOutputCallback = useMemo19(() => {
19731
19900
  if (!assignToOutput) {
19732
19901
  return null;
19733
19902
  }
@@ -19769,18 +19938,18 @@ var ToolboxRoot = ({ info }) => {
19769
19938
  },
19770
19939
  [call, info.key]
19771
19940
  );
19772
- const handlers = useMemo17(
19941
+ const handlers = useMemo19(
19773
19942
  () => ({
19774
19943
  handlers: info.handlers,
19775
19944
  callHandler
19776
19945
  }),
19777
19946
  [info.handlers, callHandler]
19778
19947
  );
19779
- const windowedTimecodeId = useMemo17(
19948
+ const windowedTimecodeId = useMemo19(
19780
19949
  () => getFragmentValue("tc", TIMECODE_INSTANCE_ID),
19781
19950
  []
19782
19951
  );
19783
- const root = useMemo17(
19952
+ const root = useMemo19(
19784
19953
  () => windowedTimecodeId ? /* @__PURE__ */ jsx51(Layout, { modes: null, children: /* @__PURE__ */ jsx51(FullscreenTimecodeDisplay, { id: windowedTimecodeId }) }) : /* @__PURE__ */ jsxs27(Fragment18, { children: [
19785
19954
  /* @__PURE__ */ jsx51(
19786
19955
  Layout,
@@ -823,6 +823,9 @@ body.touch-mode * {
823
823
  );
824
824
  }
825
825
  }
826
+ .pointer-events-none {
827
+ pointer-events: none;
828
+ }
826
829
  .visible {
827
830
  visibility: visible;
828
831
  }
@@ -891,6 +894,9 @@ body.touch-mode * {
891
894
  .min-h-timecode-min-height {
892
895
  min-height: var(--timecode-min-height);
893
896
  }
897
+ .w-0 {
898
+ width: 0px;
899
+ }
894
900
  .w-full {
895
901
  width: 100%;
896
902
  }
@@ -1052,6 +1058,9 @@ body.touch-mode * {
1052
1058
  .text-\[80\%\] {
1053
1059
  font-size: 80%;
1054
1060
  }
1061
+ .text-\[120\%\] {
1062
+ font-size: 120%;
1063
+ }
1055
1064
  .text-arcane-normal {
1056
1065
  font-size: 1em;
1057
1066
  }