@getontime/cli 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/client/assets/{Backstage-ZSqb8OU6.js → Backstage-BhtXVpms.js} +2 -2
  2. package/client/assets/Backstage-BhtXVpms.js.br +0 -0
  3. package/client/assets/Backstage-BhtXVpms.js.gz +0 -0
  4. package/client/assets/{Backstage-ZSqb8OU6.js.map → Backstage-BhtXVpms.js.map} +1 -1
  5. package/client/assets/{Countdown-DVRZbeRP.js → Countdown-NmGi1KMx.js} +2 -2
  6. package/client/assets/Countdown-NmGi1KMx.js.br +0 -0
  7. package/client/assets/Countdown-NmGi1KMx.js.gz +0 -0
  8. package/client/assets/Countdown-NmGi1KMx.js.map +1 -0
  9. package/client/assets/{CustomTranslationModal-D_Cy0d_H.js → CustomTranslationModal-BBNxpds0.js} +2 -2
  10. package/client/assets/CustomTranslationModal-BBNxpds0.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-BBNxpds0.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-D_Cy0d_H.js.map → CustomTranslationModal-BBNxpds0.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-B_JKLKYW.js → DelayIndicator-CFCDQ7FN.js} +2 -2
  14. package/client/assets/DelayIndicator-CFCDQ7FN.js.br +0 -0
  15. package/client/assets/DelayIndicator-CFCDQ7FN.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-B_JKLKYW.js.map → DelayIndicator-CFCDQ7FN.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js → EditorFeatureWrapper-D55c8JBz.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-D55c8JBz.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-D55c8JBz.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js.map → EditorFeatureWrapper-D55c8JBz.js.map} +1 -1
  21. package/client/assets/{EditorUtils-De0umjb-.js → EditorUtils-CFE106qQ.js} +2 -2
  22. package/client/assets/EditorUtils-CFE106qQ.js.br +0 -0
  23. package/client/assets/EditorUtils-CFE106qQ.js.gz +0 -0
  24. package/client/assets/{EditorUtils-De0umjb-.js.map → EditorUtils-CFE106qQ.js.map} +1 -1
  25. package/client/assets/{Empty-BYF0tVRk.js → Empty-C-JO_XAr.js} +2 -2
  26. package/client/assets/Empty-C-JO_XAr.js.br +2 -0
  27. package/client/assets/Empty-C-JO_XAr.js.gz +0 -0
  28. package/client/assets/{Empty-BYF0tVRk.js.map → Empty-C-JO_XAr.js.map} +1 -1
  29. package/client/assets/{EmptyPage-DYH2bswA.js → EmptyPage-BSzsxpGg.js} +2 -2
  30. package/client/assets/EmptyPage-BSzsxpGg.js.br +1 -0
  31. package/client/assets/EmptyPage-BSzsxpGg.js.gz +0 -0
  32. package/client/assets/{EmptyPage-DYH2bswA.js.map → EmptyPage-BSzsxpGg.js.map} +1 -1
  33. package/client/assets/{FollowButton-DyWsvyFF.js → FollowButton-Mox6N4JW.js} +2 -2
  34. package/client/assets/FollowButton-Mox6N4JW.js.br +0 -0
  35. package/client/assets/FollowButton-Mox6N4JW.js.gz +0 -0
  36. package/client/assets/{FollowButton-DyWsvyFF.js.map → FollowButton-Mox6N4JW.js.map} +1 -1
  37. package/client/assets/MessageControlExport-BL2ip9qN.js +2 -0
  38. package/client/assets/MessageControlExport-BL2ip9qN.js.br +0 -0
  39. package/client/assets/MessageControlExport-BL2ip9qN.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-yLGU2dMq.js.map → MessageControlExport-BL2ip9qN.js.map} +1 -1
  41. package/client/assets/{MilestoneEditor-GkzJ-h1C.js → MilestoneEditor-DcWPGKNK.js} +2 -2
  42. package/client/assets/MilestoneEditor-DcWPGKNK.js.br +0 -0
  43. package/client/assets/MilestoneEditor-DcWPGKNK.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-GkzJ-h1C.js.map → MilestoneEditor-DcWPGKNK.js.map} +1 -1
  45. package/client/assets/Modal-D3tAPV2u.css +1 -0
  46. package/client/assets/Modal-D3tAPV2u.css.br +0 -0
  47. package/client/assets/Modal-D3tAPV2u.css.gz +0 -0
  48. package/client/assets/Modal-krcwDRb-.js +2 -0
  49. package/client/assets/Modal-krcwDRb-.js.br +0 -0
  50. package/client/assets/Modal-krcwDRb-.js.gz +0 -0
  51. package/client/assets/Modal-krcwDRb-.js.map +1 -0
  52. package/client/assets/{MultiPartProgressBar-BITERKS0.js → MultiPartProgressBar-BXQbpM-j.js} +2 -2
  53. package/client/assets/MultiPartProgressBar-BXQbpM-j.js.br +0 -0
  54. package/client/assets/MultiPartProgressBar-BXQbpM-j.js.gz +0 -0
  55. package/client/assets/{MultiPartProgressBar-BITERKS0.js.map → MultiPartProgressBar-BXQbpM-j.js.map} +1 -1
  56. package/client/assets/{OperatorExport-DMZ6eQfT.js → OperatorExport-C50KHBrD.js} +2 -2
  57. package/client/assets/OperatorExport-C50KHBrD.js.br +0 -0
  58. package/client/assets/OperatorExport-C50KHBrD.js.gz +0 -0
  59. package/client/assets/{OperatorExport-DMZ6eQfT.js.map → OperatorExport-C50KHBrD.js.map} +1 -1
  60. package/client/assets/OverviewWrapper-MGJ1uE5W.js +2 -0
  61. package/client/assets/OverviewWrapper-MGJ1uE5W.js.br +0 -0
  62. package/client/assets/OverviewWrapper-MGJ1uE5W.js.gz +0 -0
  63. package/client/assets/{OverviewWrapper-riM6vPno.js.map → OverviewWrapper-MGJ1uE5W.js.map} +1 -1
  64. package/client/assets/{ProjectInfo-DxtMq70a.js → ProjectInfo-CJ-GLvVG.js} +2 -2
  65. package/client/assets/ProjectInfo-CJ-GLvVG.js.br +0 -0
  66. package/client/assets/ProjectInfo-CJ-GLvVG.js.gz +0 -0
  67. package/client/assets/{ProjectInfo-DxtMq70a.js.map → ProjectInfo-CJ-GLvVG.js.map} +1 -1
  68. package/client/assets/{ProtectRoute-p1fmtLeu.js → ProtectRoute-DJ9xZnPI.js} +2 -2
  69. package/client/assets/ProtectRoute-DJ9xZnPI.js.br +0 -0
  70. package/client/assets/ProtectRoute-DJ9xZnPI.js.gz +0 -0
  71. package/client/assets/{ProtectRoute-p1fmtLeu.js.map → ProtectRoute-DJ9xZnPI.js.map} +1 -1
  72. package/client/assets/{ProtectedCuesheet-CvRnqT0z.js → ProtectedCuesheet-B8tg6Mmo.js} +2 -2
  73. package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.br +0 -0
  74. package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.gz +0 -0
  75. package/client/assets/{ProtectedCuesheet-CvRnqT0z.js.map → ProtectedCuesheet-B8tg6Mmo.js.map} +1 -1
  76. package/client/assets/ProtectedEditor-Bl4wV72N.js +3 -0
  77. package/client/assets/ProtectedEditor-Bl4wV72N.js.br +0 -0
  78. package/client/assets/ProtectedEditor-Bl4wV72N.js.gz +0 -0
  79. package/client/assets/ProtectedEditor-Bl4wV72N.js.map +1 -0
  80. package/client/assets/{RundownEntry-B1dSz1wu.js → RundownEntry-D9tXNXPy.js} +2 -2
  81. package/client/assets/RundownEntry-D9tXNXPy.js.br +0 -0
  82. package/client/assets/RundownEntry-D9tXNXPy.js.gz +0 -0
  83. package/client/assets/{RundownEntry-B1dSz1wu.js.map → RundownEntry-D9tXNXPy.js.map} +1 -1
  84. package/client/assets/RundownExport-1zBZurIG.css +1 -0
  85. package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
  86. package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
  87. package/client/assets/RundownExport-D6uAmFbb.js +3 -0
  88. package/client/assets/RundownExport-D6uAmFbb.js.br +0 -0
  89. package/client/assets/RundownExport-D6uAmFbb.js.gz +0 -0
  90. package/client/assets/RundownExport-D6uAmFbb.js.map +1 -0
  91. package/client/assets/{Select-niU9Razm.js → Select-BLA-yQMq.js} +2 -2
  92. package/client/assets/Select-BLA-yQMq.js.br +0 -0
  93. package/client/assets/Select-BLA-yQMq.js.gz +0 -0
  94. package/client/assets/{Select-niU9Razm.js.map → Select-BLA-yQMq.js.map} +1 -1
  95. package/client/assets/{Studio-CWdJq4bx.js → Studio-DbP92DTf.js} +2 -2
  96. package/client/assets/Studio-DbP92DTf.js.br +0 -0
  97. package/client/assets/Studio-DbP92DTf.js.gz +0 -0
  98. package/client/assets/{Studio-CWdJq4bx.js.map → Studio-DbP92DTf.js.map} +1 -1
  99. package/client/assets/{StyleEditor-BIFjHsgD.js → StyleEditor-DNjZ46Qf.js} +2 -2
  100. package/client/assets/StyleEditor-DNjZ46Qf.js.br +0 -0
  101. package/client/assets/StyleEditor-DNjZ46Qf.js.gz +0 -0
  102. package/client/assets/{StyleEditor-BIFjHsgD.js.map → StyleEditor-DNjZ46Qf.js.map} +1 -1
  103. package/client/assets/{SuperscriptTime-DCTyUARx.js → SuperscriptTime-C8ypTVpH.js} +2 -2
  104. package/client/assets/SuperscriptTime-C8ypTVpH.js.br +0 -0
  105. package/client/assets/SuperscriptTime-C8ypTVpH.js.gz +0 -0
  106. package/client/assets/{SuperscriptTime-DCTyUARx.js.map → SuperscriptTime-C8ypTVpH.js.map} +1 -1
  107. package/client/assets/{TimeElements-DBVGVx71.js → TimeElements-DlEBhXe0.js} +2 -2
  108. package/client/assets/TimeElements-DlEBhXe0.js.br +0 -0
  109. package/client/assets/TimeElements-DlEBhXe0.js.gz +0 -0
  110. package/client/assets/{TimeElements-DBVGVx71.js.map → TimeElements-DlEBhXe0.js.map} +1 -1
  111. package/client/assets/{TimeInput-wQ67FbW6.js → TimeInput-DU09ewqh.js} +2 -2
  112. package/client/assets/TimeInput-DU09ewqh.js.br +0 -0
  113. package/client/assets/TimeInput-DU09ewqh.js.gz +0 -0
  114. package/client/assets/{TimeInput-wQ67FbW6.js.map → TimeInput-DU09ewqh.js.map} +1 -1
  115. package/client/assets/{TimelinePage-DZefE2vQ.js → TimelinePage-DTwqRihn.js} +2 -2
  116. package/client/assets/TimelinePage-DTwqRihn.js.br +0 -0
  117. package/client/assets/TimelinePage-DTwqRihn.js.gz +0 -0
  118. package/client/assets/{TimelinePage-DZefE2vQ.js.map → TimelinePage-DTwqRihn.js.map} +1 -1
  119. package/client/assets/Timer-B7nk3TMf.css +1 -0
  120. package/client/assets/Timer-B7nk3TMf.css.br +0 -0
  121. package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
  122. package/client/assets/Timer-jjWAunJc.js +2 -0
  123. package/client/assets/Timer-jjWAunJc.js.br +0 -0
  124. package/client/assets/Timer-jjWAunJc.js.gz +0 -0
  125. package/client/assets/Timer-jjWAunJc.js.map +1 -0
  126. package/client/assets/TimerControlExport-i0ZDpUx7.js +2 -0
  127. package/client/assets/TimerControlExport-i0ZDpUx7.js.br +0 -0
  128. package/client/assets/TimerControlExport-i0ZDpUx7.js.gz +0 -0
  129. package/client/assets/{TimerControlExport-C1C_vBX4.js.map → TimerControlExport-i0ZDpUx7.js.map} +1 -1
  130. package/client/assets/{TitleCard-B4N-kCM3.js → TitleCard-BgOtucv6.js} +2 -2
  131. package/client/assets/TitleCard-BgOtucv6.js.br +0 -0
  132. package/client/assets/TitleCard-BgOtucv6.js.gz +0 -0
  133. package/client/assets/{TitleCard-B4N-kCM3.js.map → TitleCard-BgOtucv6.js.map} +1 -1
  134. package/client/assets/{Tooltip-DJ8Y4CO4.js → Tooltip-C0rGHLsB.js} +2 -2
  135. package/client/assets/Tooltip-C0rGHLsB.js.br +0 -0
  136. package/client/assets/Tooltip-C0rGHLsB.js.gz +0 -0
  137. package/client/assets/{Tooltip-DJ8Y4CO4.js.map → Tooltip-C0rGHLsB.js.map} +1 -1
  138. package/client/assets/{ViewLogo-Dd60EREE.js → ViewLogo--9miplQv.js} +2 -2
  139. package/client/assets/ViewLogo--9miplQv.js.br +0 -0
  140. package/client/assets/ViewLogo--9miplQv.js.gz +0 -0
  141. package/client/assets/{ViewLogo-Dd60EREE.js.map → ViewLogo--9miplQv.js.map} +1 -1
  142. package/client/assets/{ViewParamsEditor-BWEYbq_S.js → ViewParamsEditor-BFu_0oIb.js} +2 -2
  143. package/client/assets/ViewParamsEditor-BFu_0oIb.js.br +0 -0
  144. package/client/assets/ViewParamsEditor-BFu_0oIb.js.gz +0 -0
  145. package/client/assets/{ViewParamsEditor-BWEYbq_S.js.map → ViewParamsEditor-BFu_0oIb.js.map} +1 -1
  146. package/client/assets/{dateConfig-8rhb0Dbh.js → dateConfig-WYqMzV9D.js} +2 -2
  147. package/client/assets/dateConfig-WYqMzV9D.js.br +0 -0
  148. package/client/assets/dateConfig-WYqMzV9D.js.gz +0 -0
  149. package/client/assets/{dateConfig-8rhb0Dbh.js.map → dateConfig-WYqMzV9D.js.map} +1 -1
  150. package/client/assets/{editorSettings-LMnfWux6.js → editorSettings-CCHx-wCx.js} +2 -2
  151. package/client/assets/editorSettings-CCHx-wCx.js.br +0 -0
  152. package/client/assets/editorSettings-CCHx-wCx.js.gz +0 -0
  153. package/client/assets/{editorSettings-LMnfWux6.js.map → editorSettings-CCHx-wCx.js.map} +1 -1
  154. package/client/assets/{getProgress-CyJTu6f5.js → getProgress-B94Ieskb.js} +2 -2
  155. package/client/assets/getProgress-B94Ieskb.js.br +0 -0
  156. package/client/assets/getProgress-B94Ieskb.js.gz +0 -0
  157. package/client/assets/{getProgress-CyJTu6f5.js.map → getProgress-B94Ieskb.js.map} +1 -1
  158. package/client/assets/{index-5QAOtSTh.js → index-njXwwjfn.js} +3 -3
  159. package/client/assets/index-njXwwjfn.js.br +0 -0
  160. package/client/assets/index-njXwwjfn.js.gz +0 -0
  161. package/client/assets/{index-5QAOtSTh.js.map → index-njXwwjfn.js.map} +1 -1
  162. package/client/assets/{offset-CLDSqOP5.js → offset-D1q-72D-.js} +2 -2
  163. package/client/assets/offset-D1q-72D-.js.br +0 -0
  164. package/client/assets/offset-D1q-72D-.js.gz +0 -0
  165. package/client/assets/{offset-CLDSqOP5.js.map → offset-D1q-72D-.js.map} +1 -1
  166. package/client/assets/{parseUserTime-CCDHpp7D.js → parseUserTime-Bc1pSJR2.js} +2 -2
  167. package/client/assets/parseUserTime-Bc1pSJR2.js.br +0 -0
  168. package/client/assets/parseUserTime-Bc1pSJR2.js.gz +0 -0
  169. package/client/assets/{parseUserTime-CCDHpp7D.js.map → parseUserTime-Bc1pSJR2.js.map} +1 -1
  170. package/client/assets/{playbackstate-6lBh6omZ.js → playbackstate-BpzbtG9F.js} +2 -2
  171. package/client/assets/playbackstate-BpzbtG9F.js.br +0 -0
  172. package/client/assets/playbackstate-BpzbtG9F.js.gz +0 -0
  173. package/client/assets/{playbackstate-6lBh6omZ.js.map → playbackstate-BpzbtG9F.js.map} +1 -1
  174. package/client/assets/{presentation.utils-BUIuV_2e.js → presentation.utils-B2baBe3j.js} +2 -2
  175. package/client/assets/presentation.utils-B2baBe3j.js.br +0 -0
  176. package/client/assets/presentation.utils-B2baBe3j.js.gz +0 -0
  177. package/client/assets/{presentation.utils-BUIuV_2e.js.map → presentation.utils-B2baBe3j.js.map} +1 -1
  178. package/client/assets/{rundownUtils-Cnd2prRX.js → rundownUtils-H6xvQyre.js} +2 -2
  179. package/client/assets/rundownUtils-H6xvQyre.js.br +0 -0
  180. package/client/assets/rundownUtils-H6xvQyre.js.gz +0 -0
  181. package/client/assets/{rundownUtils-Cnd2prRX.js.map → rundownUtils-H6xvQyre.js.map} +1 -1
  182. package/client/assets/{useCustomFields-BuxKsqGS.js → useCustomFields-Da0Li7nQ.js} +2 -2
  183. package/client/assets/useCustomFields-Da0Li7nQ.js.br +0 -0
  184. package/client/assets/useCustomFields-Da0Li7nQ.js.gz +0 -0
  185. package/client/assets/{useCustomFields-BuxKsqGS.js.map → useCustomFields-Da0Li7nQ.js.map} +1 -1
  186. package/client/assets/{useFollowComponent-iGQv4zoS.js → useFollowComponent-Qo3FobyV.js} +2 -2
  187. package/client/assets/useFollowComponent-Qo3FobyV.js.br +0 -0
  188. package/client/assets/useFollowComponent-Qo3FobyV.js.gz +0 -0
  189. package/client/assets/{useFollowComponent-iGQv4zoS.js.map → useFollowComponent-Qo3FobyV.js.map} +1 -1
  190. package/client/assets/{useProjectData-CetvEK9E.js → useProjectData-DW06zQvF.js} +2 -2
  191. package/client/assets/useProjectData-DW06zQvF.js.br +0 -0
  192. package/client/assets/useProjectData-DW06zQvF.js.gz +0 -0
  193. package/client/assets/{useProjectData-CetvEK9E.js.map → useProjectData-DW06zQvF.js.map} +1 -1
  194. package/client/assets/{useReport-PEFRsOhF.js → useReport-DhFY2L8v.js} +2 -2
  195. package/client/assets/useReport-DhFY2L8v.js.br +0 -0
  196. package/client/assets/useReport-DhFY2L8v.js.gz +0 -0
  197. package/client/assets/{useReport-PEFRsOhF.js.map → useReport-DhFY2L8v.js.map} +1 -1
  198. package/client/assets/useRundown-ihoU8qBi.js +2 -0
  199. package/client/assets/useRundown-ihoU8qBi.js.br +0 -0
  200. package/client/assets/useRundown-ihoU8qBi.js.gz +0 -0
  201. package/client/assets/useRundown-ihoU8qBi.js.map +1 -0
  202. package/client/assets/{useWindowTitle-b5fN0StF.js → useWindowTitle-B2UzPuki.js} +2 -2
  203. package/client/assets/useWindowTitle-B2UzPuki.js.br +0 -0
  204. package/client/assets/useWindowTitle-B2UzPuki.js.gz +0 -0
  205. package/client/assets/{useWindowTitle-b5fN0StF.js.map → useWindowTitle-B2UzPuki.js.map} +1 -1
  206. package/client/assets/{validateEvent-Bvgk1E-Y.js → validateEvent-BJMwP_mq.js} +2 -2
  207. package/client/assets/validateEvent-BJMwP_mq.js.br +0 -0
  208. package/client/assets/validateEvent-BJMwP_mq.js.gz +0 -0
  209. package/client/assets/{validateEvent-Bvgk1E-Y.js.map → validateEvent-BJMwP_mq.js.map} +1 -1
  210. package/client/assets/{vendor-Cu5xgv5K.js → vendor-9UkPSc5K.js} +3 -3
  211. package/client/assets/vendor-9UkPSc5K.js.br +0 -0
  212. package/client/assets/vendor-9UkPSc5K.js.gz +0 -0
  213. package/client/assets/{vendor-Cu5xgv5K.js.map → vendor-9UkPSc5K.js.map} +1 -1
  214. package/client/assets/{viewLoader.utils-BPhACxyG.js → viewLoader.utils-DQGhrjSp.js} +2 -2
  215. package/client/assets/viewLoader.utils-DQGhrjSp.js.br +0 -0
  216. package/client/assets/viewLoader.utils-DQGhrjSp.js.gz +0 -0
  217. package/client/assets/{viewLoader.utils-BPhACxyG.js.map → viewLoader.utils-DQGhrjSp.js.map} +1 -1
  218. package/client/index.html +2 -2
  219. package/external/demo/app.js +2 -2
  220. package/package.json +1 -1
  221. package/server/index.cjs +97 -88
  222. package/client/assets/Backstage-ZSqb8OU6.js.br +0 -0
  223. package/client/assets/Backstage-ZSqb8OU6.js.gz +0 -0
  224. package/client/assets/Countdown-DVRZbeRP.js.br +0 -0
  225. package/client/assets/Countdown-DVRZbeRP.js.gz +0 -0
  226. package/client/assets/Countdown-DVRZbeRP.js.map +0 -1
  227. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.br +0 -0
  228. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.gz +0 -0
  229. package/client/assets/DelayIndicator-B_JKLKYW.js.br +0 -0
  230. package/client/assets/DelayIndicator-B_JKLKYW.js.gz +0 -0
  231. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.br +0 -0
  232. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.gz +0 -0
  233. package/client/assets/EditorUtils-De0umjb-.js.br +0 -0
  234. package/client/assets/EditorUtils-De0umjb-.js.gz +0 -0
  235. package/client/assets/Empty-BYF0tVRk.js.br +0 -2
  236. package/client/assets/Empty-BYF0tVRk.js.gz +0 -0
  237. package/client/assets/EmptyPage-DYH2bswA.js.br +0 -0
  238. package/client/assets/EmptyPage-DYH2bswA.js.gz +0 -0
  239. package/client/assets/FollowButton-DyWsvyFF.js.br +0 -0
  240. package/client/assets/FollowButton-DyWsvyFF.js.gz +0 -0
  241. package/client/assets/MessageControlExport-yLGU2dMq.js +0 -2
  242. package/client/assets/MessageControlExport-yLGU2dMq.js.br +0 -0
  243. package/client/assets/MessageControlExport-yLGU2dMq.js.gz +0 -0
  244. package/client/assets/MilestoneEditor-GkzJ-h1C.js.br +0 -0
  245. package/client/assets/MilestoneEditor-GkzJ-h1C.js.gz +0 -0
  246. package/client/assets/Modal-BKL-5GzU.js +0 -2
  247. package/client/assets/Modal-BKL-5GzU.js.br +0 -0
  248. package/client/assets/Modal-BKL-5GzU.js.gz +0 -0
  249. package/client/assets/Modal-BKL-5GzU.js.map +0 -1
  250. package/client/assets/Modal-BgJx3SNK.css +0 -1
  251. package/client/assets/Modal-BgJx3SNK.css.br +0 -0
  252. package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
  253. package/client/assets/MultiPartProgressBar-BITERKS0.js.br +0 -0
  254. package/client/assets/MultiPartProgressBar-BITERKS0.js.gz +0 -0
  255. package/client/assets/OperatorExport-DMZ6eQfT.js.br +0 -0
  256. package/client/assets/OperatorExport-DMZ6eQfT.js.gz +0 -0
  257. package/client/assets/OverviewWrapper-riM6vPno.js +0 -2
  258. package/client/assets/OverviewWrapper-riM6vPno.js.br +0 -0
  259. package/client/assets/OverviewWrapper-riM6vPno.js.gz +0 -0
  260. package/client/assets/ProjectInfo-DxtMq70a.js.br +0 -0
  261. package/client/assets/ProjectInfo-DxtMq70a.js.gz +0 -0
  262. package/client/assets/ProtectRoute-p1fmtLeu.js.br +0 -0
  263. package/client/assets/ProtectRoute-p1fmtLeu.js.gz +0 -0
  264. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.br +0 -0
  265. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.gz +0 -0
  266. package/client/assets/ProtectedEditor-D4UXj1xL.js +0 -3
  267. package/client/assets/ProtectedEditor-D4UXj1xL.js.br +0 -0
  268. package/client/assets/ProtectedEditor-D4UXj1xL.js.gz +0 -0
  269. package/client/assets/ProtectedEditor-D4UXj1xL.js.map +0 -1
  270. package/client/assets/RundownEntry-B1dSz1wu.js.br +0 -0
  271. package/client/assets/RundownEntry-B1dSz1wu.js.gz +0 -0
  272. package/client/assets/RundownExport-CUtaG16H.css +0 -1
  273. package/client/assets/RundownExport-CUtaG16H.css.br +0 -0
  274. package/client/assets/RundownExport-CUtaG16H.css.gz +0 -0
  275. package/client/assets/RundownExport-WjLpncYT.js +0 -3
  276. package/client/assets/RundownExport-WjLpncYT.js.br +0 -0
  277. package/client/assets/RundownExport-WjLpncYT.js.gz +0 -0
  278. package/client/assets/RundownExport-WjLpncYT.js.map +0 -1
  279. package/client/assets/Select-niU9Razm.js.br +0 -0
  280. package/client/assets/Select-niU9Razm.js.gz +0 -0
  281. package/client/assets/Studio-CWdJq4bx.js.br +0 -0
  282. package/client/assets/Studio-CWdJq4bx.js.gz +0 -0
  283. package/client/assets/StyleEditor-BIFjHsgD.js.br +0 -0
  284. package/client/assets/StyleEditor-BIFjHsgD.js.gz +0 -0
  285. package/client/assets/SuperscriptTime-DCTyUARx.js.br +0 -0
  286. package/client/assets/SuperscriptTime-DCTyUARx.js.gz +0 -0
  287. package/client/assets/TimeElements-DBVGVx71.js.br +0 -0
  288. package/client/assets/TimeElements-DBVGVx71.js.gz +0 -0
  289. package/client/assets/TimeInput-wQ67FbW6.js.br +0 -0
  290. package/client/assets/TimeInput-wQ67FbW6.js.gz +0 -0
  291. package/client/assets/TimelinePage-DZefE2vQ.js.br +0 -0
  292. package/client/assets/TimelinePage-DZefE2vQ.js.gz +0 -0
  293. package/client/assets/Timer-Bs450x86.js +0 -2
  294. package/client/assets/Timer-Bs450x86.js.br +0 -0
  295. package/client/assets/Timer-Bs450x86.js.gz +0 -0
  296. package/client/assets/Timer-Bs450x86.js.map +0 -1
  297. package/client/assets/Timer-DGNfbBKM.css +0 -1
  298. package/client/assets/Timer-DGNfbBKM.css.br +0 -0
  299. package/client/assets/Timer-DGNfbBKM.css.gz +0 -0
  300. package/client/assets/TimerControlExport-C1C_vBX4.js +0 -2
  301. package/client/assets/TimerControlExport-C1C_vBX4.js.br +0 -0
  302. package/client/assets/TimerControlExport-C1C_vBX4.js.gz +0 -0
  303. package/client/assets/TitleCard-B4N-kCM3.js.br +0 -0
  304. package/client/assets/TitleCard-B4N-kCM3.js.gz +0 -0
  305. package/client/assets/Tooltip-DJ8Y4CO4.js.br +0 -0
  306. package/client/assets/Tooltip-DJ8Y4CO4.js.gz +0 -0
  307. package/client/assets/ViewLogo-Dd60EREE.js.br +0 -0
  308. package/client/assets/ViewLogo-Dd60EREE.js.gz +0 -0
  309. package/client/assets/ViewParamsEditor-BWEYbq_S.js.br +0 -0
  310. package/client/assets/ViewParamsEditor-BWEYbq_S.js.gz +0 -0
  311. package/client/assets/dateConfig-8rhb0Dbh.js.br +0 -0
  312. package/client/assets/dateConfig-8rhb0Dbh.js.gz +0 -0
  313. package/client/assets/editorSettings-LMnfWux6.js.br +0 -0
  314. package/client/assets/editorSettings-LMnfWux6.js.gz +0 -0
  315. package/client/assets/getProgress-CyJTu6f5.js.br +0 -0
  316. package/client/assets/getProgress-CyJTu6f5.js.gz +0 -0
  317. package/client/assets/index-5QAOtSTh.js.br +0 -0
  318. package/client/assets/index-5QAOtSTh.js.gz +0 -0
  319. package/client/assets/offset-CLDSqOP5.js.br +0 -0
  320. package/client/assets/offset-CLDSqOP5.js.gz +0 -0
  321. package/client/assets/parseUserTime-CCDHpp7D.js.br +0 -0
  322. package/client/assets/parseUserTime-CCDHpp7D.js.gz +0 -0
  323. package/client/assets/playbackstate-6lBh6omZ.js.br +0 -0
  324. package/client/assets/playbackstate-6lBh6omZ.js.gz +0 -0
  325. package/client/assets/presentation.utils-BUIuV_2e.js.br +0 -0
  326. package/client/assets/presentation.utils-BUIuV_2e.js.gz +0 -0
  327. package/client/assets/rundownUtils-Cnd2prRX.js.br +0 -0
  328. package/client/assets/rundownUtils-Cnd2prRX.js.gz +0 -0
  329. package/client/assets/useCustomFields-BuxKsqGS.js.br +0 -0
  330. package/client/assets/useCustomFields-BuxKsqGS.js.gz +0 -0
  331. package/client/assets/useFollowComponent-iGQv4zoS.js.br +0 -0
  332. package/client/assets/useFollowComponent-iGQv4zoS.js.gz +0 -0
  333. package/client/assets/useProjectData-CetvEK9E.js.br +0 -0
  334. package/client/assets/useProjectData-CetvEK9E.js.gz +0 -0
  335. package/client/assets/useReport-PEFRsOhF.js.br +0 -0
  336. package/client/assets/useReport-PEFRsOhF.js.gz +0 -0
  337. package/client/assets/useRundown-D8CYATNi.js +0 -2
  338. package/client/assets/useRundown-D8CYATNi.js.br +0 -0
  339. package/client/assets/useRundown-D8CYATNi.js.gz +0 -0
  340. package/client/assets/useRundown-D8CYATNi.js.map +0 -1
  341. package/client/assets/useWindowTitle-b5fN0StF.js.br +0 -0
  342. package/client/assets/useWindowTitle-b5fN0StF.js.gz +0 -0
  343. package/client/assets/validateEvent-Bvgk1E-Y.js.br +0 -0
  344. package/client/assets/validateEvent-Bvgk1E-Y.js.gz +0 -0
  345. package/client/assets/vendor-Cu5xgv5K.js.br +0 -0
  346. package/client/assets/vendor-Cu5xgv5K.js.gz +0 -0
  347. package/client/assets/viewLoader.utils-BPhACxyG.js.br +0 -0
  348. package/client/assets/viewLoader.utils-BPhACxyG.js.gz +0 -0
@@ -1 +0,0 @@
1
- ._blink_44w0f_1{animation:_blink_44w0f_1 1s step-start infinite}@keyframes _blink_44w0f_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_44w0f_13{transform:rotate(45deg)}._footer_44w0f_17{border-top:1px solid rgba(255,255,255,.1);padding-top:1rem;display:flex;flex-wrap:wrap;gap:.5rem}._blink_103di_1{animation:_blink_103di_1 1s step-start infinite}@keyframes _blink_103di_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_103di_13{transform:rotate(45deg)}._entryEditor_103di_17{color:#b1b1b1;height:100%;max-height:100%;overflow-y:auto;padding:.5rem;display:flex;flex-direction:column;overflow-x:auto}._shortcutSection_103di_28{flex:1;display:grid;place-content:center;gap:1rem}._shortcuts_103di_35{font-size:calc(1rem - 3px);border-collapse:separate;border-spacing:4rem 0}._shortcuts_103di_35 tr td:nth-child(odd){text-align:left}._shortcuts_103di_35 tr td:nth-child(2n){text-align:right;white-space:nowrap}._spacer_103di_48{height:1rem}._prompt_103di_52{margin-left:4rem}._divider_103di_56{display:inline-block;text-align:center;width:1em}._kbd_103di_62{font-family:monospace;white-space:nowrap;font-size:calc(1rem - 2px);padding:.125rem .5rem;background-color:#262626;color:#f6f6f6;border-radius:2px;font-weight:400;box-shadow:0 0 3px #0006}._blink_15pki_1{animation:_blink_15pki_1 1s step-start infinite}@keyframes _blink_15pki_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_15pki_13{transform:rotate(45deg)}._entry_15pki_17,._empty_15pki_18,._error_15pki_19{padding-inline:.5rem;font-size:1rem;height:3rem;display:flex;align-items:center;justify-content:space-between}._entry_15pki_17[data-selected=true]{background-color:#2b5abc}._empty_15pki_18{color:#b1b1b1}._error_15pki_19{color:#fa5656}._data_15pki_40{display:grid;grid-template-areas:"index cue" "index title";column-gap:1rem;grid-template-rows:min-content 1fr}._data_15pki_40 ._index_15pki_46{grid-area:index;background-color:var(--color, #404040);border-radius:2px;padding-block:.25rem;width:3.5rem;align-self:center;text-align:center}._data_15pki_40 ._title_15pki_55{grid-area:title}._data_15pki_40 ._cue_15pki_58{grid-area:cue;font-size:calc(1rem - 2px);color:#b1b1b1;max-height:1em;min-height:0}._footer_15pki_66{font-size:calc(1rem - 2px);color:#b1b1b1}._em_15pki_18{color:#f6f6f6;margin-inline:.25rem}._scrollContainer_15pki_76{max-height:70vh;overflow:auto;padding-top:1rem}._blink_156wk_1{animation:_blink_156wk_1 1s step-start infinite}@keyframes _blink_156wk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_156wk_13{transform:rotate(45deg)}._header_156wk_17{padding-inline:1rem 2rem;display:flex;align-items:center}:is([data-target=small-device]) ._header_156wk_17{padding-inline:0;overflow-x:auto}._group_156wk_28{display:flex;align-items:center;gap:2px;padding-inline:2px;background:#2d2d2d;border-radius:3px;height:2rem}._radioButton_156wk_39{box-sizing:border-box;display:flex;align-items:center;justify-content:center;height:calc(2rem - 4px);padding-inline:1em;border:1px solid transparent;border-radius:3px;color:#b1b1b1;font-size:calc(1rem - 2px);font-weight:600}._radioButton_156wk_39:focus-visible{background:transparent;outline:1px solid #578AF4}._radioButton_156wk_39:hover:not(:disabled):not(:active){background:#404040}._radioButton_156wk_39:active{background:#2d2d2d}._radioButton_156wk_39[data-pressed]{background:#2b5abc;color:#f6f6f6}._radioButton_156wk_39[data-pressed]:hover:not(:disabled):not(:active){background:#3e75e8}._apart_156wk_70{margin-left:auto}._separator_156wk_74{margin-inline:1rem}._blink_96pwt_1{animation:_blink_96pwt_1 1s step-start infinite}@keyframes _blink_96pwt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_96pwt_13{transform:rotate(45deg)}._quickAdd_96pwt_17{display:flex;align-items:center;gap:1rem;padding-block:.5rem;background:color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._quickAdd_96pwt_17._indent_96pwt_24{padding-left:calc(2em + .5rem)}._blink_fgq5o_1{animation:_blink_fgq5o_1 1s step-start infinite}@keyframes _blink_fgq5o_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_fgq5o_13{transform:rotate(45deg)}._quickAdd_fgq5o_17{display:flex;align-items:center;gap:1rem;position:relative;height:1px;background:#578af4;z-index:100}._addButton_fgq5o_27{position:absolute;top:0;left:0;transform:translateY(-50%)}._blink_zrdm3_1{animation:_blink_zrdm3_1 1s step-start infinite}@keyframes _blink_zrdm3_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_zrdm3_13{transform:rotate(45deg)}._titleEditor_zrdm3_17{display:block;font-size:calc(1rem + 2px);max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._noTitle_zrdm3_26 ._preview_zrdm3_26{opacity:.4}._blink_6ndm2_1{animation:_blink_6ndm2_1 1s step-start infinite}@keyframes _blink_6ndm2_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_6ndm2_13{transform:rotate(45deg)}._group_6ndm2_17{box-sizing:content-box;border:1px solid rgba(255,255,255,.07);border-radius:3px;position:relative;color:#f6f6f6;overflow:hidden;min-width:32rem;margin-block:.5rem;display:grid;grid-template-columns:2rem 1fr;grid-template-areas:"binder header";align-items:center}._group_6ndm2_17._hasCursor_6ndm2_31{outline:1px solid #FFCC78}._group_6ndm2_17._expanded_6ndm2_34{margin-block:.5rem 0;border-radius:3px 3px 0 0;border-bottom:.25rem solid color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._group_6ndm2_17 ._binder_6ndm2_39{grid-area:binder;height:100%;background-color:var(--user-bg, #303030);color:#f6f6f6;font-size:1rem;display:grid;place-content:center;position:relative;cursor:pointer}._group_6ndm2_17 ._binder_6ndm2_39:focus{outline:1px solid #578AF4;outline-offset:-1px}._group_6ndm2_17 ._header_6ndm2_54{grid-area:header;padding-inline:.5rem;background-color:#303030;display:flex;flex-direction:column;gap:.5rem}._group_6ndm2_17 ._titleRow_6ndm2_62{display:flex;align-items:center;gap:.5rem}._group_6ndm2_17 ._metaRow_6ndm2_67{display:flex;gap:3rem;margin-bottom:.25rem;white-space:nowrap}._group_6ndm2_17 ._metaEntry_6ndm2_73{width:4.5em}._group_6ndm2_17 ._metaEntry_6ndm2_73 :first-child{font-size:calc(1rem - 3px);color:#b1b1b1}._strike_6ndm2_81{text-decoration:line-through}._over_6ndm2_85{color:#f57c13}._under_6ndm2_89{color:#55b469}._drag_6ndm2_93{font-size:20px;justify-self:center;opacity:.3;cursor:grab;transition:opacity .3s}._drag_6ndm2_93:hover{opacity:1}._drag_6ndm2_93:focus{box-shadow:none;outline:none}._drag_6ndm2_93{position:absolute;margin-top:.25rem}._drag_6ndm2_93._isDragging_6ndm2_111{cursor:grabbing}._drag_6ndm2_93._notAllowed_6ndm2_114{cursor:not-allowed}._blink_1mlc9_1{animation:_blink_1mlc9_1 1s step-start infinite}@keyframes _blink_1mlc9_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1mlc9_13{transform:rotate(45deg)}._groupEnd_1mlc9_17{cursor:default;height:1rem;background-color:var(--user-bg, #303030);border-radius:0 0 3px 3px;margin-bottom:.5rem}._blink_pqnxu_1{animation:_blink_pqnxu_1 1s step-start infinite}@keyframes _blink_pqnxu_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_pqnxu_13{transform:rotate(45deg)}._empty_pqnxu_17{padding-block:1.5rem;text-align:center}._inline_pqnxu_22{display:flex;align-items:center;justify-content:center;gap:1rem}._blink_qmpnm_1{animation:_blink_qmpnm_1 1s step-start infinite}@keyframes _blink_qmpnm_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_qmpnm_13{transform:rotate(45deg)}._rundownWrapper_qmpnm_17{height:calc(100% - 1.5rem);width:100%}._rundownContainer_qmpnm_22{margin-top:1rem;overflow-y:scroll;height:100%}._list_qmpnm_28{overflow-x:clip;display:flex;flex-direction:column;padding-inline:1rem}:is([data-target=small-device]) ._list_qmpnm_28{padding-inline:0;overflow-x:auto}._empty_qmpnm_39{opacity:.3;align-self:center}._spacer_qmpnm_44{min-height:50vh}._entryWrapper_qmpnm_48{display:flex;gap:.5rem;align-items:center;background:color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._entryIndex_qmpnm_55{padding-block:.25rem;display:grid;grid-template-rows:1fr 1fr 1fr;justify-items:end;min-width:2em;color:#b1b1b1;font-size:calc(1rem - 3px);height:6.5rem}._flag_qmpnm_66{grid-row:1;color:#8bb33d;font-size:1rem}._index_qmpnm_72{grid-row:2;align-content:center}._entry_qmpnm_48{flex:1}._blink_h38r0_1{animation:_blink_h38r0_1 1s step-start infinite}@keyframes _blink_h38r0_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_h38r0_13{transform:rotate(45deg)}:root{--editor--panel__br: 8px}._rundownExport_h38r0_21{height:100%;flex:1 1 auto}._rundownExport_h38r0_21._extracted_h38r0_25 ._list_h38r0_25,._rundownExport_h38r0_21._extracted_h38r0_25 ._side_h38r0_29{flex:1;max-width:none}._rundown_h38r0_21{display:flex;max-height:100%;height:100%}._list_h38r0_25{display:flex;position:relative;border-radius:var(--editor--panel__br);height:100%;background-color:#1a1a1a;padding:1rem;height:inherit;padding-inline:0;box-shadow:#00000026 3px 0 3px;flex:1 1 0;min-width:38rem;max-width:none;width:0}._side_h38r0_29{max-height:100%;margin:.5rem 0;padding:1rem;padding-right:0;background-color:#151515;border-radius:0 8px 8px 0;flex:1 1 0;min-width:36.5rem;width:0}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./RundownEntry-B1dSz1wu.js","./vendor-Cu5xgv5K.js","./vendor-4xP-6xVS.css","./index-5QAOtSTh.js","./index-De0uf0Ta.css","./useRundown-D8CYATNi.js","./useProjectData-CetvEK9E.js","./useProjectData-Cw1aXCwD.css","./dateConfig-8rhb0Dbh.js","./validateEvent-Bvgk1E-Y.js","./editorSettings-LMnfWux6.js","./editorSettings-BqHbWs9b.css","./parseUserTime-CCDHpp7D.js","./rundownUtils-Cnd2prRX.js","./Tooltip-DJ8Y4CO4.js","./Tooltip-CKb7gU2M.css","./MilestoneEditor-GkzJ-h1C.js","./EditorUtils-De0umjb-.js","./EditorUtils-BXko-IuN.css","./TimeInput-wQ67FbW6.js","./TimeInput-BrVdiuOQ.css","./useCustomFields-BuxKsqGS.js","./Select-niU9Razm.js","./Select-Cd08aEcf.css","./Modal-BKL-5GzU.js","./Modal-BgJx3SNK.css","./offset-CLDSqOP5.js","./MilestoneEditor-906SVj5M.css","./useReport-PEFRsOhF.js","./playbackstate-6lBh6omZ.js","./getProgress-CyJTu6f5.js","./ProtectRoute-p1fmtLeu.js","./ProtectRoute-Bm5sjStK.css","./Empty-BYF0tVRk.js","./Empty-DvR62o5B.css","./useFollowComponent-iGQv4zoS.js","./RundownEntry-3gFEEUnw.css"])))=>i.map(i=>d[i]);
2
- import{f as we,h as f,j as e,aN as te,be as xt,C as He,M as Ye,aM as P,ah as Xe,aO as be,aP as pe,aQ as Y,T as q,aK as ht,bf as pt,aE as Je,aF as Ze,bg as ft,b2 as mt,aT as jt,ax as yt,ay as gt,az as _t,bh as vt,aH as Et,bi as wt,aD as bt,aC as Ct,$ as kt}from"./vendor-Cu5xgv5K.js";import{T as Nt,S as Ce,C as St}from"./EditorUtils-De0umjb-.js";import{bq as De,ax as Ie,an as Ae,af as et,b0 as B,b4 as ce,B as Q,aF as Mt,br as tt,bn as fe,bs as nt,i as X,ai as st,aA as Dt,l as ye,g as Re,M as It,bt as At,b as Rt,bu as Gt,bv as Ge,bw as ge,av as Ot}from"./index-5QAOtSTh.js";import{P as Oe}from"./ProtectRoute-p1fmtLeu.js";import{i as ee,h as Pt,q as Bt,k as rt,j as ae,c as $t,S as j,t as Pe,r as Tt}from"./useRundown-D8CYATNi.js";import{s as _e,E as Ft,M as Kt,G as Vt,u as qt}from"./MilestoneEditor-GkzJ-h1C.js";import{M as Lt,P as Wt,D as zt}from"./Modal-BKL-5GzU.js";import{E as ot}from"./Empty-BYF0tVRk.js";import{u as ne,c as lt,a as Be}from"./dateConfig-8rhb0Dbh.js";import{u as Ut}from"./useFollowComponent-iGQv4zoS.js";import{g as Qt}from"./offset-CLDSqOP5.js";import{d as ve,e as $e,f as Te,h as Ht,i as Yt,j as Xt}from"./rundownUtils-Cnd2prRX.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new t.Error().stack;r&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[r]="e48c0a08-9686-4196-a984-6b6295406be8",t._sentryDebugIdIdentifier="sentry-dbid-e48c0a08-9686-4196-a984-6b6295406be8")}catch{}})();function Jt(t,r,n){if(r===n)return t;const s=[...t],[i]=s.splice(r,1);return s.splice(n,0,i),s}function ke(){const t=navigator.userAgent.toLowerCase();return t.includes("macintosh")||t.includes("mac os")}const V=ke()?"Option":"Alt",Z=ke()?"Cmd":"Ctrl",ue=we()((t,r)=>({selectedEvents:new Set,anchoredIndex:null,cursor:null,entryMode:null,setSingleEntrySelection:({id:n})=>{t({selectedEvents:new Set([n]),anchoredIndex:null,cursor:n,entryMode:"single"})},setSelectedEvents:({id:n,index:s,selectMode:i})=>{const{selectedEvents:o,anchoredIndex:m,entryMode:w}=r();if(w==="single")return t({selectedEvents:new Set([n]),anchoredIndex:s,cursor:n,entryMode:"event"});if(i==="click")return t({selectedEvents:new Set([n]),anchoredIndex:s,cursor:n,entryMode:"event"});if(i==="ctrl"){const _=De.getQueryData(Ie);if(!_)return;if(!o.has(n))return t({selectedEvents:o.add(n),anchoredIndex:s,cursor:n,entryMode:"event"});o.delete(n);const R=_.order.findIndex((N,G)=>G>s&&ee(_.entries[N])&&o.has(N));return t({selectedEvents:o,anchoredIndex:R<0?_.order.length-1:R,entryMode:"event"})}if(i==="shift"){const _=De.getQueryData(Ie);if(!_)return;const R=[];_.flatOrder.forEach(g=>{const M=_.entries[g];ee(M)&&R.push(M.id)});const N=m===null?0:Math.min(m,s),G=m===null?s:Math.max(m,s+1),u=R.slice(N,G);return t({selectedEvents:new Set([...o,...u]),anchoredIndex:s,entryMode:"event"})}},clearSelectedEvents:()=>t({selectedEvents:new Set,anchoredIndex:null,cursor:null,entryMode:null}),clearMultiSelect:()=>{const{selectedEvents:n}=r(),[s]=n;t({selectedEvents:new Set(s?[s]:[]),anchoredIndex:null,entryMode:null})},unselect:n=>{const{entryMode:s,selectedEvents:i}=r();i.delete(n),t({selectedEvents:i,entryMode:i.size===0?null:s})}}));function Qs(t){return ke()&&t.metaKey||t.ctrlKey?"ctrl":t.shiftKey?"shift":"click"}const Zt="_footer_44w0f_17",en={footer:Zt},tn=f.memo(nn);function nn({id:t,cue:r}){const n=`/ontime/load/id "${t}"`,s=`/ontime/load/cue "${r}"`;return e.jsxs("div",{className:en.footer,children:[e.jsx(Ae,{copyValue:n,children:n}),e.jsx(Ae,{copyValue:s,children:s})]})}const sn="_entryEditor_103di_17",rn="_shortcutSection_103di_28",on="_shortcuts_103di_35",ln="_spacer_103di_48",dn="_prompt_103di_52",an="_divider_103di_56",cn="_kbd_103di_62",U={entryEditor:sn,shortcutSection:rn,shortcuts:on,spacer:ln,prompt:dn,divider:an,kbd:cn},un=f.memo(xn);function xn(){return e.jsx("div",{className:U.entryEditor,"data-testid":"editor-container",children:e.jsxs("div",{className:U.shortcutSection,children:[e.jsx(Nt,{className:U.prompt,children:"Rundown shortcuts"}),e.jsx("table",{className:U.shortcuts,children:e.jsxs("tbody",{children:[e.jsxs("tr",{children:[e.jsx("td",{children:"Find in rundown"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"F"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Open Settings"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:","})]})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Select entry"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Select group"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Deselect entry"}),e.jsx("td",{children:e.jsx(a,{children:"Esc"})})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Reorder selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Copy selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"C"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Paste above"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"V"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Paste below"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"V"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Delete selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Backspace"})]})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add event below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"E"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add event above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"E"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add group below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"G"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add group above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"M"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add milestone below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"G"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add milestone above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"M"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add delay below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"D"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add delay above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"D"})]})]})]})})]})})}function y({children:t}){return e.jsx("span",{className:U.divider,children:t})}function a({children:t}){return e.jsx("span",{className:U.kbd,children:t})}function hn(){const t=ue(i=>i.selectedEvents),{data:r}=Pt(),[n,s]=f.useState(null);return f.useEffect(()=>{if(r.order.length===0){s(null);return}const i=Array.from(t).at(0);if(!i){s(null);return}const o=r.entries[i];o&&!Bt(o)?s(o):s(null)},[r.order,r.entries,t]),n?ee(n)?e.jsxs("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:[e.jsx(Ft,{event:n}),e.jsx(tn,{id:n.id,cue:n.cue})]}):rt(n)?e.jsx("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:e.jsx(Kt,{milestone:n})}):ae(n)?e.jsx("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:e.jsx(Vt,{group:n})}):null:e.jsx(un,{})}const Fe=12;function pn(){const{data:t,rundownId:r}=$t(),[n,s]=f.useState([]),[i,o]=f.useState(null),m=f.useRef(""),w=ue(u=>u.setSelectedEvents),[_,R]=te({key:`rundown.${r}-editor-collapsed-groups`,defaultValue:[]}),N=f.useCallback(u=>{if(!t||t.length===0){o("No data");return}if(o(null),u.target.value===""){s([]);return}const g=u.target.value.toLowerCase();if(m.current=g,g.startsWith("index ")){const v=g.slice(6).trim(),{results:p,error:b}=se(v);s(p),o(b);return}if(g.startsWith("cue ")){const v=g.slice(4).trim(),{results:p,error:b}=T(v);s(p),o(b);return}const M=g.startsWith("title ")?g.slice(6).trim():g,{results:$,error:K}=re(M);s($),o(K);function se(v){const p=Number(v);if(isNaN(p)||p<1)return{results:[],error:"Invalid index"};if(p>t.length)return{results:[],error:null};let b=1;const S=[];for(let C=0;C<t.length;C++){const h=t[C];if(ee(h)){if(b===p){S.push({type:j.Event,id:h.id,index:C,eventIndex:b,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent});break}b++}}return{results:S,error:null}}function T(v){let p=1,b=Fe;const S=[];for(let C=0;C<t.length&&!(b<=0);C++){const h=t[C];ee(h)&&(h.cue.toLowerCase().includes(v)&&(b--,S.push({type:j.Event,id:h.id,index:C,eventIndex:p,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent})),p++)}return{results:S,error:null}}function re(v){let p=1,b=Fe;const S=[];for(let C=0;C<t.length&&!(b<=0);C++){const h=t[C];ee(h)?(h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Event,id:h.id,index:C,eventIndex:p,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent})),p++):ae(h)?h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Group,id:h.id,index:C,title:h.title,colour:h.colour})):rt(h)&&h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Milestone,id:h.id,index:C,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent}))}return{results:S,error:null}}},[t]),G=f.useCallback(u=>{if("parent"in u&&u.parent!==null){const M=[...new Set(_)].filter($=>$!==u.parent);R(M)}w({id:u.id,index:u.index,selectMode:"click"})},[_,R,w]);return f.useEffect(()=>{s([]),o(null),m.current&&N({target:{value:m.current}})},[t,N]),{find:N,select:G,results:n,error:i}}const fn="_entry_15pki_17",mn="_empty_15pki_18",jn="_error_15pki_19",yn="_data_15pki_40",gn="_index_15pki_46",_n="_title_15pki_55",vn="_cue_15pki_58",En="_footer_15pki_66",wn="_em_15pki_18",bn="_scrollContainer_15pki_76",F={entry:fn,empty:mn,error:jn,data:yn,index:gn,title:_n,cue:vn,footer:En,em:wn,scrollContainer:bn};function Cn({isOpen:t,onClose:r}){const{find:n,select:s,results:i,error:o}=pn(),[m,w]=f.useState(0),_=xt(n,100),R=u=>{i.length!==0&&(u.key==="ArrowDown"&&w(g=>(g+1)%i.length),u.key==="ArrowUp"&&w(g=>(g-1+i.length)%i.length),u.key==="Enter"&&(u.preventDefault(),u.stopPropagation(),N()))},N=()=>{const u=i[m];s(u),r()},G=u=>{const M=u.target.closest("li");if(M){const $=Number(M.dataset.index);isNaN($)||w($)}};return e.jsx(Lt,{title:"",isOpen:t,onClose:r,showBackdrop:!0,bodyElements:e.jsxs("div",{onKeyDown:R,children:[e.jsx(et,{height:"large",fluid:!0,onChange:_,placeholder:"Search..."}),e.jsxs("ul",{className:F.scrollContainer,onMouseMove:G,children:[o&&e.jsx("li",{className:F.error,children:o}),i.length===0&&e.jsx("li",{className:F.empty,children:"No results"}),i.length>0&&i.map((u,g)=>{const M=m===g,$=u.type===j.Event?u.eventIndex:"-",K="cue"in u?u.cue:"";return e.jsxs("li",{className:F.entry,"data-selected":M,"data-index":g,onClick:N,children:[e.jsxs("div",{className:F.data,children:[e.jsx("div",{className:F.index,style:{"--color":u.colour},children:$}),e.jsx("div",{className:F.cue,children:K}),e.jsx("div",{className:F.title,children:u.title})]}),M&&e.jsx("span",{children:"Go ⏎"})]},u.id)})]})]}),footerElements:e.jsxs("div",{className:F.footer,children:["Use the keywords ",e.jsx("span",{className:F.em,children:"cue"}),", ",e.jsx("span",{className:F.em,children:"index"})," or",e.jsx("span",{className:F.em,children:"title"})," to filter search."]})})}const Ke=f.memo(kn);function kn(){const[t,r]=He();return Ye([["mod + f",r.toggle],["Escape",r.close]]),t?e.jsx(Cn,{isOpen:t,onClose:r.close}):null}const it=we(t=>({position:{x:0,y:0},options:[],isOpen:!1,setContextMenu:(r,n)=>t(()=>({position:r,options:n,isOpen:!0})),setIsOpen:r=>t(()=>({isOpen:r}))}));function Ve({children:t}){const{position:r,options:n,isOpen:s,setIsOpen:i}=it(),o=()=>i(!1);return s?e.jsxs(e.Fragment,{children:[t,e.jsx(Wt,{isOpen:!0,position:r,onClose:o,items:n})]}):t}const Nn="_header_156wk_17",Sn="_group_156wk_28",Mn="_radioButton_156wk_39",Dn="_apart_156wk_70",In="_separator_156wk_74",A={header:Nn,group:Sn,radioButton:Mn,apart:Dn,separator:In},An=f.memo(Rn);function Rn(){const[t,r]=He(),n=ue(m=>m.clearSelectedEvents),[s]=te({key:ce.editorMode,defaultValue:B.Edit}),{deleteAllEntries:i}=ne(),o=f.useCallback(()=>{i(),n(),r.close()},[n,i,r]);return e.jsxs(e.Fragment,{children:[e.jsxs(P,{render:e.jsx(Q,{variant:"subtle-destructive"}),onClick:r.open,disabled:s===B.Run,className:A.apart,children:[e.jsx(Xe,{}),"Clear all"]}),e.jsx(Mt,{isOpen:t,onClose:r.close,title:"Clear rundown",showBackdrop:!0,showCloseButton:!0,bodyElements:e.jsxs(e.Fragment,{children:["You will lose all data in your rundown. ",e.jsx("br",{})," Are you sure?"]}),footerElements:e.jsxs(e.Fragment,{children:[e.jsx(Q,{variant:"ghosted-white",size:"large",onClick:r.close,children:"Cancel"}),e.jsx(Q,{variant:"destructive",size:"large",onClick:o,children:"Delete all"})]})})]})}const Gn=f.memo(On);function On(){const[t,r]=te({key:ce.editorMode,defaultValue:B.Edit}),{offsetMode:n}=tt(),s=o=>{const m=o.at(0);m&&r(m)},i=o=>{const m=o.at(0);m&&nt(m)};return e.jsxs(be,{className:A.header,children:[e.jsxs(pe,{value:[t],onValueChange:s,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:B.Run,className:A.radioButton,children:"Run"}),e.jsx(P,{render:e.jsx(Y,{}),value:B.Edit,className:A.radioButton,children:"Edit"})]}),e.jsx(Ce,{className:A.separator}),e.jsxs(pe,{value:[n],onValueChange:i,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:fe.Absolute,className:A.radioButton,children:"Absolute"}),e.jsx(P,{render:e.jsx(Y,{}),value:fe.Relative,className:A.radioButton,children:"Relative"})]}),e.jsx(An,{})]})}const Pn=f.memo(Bn);function Bn(){const[t,r]=te({key:ce.editorMode,defaultValue:B.Edit}),{offsetMode:n}=tt(),s=o=>{const m=o.at(0);m&&r(m)},i=o=>{const m=o.at(0);m&&nt(m)};return e.jsxs(be,{className:A.header,children:[e.jsxs(pe,{value:[t],onValueChange:s,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:B.Run,className:A.radioButton,children:"Run"}),e.jsx(P,{render:e.jsx(Y,{}),value:B.Edit,className:A.radioButton,children:"Edit"})]}),e.jsx(Ce,{className:A.separator}),e.jsxs(pe,{value:[n],onValueChange:i,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:fe.Absolute,className:A.radioButton,children:"Absolute"}),e.jsx(P,{render:e.jsx(Y,{}),value:fe.Relative,className:A.radioButton,children:"Relative"})]})]})}const $n=we()(t=>({entryCopyId:null,setEntryCopyId:r=>t({entryCopyId:r})})),Tn=t=>({type:j.Event,flag:t.flag,title:t.title,note:t.note,timeStart:t.timeStart,duration:t.duration,timeEnd:t.timeEnd,timerType:t.timerType,timeStrategy:t.timeStrategy,countToEnd:t.countToEnd,linkStart:t.linkStart,endAction:t.endAction,skip:t.skip,colour:t.colour,parent:t.parent,revision:0,delay:t.delay,dayOffset:t.dayOffset,gap:0,timeWarning:t.timeWarning,timeDanger:t.timeDanger,triggers:structuredClone(t.triggers),custom:structuredClone(t.custom)}),Fn="_quickAdd_96pwt_17",Kn="_indent_96pwt_24",qe={quickAdd:Fn,indent:Kn},Ee=f.memo(Vn);function Vn({previousEventId:t,parentGroup:r,backgroundColor:n}){const{addEntry:s}=ne(),i=()=>{s({type:j.Event,parent:r},{after:t,lastEventId:t})},o=()=>{s({type:j.Delay,parent:r},{lastEventId:t,after:t})},m=()=>{s({type:j.Milestone,parent:r},{lastEventId:t,after:t})},w=()=>{r===null&&s({type:j.Group},{lastEventId:t,after:t})},_=n===""?"#9d9d9d":n;return e.jsxs(be,{className:X([qe.quickAdd,!!r&&qe.indent]),style:_?{"--user-bg":_}:{},"data-testid":"quick-add-buttons",children:[e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:i,children:[e.jsx(q,{}),"Event"]}),e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:o,children:[e.jsx(q,{}),"Delay"]}),e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:m,children:[e.jsx(q,{}),"Milestone"]}),r===null&&e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:w,children:[e.jsx(q,{}),"Group"]})]})}const qn="_quickAdd_fgq5o_17",Ln="_addButton_fgq5o_27",Le={quickAdd:qn,addButton:Ln},We=f.memo(Wn);function Wn({referenceEntryId:t,parentGroup:r,placement:n}){const{addEntry:s}=ne(),i=o=>{n==="before"?s({type:o,parent:o!==j.Group?r:null},{before:t}):s({type:o,parent:o!==j.Group?r:null},{lastEventId:t,after:t})};return e.jsx("div",{className:Le.quickAdd,"data-testid":"quick-add-inline",children:e.jsx(zt,{items:[{type:"item",icon:q,label:"Add Event",onClick:()=>i(j.Event)},{type:"item",icon:q,label:"Add Delay",onClick:()=>i(j.Delay)},{type:"item",icon:q,label:"Add Milestone",onClick:()=>i(j.Milestone)},{type:"item",icon:q,label:"Add Group",onClick:()=>i(j.Group),disabled:r!==null}],render:e.jsx(st,{size:"small",variant:"primary",className:Le.addButton}),children:e.jsx(q,{})})})}const zn=t=>{const r=it(s=>s.setContextMenu);return[s=>{s.preventDefault();const{pageX:i,pageY:o}=s;return r({x:i,y:o},t)}]},Un="_noTitle_zrdm3_26",ze={noTitle:Un};function Qn({title:t,entryId:r,placeholder:n,className:s}){const{updateEntry:i}=ne(),o=f.useRef(null),m=f.useCallback(u=>{if(u===t)return;const g=u.trim();i({id:r,title:g})},[t,i,r]),{value:w,onChange:_,onBlur:R,onKeyDown:N}=qt(t,m,o,{submitOnEnter:!0}),G=X([s,ze.eventTitle,w?null:ze.noTitle]);return e.jsx(et,{"data-testid":"entry__title",variant:"ghosted",fluid:!0,ref:o,value:w,className:G,placeholder:n,onChange:_,onBlur:R,onKeyDown:N})}const Hn="_blink_6ndm2_1",Yn="_fourtyfive_6ndm2_13",Xn="_group_6ndm2_17",Jn="_hasCursor_6ndm2_31",Zn="_expanded_6ndm2_34",es="_binder_6ndm2_39",ts="_header_6ndm2_54",ns="_titleRow_6ndm2_62",ss="_metaRow_6ndm2_67",rs="_metaEntry_6ndm2_73",os="_strike_6ndm2_81",ls="_over_6ndm2_85",is="_under_6ndm2_89",ds="_drag_6ndm2_93",as="_isDragging_6ndm2_111",cs="_notAllowed_6ndm2_114",I={blink:Hn,fourtyfive:Yn,group:Xn,hasCursor:Jn,expanded:Zn,binder:es,header:ts,titleRow:ns,metaRow:ss,metaEntry:rs,strike:os,over:ls,under:is,drag:ds,isDragging:as,notAllowed:cs};function us({data:t,hasCursor:r,collapsed:n,onCollapse:s}){var h,oe;const i=f.useRef(null),{clone:o,ungroup:m,deleteEntry:w}=ne(),{selectedEvents:_,setSingleEntrySelection:R}=ue(),[N]=zn([{type:"item",label:"Clone Group",icon:ht,onClick:()=>o(t.id)},{type:"item",label:"Ungroup",icon:pt,onClick:()=>m(t.id),disabled:t.entries.length===0},{type:"divider"},{type:"item",label:"Delete Group",icon:Xe,onClick:()=>w([t.id])}]),{attributes:G,listeners:u,setNodeRef:g,transform:M,transition:$,isDragging:K,isOver:se,over:T}=Je({id:t.id,data:{type:"group"},animateLayoutChanges:()=>!1}),re=O=>{O.stopPropagation(),!(_.size>1&&O.button===2)&&R({id:t.id})},v=t.colour&&Dt(t.colour),p=K&&(T==null?void 0:T.id)&&lt((h=T.data.current)==null?void 0:h.type,(oe=T.data.current)==null?void 0:oe.parent),[b,S]=(()=>{if(t.targetDuration===null)return[null,null];const O=t.duration-t.targetDuration;if(O===0)return[null,"under"];const le=Math.abs(O);return[`${O<0?"-":"+"}${ye(le,le>2*It)}`,Qt(O)]})(),C={zIndex:K?2:"inherit",transform:Ze.Translate.toString(M),transition:$,cursor:se?p?"grabbing":"no-drop":"inherit"};return e.jsxs("div",{className:X([I.group,r&&I.hasCursor,!n&&I.expanded]),ref:g,onClick:re,onContextMenu:N,style:{...C,"--user-bg":t.colour||"#929292"},"data-testid":"rundown-group",children:[e.jsx("div",{className:I.binder,style:{...v},tabIndex:-1,children:e.jsx("span",{className:X([I.drag,K&&I.isDragging,K&&!p&&I.notAllowed]),ref:i,...G,...u,children:e.jsx(ft,{})})}),e.jsxs("div",{className:I.header,children:[e.jsxs("div",{className:I.titleRow,children:[e.jsx(Qn,{title:t.title,entryId:t.id,placeholder:"Group title"}),e.jsx(st,{"aria-label":"Collapse",variant:"subtle-white",onClick:()=>s(!n,t.id),children:n?e.jsx(mt,{}):e.jsx(jt,{})})]}),e.jsxs("div",{className:I.metaRow,children:[e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Start"}),e.jsx("div",{children:Re(t.timeStart)})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"End"}),e.jsx("div",{children:Re(t.timeEnd)})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Duration"}),b===null?e.jsx("div",{className:X([S!==null&&I[S]]),children:ye(t.duration)}):e.jsxs("div",{children:[e.jsx("span",{className:I.strike,children:ye(t.duration)}),e.jsx("span",{className:X([S!==null&&I[S]]),children:b})]})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Entries"}),e.jsx("div",{children:t.entries.length})]})]})]})]})}const xs="_groupEnd_1mlc9_17",hs={groupEnd:xs};function ps({id:t,colour:r}){const{attributes:n,listeners:s,setNodeRef:i,transform:o,transition:m}=Je({id:t,data:{type:"end-group"},animateLayoutChanges:()=>!1,disabled:!0}),w={transform:Ze.Transform.toString(o),transition:m};return e.jsx("div",{className:hs.groupEnd,ref:i,...n,...s,style:{...w,...r?{"--user-bg":r}:{}},tabIndex:-1})}const fs="_empty_pqnxu_17",ms="_inline_pqnxu_22",Ue={empty:fs,inline:ms};function js(t){const{handleAddNew:r}=t;return e.jsxs("div",{className:Ue.empty,children:[e.jsx(ot,{injectedStyles:{marginTop:"5vh",marginBottom:"3rem"}}),e.jsxs("div",{className:Ue.inline,children:[e.jsxs(Q,{onClick:()=>r(j.Event),variant:"primary",size:"large",children:[e.jsx(q,{}),"Create Event"]}),e.jsx(Ce,{}),e.jsxs(Q,{onClick:()=>r(j.Group),variant:"primary",size:"large",children:[e.jsx(q,{})," Create Group"]})]})]})}const ys="_rundownWrapper_qmpnm_17",gs="_rundownContainer_qmpnm_22",_s="_list_qmpnm_28",vs="_spacer_qmpnm_44",Es="_entryWrapper_qmpnm_48",ws="_entryIndex_qmpnm_55",bs="_flag_qmpnm_66",Cs="_index_qmpnm_72",ks="_entry_qmpnm_48",z={rundownWrapper:ys,rundownContainer:gs,list:_s,spacer:vs,entryWrapper:Es,entryIndex:ws,flag:bs,index:Cs,entry:ks},Ns=f.lazy(()=>kt(()=>import("./RundownEntry-B1dSz1wu.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36]),import.meta.url));function Ss({data:t,rundownMetadata:r}){var Me;const{order:n,entries:s,id:i}=t,o=At(),[m,w]=f.useState(()=>Be(n,s)),[_,R]=f.useState(r),[N,G]=te({key:`rundown.${i}-editor-collapsed-groups`,defaultValue:[]}),{addEntry:u,deleteEntry:g,move:M,reorderEntry:$}=ne(),{entryCopyId:K,setEntryCopyId:se}=$n(),[T]=te({key:ce.editorMode,defaultValue:B.Edit}),{clearSelectedEvents:re,setSelectedEvents:v,cursor:p}=ue(),b=f.useRef(null),S=f.useRef(null);Ut({followRef:b,scrollRef:S,doFollow:!0,followTrigger:T===B.Edit?p:o==null?void 0:o.selectedEventId});const C=yt(gt(Ct,{activationConstraint:{distance:10}})),h=f.useCallback(d=>{if(!d)return;const{entry:c,index:l}=ve(s,n,d);g([d]),c&&l!==null&&v({id:c.id,selectMode:"click",index:l})},[s,n,g,v]),oe=f.useCallback((d,c,l=!1)=>{var k;const x=l?((k=ve(s,n,d??"").entry)==null?void 0:k.id)??null:d;if(c===null)return;const E=s[c];if((E==null?void 0:E.type)===j.Event){const D=Tn(E);u(D,{after:x??void 0})}},[u,n,s]),O=f.useCallback((d,c,l=!1)=>{u(d,{after:c&&!l?c:void 0,before:c&&l?c:void 0,lastEventId:!l&&c?c:void 0})},[u]),le=f.useCallback((d,c)=>{if(n.length<1)return;let l=d;if(d===null){const E=c==="up"?$e(s,n):Te(s,n);if(ae(E)){v({id:E.id,selectMode:"click",index:c==="up"?n.length:0});return}l=(E==null?void 0:E.id)??null}if(l===null)return;const x=c==="up"?Ht(s,n,l):Yt(s,n,l);x.entry!==null&&x.index!==null&&v({id:x.entry.id,selectMode:"click",index:x.index})},[n,s,v]),Ne=f.useCallback((d,c)=>{if(n.length<1)return;if(d===null){const x=c==="up"?$e(s,n):Te(s,n);x!==null&&v({id:x.id,selectMode:"click",index:c==="up"?n.length:0});return}const l=c==="up"?ve(s,n,d):Xt(s,n,d);l.entry!==null&&l.index!==null&&v({id:l.entry.id,selectMode:"click",index:l.index})},[n,s,v]),J=f.useCallback(d=>!!N.find(c=>c===d),[N]),ie=f.useCallback((d,c)=>{G(l=>{const x=J(c);return d&&!x?[...new Set(l).add(c)]:!d&&x?[...l].filter(E=>E!==c):l})},[J,G]),Se=f.useCallback(async(d,c)=>{if(d==null)return;const l=await M(d,c);l&&ie(!1,l)},[ie,M]);Ye([["alt + ArrowDown",()=>Ne(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + ArrowUp",()=>Ne(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + ArrowDown",()=>le(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + ArrowUp",()=>le(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + mod + ArrowDown",()=>Se(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + mod + ArrowUp",()=>Se(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["Escape",()=>re(),{preventDefault:!0,usePhysicalKeys:!0}],["mod + Backspace",()=>h(p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + E",()=>O({type:j.Event},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + E",()=>O({type:j.Event},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + G",()=>O({type:j.Group},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + G",()=>O({type:j.Group},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + D",()=>O({type:j.Delay},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + D",()=>O({type:j.Delay},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + M",()=>O({type:j.Milestone},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + M",()=>O({type:j.Milestone},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["mod + C",()=>se(p)],["mod + V",()=>oe(p,K)],["mod + shift + V",()=>oe(p,K,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + backspace",()=>h(p),{preventDefault:!0,usePhysicalKeys:!0}]]),f.useEffect(()=>{w(Be(n,s)),R(r)},[n,s,r]),f.useEffect(()=>{var l;if(T!==B.Run||!(o!=null&&o.selectedEventId))return;const d=n.findIndex(x=>x===o.selectedEventId),c=(l=s[o.selectedEventId])==null?void 0:l.parent;c&&G(x=>[...x].filter(E=>E!==c)),v({id:o.selectedEventId,selectMode:"click",index:d})},[T,s,o.selectedEventId,n,G,v]);const dt=d=>{var he;const{active:c,over:l}=d;if(!(l!=null&&l.id)||c.id===l.id||!c.data.current||!l.data.current)return;const x=c.data.current.sortable.index,E=l.data.current.sortable.index;let k=x<E?"after":"before",D=l.id;const xe=((he=c.data.current)==null?void 0:he.type)===j.Group;if(xe&&!lt(l.data.current.type,l.data.current.parent,k,J(D)))return;if(D.startsWith("end-"))D=D.replace("end-",""),k==="before"&&(k="insert");else{const L=t.entries[D];ae(L)&&k==="after"&&(xe?D=L.id:L.entries.length===0?(D=L.id,k="insert"):(D=L.entries[0],k="before"))}const me=structuredClone(m);w(L=>Jt(L,x,E)),$(c.id,D,k).catch(L=>{w(me)})},at=d=>{var l;((l=d.active.data.current)==null?void 0:l.type)===j.Group&&ie(!0,d.active.id)},ct=d=>{var x,E,k,D;if(((x=d.active.data.current)==null?void 0:x.type)==="group"||((k=(E=d.over)==null?void 0:E.data.current)==null?void 0:k.type)!=="group")return;const c=(D=d.over)==null?void 0:D.id;J(c)&&ie(!1,c)};if(m.length<1)return e.jsx(js,{handleAddNew:d=>u({type:d})});const de=T===B.Edit;return e.jsx("div",{className:z.rundownContainer,ref:S,"data-testid":"rundown",children:e.jsx(_t,{onDragEnd:dt,onDragStart:at,onDragOver:ct,sensors:C,collisionDetection:vt,children:e.jsx(Et,{items:m,strategy:wt,children:e.jsxs("div",{className:z.list,children:[de&&e.jsx(Ee,{previousEventId:null,parentGroup:null}),m.map((d,c)=>{if(d.startsWith("end-")){const je=d.split("end-")[1],ut=J(je),W=_[je];return ut?null:e.jsxs(f.Fragment,{children:[de&&(W==null?void 0:W.groupEntries)===0&&e.jsx(Ee,{previousEventId:null,parentGroup:je,backgroundColor:W==null?void 0:W.groupColour}),e.jsx(ps,{id:d,colour:W==null?void 0:W.groupColour},d)]},d)}const l=s[d],x=_[d];if(!l||!x||l.type!==j.Group&&x.groupId!==null&&J(x.groupId))return null;const E=(o==null?void 0:o.nextEventId)===l.id,k=l.id===p,D=x.groupColour===""?"#9d9d9d":x.groupColour,xe=c===0,me=d===n.at(-1),he=x.thisId!==x.groupId?x.groupId:null,L=x.groupId;return e.jsxs(f.Fragment,{children:[de&&k&&!xe&&e.jsx(We,{placement:"before",referenceEntryId:l.id,parentGroup:he}),ae(l)?e.jsx(us,{data:l,hasCursor:k,collapsed:J(l.id),onCollapse:ie}):e.jsxs("div",{className:z.entryWrapper,"data-testid":`entry-${x.eventIndex}`,style:D?{"--user-bg":D}:{},children:[ee(l)&&e.jsxs("div",{className:z.entryIndex,children:[l.flag&&e.jsx(bt,{className:z.flag}),e.jsx("div",{className:z.index,children:x.eventIndex})]}),e.jsx("div",{className:z.entry,ref:k?b:void 0,children:e.jsx(Ns,{type:l.type,isPast:x.isPast,eventIndex:x.eventIndex,data:l,loaded:x.isLoaded,hasCursor:k,isNext:E,isNextDay:x.isNextDay,playback:x.isLoaded?o.playback:void 0,isRolling:o.playback===Rt.Roll,totalGap:x.totalGap,isLinkedToLoaded:x.isLinkedToLoaded})},l.id)]}),de&&k&&!me&&e.jsx(We,{placement:"after",referenceEntryId:l.id,parentGroup:L})]},l.id)}),de&&e.jsx(Ee,{previousEventId:((Me=_[Pe])==null?void 0:Me.groupId)??_[Pe].thisId,parentGroup:null}),e.jsx("div",{className:z.spacer})]})})})})}function Qe({isSmallDevice:t}){const{data:r,status:n,rundownMetadata:s}=Tt();return e.jsxs("div",{className:z.rundownWrapper,children:[t?e.jsx(Pn,{}):e.jsx(Gn,{}),n==="success"&&r&&s?e.jsx(Ss,{data:r,rundownMetadata:s}):e.jsx(ot,{text:"Connecting to server"})]})}const Ms="_rundownExport_h38r0_21",Ds="_extracted_h38r0_25",Is="_list_h38r0_25",As="_side_h38r0_29",Rs="_rundown_h38r0_21",H={rundownExport:Ms,extracted:Ds,list:Is,side:As,rundown:Rs},Gs=f.memo(Os);function Os(){const t=window.location.pathname.includes("/rundown"),[r]=te({key:ce.editorMode,defaultValue:B.Edit});if(Gt()&&t)return e.jsx(Oe,{permission:"editor",children:e.jsxs("div",{className:X([H.rundownExport,H.extracted]),"data-target":"small-device","data-testid":"panel-rundown",children:[e.jsx(Ke,{}),e.jsx(Ge,{suppressSettings:!0}),e.jsx("div",{className:H.rundown,children:e.jsx(ge,{children:e.jsx(Ve,{children:e.jsx(Qe,{isSmallDevice:!0})})})})]})});const s=t&&r==="run";return e.jsx(Oe,{permission:"editor",children:e.jsxs("div",{className:X([H.rundownExport,t&&H.extracted]),"data-testid":"panel-rundown",children:[e.jsx(Ke,{}),t&&e.jsx(Ge,{suppressSettings:!0}),e.jsxs("div",{className:H.rundown,children:[e.jsx("div",{className:H.list,children:e.jsxs(ge,{children:[!t&&e.jsx(St,{onClick:i=>Ot("rundown",i)}),e.jsx(Ve,{children:e.jsx(Qe,{})})]})}),!s&&e.jsx("div",{className:H.side,children:e.jsx(ge,{children:e.jsx(hn,{})})})]})]})})}const Hs=Object.freeze(Object.defineProperty({__proto__:null,default:Gs},Symbol.toStringTag,{value:"Module"}));export{Hs as R,Qn as T,zn as a,Tn as c,Qs as g,ue as u};
3
- //# sourceMappingURL=RundownExport-WjLpncYT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["reorderArray","array","fromIndex","toIndex","modifiedArray","reorderedItem","isMacOS","userAgent","deviceAlt","deviceMod","useEventSelection","create","set","get","id","index","selectMode","selectedEvents","anchoredIndex","entryMode","rundownData","ontimeQueryClient","RUNDOWN","nextIndex","eventId","i","isOntimeEvent","eventIds","event","start","end","selectedEventIds","firstSelected","getSelectionMode","memo","EventEditorFooter","cue","loadById","loadByCue","jsxs","style","jsx","CopyTag","EventEditorEmpty","Editor.Title","Kbd","AuxKey","children","RundownEntryEditor","state","data","useRundown","entry","setEntry","useState","useEffect","selectedEventId","isOntimeDelay","EventEditor","isOntimeMilestone","MilestoneEditor","isOntimeGroup","GroupEditor","maxResults","useFinder","rundownId","useFlatRundown","results","setResults","error","setError","lastSearchString","useRef","setSelectedEvents","collapsedGroups","setCollapsedGroups","useSessionStorage","find","useCallback","searchValue","searchString","searchByIndex","searchByCue","searchByTitle","searchIndex","eventIndex","SupportedEntry","remaining","select","selectedEvent","newGroups","Finder","isOpen","onClose","selected","setSelected","debouncedFind","useDebouncedCallback","navigate","prev","submit","handleMouseMoveEvent","li","Modal","Input","isSelected","displayIndex","displayCue","FinderPlacement","handler","useDisclosure","useHotkeys","useContextMenuStore","position","options","newIsOpen","RundownContextMenu","setIsOpen","Fragment","PositionedDropdownMenu","RundownMenu","handlers","clearSelectedEvents","editorMode","sessionKeys","AppMode","deleteAllEntries","useEntryActions","deleteAll","Toolbar.Button","Button","IoTrash","Dialog","RundownHeader","setEditorMode","offsetMode","useOffsetMode","toggleAppMode","mode","newValue","toggleOffsetMode","setOffsetMode","Toolbar.Root","ToggleGroup","Toggle","Editor.Separator","OffsetMode","useEntryCopy","entryCopyId","cloneEvent","QuickAddButtons","previousEventId","parentGroup","backgroundColor","addEntry","addEvent","addDelay","addMilestone","addGroup","groupColour","cx","IoAdd","QuickAddInline","referenceEntryId","placement","handleAddEntry","type","DropdownMenu","IconButton","useContextMenu","setContextMenu","contextMenuEvent","pageX","pageY","TitleEditor","title","entryId","placeholder","className","updateEntry","ref","submitCallback","text","cleanVal","value","onChange","onBlur","onKeyDown","useReactiveTextInput","classes","RundownGroup","hasCursor","collapsed","onCollapse","handleRef","clone","ungroup","deleteEntry","setSingleEntrySelection","onContextMenu","IoDuplicateOutline","IoFolderOpenOutline","dragAttributes","dragListeners","setNodeRef","transform","transition","isDragging","isOver","over","useSortable","handleFocusClick","binderColours","getAccessibleColour","isValidDrop","canDrop","_a","_b","planOffset","planOffsetLabel","offset","absOffset","formatDuration","MILLIS_PER_MINUTE","getOffsetState","dragStyle","CSS","IoReorderTwo","IoChevronUp","IoChevronDown","formatTime","RundownGroupEnd","colour","RundownEmpty","props","handleAddNew","Empty","RundownEntry","lazy","__vitePreload","Rundown","rundownMetadata","order","entries","featureData","useRundownEditor","sortableData","setSortableData","makeSortableList","metadata","setMetadata","move","reorderEntry","setEntryCopyId","cursor","cursorRef","scrollRef","useFollowComponent","sensors","useSensors","useSensor","PointerSensor","deleteAtCursor","getPreviousNormal","insertCopyAtId","atId","copyId","above","adjustedCursor","cloneEntry","newEvent","insertAtId","patch","selectGroup","direction","newCursor","getLastNormal","getFirstNormal","getPreviousGroupNormal","getNextGroupNormal","selectEntry","getNextNormal","getIsCollapsed","groupId","handleCollapseGroup","isCollapsed","moveEntry","movedIntoGroupId","maybeParent","handleOnDragEnd","active","destinationId","isDraggingGroup","group","currentEntries","_","collapseDraggedGroups","expandOverGroup","_c","_d","isEditMode","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","parentId","isGroupCollapsed","parentMetadata","entryMetadata","isNext","isFirst","isLast","parentIdForBefore","parentIdForAfter","TbFlagFilled","Playback","lastMetadataKey","RundownWrapper","isSmallDevice","status","useRundownWithMetadata","styles","RundownHeaderMobile","RundownExport","isExtracted","useIsSmallDevice","ProtectRoute","ViewNavigationMenu","ErrorBoundary","hideSideBar","Corner","handleLinks"],"ignoreList":[],"sources":["../../../../packages/utils/src/common/arrayUtils.ts","../../src/common/utils/deviceUtils.ts","../../src/features/rundown/useEventSelection.ts","../../src/features/rundown/entry-editor/composite/EventEditorFooter.tsx","../../src/features/rundown/entry-editor/EventEditorEmpty.tsx","../../src/features/rundown/entry-editor/RundownEntryEditor.tsx","../../src/views/editor/finder/useFinder.tsx","../../src/views/editor/finder/Finder.tsx","../../src/features/rundown/placements/FinderPlacement.tsx","../../src/features/rundown/rundown-context-menu/RundownContextMenu.tsx","../../src/features/rundown/rundown-header/RundownMenu.tsx","../../src/features/rundown/rundown-header/RundownHeader.tsx","../../src/features/rundown/rundown-header/RundownHeaderMobile.tsx","../../src/common/stores/entryCopyStore.ts","../../src/common/utils/clone.ts","../../src/features/rundown/entry-editor/quick-add-buttons/QuickAddButtons.tsx","../../src/features/rundown/entry-editor/quick-add-cursor/QuickAddInline.tsx","../../src/common/hooks/useContextMenu.tsx","../../src/features/rundown/common/TitleEditor.tsx","../../src/features/rundown/rundown-group/RundownGroup.tsx","../../src/features/rundown/rundown-group/RundownGroupEnd.tsx","../../src/features/rundown/RundownEmpty.tsx","../../src/features/rundown/Rundown.tsx","../../src/features/rundown/RundownWrapper.tsx","../../src/features/rundown/RundownExport.tsx"],"sourcesContent":["/**\n * Inserts an item in an array at a given index\n * @param index\n * @param item\n * @param array\n */\nexport function insertAtIndex<T>(index: number, item: T, array: T[]): T[] {\n const modifiedArray = [...array];\n\n // Insert at beginning\n if (index === 0) {\n modifiedArray.unshift(item);\n }\n\n // insert at end\n else if (index >= modifiedArray.length) {\n modifiedArray.push(item);\n }\n\n // insert in the middle\n else {\n modifiedArray.splice(index, 0, item);\n }\n\n return modifiedArray;\n}\n\n/**\n * Inserts an array into another one of the same type at a given index\n */\nexport function mergeAtIndex<T>(index: number, newArray: T[], currentArray: T[]): T[] {\n // Insert at beginning\n if (index === 0) {\n return [...newArray, ...currentArray];\n }\n\n // insert at end\n else if (index >= currentArray.length) {\n return [...currentArray, ...newArray];\n }\n\n // insert in the middle\n return currentArray.toSpliced(index, 0, ...newArray);\n}\n\n/**\n * Deletes array element at a given index\n * @param index\n * @param array\n */\nexport function deleteAtIndex<T>(index: number, array: T[]) {\n return array.filter((_, i) => i !== index);\n}\n\n/**\n * Reorders two objects in an array\n */\nexport function reorderArray<T>(array: T[], fromIndex: number, toIndex: number): T[] {\n if (fromIndex === toIndex) {\n return array; // No change needed, return the original array\n }\n\n const modifiedArray = [...array];\n\n // delete in from\n const [reorderedItem] = modifiedArray.splice(fromIndex, 1);\n\n // reinsert item at to\n modifiedArray.splice(toIndex, 0, reorderedItem);\n return modifiedArray;\n}\n","export function isMacOS() {\n const userAgent = navigator.userAgent.toLowerCase();\n return userAgent.includes('macintosh') || userAgent.includes('mac os');\n}\n\nexport const deviceAlt = isMacOS() ? 'Option' : 'Alt';\n\nexport const deviceMod = isMacOS() ? 'Cmd' : 'Ctrl';\n","import { MouseEvent } from 'react';\nimport { EntryId, isOntimeEvent, MaybeNumber, MaybeString, Rundown } from 'ontime-types';\nimport { create } from 'zustand';\n\nimport { RUNDOWN } from '../../common/api/constants';\nimport { ontimeQueryClient } from '../../common/queryClient';\nimport { isMacOS } from '../../common/utils/deviceUtils';\n\ntype SelectionMode = 'shift' | 'click' | 'ctrl';\n\ninterface EventSelectionStore {\n selectedEvents: Set<EntryId>;\n anchoredIndex: MaybeNumber;\n cursor: MaybeString;\n entryMode: 'event' | 'single' | null;\n setSingleEntrySelection: (selectionArgs: { id: EntryId }) => void;\n setSelectedEvents: (selectionArgs: { id: EntryId; index: number; selectMode: SelectionMode }) => void;\n clearSelectedEvents: () => void;\n clearMultiSelect: () => void;\n unselect: (id: EntryId) => void;\n}\n\nexport const useEventSelection = create<EventSelectionStore>()((set, get) => ({\n selectedEvents: new Set(),\n anchoredIndex: null,\n cursor: null,\n entryMode: null,\n setSingleEntrySelection: ({ id }) => {\n set({ selectedEvents: new Set([id]), anchoredIndex: null, cursor: id, entryMode: 'single' });\n },\n setSelectedEvents: ({ id, index, selectMode }) => {\n const { selectedEvents, anchoredIndex, entryMode } = get();\n\n // if we are in single mode, we replace the selection and change the mode\n if (entryMode === 'single') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on click, we replace selection with event\n if (selectMode === 'click') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on ctrl + click, we toggle the selection of that event\n if (selectMode === 'ctrl') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // if it doesnt exist, simply add to the list and set an anchor\n if (!selectedEvents.has(id)) {\n return set({\n selectedEvents: selectedEvents.add(id),\n anchoredIndex: index,\n cursor: id,\n entryMode: 'event',\n });\n }\n\n // if event is already selected, we remove it from selection\n // and set the anchor to the event after\n selectedEvents.delete(id);\n\n const nextIndex = rundownData.order.findIndex(\n (eventId, i) => i > index && isOntimeEvent(rundownData.entries[eventId]) && selectedEvents.has(eventId),\n );\n\n // if we didnt find anything after, set the anchor to the last event\n return set({\n selectedEvents,\n anchoredIndex: nextIndex < 0 ? rundownData.order.length - 1 : nextIndex,\n entryMode: 'event',\n });\n }\n\n // on shift + click, we select a range of events up to the clicked event\n if (selectMode === 'shift') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // get list of rundown with only ontime events\n const eventIds: EntryId[] = [];\n rundownData.flatOrder.forEach((eventId) => {\n const event = rundownData.entries[eventId];\n if (isOntimeEvent(event)) {\n eventIds.push(event.id);\n }\n });\n\n const start = anchoredIndex === null ? 0 : Math.min(anchoredIndex, index);\n const end = anchoredIndex === null ? index : Math.max(anchoredIndex, index + 1);\n\n // create new set with range of ids from start to end\n const selectedEventIds = eventIds.slice(start, end);\n\n return set({\n selectedEvents: new Set([...selectedEvents, ...selectedEventIds]),\n anchoredIndex: index,\n entryMode: 'event',\n });\n }\n },\n clearSelectedEvents: () => set({ selectedEvents: new Set(), anchoredIndex: null, cursor: null, entryMode: null }),\n clearMultiSelect: () => {\n const { selectedEvents } = get();\n const [firstSelected] = selectedEvents;\n set({\n selectedEvents: new Set(firstSelected ? [firstSelected] : []),\n anchoredIndex: null,\n entryMode: null,\n });\n },\n unselect: (id: string) => {\n const { entryMode, selectedEvents } = get();\n selectedEvents.delete(id);\n set({\n selectedEvents,\n entryMode: selectedEvents.size === 0 ? null : entryMode,\n });\n },\n}));\n\nexport function getSelectionMode(event: MouseEvent): SelectionMode {\n if ((isMacOS() && event.metaKey) || event.ctrlKey) {\n return 'ctrl';\n }\n\n if (event.shiftKey) {\n return 'shift';\n }\n\n return 'click';\n}\n","import { memo } from 'react';\n\nimport CopyTag from '../../../../common/components/copy-tag/CopyTag';\n\nimport style from './EventEditorFooter.module.scss';\n\ninterface EventEditorFooterProps {\n id: string;\n cue: string;\n}\n\nexport default memo(EventEditorFooter);\nfunction EventEditorFooter({ id, cue }: EventEditorFooterProps) {\n const loadById = `/ontime/load/id \"${id}\"`;\n const loadByCue = `/ontime/load/cue \"${cue}\"`;\n\n return (\n <div className={style.footer}>\n <CopyTag copyValue={loadById}>{loadById}</CopyTag>\n <CopyTag copyValue={loadByCue}>{loadByCue}</CopyTag>\n </div>\n );\n}\n","import { memo, PropsWithChildren } from 'react';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { deviceAlt, deviceMod } from '../../../common/utils/deviceUtils';\n\nimport style from './EventEditorEmpty.module.scss';\n\nexport default memo(EventEditorEmpty);\n\nfunction EventEditorEmpty() {\n return (\n <div className={style.entryEditor} data-testid='editor-container'>\n <div className={style.shortcutSection}>\n <Editor.Title className={style.prompt}>Rundown shortcuts</Editor.Title>\n <table className={style.shortcuts}>\n <tbody>\n <tr>\n <td>Find in rundown</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>F</Kbd>\n </td>\n </tr>\n <tr>\n <td>Open Settings</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>,</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Select entry</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Select group</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Deselect entry</td>\n <td>\n <Kbd>Esc</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Reorder selected entry</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Copy selected entry</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>C</Kbd>\n </td>\n </tr>\n <tr>\n <td>Paste above</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>V</Kbd>\n </td>\n </tr>\n <tr>\n <td>Paste below</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>V</Kbd>\n </td>\n </tr>\n <tr>\n <td>Delete selected entry</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Backspace</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Add event below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>E</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add event above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>E</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add group below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>G</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add group above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>M</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add milestone below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>G</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add milestone above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>M</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add delay below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>D</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add delay above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>D</Kbd>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction AuxKey({ children }: PropsWithChildren) {\n return <span className={style.divider}>{children}</span>;\n}\n\nfunction Kbd({ children }: PropsWithChildren) {\n return <span className={style.kbd}>{children}</span>;\n}\n","import { useEffect, useState } from 'react';\nimport {\n isOntimeDelay,\n isOntimeEvent,\n isOntimeGroup,\n isOntimeMilestone,\n OntimeEvent,\n OntimeGroup,\n OntimeMilestone,\n} from 'ontime-types';\n\nimport useRundown from '../../../common/hooks-query/useRundown';\nimport { useEventSelection } from '../useEventSelection';\n\nimport EventEditorFooter from './composite/EventEditorFooter';\nimport EventEditor from './EventEditor';\nimport EventEditorEmpty from './EventEditorEmpty';\nimport GroupEditor from './GroupEditor';\nimport MilestoneEditor from './MilestoneEditor';\n\nimport style from './EntryEditor.module.scss';\n\nexport default function RundownEntryEditor() {\n const selectedEvents = useEventSelection((state) => state.selectedEvents);\n const { data } = useRundown();\n\n const [entry, setEntry] = useState<OntimeEvent | OntimeGroup | OntimeMilestone | null>(null);\n\n useEffect(() => {\n if (data.order.length === 0) {\n setEntry(null);\n return;\n }\n\n const selectedEventId = Array.from(selectedEvents).at(0);\n if (!selectedEventId) {\n setEntry(null);\n return;\n }\n const event = data.entries[selectedEventId];\n\n if (event && !isOntimeDelay(event)) {\n setEntry(event);\n } else {\n setEntry(null);\n }\n }, [data.order, data.entries, selectedEvents]);\n\n if (!entry) {\n return <EventEditorEmpty />;\n }\n\n if (isOntimeEvent(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <EventEditor event={entry} />\n <EventEditorFooter id={entry.id} cue={entry.cue} />\n </div>\n );\n }\n\n if (isOntimeMilestone(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <MilestoneEditor milestone={entry} />\n </div>\n );\n }\n\n if (isOntimeGroup(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <GroupEditor group={entry} />\n </div>\n );\n }\n\n return null;\n}\n","import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { EntryId, isOntimeEvent, isOntimeGroup, isOntimeMilestone, MaybeString, SupportedEntry } from 'ontime-types';\n\nimport { useFlatRundown } from '../../../common/hooks-query/useRundown';\nimport { useEventSelection } from '../../../features/rundown/useEventSelection';\n\nconst maxResults = 12;\n\ntype FilterableGroup = {\n type: SupportedEntry.Group;\n id: EntryId;\n index: number;\n title: string;\n colour: string;\n};\n\ntype FilterableEvent = {\n type: SupportedEntry.Event;\n id: EntryId;\n index: number;\n eventIndex: number;\n title: string;\n cue: string;\n colour: string;\n parent: MaybeString;\n};\n\ntype FilterableMilestone = {\n type: SupportedEntry.Milestone;\n id: EntryId;\n index: number;\n title: string;\n cue: string;\n colour: string;\n parent: MaybeString;\n};\n\ntype FilterableEntry = FilterableGroup | FilterableEvent | FilterableMilestone;\n\nexport default function useFinder() {\n const { data, rundownId } = useFlatRundown();\n const [results, setResults] = useState<FilterableEntry[]>([]);\n const [error, setError] = useState<MaybeString>(null);\n const lastSearchString = useRef('');\n\n const setSelectedEvents = useEventSelection((state) => state.setSelectedEvents);\n\n const [collapsedGroups, setCollapsedGroups] = useSessionStorage<EntryId[]>({\n // we ensure that this is unique to the rundown\n key: `rundown.${rundownId}-editor-collapsed-groups`,\n defaultValue: [],\n });\n\n /** Filters the rundown to a given evaluation */\n const find = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (!data || data.length === 0) {\n setError('No data');\n return;\n }\n setError(null);\n\n if (event.target.value === '') {\n setResults([]);\n return;\n }\n\n const searchValue = event.target.value.toLowerCase();\n lastSearchString.current = searchValue;\n\n if (searchValue.startsWith('index ')) {\n const searchString = searchValue.slice('index '.length).trim();\n const { results, error } = searchByIndex(searchString);\n setResults(results);\n setError(error);\n return;\n }\n\n if (searchValue.startsWith('cue ')) {\n const searchString = searchValue.slice('cue '.length).trim();\n const { results, error } = searchByCue(searchString);\n setResults(results);\n setError(error);\n return;\n }\n\n const searchString = searchValue.startsWith('title ') ? searchValue.slice('title '.length).trim() : searchValue;\n const { results, error } = searchByTitle(searchString);\n setResults(results);\n setError(error);\n\n /** Returns a single item with a matching index */\n function searchByIndex(searchString: string) {\n const searchIndex = Number(searchString);\n if (isNaN(searchIndex) || searchIndex < 1) {\n return { results: [], error: 'Invalid index' };\n }\n\n if (searchIndex > data.length) {\n return { results: [], error: null };\n }\n\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n const results: FilterableEvent[] = [];\n for (let i = 0; i < data.length; i++) {\n const event = data[i];\n if (isOntimeEvent(event)) {\n if (eventIndex === searchIndex) {\n results.push({\n type: SupportedEntry.Event,\n id: event.id,\n index: i,\n eventIndex,\n title: event.title,\n cue: event.cue,\n colour: event.colour,\n parent: event.parent,\n } satisfies FilterableEvent);\n break;\n }\n eventIndex++;\n }\n }\n\n return { results, error: null };\n }\n\n /** Returns maxResults of OntimeEvents that match the cue field */\n function searchByCue(searchString: string) {\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n // limit amount of results we show\n let remaining = maxResults;\n const results: FilterableEvent[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (remaining <= 0) {\n break;\n }\n const event = data[i];\n if (isOntimeEvent(event)) {\n if (event.cue.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Event,\n id: event.id,\n index: i,\n eventIndex,\n title: event.title,\n cue: event.cue,\n colour: event.colour,\n parent: event.parent,\n } satisfies FilterableEvent);\n }\n eventIndex++;\n }\n }\n return { results, error: null };\n }\n\n /** Returns maxResults of OntimeEvents that match the title field*/\n function searchByTitle(searchString: string) {\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n // limit amount of results we show\n let remaining = maxResults;\n const results: FilterableEntry[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (remaining <= 0) {\n break;\n }\n\n const entry = data[i];\n if (isOntimeEvent(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Event,\n id: entry.id,\n index: i,\n eventIndex,\n title: entry.title,\n cue: entry.cue,\n colour: entry.colour,\n parent: entry.parent,\n } satisfies FilterableEvent);\n }\n eventIndex++;\n } else if (isOntimeGroup(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Group,\n id: entry.id,\n index: i,\n title: entry.title,\n colour: entry.colour,\n } satisfies FilterableGroup);\n }\n } else if (isOntimeMilestone(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Milestone,\n id: entry.id,\n index: i,\n title: entry.title,\n cue: entry.cue,\n colour: entry.colour,\n parent: entry.parent,\n } satisfies FilterableMilestone);\n }\n }\n }\n return { results, error: null };\n }\n },\n [data],\n );\n\n const select = useCallback(\n (selectedEvent: FilterableEntry) => {\n // First expand the parent group if this is an event inside a group\n if ('parent' in selectedEvent && selectedEvent.parent !== null) {\n // Try direct state update instead of using callback\n const currentGroups = [...new Set(collapsedGroups)];\n const newGroups = currentGroups.filter((id) => id !== selectedEvent.parent);\n // Force a direct update\n setCollapsedGroups(newGroups);\n }\n\n // Then select the event\n setSelectedEvents({ id: selectedEvent.id, index: selectedEvent.index, selectMode: 'click' });\n },\n [collapsedGroups, setCollapsedGroups, setSelectedEvents],\n );\n\n /** clear results when source data changes */\n useEffect(() => {\n setResults([]);\n setError(null);\n // fake a submit event to re-run the search\n if (lastSearchString.current) {\n find({ target: { value: lastSearchString.current } } as ChangeEvent<HTMLInputElement>);\n }\n }, [data, find]);\n\n return { find, select, results, error };\n}\n","import { KeyboardEvent, useState } from 'react';\nimport { useDebouncedCallback } from '@mantine/hooks';\nimport { SupportedEntry } from 'ontime-types';\n\nimport Input from '../../../common/components/input/input/Input';\nimport Modal from '../../../common/components/modal/Modal';\n\nimport useFinder from './useFinder';\n\nimport style from './Finder.module.scss';\n\ninterface FinderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function Finder({ isOpen, onClose }: FinderProps) {\n const { find, select, results, error } = useFinder();\n const [selected, setSelected] = useState(0);\n\n const debouncedFind = useDebouncedCallback(find, 100);\n\n const navigate = (event: KeyboardEvent<HTMLDivElement>) => {\n // all operations need results\n if (results.length === 0) {\n return;\n }\n if (event.key === 'ArrowDown') {\n setSelected((prev) => (prev + 1) % results.length);\n }\n if (event.key === 'ArrowUp') {\n setSelected((prev) => (prev - 1 + results.length) % results.length);\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n submit();\n }\n };\n\n const submit = () => {\n const selectedEvent = results[selected];\n select(selectedEvent);\n onClose();\n };\n\n const handleMouseMoveEvent = (event: React.MouseEvent<HTMLUListElement>) => {\n const target = event.target as HTMLElement;\n const li = target.closest('li');\n if (li) {\n const index = Number(li.dataset.index);\n if (!isNaN(index)) {\n setSelected(index);\n }\n }\n };\n\n return (\n <Modal\n title=''\n isOpen={isOpen}\n onClose={onClose}\n showBackdrop\n bodyElements={\n <div onKeyDown={navigate}>\n <Input height='large' fluid onChange={debouncedFind} placeholder='Search...' />\n <ul className={style.scrollContainer} onMouseMove={handleMouseMoveEvent}>\n {error && <li className={style.error}>{error}</li>}\n {results.length === 0 && <li className={style.empty}>No results</li>}\n {results.length > 0 &&\n results.map((entry, index) => {\n const isSelected = selected === index;\n const displayIndex = entry.type === SupportedEntry.Event ? entry.eventIndex : '-';\n const displayCue = 'cue' in entry ? entry.cue : '';\n\n return (\n <li\n key={entry.id}\n className={style.entry}\n data-selected={isSelected}\n data-index={index}\n onClick={submit}\n >\n <div className={style.data}>\n <div className={style.index} style={{ '--color': entry.colour }}>\n {displayIndex}\n </div>\n <div className={style.cue}>{displayCue}</div>\n <div className={style.title}>{entry.title}</div>\n </div>\n {isSelected && <span>Go ⏎</span>}\n </li>\n );\n })}\n </ul>\n </div>\n }\n footerElements={\n <div className={style.footer}>\n Use the keywords <span className={style.em}>cue</span>, <span className={style.em}>index</span> or\n <span className={style.em}>title</span> to filter search.\n </div>\n }\n />\n );\n}\n","import { memo } from 'react';\nimport { useDisclosure, useHotkeys } from '@mantine/hooks';\n\nimport Finder from '../../../views/editor/finder/Finder';\n\nexport default memo(FinderPlacement);\n\nfunction FinderPlacement() {\n const [isOpen, handler] = useDisclosure();\n\n useHotkeys([\n ['mod + f', handler.toggle],\n ['Escape', handler.close],\n ]);\n\n if (isOpen) {\n return <Finder isOpen={isOpen} onClose={handler.close} />;\n }\n\n return null;\n}\n","import type { PropsWithChildren } from 'react';\nimport { create } from 'zustand';\n\nimport { DropdownMenuOption, PositionedDropdownMenu } from '../../../common/components/dropdown-menu/DropdownMenu';\n\ntype Position = {\n x: number;\n y: number;\n};\n\ntype ContextMenuStore = {\n position: Position;\n options: DropdownMenuOption[];\n isOpen: boolean;\n setContextMenu: (position: Position, options: DropdownMenuOption[]) => void;\n setIsOpen: (newIsOpen: boolean) => void;\n};\n\nexport const useContextMenuStore = create<ContextMenuStore>((set) => ({\n position: { x: 0, y: 0 },\n options: [],\n isOpen: false,\n setContextMenu: (position, options) => set(() => ({ position, options, isOpen: true })),\n setIsOpen: (newIsOpen) => set(() => ({ isOpen: newIsOpen })),\n}));\n\nexport function RundownContextMenu({ children }: PropsWithChildren) {\n const { position, options, isOpen, setIsOpen } = useContextMenuStore();\n\n const onClose = () => {\n return setIsOpen(false);\n };\n\n if (!isOpen) {\n return children;\n }\n\n return (\n <>\n {children}\n <PositionedDropdownMenu isOpen position={position} onClose={onClose} items={options} />\n </>\n );\n}\n","import { memo, useCallback } from 'react';\nimport { IoTrash } from 'react-icons/io5';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useDisclosure, useSessionStorage } from '@mantine/hooks';\n\nimport Button from '../../../common/components/buttons/Button';\nimport Dialog from '../../../common/components/dialog/Dialog';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownMenu);\nfunction RundownMenu() {\n const [isOpen, handlers] = useDisclosure();\n\n const clearSelectedEvents = useEventSelection((state) => state.clearSelectedEvents);\n const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const { deleteAllEntries } = useEntryActions();\n\n const deleteAll = useCallback(() => {\n deleteAllEntries();\n clearSelectedEvents();\n handlers.close();\n }, [clearSelectedEvents, deleteAllEntries, handlers]);\n\n return (\n <>\n <Toolbar.Button\n render={<Button variant='subtle-destructive' />}\n onClick={handlers.open}\n disabled={editorMode === AppMode.Run}\n className={style.apart}\n >\n <IoTrash />\n Clear all\n </Toolbar.Button>\n <Dialog\n isOpen={isOpen}\n onClose={handlers.close}\n title='Clear rundown'\n showBackdrop\n showCloseButton\n bodyElements={\n <>\n You will lose all data in your rundown. <br /> Are you sure?\n </>\n }\n footerElements={\n <>\n <Button variant='ghosted-white' size='large' onClick={handlers.close}>\n Cancel\n </Button>\n <Button variant='destructive' size='large' onClick={deleteAll}>\n Delete all\n </Button>\n </>\n }\n />\n </>\n );\n}\n","import { memo } from 'react';\nimport { Toggle } from '@base-ui-components/react/toggle';\nimport { ToggleGroup } from '@base-ui-components/react/toggle-group';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { OffsetMode } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { setOffsetMode, useOffsetMode } from '../../../common/hooks/useSocket';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\n\nimport RundownMenu from './RundownMenu';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownHeader);\nfunction RundownHeader() {\n const [editorMode, setEditorMode] = useSessionStorage({ key: sessionKeys.editorMode, defaultValue: AppMode.Edit });\n\n const { offsetMode } = useOffsetMode();\n\n const toggleAppMode = (mode: AppMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setEditorMode(newValue);\n };\n\n const toggleOffsetMode = (mode: OffsetMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setOffsetMode(newValue);\n };\n\n return (\n <Toolbar.Root className={style.header}>\n <ToggleGroup value={[editorMode]} onValueChange={toggleAppMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>\n Run\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>\n Edit\n </Toolbar.Button>\n </ToggleGroup>\n\n <Editor.Separator className={style.separator} />\n\n <ToggleGroup value={[offsetMode]} onValueChange={toggleOffsetMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Absolute} className={style.radioButton}>\n Absolute\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Relative} className={style.radioButton}>\n Relative\n </Toolbar.Button>\n </ToggleGroup>\n\n <RundownMenu />\n </Toolbar.Root>\n );\n}\n","import { memo } from 'react';\nimport { Toggle } from '@base-ui-components/react/toggle';\nimport { ToggleGroup } from '@base-ui-components/react/toggle-group';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { OffsetMode } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { setOffsetMode, useOffsetMode } from '../../../common/hooks/useSocket';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownHeader);\nfunction RundownHeader() {\n const [editorMode, setEditorMode] = useSessionStorage<AppMode>({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n\n const { offsetMode } = useOffsetMode();\n\n const toggleAppMode = (mode: AppMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setEditorMode(newValue);\n };\n\n const toggleOffsetMode = (mode: OffsetMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setOffsetMode(newValue);\n };\n\n return (\n <Toolbar.Root className={style.header}>\n <ToggleGroup value={[editorMode]} onValueChange={toggleAppMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>\n Run\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>\n Edit\n </Toolbar.Button>\n </ToggleGroup>\n\n <Editor.Separator className={style.separator} />\n\n <ToggleGroup value={[offsetMode]} onValueChange={toggleOffsetMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Absolute} className={style.radioButton}>\n Absolute\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Relative} className={style.radioButton}>\n Relative\n </Toolbar.Button>\n </ToggleGroup>\n </Toolbar.Root>\n );\n}\n","import { create } from 'zustand';\n\ntype EntryCopyStore = {\n entryCopyId: string | null;\n setEntryCopyId: (eventId: string | null) => void;\n};\n\nexport const useEntryCopy = create<EntryCopyStore>()((set) => ({\n entryCopyId: null,\n setEntryCopyId: (entryCopyId: string | null) => set({ entryCopyId }),\n}));\n","import { OntimeEvent, SupportedEntry } from 'ontime-types';\n\n/**\n * @description Creates a safe duplicate of an event\n * @param {OntimeEvent} event\n * @param {string} [after]\n * @return {OntimeEvent} clean event\n */\ntype ClonedEvent = Omit<OntimeEvent, 'id' | 'cue'>;\nexport const cloneEvent = (event: OntimeEvent): ClonedEvent => {\n return {\n type: SupportedEntry.Event,\n flag: event.flag,\n title: event.title,\n note: event.note,\n timeStart: event.timeStart,\n duration: event.duration,\n timeEnd: event.timeEnd,\n timerType: event.timerType,\n timeStrategy: event.timeStrategy,\n countToEnd: event.countToEnd,\n linkStart: event.linkStart,\n endAction: event.endAction,\n skip: event.skip,\n colour: event.colour,\n parent: event.parent,\n revision: 0,\n delay: event.delay, // the events will be collocated, so having the same metadata is a good start\n dayOffset: event.dayOffset,\n gap: 0,\n timeWarning: event.timeWarning,\n timeDanger: event.timeDanger,\n triggers: structuredClone(event.triggers),\n custom: structuredClone(event.custom),\n };\n};\n","import { memo } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { MaybeString, SupportedEntry } from 'ontime-types';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './QuickAddButtons.module.scss';\n\ninterface QuickAddButtonsProps {\n previousEventId: MaybeString;\n parentGroup: MaybeString;\n backgroundColor?: string;\n}\n\nexport default memo(QuickAddButtons);\nfunction QuickAddButtons({ previousEventId, parentGroup, backgroundColor }: QuickAddButtonsProps) {\n const { addEntry } = useEntryActions();\n\n const addEvent = () => {\n addEntry(\n {\n type: SupportedEntry.Event,\n parent: parentGroup,\n },\n {\n after: previousEventId,\n lastEventId: previousEventId,\n },\n );\n };\n\n const addDelay = () => {\n addEntry(\n { type: SupportedEntry.Delay, parent: parentGroup },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n const addMilestone = () => {\n addEntry(\n { type: SupportedEntry.Milestone, parent: parentGroup },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n const addGroup = () => {\n if (parentGroup !== null) {\n return;\n }\n addEntry(\n { type: SupportedEntry.Group },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n /**\n * If the colour is empty string ''\n * ie: we are inside a group, but there is no defined colour\n * we default to $gray-500 #9d9d9d\n */\n const groupColour = backgroundColor === '' ? '#9d9d9d' : backgroundColor;\n\n return (\n <Toolbar.Root\n className={cx([style.quickAdd, Boolean(parentGroup) && style.indent])}\n style={groupColour ? { '--user-bg': groupColour } : {}}\n data-testid='quick-add-buttons'\n >\n <Toolbar.Button render={<Button size='small' />} onClick={addEvent}>\n <IoAdd />\n Event\n </Toolbar.Button>\n\n <Toolbar.Button render={<Button size='small' />} onClick={addDelay}>\n <IoAdd />\n Delay\n </Toolbar.Button>\n\n <Toolbar.Button render={<Button size='small' />} onClick={addMilestone}>\n <IoAdd />\n Milestone\n </Toolbar.Button>\n\n {parentGroup === null && (\n <Toolbar.Button render={<Button size='small' />} onClick={addGroup}>\n <IoAdd />\n Group\n </Toolbar.Button>\n )}\n </Toolbar.Root>\n );\n}\n","import { memo } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { MaybeString, SupportedEntry } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport { DropdownMenu } from '../../../../common/components/dropdown-menu/DropdownMenu';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\n\nimport style from './QuickAddInline.module.scss';\n\ninterface QuickAddInlineProps {\n referenceEntryId: MaybeString;\n parentGroup: MaybeString;\n placement: 'before' | 'after';\n}\n\nexport default memo(QuickAddInline);\nfunction QuickAddInline({ referenceEntryId, parentGroup, placement }: QuickAddInlineProps) {\n const { addEntry } = useEntryActions();\n\n const handleAddEntry = (type: SupportedEntry) => {\n if (placement === 'before') {\n addEntry(\n { type, parent: type !== SupportedEntry.Group ? parentGroup : null },\n {\n before: referenceEntryId,\n },\n );\n } else {\n addEntry(\n { type, parent: type !== SupportedEntry.Group ? parentGroup : null },\n {\n lastEventId: referenceEntryId,\n after: referenceEntryId,\n },\n );\n }\n };\n\n return (\n <div className={style.quickAdd} data-testid='quick-add-inline'>\n <DropdownMenu\n items={[\n { type: 'item', icon: IoAdd, label: 'Add Event', onClick: () => handleAddEntry(SupportedEntry.Event) },\n { type: 'item', icon: IoAdd, label: 'Add Delay', onClick: () => handleAddEntry(SupportedEntry.Delay) },\n {\n type: 'item',\n icon: IoAdd,\n label: 'Add Milestone',\n onClick: () => handleAddEntry(SupportedEntry.Milestone),\n },\n {\n type: 'item',\n icon: IoAdd,\n label: 'Add Group',\n onClick: () => handleAddEntry(SupportedEntry.Group),\n disabled: parentGroup !== null,\n },\n ]}\n render={<IconButton size='small' variant='primary' className={style.addButton} />}\n >\n <IoAdd />\n </DropdownMenu>\n </div>\n );\n}\n","import { MouseEvent } from 'react';\n\nimport { useContextMenuStore } from '../../features/rundown/rundown-context-menu/RundownContextMenu';\nimport { DropdownMenuOption } from '../components/dropdown-menu/DropdownMenu';\n\nexport const useContextMenu = <T extends HTMLElement>(options: DropdownMenuOption[]) => {\n const setContextMenu = useContextMenuStore((state) => state.setContextMenu);\n\n const localCreateContextMenu = (contextMenuEvent: MouseEvent<T, globalThis.MouseEvent>) => {\n // prevent browser default context menu from showing up\n contextMenuEvent.preventDefault();\n\n const { pageX, pageY } = contextMenuEvent;\n return setContextMenu({ x: pageX, y: pageY }, options);\n };\n\n return [localCreateContextMenu];\n};\n","import { useCallback, useRef } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TitleEditor.module.scss';\n\ninterface TitleEditorProps {\n title: string;\n entryId: string;\n placeholder: string;\n className?: string;\n}\n\nexport default function TitleEditor({ title, entryId, placeholder, className }: TitleEditorProps) {\n const { updateEntry } = useEntryActions();\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback(\n (text: string) => {\n if (text === title) {\n return;\n }\n\n const cleanVal = text.trim();\n updateEntry({ id: entryId, title: cleanVal });\n },\n [title, updateEntry, entryId],\n );\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(title, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n const classes = cx([className, style.eventTitle, !value ? style.noTitle : null]);\n\n return (\n <Input\n data-testid='entry__title'\n variant='ghosted'\n fluid\n ref={ref}\n value={value}\n className={classes}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import { MouseEvent, useRef } from 'react';\nimport {\n IoChevronDown,\n IoChevronUp,\n IoDuplicateOutline,\n IoFolderOpenOutline,\n IoReorderTwo,\n IoTrash,\n} from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EntryId, OntimeGroup } from 'ontime-types';\nimport { MILLIS_PER_MINUTE } from 'ontime-utils';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, formatTime } from '../../../common/utils/time';\nimport TitleEditor from '../common/TitleEditor';\nimport { canDrop } from '../rundown.utils';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownGroup.module.scss';\n\ninterface RundownGroupProps {\n data: OntimeGroup;\n hasCursor: boolean;\n collapsed: boolean;\n onCollapse: (collapsed: boolean, groupId: EntryId) => void;\n}\n\n//TODO: the group should maybe include a multiple day indicator\nexport default function RundownGroup({ data, hasCursor, collapsed, onCollapse }: RundownGroupProps) {\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const { clone, ungroup, deleteEntry } = useEntryActions();\n const { selectedEvents, setSingleEntrySelection } = useEventSelection();\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>([\n {\n type: 'item',\n label: 'Clone Group',\n icon: IoDuplicateOutline,\n onClick: () => clone(data.id),\n },\n {\n type: 'item',\n label: 'Ungroup',\n icon: IoFolderOpenOutline,\n onClick: () => ungroup(data.id),\n disabled: data.entries.length === 0,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete Group',\n icon: IoTrash,\n onClick: () => deleteEntry([data.id]),\n },\n ]);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n isOver,\n over,\n } = useSortable({\n id: data.id,\n data: {\n type: 'group',\n },\n animateLayoutChanges: () => false,\n });\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n setSingleEntrySelection({ id: data.id });\n };\n\n const binderColours = data.colour && getAccessibleColour(data.colour);\n const isValidDrop = isDragging && over?.id && canDrop(over.data.current?.type, over.data.current?.parent);\n\n const [planOffset, planOffsetLabel] = (() => {\n if (data.targetDuration === null) {\n return [null, null];\n }\n\n const offset = data.duration - data.targetDuration;\n if (offset === 0) {\n return [null, 'under'];\n }\n const absOffset = Math.abs(offset);\n return [\n `${offset < 0 ? '-' : '+'}${formatDuration(absOffset, absOffset > 2 * MILLIS_PER_MINUTE)}`,\n getOffsetState(offset),\n ];\n })();\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n cursor: isOver ? (isValidDrop ? 'grabbing' : 'no-drop') : 'inherit',\n };\n\n return (\n <div\n className={cx([style.group, hasCursor && style.hasCursor, !collapsed && style.expanded])}\n ref={setNodeRef}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n style={{\n ...dragStyle,\n '--user-bg': data.colour || '#929292',\n }}\n data-testid='rundown-group'\n >\n <div className={style.binder} style={{ ...binderColours }} tabIndex={-1}>\n <span\n className={cx([style.drag, isDragging && style.isDragging, isDragging && !isValidDrop && style.notAllowed])}\n ref={handleRef}\n {...dragAttributes}\n {...dragListeners}\n >\n <IoReorderTwo />\n </span>\n </div>\n <div className={style.header}>\n <div className={style.titleRow}>\n <TitleEditor title={data.title} entryId={data.id} placeholder='Group title' />\n <IconButton aria-label='Collapse' variant='subtle-white' onClick={() => onCollapse(!collapsed, data.id)}>\n {collapsed ? <IoChevronUp /> : <IoChevronDown />}\n </IconButton>\n </div>\n <div className={style.metaRow}>\n <div className={style.metaEntry}>\n <div>Start</div>\n <div>{formatTime(data.timeStart)}</div>\n </div>\n <div className={style.metaEntry}>\n <div>End</div>\n <div>{formatTime(data.timeEnd)}</div>\n </div>\n <div className={style.metaEntry}>\n <div>Duration</div>\n {planOffset === null ? (\n <div className={cx([planOffsetLabel !== null && style[planOffsetLabel]])}>\n {formatDuration(data.duration)}\n </div>\n ) : (\n <div>\n <span className={style.strike}>{formatDuration(data.duration)}</span>\n <span className={cx([planOffsetLabel !== null && style[planOffsetLabel]])}>{planOffset}</span>\n </div>\n )}\n </div>\n <div className={style.metaEntry}>\n <div>Entries</div>\n <div>{data.entries.length}</div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport style from './RundownGroupEnd.module.scss';\n\ninterface RundownGroupEndProps {\n id: string;\n colour?: string;\n}\n\nexport default function RundownGroupEnd({ id, colour }: RundownGroupEndProps) {\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({\n id,\n data: {\n type: 'end-group',\n },\n animateLayoutChanges: () => false,\n disabled: true, // we do not want to drag end groups\n });\n\n const dragStyle = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n return (\n <div\n className={style.groupEnd}\n ref={setNodeRef}\n {...dragAttributes}\n {...dragListeners}\n style={{\n ...dragStyle,\n ...(colour ? { '--user-bg': colour } : {}),\n }}\n tabIndex={-1}\n />\n );\n}\n","import { IoAdd } from 'react-icons/io5';\nimport { SupportedEntry } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport * as Editor from '../../common/components/editor-utils/EditorUtils';\nimport Empty from '../../common/components/state/Empty';\n\nimport style from './Empty.module.scss';\n\ninterface RundownEmptyProps {\n handleAddNew: (type: SupportedEntry) => void;\n}\n\nexport default function RundownEmpty(props: RundownEmptyProps) {\n const { handleAddNew } = props;\n\n return (\n <div className={style.empty}>\n <Empty injectedStyles={{ marginTop: '5vh', marginBottom: '3rem' }} />\n <div className={style.inline}>\n <Button onClick={() => handleAddNew(SupportedEntry.Event)} variant='primary' size='large'>\n <IoAdd />\n Create Event\n </Button>\n\n <Editor.Separator />\n\n <Button onClick={() => handleAddNew(SupportedEntry.Group)} variant='primary' size='large'>\n <IoAdd /> Create Group\n </Button>\n </div>\n </div>\n );\n}\n","import { Fragment, lazy, useCallback, useEffect, useRef, useState } from 'react';\nimport { TbFlagFilled } from 'react-icons/tb';\nimport {\n closestCenter,\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragStartEvent,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { useHotkeys, useSessionStorage } from '@mantine/hooks';\nimport {\n type EntryId,\n type MaybeString,\n type Rundown,\n isOntimeEvent,\n isOntimeGroup,\n OntimeEntry,\n Playback,\n SupportedEntry,\n} from 'ontime-types';\nimport {\n getFirstNormal,\n getLastNormal,\n getNextGroupNormal,\n getNextNormal,\n getPreviousGroupNormal,\n getPreviousNormal,\n reorderArray,\n} from 'ontime-utils';\n\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useRundownEditor } from '../../common/hooks/useSocket';\nimport { useEntryCopy } from '../../common/stores/entryCopyStore';\nimport { cloneEvent } from '../../common/utils/clone';\nimport { lastMetadataKey, RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { AppMode, sessionKeys } from '../../ontimeConfig';\n\nimport QuickAddButtons from './entry-editor/quick-add-buttons/QuickAddButtons';\nimport QuickAddInline from './entry-editor/quick-add-cursor/QuickAddInline';\nimport RundownGroup from './rundown-group/RundownGroup';\nimport RundownGroupEnd from './rundown-group/RundownGroupEnd';\nimport { canDrop, makeSortableList } from './rundown.utils';\nimport RundownEmpty from './RundownEmpty';\nimport { useEventSelection } from './useEventSelection';\n\nimport style from './Rundown.module.scss';\n\nconst RundownEntry = lazy(() => import('./RundownEntry'));\n\ninterface RundownProps {\n data: Rundown;\n rundownMetadata: RundownMetadataObject;\n}\n\nexport default function Rundown({ data, rundownMetadata }: RundownProps) {\n const { order, entries, id } = data;\n // we create a copy of the rundown with a data structured aligned with what dnd-kit needs\n const featureData = useRundownEditor();\n const [sortableData, setSortableData] = useState<EntryId[]>(() => makeSortableList(order, entries));\n const [metadata, setMetadata] = useState(rundownMetadata);\n const [collapsedGroups, setCollapsedGroups] = useSessionStorage<EntryId[]>({\n // we ensure that this is unique to the rundown\n key: `rundown.${id}-editor-collapsed-groups`,\n defaultValue: [],\n });\n\n const { addEntry, deleteEntry, move, reorderEntry } = useEntryActions();\n\n const { entryCopyId, setEntryCopyId } = useEntryCopy();\n\n // cursor\n const [editorMode] = useSessionStorage<AppMode>({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const { clearSelectedEvents, setSelectedEvents, cursor } = useEventSelection();\n\n const cursorRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n useFollowComponent({\n followRef: cursorRef,\n scrollRef,\n doFollow: true,\n followTrigger: editorMode === AppMode.Edit ? cursor : featureData?.selectedEventId,\n });\n\n // DND KIT\n const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 10 } }));\n\n const deleteAtCursor = useCallback(\n (cursor: string | null) => {\n if (!cursor) return;\n const { entry, index } = getPreviousNormal(entries, order, cursor);\n deleteEntry([cursor]);\n if (entry && index !== null) {\n setSelectedEvents({ id: entry.id, selectMode: 'click', index });\n }\n },\n [entries, order, deleteEntry, setSelectedEvents],\n );\n\n const insertCopyAtId = useCallback(\n (atId: string | null, copyId: string | null, above = false) => {\n const adjustedCursor = above ? getPreviousNormal(entries, order, atId ?? '').entry?.id ?? null : atId;\n if (copyId === null) {\n // we cant clone without selection\n return;\n }\n const cloneEntry = entries[copyId];\n if (cloneEntry?.type === SupportedEntry.Event) {\n //if we don't have a cursor add the new event on top\n const newEvent = cloneEvent(cloneEntry);\n addEntry(newEvent, { after: adjustedCursor ?? undefined });\n }\n },\n [addEntry, order, entries],\n );\n\n /**\n * Add a new item referring to an existing one\n */\n const insertAtId = useCallback(\n (patch: Partial<OntimeEntry> & { type: SupportedEntry }, id: MaybeString, above = false) => {\n addEntry(patch, {\n after: id && !above ? id : undefined,\n before: id && above ? id : undefined,\n lastEventId: !above && id ? id : undefined,\n });\n },\n [addEntry],\n );\n\n const selectGroup = useCallback(\n (cursor: string | null, direction: 'up' | 'down') => {\n if (order.length < 1) {\n return;\n }\n let newCursor = cursor;\n if (cursor === null) {\n // there is no cursor, we select the first or last depending on direction\n const selected = direction === 'up' ? getLastNormal(entries, order) : getFirstNormal(entries, order);\n\n if (isOntimeGroup(selected)) {\n setSelectedEvents({ id: selected.id, selectMode: 'click', index: direction === 'up' ? order.length : 0 });\n return;\n }\n newCursor = selected?.id ?? null;\n }\n\n if (newCursor === null) {\n return;\n }\n\n // otherwise we select the next or previous\n const selected =\n direction === 'up'\n ? getPreviousGroupNormal(entries, order, newCursor)\n : getNextGroupNormal(entries, order, newCursor);\n\n if (selected.entry !== null && selected.index !== null) {\n setSelectedEvents({ id: selected.entry.id, selectMode: 'click', index: selected.index });\n }\n },\n [order, entries, setSelectedEvents],\n );\n\n const selectEntry = useCallback(\n (cursor: string | null, direction: 'up' | 'down') => {\n if (order.length < 1) {\n return;\n }\n\n if (cursor === null) {\n // there is no cursor, we select the first or last depending on direction if it exists\n const selected = direction === 'up' ? getLastNormal(entries, order) : getFirstNormal(entries, order);\n if (selected !== null) {\n setSelectedEvents({ id: selected.id, selectMode: 'click', index: direction === 'up' ? order.length : 0 });\n }\n return;\n }\n\n // otherwise we select the next or previous\n const selected =\n direction === 'up' ? getPreviousNormal(entries, order, cursor) : getNextNormal(entries, order, cursor);\n\n if (selected.entry !== null && selected.index !== null) {\n setSelectedEvents({ id: selected.entry.id, selectMode: 'click', index: selected.index });\n }\n },\n [order, entries, setSelectedEvents],\n );\n\n /**\n * Checks whether a group is collapsed\n */\n const getIsCollapsed = useCallback(\n (groupId: EntryId): boolean => {\n return Boolean(collapsedGroups.find((id) => id === groupId));\n },\n [collapsedGroups],\n );\n\n /**\n * Handles logic for collapsing groups\n */\n const handleCollapseGroup = useCallback(\n (collapsed: boolean, groupId: EntryId) => {\n setCollapsedGroups((prev) => {\n const isCollapsed = getIsCollapsed(groupId);\n if (collapsed && !isCollapsed) {\n const newSet = new Set(prev).add(groupId);\n return [...newSet];\n }\n if (!collapsed && isCollapsed) {\n return [...prev].filter((id) => id !== groupId);\n }\n return prev;\n });\n },\n [getIsCollapsed, setCollapsedGroups],\n );\n\n const moveEntry = useCallback(\n async (cursor: EntryId | null, direction: 'up' | 'down') => {\n if (cursor == null) {\n return;\n }\n\n const movedIntoGroupId = await move(cursor, direction);\n // if we are moving into a group, we need to make sure it is expanded\n if (movedIntoGroupId) {\n handleCollapseGroup(false, movedIntoGroupId);\n }\n },\n [handleCollapseGroup, move],\n );\n\n // shortcuts\n useHotkeys([\n ['alt + ArrowDown', () => selectEntry(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + ArrowUp', () => selectEntry(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['alt + shift + ArrowDown', () => selectGroup(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + shift + ArrowUp', () => selectGroup(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['alt + mod + ArrowDown', () => moveEntry(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + mod + ArrowUp', () => moveEntry(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['Escape', () => clearSelectedEvents(), { preventDefault: true, usePhysicalKeys: true }],\n\n ['mod + Backspace', () => deleteAtCursor(cursor), { preventDefault: true, usePhysicalKeys: true }],\n\n [\n 'alt + E',\n () => insertAtId({ type: SupportedEntry.Event }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + E',\n () => insertAtId({ type: SupportedEntry.Event }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + G',\n () => insertAtId({ type: SupportedEntry.Group }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + G',\n () => insertAtId({ type: SupportedEntry.Group }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + D',\n () => insertAtId({ type: SupportedEntry.Delay }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + D',\n () => insertAtId({ type: SupportedEntry.Delay }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + M',\n () => insertAtId({ type: SupportedEntry.Milestone }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + M',\n () => insertAtId({ type: SupportedEntry.Milestone }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n ['mod + C', () => setEntryCopyId(cursor)],\n ['mod + V', () => insertCopyAtId(cursor, entryCopyId)],\n [\n 'mod + shift + V',\n () => insertCopyAtId(cursor, entryCopyId, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n ['alt + backspace', () => deleteAtCursor(cursor), { preventDefault: true, usePhysicalKeys: true }],\n ]);\n\n // we copy the state from the store here\n // to workaround async updates on the drag mutations\n useEffect(() => {\n setSortableData(makeSortableList(order, entries));\n setMetadata(rundownMetadata);\n }, [order, entries, rundownMetadata]);\n\n // in run mode, we follow the playback selection and open groups as needed\n useEffect(() => {\n if (editorMode !== AppMode.Run || !featureData?.selectedEventId) {\n return;\n }\n const index = order.findIndex((id) => id === featureData.selectedEventId);\n // @ts-expect-error -- but we safely check if the parent property exists\n const maybeParent = entries[featureData.selectedEventId]?.parent;\n if (maybeParent) {\n // open the group\n setCollapsedGroups((prev) => [...prev].filter((id) => id !== maybeParent));\n }\n\n setSelectedEvents({ id: featureData.selectedEventId, selectMode: 'click', index });\n }, [editorMode, entries, featureData.selectedEventId, order, setCollapsedGroups, setSelectedEvents]);\n\n /**\n * On drag end, we reorder the events\n */\n const handleOnDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over?.id || active.id === over.id) {\n return;\n }\n\n if (!active.data.current || !over.data.current) {\n return;\n }\n\n const fromIndex: number = active.data.current.sortable.index;\n const toIndex: number = over.data.current.sortable.index;\n let placement: 'before' | 'after' | 'insert' = fromIndex < toIndex ? 'after' : 'before';\n\n let destinationId = over.id as EntryId;\n const isDraggingGroup = active.data.current?.type === SupportedEntry.Group;\n\n // prevent dropping a group inside another\n if (\n isDraggingGroup &&\n !canDrop(over.data.current.type, over.data.current.parent, placement, getIsCollapsed(destinationId))\n ) {\n return;\n }\n\n /**\n * We need to specially handle the end-group\n * Dragging before a end-group will add the entry to the end of the group\n * Dragging after a end-group will add the event after the group itself\n * Dragging to the top of a group either place before first entry or if no entries do insert\n */\n if (destinationId.startsWith('end-')) {\n destinationId = destinationId.replace('end-', '');\n // if we are moving before the end, we use the insert operation\n if (placement === 'before') {\n placement = 'insert';\n }\n } else {\n const group = data.entries[destinationId];\n // if dragging into a group\n if (isOntimeGroup(group) && placement === 'after') {\n if (isDraggingGroup) {\n // ... and the dragged entry is a group, we know that the group is collapsed, because of the safe check canDrop from before\n // so we can safely push the dragged event after the group\n destinationId = group.id;\n } else if (group.entries.length === 0) {\n // ... and the group is entry, we insert\n destinationId = group.id;\n placement = 'insert';\n } else {\n // otherwise we add it to before the first group child\n destinationId = group.entries[0];\n placement = 'before';\n }\n }\n }\n\n // keep copy of the current state in case we need to revert\n const currentEntries = structuredClone(sortableData);\n // we keep a copy of the state as a hack to handle inconsistencies between dnd-kit and async store updates\n setSortableData((currentEntries) => {\n return reorderArray(currentEntries, fromIndex, toIndex);\n });\n reorderEntry(active.id as EntryId, destinationId, placement).catch((_) => {\n setSortableData(currentEntries);\n });\n };\n\n /**\n * When we drag a group, we force collapse it\n * This avoids strange scenarios like dropping a group inside itself\n */\n const collapseDraggedGroups = (event: DragStartEvent) => {\n const isGroup = event.active.data.current?.type === SupportedEntry.Group;\n if (isGroup) {\n handleCollapseGroup(true, event.active.id as EntryId);\n }\n };\n\n /**\n * When we drag over a group, we expand it if it is collapsed\n */\n const expandOverGroup = (event: DragOverEvent) => {\n // if we are dragging a group, the drop operation is invalid so we dont expand\n if (event.active.data.current?.type === 'group') {\n return;\n }\n if (event.over?.data.current?.type !== 'group') {\n return;\n }\n const groupId = event.over?.id as EntryId;\n const isCollapsed = getIsCollapsed(groupId);\n if (isCollapsed) {\n handleCollapseGroup(false, groupId);\n }\n };\n\n if (sortableData.length < 1) {\n return <RundownEmpty handleAddNew={(type: SupportedEntry) => addEntry({ type })} />;\n }\n\n // 1. gather presentation options\n const isEditMode = editorMode === AppMode.Edit;\n\n return (\n <div className={style.rundownContainer} ref={scrollRef} data-testid='rundown'>\n <DndContext\n onDragEnd={handleOnDragEnd}\n onDragStart={collapseDraggedGroups}\n onDragOver={expandOverGroup}\n sensors={sensors}\n collisionDetection={closestCenter}\n >\n <SortableContext items={sortableData} strategy={verticalListSortingStrategy}>\n <div className={style.list}>\n {isEditMode && <QuickAddButtons previousEventId={null} parentGroup={null} />}\n {sortableData.map((entryId, index) => {\n // the entry might be a pseudo end-group which does not generate metadata and should not be processed\n if (entryId.startsWith('end-')) {\n const parentId = entryId.split('end-')[1];\n const isGroupCollapsed = getIsCollapsed(parentId);\n const parentMetadata = metadata[parentId];\n\n if (isGroupCollapsed) {\n return null;\n }\n\n // if the previous element is selected, it will have its own QuickAddInline\n // we use thisId instead of previousEntryId because the end-group does not process\n // and it does not cause the reassignment of the iteration id to the previous entry\n return (\n <Fragment key={entryId}>\n {isEditMode && parentMetadata?.groupEntries === 0 && (\n <QuickAddButtons\n previousEventId={null}\n parentGroup={parentId}\n backgroundColor={parentMetadata?.groupColour}\n />\n )}\n <RundownGroupEnd key={entryId} id={entryId} colour={parentMetadata?.groupColour} />\n </Fragment>\n );\n }\n\n // we iterate through a stateful copy of order to make the dnd operations smoother\n // this means that this can be out of sync with order until the useEffect runs\n // instead of writing all the logic guards, we simply short circuit rendering here\n const entry = entries[entryId];\n const entryMetadata = metadata[entryId];\n if (!entry || !entryMetadata) return null;\n\n // if the entry has a parent, and it is collapsed, render nothing\n if (\n entry.type !== SupportedEntry.Group &&\n entryMetadata.groupId !== null &&\n getIsCollapsed(entryMetadata.groupId)\n ) {\n return null;\n }\n\n const isNext = featureData?.nextEventId === entry.id;\n const hasCursor = entry.id === cursor;\n\n /**\n * Outside a group, the value will be undefined\n * If the colour is empty string ''\n * ie: we are inside a group, but there is no defined colour\n * we default to $gray-500 #9d9d9d\n */\n const groupColour = entryMetadata.groupColour === '' ? '#9d9d9d' : entryMetadata.groupColour;\n\n const isFirst = index === 0;\n const isLast = entryId === order.at(-1);\n\n /**\n * We need to provide the parent ID for the QuickAdd components\n * This should be different depending on whether we are adding before or after an element\n * - when adding before, we need to avoid a group referencing itself as the parent\n * - when adding after, we can use the group ID directly to insert at the top of the group\n */\n\n const parentIdForBefore = entryMetadata.thisId !== entryMetadata.groupId ? entryMetadata.groupId : null;\n const parentIdForAfter = entryMetadata.groupId;\n\n return (\n <Fragment key={entry.id}>\n {/**\n * Before the entry\n * - edit mode only\n * - if there is a cursor\n * - if it is not the first entry (the buttons would be there)\n */}\n {isEditMode && hasCursor && !isFirst && (\n <QuickAddInline placement='before' referenceEntryId={entry.id} parentGroup={parentIdForBefore} />\n )}\n {isOntimeGroup(entry) ? (\n <RundownGroup\n data={entry}\n hasCursor={hasCursor}\n collapsed={getIsCollapsed(entry.id)}\n onCollapse={handleCollapseGroup}\n />\n ) : (\n <div\n className={style.entryWrapper}\n data-testid={`entry-${entryMetadata.eventIndex}`}\n style={groupColour ? { '--user-bg': groupColour } : {}}\n >\n {isOntimeEvent(entry) && (\n <div className={style.entryIndex}>\n {entry.flag && <TbFlagFilled className={style.flag} />}\n <div className={style.index}>{entryMetadata.eventIndex}</div>\n </div>\n )}\n <div className={style.entry} key={entry.id} ref={hasCursor ? cursorRef : undefined}>\n <RundownEntry\n type={entry.type}\n isPast={entryMetadata.isPast}\n eventIndex={entryMetadata.eventIndex}\n data={entry}\n loaded={entryMetadata.isLoaded}\n hasCursor={hasCursor}\n isNext={isNext}\n isNextDay={entryMetadata.isNextDay}\n playback={entryMetadata.isLoaded ? featureData.playback : undefined}\n isRolling={featureData.playback === Playback.Roll}\n totalGap={entryMetadata.totalGap}\n isLinkedToLoaded={entryMetadata.isLinkedToLoaded}\n />\n </div>\n </div>\n )}\n {/**\n * After the entry\n * - edit mode only\n * - if there is a cursor\n * - if it is not the last entry (the buttons would be there)\n * - if the entry is not the group header\n */}\n {isEditMode && hasCursor && !isLast && (\n <QuickAddInline placement='after' referenceEntryId={entry.id} parentGroup={parentIdForAfter} />\n )}\n </Fragment>\n );\n })}\n {isEditMode && (\n <QuickAddButtons\n previousEventId={metadata[lastMetadataKey]?.groupId ?? metadata[lastMetadataKey].thisId}\n parentGroup={null}\n />\n )}\n <div className={style.spacer} />\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n}\n","import Empty from '../../common/components/state/Empty';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\n\nimport RundownHeader from './rundown-header/RundownHeader';\nimport RundownHeaderMobile from './rundown-header/RundownHeaderMobile';\nimport Rundown from './Rundown';\n\nimport styles from './Rundown.module.scss';\n\ninterface RundownWrapperProps {\n isSmallDevice?: boolean;\n}\n\nexport default function RundownWrapper({ isSmallDevice }: RundownWrapperProps) {\n const { data, status, rundownMetadata } = useRundownWithMetadata();\n\n return (\n <div className={styles.rundownWrapper}>\n {isSmallDevice ? <RundownHeaderMobile /> : <RundownHeader />}\n {status === 'success' && data && rundownMetadata ? (\n <Rundown data={data} rundownMetadata={rundownMetadata} />\n ) : (\n <Empty text='Connecting to server' />\n )}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { useSessionStorage } from '@mantine/hooks';\n\nimport { Corner } from '../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../common/components/protect-route/ProtectRoute';\nimport { useIsSmallDevice } from '../../common/hooks/useIsSmallDevice';\nimport { handleLinks } from '../../common/utils/linkUtils';\nimport { cx } from '../../common/utils/styleUtils';\nimport { AppMode, sessionKeys } from '../../ontimeConfig';\n\nimport RundownEntryEditor from './entry-editor/RundownEntryEditor';\nimport FinderPlacement from './placements/FinderPlacement';\nimport { RundownContextMenu } from './rundown-context-menu/RundownContextMenu';\nimport RundownWrapper from './RundownWrapper';\n\nimport style from './RundownExport.module.scss';\n\nexport default memo(RundownExport);\n\nfunction RundownExport() {\n const isExtracted = window.location.pathname.includes('/rundown');\n const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const isSmallDevice = useIsSmallDevice();\n\n if (isSmallDevice && isExtracted) {\n return (\n <ProtectRoute permission='editor'>\n <div\n className={cx([style.rundownExport, style.extracted])}\n data-target='small-device'\n data-testid='panel-rundown'\n >\n <FinderPlacement />\n <ViewNavigationMenu suppressSettings />\n <div className={style.rundown}>\n <ErrorBoundary>\n <RundownContextMenu>\n <RundownWrapper isSmallDevice />\n </RundownContextMenu>\n </ErrorBoundary>\n </div>\n </div>\n </ProtectRoute>\n );\n }\n\n const hideSideBar = isExtracted && editorMode === 'run';\n\n return (\n <ProtectRoute permission='editor'>\n <div className={cx([style.rundownExport, isExtracted && style.extracted])} data-testid='panel-rundown'>\n <FinderPlacement />\n {isExtracted && <ViewNavigationMenu suppressSettings />}\n <div className={style.rundown}>\n <div className={style.list}>\n <ErrorBoundary>\n {!isExtracted && <Corner onClick={(event) => handleLinks('rundown', event)} />}\n <RundownContextMenu>\n <RundownWrapper />\n </RundownContextMenu>\n </ErrorBoundary>\n </div>\n {!hideSideBar && (\n <div className={style.side}>\n <ErrorBoundary>\n <RundownEntryEditor />\n </ErrorBoundary>\n </div>\n )}\n </div>\n </div>\n </ProtectRoute>\n );\n}\n"],"file":"assets/RundownExport-WjLpncYT.js"}
Binary file
Binary file
Binary file
Binary file
@@ -1,2 +0,0 @@
1
- import{h as p,j as r,l as be}from"./vendor-Cu5xgv5K.js";import{P as xe,T as m,a as w,b as C,u as Se,c as Te,d as Ce,L as ke,e as Me,f as Pe,g as Oe,h as Ne,i as h,O as ze}from"./index-5QAOtSTh.js";import{M as Fe}from"./MultiPartProgressBar-BITERKS0.js";import{E as je}from"./EmptyPage-DYH2bswA.js";import{T as W}from"./TitleCard-B4N-kCM3.js";import{V as Ve}from"./ViewLogo-Dd60EREE.js";import{m as I,O as y,a as A,i as u,g,b as _,c as De,V as Le}from"./ViewParamsEditor-BWEYbq_S.js";import{u as Ee}from"./useWindowTitle-b5fN0StF.js";import{S as He}from"./SuperscriptTime-DCTyUARx.js";import{g as Be}from"./presentation.utils-BUIuV_2e.js";import{g as We,h as Ie,s as Ae,a as Re}from"./viewLoader.utils-BPhACxyG.js";import{v as Ze}from"./validateEvent-Bvgk1E-Y.js";import{i as _e}from"./playbackstate-6lBh6omZ.js";import{u as $e}from"./useCustomFields-BuxKsqGS.js";import{u as Ue}from"./useProjectData-CetvEK9E.js";import"./getProgress-CyJTu6f5.js";import"./Empty-BYF0tVRk.js";import"./Select-niU9Razm.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},o=new e.Error().stack;o&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[o]="b9313b80-0af8-4ae6-9609-ab6eceb02d77",e._sentryDebugIdIdentifier="sentry-dbid-b9313b80-0af8-4ae6-9609-ab6eceb02d77")}catch{}})();const Ke=(e,o,t)=>{for(;e<o;){const i=Math.floor((e+o)/2);if(i===e)break;t(i)?e=i:o=i}return e};function R({children:e,mode:o="multi",min:t=16,max:i=256,...n}){const d=p.useRef(null),a=p.useCallback(()=>{const s=d.current;return s?s.scrollHeight>s.clientHeight||s.scrollWidth>s.clientWidth:!1},[]),l=p.useCallback(()=>{const s=d.current;if(!s)return;const c=s.style.visibility;s.style.visibility="hidden";const f=Ke(t,i+1,v=>(s.style.fontSize=`${v}px`,!a()));s.style.fontSize=`${f}px`,s.style.visibility=c},[a,t,i]);return p.useEffect(()=>{const s=d.current;if(!s)return;l();const c=new ResizeObserver(l);return c.observe(s),()=>c.disconnect()},[e,o,l]),r.jsx("div",{ref:d,style:{whiteSpace:o==="single"?"nowrap":"normal"},...n,children:e})}const Qe=[{value:"no-overrides",label:"No Overrides"},{value:m.CountUp,label:"Count Up"},{value:m.CountDown,label:"Count Down"},{value:m.Clock,label:"Clock"}],qe=(e,o)=>{const t=I(o,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),i=I(o,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]);return[{title:y.ClockOptions,collapsible:!0,options:[We(e)]},{title:y.TimerOptions,collapsible:!0,options:[Ie,Ae,{id:"timerType",title:"Timer type",description:"Override the timer type",type:"option",values:Qe,defaultValue:"no-overrides"},{id:"freezeOvertime",title:"Freeze Overtime",description:"If active, the timer will not count into negative numbers",type:"boolean",defaultValue:!1},{id:"freezeMessage",title:"Freeze Message",description:"An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)",type:"string",defaultValue:"",placeholder:"e.g. Time is up!"},{id:"hidePhase",title:"Hide progress styles",description:"Whether to suppress the progress styles (warning, danger and overtime)",type:"boolean",defaultValue:!1}]},{title:y.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:t,defaultValue:"title"},{id:"secondary-src",title:"Secondary text",description:"Select the data source for the secondary text",type:"option",values:i,defaultValue:"none"}]},{title:y.ElementVisibility,collapsible:!0,options:[{id:"hideClock",title:"Hide Time Now",description:"Hides the Time Now field",type:"boolean",defaultValue:!1},{id:"hideCards",title:"Hide Cards",description:"Hides the Now and Next cards",type:"boolean",defaultValue:!1},{id:"hideProgress",title:"Hide progress bar",description:"Hides the progress bar",type:"boolean",defaultValue:!1},{id:"hideMessage",title:"Hide Timer Message",description:"Prevents displaying fullscreen messages in the timer",type:"boolean",defaultValue:!1},{id:"hideSecondary",title:"Hide Auxiliary timer / Secondary message",description:"Prevents the screen from displaying the secondary timer field",type:"boolean",defaultValue:!1},{id:"hideLogo",title:"Hide the project logo",description:"Prevents the screen from displaying the given project logo",type:"boolean",defaultValue:!1}]},{title:y.StyleOverride,collapsible:!0,options:[{id:"font",title:"Font",description:"Font family, will use the fonts available in the system",type:"string",placeholder:"Open Sans (default)"},{id:"keyColour",title:"Key Colour",description:"Background or key colour for entire view. Default: #101010",type:"colour",defaultValue:"101010"},{id:"timerColour",title:"Timer Colour",description:"Timer colour. Default: #f6f6f6",type:"colour",defaultValue:"f6f6f6"}]}]};function Ge(e,o){const t=n=>(o==null?void 0:o.get(n))??e.get(n),i=Ze(t("timerType"),m.None);return{hideClock:u(t("hideClock")),hideCards:u(t("hideCards")),hideProgress:u(t("hideProgress")),hideMessage:u(t("hideMessage")),hideSecondary:u(t("hideSecondary")),hideLogo:u(t("hideLogo")),hideTimerSeconds:u(t("hideTimerSeconds")),removeLeadingZeros:!u(t("showLeadingZeros")),mainSource:t("main"),secondarySource:t("secondary-src"),timerType:i===m.None?void 0:i,freezeOvertime:u(t("freezeOvertime")),freezeMessage:t("freezeMessage")??"",hidePhase:u(t("hidePhase")),font:t("font")??void 0,keyColour:A(t("keyColour")),timerColour:A(t("timerColour"))}}function Je(){const[e]=be(),o=p.use(xe);return p.useMemo(()=>{const i=o?new URLSearchParams(o.search):void 0;return Ge(e,i)},[o,e])}function Xe(e){return e.text!==""&&e.visible}function Ye(e){return e===C.Play||e===C.Roll}function et(e,o){return(e??0)+(o??0)}function tt(e){return e!==m.None&&e!==m.Clock}function ot(e){return e!==m.Clock}const Z={4:28,5:28,6:25,8:18,9:18};function it(e,o){const t=e.length;let i=100/(t-1)*1.25;Z[t]&&(i=Z[t]);let n=i*.325;return o&&(i*=.6,o.length>25&&(n=100/(o.length-1)*1.8)),{timerFontSize:i,externalFontSize:n}}function st(e,o,t,i,n,d){return d?{showEndMessage:!1,showFinished:!1,showWarning:!1,showDanger:!1}:e===m.CountDown||o?{showEndMessage:i&&n!=="",showFinished:t===w.Overtime,showWarning:t===w.Warning,showDanger:t===w.Danger}:{showEndMessage:!1,showFinished:!1,showWarning:!1,showDanger:!1}}function rt(e,o,t,i,n,d){if(!d){if(e.timer.secondarySource==="aux1"||e.timer.secondarySource==="aux2"||e.timer.secondarySource==="aux3")return _(o,m.CountDown,t,{removeSeconds:i,removeLeadingZero:n});if(e.timer.secondarySource==="secondary"&&e.secondary)return e.secondary}}function nt(e,o,t,i,n,d){if(n===C.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const a=_e(n)&&d!==w.Pending,l=a?g(e,t??"title"):void 0,s=a?g(e,i):void 0,c=a?g(o,t??"title"):g(e,t??"title"),f=a?g(o,i):g(e,i);return{showNow:!!l||!!s,nowMain:l,nowSecondary:s,showNext:!!c||!!f,nextMain:c,nextSecondary:f}}function at(){const e=Se(c=>c.mirror),{data:o,status:t}=Ue(),{data:i,status:n}=Te(),{data:d,status:a}=Ce(),{data:l,status:s}=$e();return{data:{customFields:l,projectData:o,isMirrored:e,settings:d,viewSettings:i},status:Re([t,n,a,s])}}function Pt(){const{data:e,status:o}=at();return Ee("Timer"),o==="pending"?r.jsx(ke,{}):o==="error"?r.jsx(je,{text:"There was an error fetching data, please refresh the page."}):r.jsx(lt,{...e})}function lt({customFields:e,projectData:o,isMirrored:t,settings:i,viewSettings:n}){const{eventNext:d,eventNow:a,message:l,time:s,clock:c,timerTypeNow:f,countToEndNow:v,auxTimer:b}=Me(),{hideClock:$,hideCards:U,hideProgress:K,hideMessage:Q,hideSecondary:q,hideLogo:G,hideTimerSeconds:k,removeLeadingZeros:M,mainSource:J,secondarySource:X,timerType:P,freezeOvertime:O,freezeMessage:N,hidePhase:Y,font:z,keyColour:F,timerColour:ee}=Je(),{getLocalizedString:j}=Pe(),V=j("common.minutes"),x=P??f,D=Xe(l.timer),{showEndMessage:te,showFinished:S,showWarning:oe,showDanger:ie}=st(f,v,s.phase,O,N,Y),L=Ye(s.playback),se=!$&&ot(x),re=!K&&tt(x),{showNow:ne,nowMain:ae,nowSecondary:le,showNext:de,nextMain:ce,nextSecondary:ue}=nt(a,d,J,X,s.playback,s.phase),me=et(s.duration,s.addedTime),fe=Oe(c),he=De(O,f,v,c,s,P),E=_(he,x,V,{removeSeconds:k,removeLeadingZero:M}),pe=l.timer.secondarySource==="aux1"?b.aux1:l.timer.secondarySource==="aux2"?b.aux2:l.timer.secondarySource==="aux3"?b.aux3:null,T=rt(l,pe,V,k,M,q),H=Be(n,ee,oe,ie),{timerFontSize:ge,externalFontSize:ye}=it(E,T),ve={...F&&{"--timer-bg":F},...H&&{"--timer-colour":H},...z&&{"--timer-font":z}},B=Ne(i==null?void 0:i.timeFormat),we=p.useMemo(()=>qe(B,e),[e,B]);return r.jsxs("div",{"data-testid":"timer-view",className:h(["stage-timer",t&&"mirror",S&&"stage-timer--finished"]),style:ve,children:[!G&&(o==null?void 0:o.logo)&&r.jsx(Ve,{name:o.logo,className:"logo"}),r.jsx(Le,{target:ze.Timer,viewOptions:we}),r.jsx("div",{className:h(["blackout",l.timer.blackout&&"blackout--active"])}),!Q&&r.jsx("div",{className:h(["message-overlay",D&&"message-overlay--active"]),children:r.jsx(R,{mode:"multi",min:32,max:256,className:h(["message",l.timer.blink&&"blink"]),children:l.timer.text})}),se&&r.jsxs("div",{className:"clock-container",children:[r.jsx("div",{className:"label",children:j("common.time_now")}),r.jsx(He,{time:fe,className:"clock"})]}),r.jsxs("div",{className:h(["timer-container",l.timer.blink&&!D&&"blink"]),children:[te?r.jsx(R,{mode:"multi",min:64,max:256,className:"end-message",children:N}):r.jsx("div",{className:h(["timer",!L&&"timer--paused",S&&"timer--finished"]),style:{fontSize:`${ge}vw`},"data-phase":s.phase,children:E}),r.jsx("div",{className:h(["secondary",!T&&"secondary--hidden"]),style:{fontSize:`${ye}vw`},children:T})]}),re&&r.jsx(Fe,{className:h(["progress-container",!L&&"progress-container--paused"]),now:s.current,complete:me,normalColor:n.normalColor,warning:a==null?void 0:a.timeWarning,warningColor:n.warningColor,danger:a==null?void 0:a.timeDanger,dangerColor:n.dangerColor,hideOvertime:!S}),!U&&r.jsxs(r.Fragment,{children:[ne&&r.jsx(W,{className:"event now",label:"now",title:ae,secondary:le}),de&&r.jsx(W,{className:"event next",label:"next",title:ce,secondary:ue})]})]})}export{Pt as default};
2
- //# sourceMappingURL=Timer-Bs450x86.js.map
Binary file
Binary file