@getontime/cli 4.2.0 → 4.3.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 (481) hide show
  1. package/client/assets/Backstage-CDH53Q_N.js +2 -0
  2. package/client/assets/Backstage-CDH53Q_N.js.br +0 -0
  3. package/client/assets/Backstage-CDH53Q_N.js.gz +0 -0
  4. package/client/assets/Backstage-CDH53Q_N.js.map +1 -0
  5. package/client/assets/Countdown-B-MuMf1C.js +2 -0
  6. package/client/assets/Countdown-B-MuMf1C.js.br +0 -0
  7. package/client/assets/Countdown-B-MuMf1C.js.gz +0 -0
  8. package/client/assets/Countdown-B-MuMf1C.js.map +1 -0
  9. package/client/assets/CustomTranslationModal-DiQbmcgD.js +2 -0
  10. package/client/assets/CustomTranslationModal-DiQbmcgD.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-DiQbmcgD.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-CJ9-aDjl.js.map → CustomTranslationModal-DiQbmcgD.js.map} +1 -1
  13. package/client/assets/DelayIndicator-D--91EO3.js +2 -0
  14. package/client/assets/DelayIndicator-D--91EO3.js.br +0 -0
  15. package/client/assets/DelayIndicator-D--91EO3.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-F4GdgsGh.js.map → DelayIndicator-D--91EO3.js.map} +1 -1
  17. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js +2 -0
  18. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-eIpSr_UK.js.map → EditorFeatureWrapper-DwXUAV4k.js.map} +1 -1
  21. package/client/assets/EditorUtils-DuKjlUkF.js +2 -0
  22. package/client/assets/EditorUtils-DuKjlUkF.js.br +0 -0
  23. package/client/assets/EditorUtils-DuKjlUkF.js.gz +0 -0
  24. package/client/assets/{EditorUtils-Bd3J5Dvf.js.map → EditorUtils-DuKjlUkF.js.map} +1 -1
  25. package/client/assets/EditorUtils-L4Sg72o_.css +1 -0
  26. package/client/assets/EditorUtils-L4Sg72o_.css.br +0 -0
  27. package/client/assets/EditorUtils-L4Sg72o_.css.gz +0 -0
  28. package/client/assets/Empty-CJbZxh45.js +2 -0
  29. package/client/assets/Empty-CJbZxh45.js.br +0 -0
  30. package/client/assets/Empty-CJbZxh45.js.gz +0 -0
  31. package/client/assets/{Empty-C0IdV_kI.js.map → Empty-CJbZxh45.js.map} +1 -1
  32. package/client/assets/EmptyPage-Bc358YpE.js +2 -0
  33. package/client/assets/EmptyPage-Bc358YpE.js.br +5 -0
  34. package/client/assets/EmptyPage-Bc358YpE.js.gz +0 -0
  35. package/client/assets/{EmptyPage-Ct3d0DqJ.js.map → EmptyPage-Bc358YpE.js.map} +1 -1
  36. package/client/assets/FollowButton-C6Fvaqh0.js +2 -0
  37. package/client/assets/FollowButton-C6Fvaqh0.js.br +0 -0
  38. package/client/assets/FollowButton-C6Fvaqh0.js.gz +0 -0
  39. package/client/assets/{FollowButton-BG-ycRWu.js.map → FollowButton-C6Fvaqh0.js.map} +1 -1
  40. package/client/assets/MessageControlExport-D_pNX6Vj.css +1 -0
  41. package/client/assets/MessageControlExport-D_pNX6Vj.css.br +0 -0
  42. package/client/assets/MessageControlExport-D_pNX6Vj.css.gz +0 -0
  43. package/client/assets/MessageControlExport-GmOrvUik.js +3 -0
  44. package/client/assets/MessageControlExport-GmOrvUik.js.br +0 -0
  45. package/client/assets/MessageControlExport-GmOrvUik.js.gz +0 -0
  46. package/client/assets/MessageControlExport-GmOrvUik.js.map +1 -0
  47. package/client/assets/MilestoneEditor-BA0PVIQh.js +2 -0
  48. package/client/assets/MilestoneEditor-BA0PVIQh.js.br +0 -0
  49. package/client/assets/MilestoneEditor-BA0PVIQh.js.gz +0 -0
  50. package/client/assets/MilestoneEditor-BA0PVIQh.js.map +1 -0
  51. package/client/assets/Modal-BKx0PDGT.js +2 -0
  52. package/client/assets/Modal-BKx0PDGT.js.br +0 -0
  53. package/client/assets/Modal-BKx0PDGT.js.gz +0 -0
  54. package/client/assets/Modal-BKx0PDGT.js.map +1 -0
  55. package/client/assets/{MultiPartProgressBar-Cmw-gisu.js → MultiPartProgressBar-BXdLxJpy.js} +2 -2
  56. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.br +0 -0
  57. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.gz +0 -0
  58. package/client/assets/{MultiPartProgressBar-Cmw-gisu.js.map → MultiPartProgressBar-BXdLxJpy.js.map} +1 -1
  59. package/client/assets/OperatorExport-CA5WcIt5.css +1 -0
  60. package/client/assets/OperatorExport-CA5WcIt5.css.br +0 -0
  61. package/client/assets/OperatorExport-CA5WcIt5.css.gz +0 -0
  62. package/client/assets/OperatorExport-X7-qi2jv.js +2 -0
  63. package/client/assets/OperatorExport-X7-qi2jv.js.br +0 -0
  64. package/client/assets/OperatorExport-X7-qi2jv.js.gz +0 -0
  65. package/client/assets/OperatorExport-X7-qi2jv.js.map +1 -0
  66. package/client/assets/OverviewWrapper-BQb2xl_N.js +2 -0
  67. package/client/assets/OverviewWrapper-BQb2xl_N.js.br +0 -0
  68. package/client/assets/OverviewWrapper-BQb2xl_N.js.gz +0 -0
  69. package/client/assets/OverviewWrapper-BQb2xl_N.js.map +1 -0
  70. package/client/assets/PipHost-CvtlZIn7.js +2 -0
  71. package/client/assets/PipHost-CvtlZIn7.js.br +0 -0
  72. package/client/assets/PipHost-CvtlZIn7.js.gz +0 -0
  73. package/client/assets/PipHost-CvtlZIn7.js.map +1 -0
  74. package/client/assets/PipHost-DEhjTbGT.css +1 -0
  75. package/client/assets/PipHost-DEhjTbGT.css.br +0 -0
  76. package/client/assets/PipHost-DEhjTbGT.css.gz +0 -0
  77. package/client/assets/ProjectInfo-1tw48NHZ.js +2 -0
  78. package/client/assets/ProjectInfo-1tw48NHZ.js.br +0 -0
  79. package/client/assets/ProjectInfo-1tw48NHZ.js.gz +0 -0
  80. package/client/assets/{ProjectInfo-BduQgjcz.js.map → ProjectInfo-1tw48NHZ.js.map} +1 -1
  81. package/client/assets/ProtectRoute-BH-QvsU0.js +2 -0
  82. package/client/assets/ProtectRoute-BH-QvsU0.js.br +0 -0
  83. package/client/assets/ProtectRoute-BH-QvsU0.js.gz +0 -0
  84. package/client/assets/{ProtectRoute-Ci_AIozP.js.map → ProtectRoute-BH-QvsU0.js.map} +1 -1
  85. package/client/assets/ProtectedCuesheet-CYBIcg1c.js +2 -0
  86. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.br +0 -0
  87. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.gz +0 -0
  88. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.map +1 -0
  89. package/client/assets/ProtectedCuesheet-DPO7xYMb.css +1 -0
  90. package/client/assets/ProtectedCuesheet-DPO7xYMb.css.br +0 -0
  91. package/client/assets/ProtectedCuesheet-DPO7xYMb.css.gz +0 -0
  92. package/client/assets/{ProtectedEditor-Dw0pWw0J.css → ProtectedEditor-BtSuTFlT.css} +1 -1
  93. package/client/assets/ProtectedEditor-BtSuTFlT.css.br +0 -0
  94. package/client/assets/{ProtectedEditor-Dw0pWw0J.css.gz → ProtectedEditor-BtSuTFlT.css.gz} +0 -0
  95. package/client/assets/ProtectedEditor-D_A75byA.js +3 -0
  96. package/client/assets/ProtectedEditor-D_A75byA.js.br +0 -0
  97. package/client/assets/ProtectedEditor-D_A75byA.js.gz +0 -0
  98. package/client/assets/ProtectedEditor-D_A75byA.js.map +1 -0
  99. package/client/assets/RundownEntry-bkqwx57t.js +2 -0
  100. package/client/assets/RundownEntry-bkqwx57t.js.br +0 -0
  101. package/client/assets/RundownEntry-bkqwx57t.js.gz +0 -0
  102. package/client/assets/RundownEntry-bkqwx57t.js.map +1 -0
  103. package/client/assets/{RundownExport-DtSvAfBG.css → RundownExport-Bgtg_idR.css} +1 -1
  104. package/client/assets/RundownExport-Bgtg_idR.css.br +0 -0
  105. package/client/assets/RundownExport-Bgtg_idR.css.gz +0 -0
  106. package/client/assets/RundownExport-EorsanA0.js +3 -0
  107. package/client/assets/RundownExport-EorsanA0.js.br +0 -0
  108. package/client/assets/RundownExport-EorsanA0.js.gz +0 -0
  109. package/client/assets/RundownExport-EorsanA0.js.map +1 -0
  110. package/client/assets/Select-BGGVCKqU.js +2 -0
  111. package/client/assets/Select-BGGVCKqU.js.br +0 -0
  112. package/client/assets/Select-BGGVCKqU.js.gz +0 -0
  113. package/client/assets/Select-BGGVCKqU.js.map +1 -0
  114. package/client/assets/Studio-BjNZ4l-W.js +2 -0
  115. package/client/assets/Studio-BjNZ4l-W.js.br +0 -0
  116. package/client/assets/Studio-BjNZ4l-W.js.gz +0 -0
  117. package/client/assets/Studio-BjNZ4l-W.js.map +1 -0
  118. package/client/assets/StyleEditor-CpciRLYh.js +2 -0
  119. package/client/assets/StyleEditor-CpciRLYh.js.br +0 -0
  120. package/client/assets/StyleEditor-CpciRLYh.js.gz +0 -0
  121. package/client/assets/{StyleEditor-BvcE8dkA.js.map → StyleEditor-CpciRLYh.js.map} +1 -1
  122. package/client/assets/SuperscriptPeriod-DsPdWN_s.js +2 -0
  123. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.br +0 -0
  124. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.gz +0 -0
  125. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.map +1 -0
  126. package/client/assets/SuperscriptTime-CA6S2R55.js +2 -0
  127. package/client/assets/SuperscriptTime-CA6S2R55.js.br +0 -0
  128. package/client/assets/SuperscriptTime-CA6S2R55.js.gz +0 -0
  129. package/client/assets/SuperscriptTime-CA6S2R55.js.map +1 -0
  130. package/client/assets/SwatchPicker-Cm5Eicvv.js +2 -0
  131. package/client/assets/SwatchPicker-Cm5Eicvv.js.br +0 -0
  132. package/client/assets/SwatchPicker-Cm5Eicvv.js.gz +0 -0
  133. package/client/assets/SwatchPicker-Cm5Eicvv.js.map +1 -0
  134. package/client/assets/{TimeElements-XpRwBsaa.js → TimeElements-DbclWDbU.js} +2 -2
  135. package/client/assets/TimeElements-DbclWDbU.js.br +0 -0
  136. package/client/assets/TimeElements-DbclWDbU.js.gz +0 -0
  137. package/client/assets/TimeElements-DbclWDbU.js.map +1 -0
  138. package/client/assets/TimeInput-C8DQoFXv.js +2 -0
  139. package/client/assets/TimeInput-C8DQoFXv.js.br +0 -0
  140. package/client/assets/TimeInput-C8DQoFXv.js.gz +0 -0
  141. package/client/assets/{TimeInput-Bu_5GlHP.js.map → TimeInput-C8DQoFXv.js.map} +1 -1
  142. package/client/assets/TimelinePage-Cgtl1qNp.js +2 -0
  143. package/client/assets/TimelinePage-Cgtl1qNp.js.br +0 -0
  144. package/client/assets/TimelinePage-Cgtl1qNp.js.gz +0 -0
  145. package/client/assets/TimelinePage-Cgtl1qNp.js.map +1 -0
  146. package/client/assets/Timer-BbixOGdj.js +2 -0
  147. package/client/assets/Timer-BbixOGdj.js.br +0 -0
  148. package/client/assets/Timer-BbixOGdj.js.gz +0 -0
  149. package/client/assets/Timer-BbixOGdj.js.map +1 -0
  150. package/client/assets/{Timer-B7nk3TMf.css → Timer-Jjolf5Ra.css} +1 -1
  151. package/client/assets/Timer-Jjolf5Ra.css.br +0 -0
  152. package/client/assets/Timer-Jjolf5Ra.css.gz +0 -0
  153. package/client/assets/TimerControlExport-Dx3SSGNG.js +2 -0
  154. package/client/assets/TimerControlExport-Dx3SSGNG.js.br +0 -0
  155. package/client/assets/TimerControlExport-Dx3SSGNG.js.gz +0 -0
  156. package/client/assets/{TimerControlExport-4a3Cd9x8.js.map → TimerControlExport-Dx3SSGNG.js.map} +1 -1
  157. package/client/assets/{TimerControlExport-DavNxY9p.css → TimerControlExport-cJRa5GUp.css} +1 -1
  158. package/client/assets/TimerControlExport-cJRa5GUp.css.br +0 -0
  159. package/client/assets/{TimerControlExport-DavNxY9p.css.gz → TimerControlExport-cJRa5GUp.css.gz} +0 -0
  160. package/client/assets/TitleCard-Xdr7xwzU.js +2 -0
  161. package/client/assets/TitleCard-Xdr7xwzU.js.br +0 -0
  162. package/client/assets/TitleCard-Xdr7xwzU.js.gz +0 -0
  163. package/client/assets/{TitleCard-1U35ek0D.js.map → TitleCard-Xdr7xwzU.js.map} +1 -1
  164. package/client/assets/Tooltip-B5vsLcFu.js +2 -0
  165. package/client/assets/Tooltip-B5vsLcFu.js.br +0 -0
  166. package/client/assets/Tooltip-B5vsLcFu.js.gz +0 -0
  167. package/client/assets/Tooltip-B5vsLcFu.js.map +1 -0
  168. package/client/assets/ViewLogo-G7EosFIr.js +2 -0
  169. package/client/assets/ViewLogo-G7EosFIr.js.br +0 -0
  170. package/client/assets/ViewLogo-G7EosFIr.js.gz +0 -0
  171. package/client/assets/{ViewLogo-BHsV7Faa.js.map → ViewLogo-G7EosFIr.js.map} +1 -1
  172. package/client/assets/ViewParamsEditor-C2-TRP6e.js +2 -0
  173. package/client/assets/ViewParamsEditor-C2-TRP6e.js.br +0 -0
  174. package/client/assets/ViewParamsEditor-C2-TRP6e.js.gz +0 -0
  175. package/client/assets/ViewParamsEditor-C2-TRP6e.js.map +1 -0
  176. package/client/assets/dateConfig-D7xim1t4.js +2 -0
  177. package/client/assets/dateConfig-D7xim1t4.js.br +0 -0
  178. package/client/assets/dateConfig-D7xim1t4.js.gz +0 -0
  179. package/client/assets/dateConfig-D7xim1t4.js.map +1 -0
  180. package/client/assets/editorSettings-D2f7e1a6.js +2 -0
  181. package/client/assets/editorSettings-D2f7e1a6.js.br +0 -0
  182. package/client/assets/editorSettings-D2f7e1a6.js.gz +0 -0
  183. package/client/assets/{editorSettings-DH9ca-nB.js.map → editorSettings-D2f7e1a6.js.map} +1 -1
  184. package/client/assets/{getProgress-DlrSzpnf.js → getProgress-cLuBFPjh.js} +2 -2
  185. package/client/assets/getProgress-cLuBFPjh.js.br +0 -0
  186. package/client/assets/getProgress-cLuBFPjh.js.gz +0 -0
  187. package/client/assets/{getProgress-DlrSzpnf.js.map → getProgress-cLuBFPjh.js.map} +1 -1
  188. package/client/assets/index-B81u4hxi.js +3 -0
  189. package/client/assets/index-B81u4hxi.js.br +0 -0
  190. package/client/assets/index-B81u4hxi.js.gz +0 -0
  191. package/client/assets/index-B81u4hxi.js.map +1 -0
  192. package/client/assets/{index-BuJoGGff.css → index-D6S93MXv.css} +1 -1
  193. package/client/assets/index-D6S93MXv.css.br +0 -0
  194. package/client/assets/index-D6S93MXv.css.gz +0 -0
  195. package/client/assets/{offset-CLG4o744.js → offset-R98EXhWK.js} +2 -2
  196. package/client/assets/offset-R98EXhWK.js.br +0 -0
  197. package/client/assets/offset-R98EXhWK.js.gz +0 -0
  198. package/client/assets/{offset-CLG4o744.js.map → offset-R98EXhWK.js.map} +1 -1
  199. package/client/assets/parseUserTime-YeFR8t3F.js +2 -0
  200. package/client/assets/parseUserTime-YeFR8t3F.js.br +0 -0
  201. package/client/assets/parseUserTime-YeFR8t3F.js.gz +0 -0
  202. package/client/assets/{parseUserTime-Cp5iWS7y.js.map → parseUserTime-YeFR8t3F.js.map} +1 -1
  203. package/client/assets/{playbackstate-B3BKJ8cT.js → playbackstate-CPQdnF-k.js} +2 -2
  204. package/client/assets/playbackstate-CPQdnF-k.js.br +0 -0
  205. package/client/assets/playbackstate-CPQdnF-k.js.gz +0 -0
  206. package/client/assets/{playbackstate-B3BKJ8cT.js.map → playbackstate-CPQdnF-k.js.map} +1 -1
  207. package/client/assets/{presentation.utils-B-wIv_a5.js → presentation.utils-Cl-L3pHN.js} +2 -2
  208. package/client/assets/presentation.utils-Cl-L3pHN.js.br +0 -0
  209. package/client/assets/presentation.utils-Cl-L3pHN.js.gz +0 -0
  210. package/client/assets/{presentation.utils-B-wIv_a5.js.map → presentation.utils-Cl-L3pHN.js.map} +1 -1
  211. package/client/assets/{rundownUtils-DJKMt8Ih.js → rundownUtils-CtVGQDQn.js} +2 -2
  212. package/client/assets/rundownUtils-CtVGQDQn.js.br +0 -0
  213. package/client/assets/rundownUtils-CtVGQDQn.js.gz +0 -0
  214. package/client/assets/{rundownUtils-DJKMt8Ih.js.map → rundownUtils-CtVGQDQn.js.map} +1 -1
  215. package/client/assets/timer.utils-rGyI9NYa.js +2 -0
  216. package/client/assets/timer.utils-rGyI9NYa.js.br +0 -0
  217. package/client/assets/timer.utils-rGyI9NYa.js.gz +0 -0
  218. package/client/assets/timer.utils-rGyI9NYa.js.map +1 -0
  219. package/client/assets/useCustomFields-k4piRt9n.js +2 -0
  220. package/client/assets/useCustomFields-k4piRt9n.js.br +0 -0
  221. package/client/assets/useCustomFields-k4piRt9n.js.gz +0 -0
  222. package/client/assets/{useCustomFields-BUJkzZvM.js.map → useCustomFields-k4piRt9n.js.map} +1 -1
  223. package/client/assets/useFollowComponent-B7vvPzG2.js +2 -0
  224. package/client/assets/useFollowComponent-B7vvPzG2.js.br +0 -0
  225. package/client/assets/useFollowComponent-B7vvPzG2.js.gz +0 -0
  226. package/client/assets/{useFollowComponent-Eyo4hWVG.js.map → useFollowComponent-B7vvPzG2.js.map} +1 -1
  227. package/client/assets/useProjectData-DdgKoYzk.js +2 -0
  228. package/client/assets/useProjectData-DdgKoYzk.js.br +0 -0
  229. package/client/assets/useProjectData-DdgKoYzk.js.gz +0 -0
  230. package/client/assets/useProjectData-DdgKoYzk.js.map +1 -0
  231. package/client/assets/useReport-DSuFnUb9.js +2 -0
  232. package/client/assets/useReport-DSuFnUb9.js.br +0 -0
  233. package/client/assets/useReport-DSuFnUb9.js.gz +0 -0
  234. package/client/assets/{useReport-BUCsRa2T.js.map → useReport-DSuFnUb9.js.map} +1 -1
  235. package/client/assets/useRundown-Bn6ZPsz0.js +2 -0
  236. package/client/assets/useRundown-Bn6ZPsz0.js.br +0 -0
  237. package/client/assets/useRundown-Bn6ZPsz0.js.gz +0 -0
  238. package/client/assets/useRundown-Bn6ZPsz0.js.map +1 -0
  239. package/client/assets/useWindowTitle-Bpmo_HzW.js +2 -0
  240. package/client/assets/useWindowTitle-Bpmo_HzW.js.br +0 -0
  241. package/client/assets/useWindowTitle-Bpmo_HzW.js.gz +0 -0
  242. package/client/assets/useWindowTitle-Bpmo_HzW.js.map +1 -0
  243. package/client/assets/{validateEvent-3adKsP1N.js → validateEvent-Do8yE_DJ.js} +2 -2
  244. package/client/assets/validateEvent-Do8yE_DJ.js.br +3 -0
  245. package/client/assets/validateEvent-Do8yE_DJ.js.gz +0 -0
  246. package/client/assets/{validateEvent-3adKsP1N.js.map → validateEvent-Do8yE_DJ.js.map} +1 -1
  247. package/client/assets/vendor-q6fv0YT2.js +74 -0
  248. package/client/assets/vendor-q6fv0YT2.js.br +0 -0
  249. package/client/assets/vendor-q6fv0YT2.js.gz +0 -0
  250. package/client/assets/{vendor-BoH5HFNN.js.map → vendor-q6fv0YT2.js.map} +1 -1
  251. package/client/assets/{viewLoader.utils-BPOG1xso.js → viewLoader.utils-b42scp-I.js} +2 -2
  252. package/client/assets/viewLoader.utils-b42scp-I.js.br +0 -0
  253. package/client/assets/viewLoader.utils-b42scp-I.js.gz +0 -0
  254. package/client/assets/{viewLoader.utils-BPOG1xso.js.map → viewLoader.utils-b42scp-I.js.map} +1 -1
  255. package/client/assets/viewUtils-B8Dr4GHH.js +2 -0
  256. package/client/assets/viewUtils-B8Dr4GHH.js.br +0 -0
  257. package/client/assets/viewUtils-B8Dr4GHH.js.gz +0 -0
  258. package/client/assets/viewUtils-B8Dr4GHH.js.map +1 -0
  259. package/client/index.html +3 -3
  260. package/package.json +1 -1
  261. package/server/index.cjs +92 -92
  262. package/client/assets/Backstage-DG-hwPI3.js +0 -2
  263. package/client/assets/Backstage-DG-hwPI3.js.br +0 -0
  264. package/client/assets/Backstage-DG-hwPI3.js.gz +0 -0
  265. package/client/assets/Backstage-DG-hwPI3.js.map +0 -1
  266. package/client/assets/Countdown-C8LGl1pp.js +0 -2
  267. package/client/assets/Countdown-C8LGl1pp.js.br +0 -0
  268. package/client/assets/Countdown-C8LGl1pp.js.gz +0 -0
  269. package/client/assets/Countdown-C8LGl1pp.js.map +0 -1
  270. package/client/assets/CustomTranslationModal-CJ9-aDjl.js +0 -2
  271. package/client/assets/CustomTranslationModal-CJ9-aDjl.js.br +0 -0
  272. package/client/assets/CustomTranslationModal-CJ9-aDjl.js.gz +0 -0
  273. package/client/assets/DelayIndicator-F4GdgsGh.js +0 -2
  274. package/client/assets/DelayIndicator-F4GdgsGh.js.br +0 -0
  275. package/client/assets/DelayIndicator-F4GdgsGh.js.gz +0 -0
  276. package/client/assets/Editor-B_NlyOLw.css +0 -1
  277. package/client/assets/Editor-B_NlyOLw.css.br +0 -0
  278. package/client/assets/Editor-B_NlyOLw.css.gz +0 -0
  279. package/client/assets/Editor.module-DvV2efYs.js +0 -2
  280. package/client/assets/Editor.module-DvV2efYs.js.br +0 -0
  281. package/client/assets/Editor.module-DvV2efYs.js.gz +0 -0
  282. package/client/assets/Editor.module-DvV2efYs.js.map +0 -1
  283. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js +0 -2
  284. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.br +0 -0
  285. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.gz +0 -0
  286. package/client/assets/EditorUtils-Bd3J5Dvf.js +0 -2
  287. package/client/assets/EditorUtils-Bd3J5Dvf.js.br +0 -0
  288. package/client/assets/EditorUtils-Bd3J5Dvf.js.gz +0 -0
  289. package/client/assets/EditorUtils-CgF7UfHP.css +0 -1
  290. package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
  291. package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
  292. package/client/assets/Empty-C0IdV_kI.js +0 -2
  293. package/client/assets/Empty-C0IdV_kI.js.br +0 -0
  294. package/client/assets/Empty-C0IdV_kI.js.gz +0 -0
  295. package/client/assets/EmptyPage-Ct3d0DqJ.js +0 -2
  296. package/client/assets/EmptyPage-Ct3d0DqJ.js.br +0 -0
  297. package/client/assets/EmptyPage-Ct3d0DqJ.js.gz +0 -0
  298. package/client/assets/FollowButton-BG-ycRWu.js +0 -2
  299. package/client/assets/FollowButton-BG-ycRWu.js.br +0 -0
  300. package/client/assets/FollowButton-BG-ycRWu.js.gz +0 -0
  301. package/client/assets/MessageControlExport-DjoUioWA.css +0 -1
  302. package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
  303. package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
  304. package/client/assets/MessageControlExport-X-4dl9QT.js +0 -3
  305. package/client/assets/MessageControlExport-X-4dl9QT.js.br +0 -0
  306. package/client/assets/MessageControlExport-X-4dl9QT.js.gz +0 -0
  307. package/client/assets/MessageControlExport-X-4dl9QT.js.map +0 -1
  308. package/client/assets/MilestoneEditor-rgBQSXVU.js +0 -2
  309. package/client/assets/MilestoneEditor-rgBQSXVU.js.br +0 -0
  310. package/client/assets/MilestoneEditor-rgBQSXVU.js.gz +0 -0
  311. package/client/assets/MilestoneEditor-rgBQSXVU.js.map +0 -1
  312. package/client/assets/Modal-Bn1bZkwb.js +0 -2
  313. package/client/assets/Modal-Bn1bZkwb.js.br +0 -0
  314. package/client/assets/Modal-Bn1bZkwb.js.gz +0 -0
  315. package/client/assets/Modal-Bn1bZkwb.js.map +0 -1
  316. package/client/assets/MultiPartProgressBar-Cmw-gisu.js.br +0 -0
  317. package/client/assets/MultiPartProgressBar-Cmw-gisu.js.gz +0 -0
  318. package/client/assets/OperatorExport-BiBcgVKc.css +0 -1
  319. package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
  320. package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
  321. package/client/assets/OperatorExport-CJd8jmY4.js +0 -2
  322. package/client/assets/OperatorExport-CJd8jmY4.js.br +0 -0
  323. package/client/assets/OperatorExport-CJd8jmY4.js.gz +0 -0
  324. package/client/assets/OperatorExport-CJd8jmY4.js.map +0 -1
  325. package/client/assets/OverviewWrapper-1Vj3_ojX.js +0 -2
  326. package/client/assets/OverviewWrapper-1Vj3_ojX.js.br +0 -0
  327. package/client/assets/OverviewWrapper-1Vj3_ojX.js.gz +0 -0
  328. package/client/assets/OverviewWrapper-1Vj3_ojX.js.map +0 -1
  329. package/client/assets/PipHost-BUF7n-lT.css +0 -1
  330. package/client/assets/PipHost-BUF7n-lT.css.br +0 -0
  331. package/client/assets/PipHost-BUF7n-lT.css.gz +0 -0
  332. package/client/assets/PipHost-D7liNR4M.js +0 -2
  333. package/client/assets/PipHost-D7liNR4M.js.br +0 -0
  334. package/client/assets/PipHost-D7liNR4M.js.gz +0 -0
  335. package/client/assets/PipHost-D7liNR4M.js.map +0 -1
  336. package/client/assets/ProjectInfo-BduQgjcz.js +0 -2
  337. package/client/assets/ProjectInfo-BduQgjcz.js.br +0 -0
  338. package/client/assets/ProjectInfo-BduQgjcz.js.gz +0 -0
  339. package/client/assets/ProtectRoute-Ci_AIozP.js +0 -2
  340. package/client/assets/ProtectRoute-Ci_AIozP.js.br +0 -0
  341. package/client/assets/ProtectRoute-Ci_AIozP.js.gz +0 -0
  342. package/client/assets/ProtectedCuesheet-C_tKodwo.css +0 -1
  343. package/client/assets/ProtectedCuesheet-C_tKodwo.css.br +0 -0
  344. package/client/assets/ProtectedCuesheet-C_tKodwo.css.gz +0 -0
  345. package/client/assets/ProtectedCuesheet-D_zdkwM-.js +0 -2
  346. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.br +0 -0
  347. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.gz +0 -0
  348. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.map +0 -1
  349. package/client/assets/ProtectedEditor-CNL2ig79.js +0 -3
  350. package/client/assets/ProtectedEditor-CNL2ig79.js.br +0 -0
  351. package/client/assets/ProtectedEditor-CNL2ig79.js.gz +0 -0
  352. package/client/assets/ProtectedEditor-CNL2ig79.js.map +0 -1
  353. package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
  354. package/client/assets/RundownEntry-Bs1ombtH.js +0 -2
  355. package/client/assets/RundownEntry-Bs1ombtH.js.br +0 -0
  356. package/client/assets/RundownEntry-Bs1ombtH.js.gz +0 -0
  357. package/client/assets/RundownEntry-Bs1ombtH.js.map +0 -1
  358. package/client/assets/RundownExport-BCT0ybxy.js +0 -3
  359. package/client/assets/RundownExport-BCT0ybxy.js.br +0 -0
  360. package/client/assets/RundownExport-BCT0ybxy.js.gz +0 -0
  361. package/client/assets/RundownExport-BCT0ybxy.js.map +0 -1
  362. package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
  363. package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
  364. package/client/assets/Select-B5xNi_tM.js +0 -2
  365. package/client/assets/Select-B5xNi_tM.js.br +0 -0
  366. package/client/assets/Select-B5xNi_tM.js.gz +0 -0
  367. package/client/assets/Select-B5xNi_tM.js.map +0 -1
  368. package/client/assets/Studio-D4hRKhJ1.js +0 -2
  369. package/client/assets/Studio-D4hRKhJ1.js.br +0 -0
  370. package/client/assets/Studio-D4hRKhJ1.js.gz +0 -0
  371. package/client/assets/Studio-D4hRKhJ1.js.map +0 -1
  372. package/client/assets/StyleEditor-BvcE8dkA.js +0 -2
  373. package/client/assets/StyleEditor-BvcE8dkA.js.br +0 -3
  374. package/client/assets/StyleEditor-BvcE8dkA.js.gz +0 -0
  375. package/client/assets/SuperscriptPeriod-BmHAoSBy.js +0 -2
  376. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.br +0 -0
  377. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.gz +0 -0
  378. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.map +0 -1
  379. package/client/assets/SuperscriptTime-Nou92D8X.js +0 -2
  380. package/client/assets/SuperscriptTime-Nou92D8X.js.br +0 -0
  381. package/client/assets/SuperscriptTime-Nou92D8X.js.gz +0 -0
  382. package/client/assets/SuperscriptTime-Nou92D8X.js.map +0 -1
  383. package/client/assets/TimeElements-XpRwBsaa.js.br +0 -0
  384. package/client/assets/TimeElements-XpRwBsaa.js.gz +0 -0
  385. package/client/assets/TimeElements-XpRwBsaa.js.map +0 -1
  386. package/client/assets/TimeInput-Bu_5GlHP.js +0 -2
  387. package/client/assets/TimeInput-Bu_5GlHP.js.br +0 -0
  388. package/client/assets/TimeInput-Bu_5GlHP.js.gz +0 -0
  389. package/client/assets/TimelinePage-CQqUB1KT.js +0 -2
  390. package/client/assets/TimelinePage-CQqUB1KT.js.br +0 -0
  391. package/client/assets/TimelinePage-CQqUB1KT.js.gz +0 -0
  392. package/client/assets/TimelinePage-CQqUB1KT.js.map +0 -1
  393. package/client/assets/Timer-B7nk3TMf.css.br +0 -0
  394. package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
  395. package/client/assets/Timer-CIr2L3gJ.js +0 -2
  396. package/client/assets/Timer-CIr2L3gJ.js.br +0 -0
  397. package/client/assets/Timer-CIr2L3gJ.js.gz +0 -0
  398. package/client/assets/Timer-CIr2L3gJ.js.map +0 -1
  399. package/client/assets/TimerControlExport-4a3Cd9x8.js +0 -2
  400. package/client/assets/TimerControlExport-4a3Cd9x8.js.br +0 -0
  401. package/client/assets/TimerControlExport-4a3Cd9x8.js.gz +0 -0
  402. package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
  403. package/client/assets/TitleCard-1U35ek0D.js +0 -2
  404. package/client/assets/TitleCard-1U35ek0D.js.br +0 -0
  405. package/client/assets/TitleCard-1U35ek0D.js.gz +0 -0
  406. package/client/assets/Tooltip-B8y25e3n.js +0 -2
  407. package/client/assets/Tooltip-B8y25e3n.js.br +0 -0
  408. package/client/assets/Tooltip-B8y25e3n.js.gz +0 -0
  409. package/client/assets/Tooltip-B8y25e3n.js.map +0 -1
  410. package/client/assets/ViewLogo-BHsV7Faa.js +0 -2
  411. package/client/assets/ViewLogo-BHsV7Faa.js.br +0 -0
  412. package/client/assets/ViewLogo-BHsV7Faa.js.gz +0 -0
  413. package/client/assets/ViewParamsEditor-BMHXOv-K.js +0 -2
  414. package/client/assets/ViewParamsEditor-BMHXOv-K.js.br +0 -0
  415. package/client/assets/ViewParamsEditor-BMHXOv-K.js.gz +0 -0
  416. package/client/assets/ViewParamsEditor-BMHXOv-K.js.map +0 -1
  417. package/client/assets/dateConfig-_BhycZza.js +0 -2
  418. package/client/assets/dateConfig-_BhycZza.js.br +0 -0
  419. package/client/assets/dateConfig-_BhycZza.js.gz +0 -0
  420. package/client/assets/dateConfig-_BhycZza.js.map +0 -1
  421. package/client/assets/editorSettings-DH9ca-nB.js +0 -2
  422. package/client/assets/editorSettings-DH9ca-nB.js.br +0 -0
  423. package/client/assets/editorSettings-DH9ca-nB.js.gz +0 -0
  424. package/client/assets/getProgress-DlrSzpnf.js.br +0 -0
  425. package/client/assets/getProgress-DlrSzpnf.js.gz +0 -0
  426. package/client/assets/index-BuJoGGff.css.br +0 -0
  427. package/client/assets/index-BuJoGGff.css.gz +0 -0
  428. package/client/assets/index-CDBQg2fh.js +0 -3
  429. package/client/assets/index-CDBQg2fh.js.br +0 -0
  430. package/client/assets/index-CDBQg2fh.js.gz +0 -0
  431. package/client/assets/index-CDBQg2fh.js.map +0 -1
  432. package/client/assets/offset-CLG4o744.js.br +0 -0
  433. package/client/assets/offset-CLG4o744.js.gz +0 -0
  434. package/client/assets/parseUserTime-Cp5iWS7y.js +0 -2
  435. package/client/assets/parseUserTime-Cp5iWS7y.js.br +0 -0
  436. package/client/assets/parseUserTime-Cp5iWS7y.js.gz +0 -0
  437. package/client/assets/playbackstate-B3BKJ8cT.js.br +0 -0
  438. package/client/assets/playbackstate-B3BKJ8cT.js.gz +0 -0
  439. package/client/assets/presentation.utils-B-wIv_a5.js.br +0 -0
  440. package/client/assets/presentation.utils-B-wIv_a5.js.gz +0 -0
  441. package/client/assets/rundownUtils-DJKMt8Ih.js.br +0 -0
  442. package/client/assets/rundownUtils-DJKMt8Ih.js.gz +0 -0
  443. package/client/assets/timer.utils-ByC_bcT9.js +0 -2
  444. package/client/assets/timer.utils-ByC_bcT9.js.br +0 -0
  445. package/client/assets/timer.utils-ByC_bcT9.js.gz +0 -0
  446. package/client/assets/timer.utils-ByC_bcT9.js.map +0 -1
  447. package/client/assets/useCustomFields-BUJkzZvM.js +0 -2
  448. package/client/assets/useCustomFields-BUJkzZvM.js.br +0 -2
  449. package/client/assets/useCustomFields-BUJkzZvM.js.gz +0 -0
  450. package/client/assets/useFollowComponent-Eyo4hWVG.js +0 -2
  451. package/client/assets/useFollowComponent-Eyo4hWVG.js.br +0 -0
  452. package/client/assets/useFollowComponent-Eyo4hWVG.js.gz +0 -0
  453. package/client/assets/useProjectData-DGA6K2Zs.js +0 -2
  454. package/client/assets/useProjectData-DGA6K2Zs.js.br +0 -0
  455. package/client/assets/useProjectData-DGA6K2Zs.js.gz +0 -0
  456. package/client/assets/useProjectData-DGA6K2Zs.js.map +0 -1
  457. package/client/assets/useReport-BUCsRa2T.js +0 -2
  458. package/client/assets/useReport-BUCsRa2T.js.br +0 -0
  459. package/client/assets/useReport-BUCsRa2T.js.gz +0 -0
  460. package/client/assets/useRundown-BFae0_bU.js +0 -2
  461. package/client/assets/useRundown-BFae0_bU.js.br +0 -0
  462. package/client/assets/useRundown-BFae0_bU.js.gz +0 -0
  463. package/client/assets/useRundown-BFae0_bU.js.map +0 -1
  464. package/client/assets/useWindowTitle-DU8NlxIu.js +0 -2
  465. package/client/assets/useWindowTitle-DU8NlxIu.js.br +0 -0
  466. package/client/assets/useWindowTitle-DU8NlxIu.js.gz +0 -0
  467. package/client/assets/useWindowTitle-DU8NlxIu.js.map +0 -1
  468. package/client/assets/validateEvent-3adKsP1N.js.br +0 -0
  469. package/client/assets/validateEvent-3adKsP1N.js.gz +0 -0
  470. package/client/assets/vendor-BoH5HFNN.js +0 -75
  471. package/client/assets/vendor-BoH5HFNN.js.br +0 -0
  472. package/client/assets/vendor-BoH5HFNN.js.gz +0 -0
  473. package/client/assets/viewLoader.utils-BPOG1xso.js.br +0 -0
  474. package/client/assets/viewLoader.utils-BPOG1xso.js.gz +0 -0
  475. package/client/assets/viewUtils-DI8_kmUZ.js +0 -2
  476. package/client/assets/viewUtils-DI8_kmUZ.js.br +0 -0
  477. package/client/assets/viewUtils-DI8_kmUZ.js.gz +0 -0
  478. package/client/assets/viewUtils-DI8_kmUZ.js.map +0 -1
  479. /package/client/assets/{useProjectData-Cw1aXCwD.css → SwatchPicker-Cw1aXCwD.css} +0 -0
  480. /package/client/assets/{useProjectData-Cw1aXCwD.css.br → SwatchPicker-Cw1aXCwD.css.br} +0 -0
  481. /package/client/assets/{useProjectData-Cw1aXCwD.css.gz → SwatchPicker-Cw1aXCwD.css.gz} +0 -0
@@ -1,2 +1,2 @@
1
- import{j as e,h as C,b2 as P,b3 as M,b4 as U,b5 as A,b6 as F,b7 as H,b8 as z}from"./vendor-BoH5HFNN.js";import{s as v,m as b,bk as m,A as V,e as d,bl as W,f as h,bm as q,x as w,bn as K,v as B,K as J,y as L,bo as Q,bp as X,bq as Y,br as I,T as E,bs as Z,bt as ee}from"./index-CDBQg2fh.js";import{T as f}from"./Tooltip-B8y25e3n.js";import{v as G}from"./useRundown-BFae0_bU.js";import{a as te,g as ae}from"./offset-CLG4o744.js";import{S as N}from"./SuperscriptPeriod-BmHAoSBy.js";import{i as g}from"./playbackstate-B3BKJ8cT.js";(function(){try{var a=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new a.Error().stack;n&&(a._sentryDebugIds=a._sentryDebugIds||{},a._sentryDebugIds[n]="9906ee58-be5e-4ed8-8d2f-9365abefa0d1",a._sentryDebugIdIdentifier="sentry-dbid-9906ee58-be5e-4ed8-8d2f-9365abefa0d1")}catch{}})();function S(a,n=3,s,l="due"){return a!==null&&a<=0?l:se(a,n,s)}function se(a,n=3,s){return b(a,{fallback:n===3?m:V,direction:s})}function R(a){return a!==null&&a>v?[a%v,Math.floor(a/v)]:[a,0]}const ne="_label_1ahsu_18",le="_clock_1ahsu_23",re="_column_1ahsu_35",ce="_over_1ahsu_47",ie="_under_1ahsu_48",o={label:ne,clock:le,column:re,over:ce,under:ie};function $({label:a,value:n,state:s="active",className:l,testId:c}){return e.jsxs("div",{className:d([o.column,l]),"data-state":s,children:[e.jsx("span",{className:o.label,children:a}),e.jsx("span",{className:o.clock,"data-testid":c,children:n})]})}function de({label:a,state:n="active",className:s,render:l}){return e.jsxs("div",{className:d([o.column,s]),"data-state":n,children:[e.jsx("span",{className:o.label,children:a}),l(o.clock)]})}function oe({state:a,value:n,testId:s}){return e.jsxs("div",{className:o.column,"data-state":a,children:[e.jsxs("div",{className:o.label,children:[e.jsx("span",{className:o.over,children:"Over"}),e.jsx("span",{children:"/"}),e.jsx("span",{className:o.under,children:"Under"})]}),e.jsx("span",{className:o.clock,"data-testid":s,children:n})]})}const ue="_column_1uyfj_17",me="_row_1uyfj_26",fe="_metadataRow_1uyfj_33",xe="_labelledElement_1uyfj_40",pe="_icon_1uyfj_46",be="_label_1uyfj_40",je="_time_1uyfj_58",Te="_daySpan_1uyfj_65",ve="_muted_1uyfj_80",ye="_labelTitle_1uyfj_84",_e="_dueTime_1uyfj_93",t={column:ue,row:me,metadataRow:fe,labelledElement:xe,icon:pe,label:be,time:je,daySpan:Te,muted:ve,labelTitle:ye,dueTime:_e};function Ce({shouldFormat:a}){const{plannedEnd:n,plannedStart:s,actualStart:l}=W(),c={format12:"hh:mm:ss a",format24:"HH:mm:ss"},u=s===null?m:a?h(s,c):b(s,{fallback:m}),x=l===null?m:a?h(l,c):b(l,{fallback:m}),[r,i]=C.useMemo(()=>R(n),[n]),j=r===null?m:a?h(r,c):b(r,{fallback:m}),p=i>0,T=p?`Planned end time (rundown spans over ${i+1} days)`:"Planned end time";return e.jsxs("div",{className:t.column,children:[e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"Start"}),e.jsx(f,{text:"Planned start time",render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(P,{className:t.icon}),e.jsx(N,{className:d([t.time,s===null&&t.muted]),time:u})]})}),e.jsx(f,{text:"Actual start time",render:e.jsxs("div",{className:t.labelledElement,"data-testid":"actual-start-time",children:[e.jsx(M,{className:t.icon}),e.jsx(N,{className:d([t.time,l===null&&t.muted]),time:x})]})})]}),e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"End"}),e.jsx(f,{text:T,render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(P,{className:t.icon}),e.jsx(N,{className:d([t.time,n===null&&t.muted]),time:j}),p&&e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":i})]})}),e.jsx(he,{shouldFormat:a})]})]})}function he({shouldFormat:a}){const{expectedEnd:n}=Q(),[s,l]=C.useMemo(()=>R(n),[n]),c=s===null?m:a?h(s,{format12:"hh:mm:ss a",format24:"HH:mm:ss"}):b(s,{fallback:m}),u=s!==null&&l>0,x=u?`Expected end time (rundown spans over ${l+1} days)`:"Expected end time";return e.jsx(f,{text:x,render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(U,{className:t.icon}),e.jsx(N,{className:d([t.time,s===null&&t.muted]),time:c}),u&&e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":l})]})})}function Ie(){return e.jsxs("div",{className:t.column,children:[e.jsx(Ne,{}),e.jsx(Ee,{})]})}function Ne(){const{clock:a,mode:n,groupExpectedEnd:s,actualGroupStart:l,currentDay:c,playback:u}=X(),{currentGroupId:x}=Y(),r=G(x),i=g(u),j=(()=>{if(!i||!r||r.timeStart===null)return null;const _=a+c*v;return n===I.Absolute?r.timeStart+r.duration-_:l+r.duration-_})(),p=S(j,3,E.CountDown),T=s!==null?s-a:null,y=S(T,3,E.CountDown);return e.jsxs("div",{className:t.metadataRow,children:[e.jsx("span",{className:r!=null&&r.title?t.labelTitle:t.label,children:`${(r==null?void 0:r.title)||"Group"} `}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to planned group end",render:e.jsx(A,{className:t.icon})}),e.jsx("span",{className:d([t.time,(!r||!i)&&t.muted,p==="due"&&t.dueTime]),children:p})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to expected group end",render:e.jsx(F,{className:t.icon})}),e.jsx("span",{className:d([t.time,!s&&t.muted,y==="due"&&t.dueTime]),children:y})]})]})}function Ee(){const{clock:a,mode:n,actualStart:s,plannedStart:l,playback:c,currentDay:u}=Z(),{id:x,expectedStart:r}=ee(),i=G(x),j=g(c),p=(()=>{if(!j||!i)return null;const D=i.timeStart+i.dayOffset*v,O=a+u*v;return n===I.Absolute?D-O:D+s-l-O})(),T=S(p,3,E.CountDown),y=r!==null?r-a:null,_=S(y,3,E.CountDown),k=(i==null?void 0:i.title)??null;return e.jsxs("div",{className:t.metadataRow,children:[e.jsx("span",{className:k?t.labelTitle:t.label,children:`${k||"Flag"} `}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to next flag planned start",render:e.jsx(H,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-plannedStart",className:d([t.time,(!i||!j)&&t.muted,T==="due"&&t.dueTime]),children:T})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to next flag expected start",render:e.jsx(z,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-expectedStart",className:d([t.time,y===null&&t.muted,_==="due"&&t.dueTime]),children:_})]})]})}function Ge(){const{numEvents:a,selectedEventIndex:n}=q(),s=n!==null?n+1:w,l=a?`${s} of ${a||w}`:w;return e.jsx($,{label:"Progress",value:l,state:n===null?"muted":"active"})}function Re(){const{offset:a,playback:n}=K(),s=g(n),l=ae(s?a:null),c=te(s?a:null);return e.jsx(oe,{state:l,value:c,testId:"offset"})}function $e({shouldFormat:a,className:n}){const{clock:s}=B(),l=a?h(s):b(s);return e.jsx(de,{label:"Time now",className:n,render:c=>e.jsx(N,{className:c,time:l})})}function Me({className:a}){const n=J(),s=n.phase===L.Pending,l=s?"Count to start":"Running timer",c=b(s?n.secondaryTimer:n.current,{fallback:m}),u=s?"waiting":n.current===null?"muted":"active";return e.jsx($,{label:l,value:c,state:u,className:a})}export{$e as C,Ie as M,Re as O,Ge as P,Ce as S,Me as T,se as f};
2
- //# sourceMappingURL=TimeElements-XpRwBsaa.js.map
1
+ import{j as e,h as C,b2 as P,b3 as M,b4 as U,b5 as A,b6 as F,b7 as H,b8 as z}from"./vendor-q6fv0YT2.js";import{s as v,m as b,bk as m,A as V,e as d,bl as W,f as h,bm as q,x as w,bn as K,v as B,K as J,y as L,bo as Q,bp as X,bq as Y,br as I,T as E,bs as Z,bt as ee}from"./index-B81u4hxi.js";import{T as f}from"./Tooltip-B5vsLcFu.js";import{v as G}from"./useRundown-Bn6ZPsz0.js";import{a as te,g as ae}from"./offset-R98EXhWK.js";import{S as N}from"./SuperscriptPeriod-DsPdWN_s.js";import{i as g}from"./playbackstate-CPQdnF-k.js";(function(){try{var a=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new a.Error().stack;n&&(a._sentryDebugIds=a._sentryDebugIds||{},a._sentryDebugIds[n]="ab64aecc-d13f-4095-adee-5745f13eec91",a._sentryDebugIdIdentifier="sentry-dbid-ab64aecc-d13f-4095-adee-5745f13eec91")}catch{}})();function S(a,n=3,s,l="due"){return a!==null&&a<=0?l:se(a,n,s)}function se(a,n=3,s){return b(a,{fallback:n===3?m:V,direction:s})}function R(a){return a!==null&&a>v?[a%v,Math.floor(a/v)]:[a,0]}const ne="_label_1ahsu_18",le="_clock_1ahsu_23",re="_column_1ahsu_35",ce="_over_1ahsu_47",ie="_under_1ahsu_48",o={label:ne,clock:le,column:re,over:ce,under:ie};function $({label:a,value:n,state:s="active",className:l,testId:c}){return e.jsxs("div",{className:d([o.column,l]),"data-state":s,children:[e.jsx("span",{className:o.label,children:a}),e.jsx("span",{className:o.clock,"data-testid":c,children:n})]})}function de({label:a,state:n="active",className:s,render:l}){return e.jsxs("div",{className:d([o.column,s]),"data-state":n,children:[e.jsx("span",{className:o.label,children:a}),l(o.clock)]})}function oe({state:a,value:n,testId:s}){return e.jsxs("div",{className:o.column,"data-state":a,children:[e.jsxs("div",{className:o.label,children:[e.jsx("span",{className:o.over,children:"Over"}),e.jsx("span",{children:"/"}),e.jsx("span",{className:o.under,children:"Under"})]}),e.jsx("span",{className:o.clock,"data-testid":s,children:n})]})}const ue="_column_1uyfj_17",me="_row_1uyfj_26",fe="_metadataRow_1uyfj_33",xe="_labelledElement_1uyfj_40",pe="_icon_1uyfj_46",be="_label_1uyfj_40",je="_time_1uyfj_58",Te="_daySpan_1uyfj_65",ve="_muted_1uyfj_80",ye="_labelTitle_1uyfj_84",_e="_dueTime_1uyfj_93",t={column:ue,row:me,metadataRow:fe,labelledElement:xe,icon:pe,label:be,time:je,daySpan:Te,muted:ve,labelTitle:ye,dueTime:_e};function Ce({shouldFormat:a}){const{plannedEnd:n,plannedStart:s,actualStart:l}=W(),c={format12:"hh:mm:ss a",format24:"HH:mm:ss"},u=s===null?m:a?h(s,c):b(s,{fallback:m}),x=l===null?m:a?h(l,c):b(l,{fallback:m}),[r,i]=C.useMemo(()=>R(n),[n]),j=r===null?m:a?h(r,c):b(r,{fallback:m}),p=i>0,T=p?`Planned end time (rundown spans over ${i+1} days)`:"Planned end time";return e.jsxs("div",{className:t.column,children:[e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"Start"}),e.jsx(f,{text:"Planned start time",render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(P,{className:t.icon}),e.jsx(N,{className:d([t.time,s===null&&t.muted]),time:u})]})}),e.jsx(f,{text:"Actual start time",render:e.jsxs("div",{className:t.labelledElement,"data-testid":"actual-start-time",children:[e.jsx(M,{className:t.icon}),e.jsx(N,{className:d([t.time,l===null&&t.muted]),time:x})]})})]}),e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"End"}),e.jsx(f,{text:T,render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(P,{className:t.icon}),e.jsx(N,{className:d([t.time,n===null&&t.muted]),time:j}),p&&e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":i})]})}),e.jsx(he,{shouldFormat:a})]})]})}function he({shouldFormat:a}){const{expectedEnd:n}=Q(),[s,l]=C.useMemo(()=>R(n),[n]),c=s===null?m:a?h(s,{format12:"hh:mm:ss a",format24:"HH:mm:ss"}):b(s,{fallback:m}),u=s!==null&&l>0,x=u?`Expected end time (rundown spans over ${l+1} days)`:"Expected end time";return e.jsx(f,{text:x,render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(U,{className:t.icon}),e.jsx(N,{className:d([t.time,s===null&&t.muted]),time:c}),u&&e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":l})]})})}function Ie(){return e.jsxs("div",{className:t.column,children:[e.jsx(Ne,{}),e.jsx(Ee,{})]})}function Ne(){const{clock:a,mode:n,groupExpectedEnd:s,actualGroupStart:l,currentDay:c,playback:u}=X(),{currentGroupId:x}=Y(),r=G(x),i=g(u),j=(()=>{if(!i||!r||r.timeStart===null)return null;const _=a+c*v;return n===I.Absolute?r.timeStart+r.duration-_:l+r.duration-_})(),p=S(j,3,E.CountDown),T=s!==null?s-a:null,y=S(T,3,E.CountDown);return e.jsxs("div",{className:t.metadataRow,children:[e.jsx("span",{className:r!=null&&r.title?t.labelTitle:t.label,children:`${(r==null?void 0:r.title)||"Group"} `}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to planned group end",render:e.jsx(A,{className:t.icon})}),e.jsx("span",{className:d([t.time,(!r||!i)&&t.muted,p==="due"&&t.dueTime]),children:p})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to expected group end",render:e.jsx(F,{className:t.icon})}),e.jsx("span",{className:d([t.time,!s&&t.muted,y==="due"&&t.dueTime]),children:y})]})]})}function Ee(){const{clock:a,mode:n,actualStart:s,plannedStart:l,playback:c,currentDay:u}=Z(),{id:x,expectedStart:r}=ee(),i=G(x),j=g(c),p=(()=>{if(!j||!i)return null;const D=i.timeStart+i.dayOffset*v,O=a+u*v;return n===I.Absolute?D-O:D+s-l-O})(),T=S(p,3,E.CountDown),y=r!==null?r-a:null,_=S(y,3,E.CountDown),k=(i==null?void 0:i.title)??null;return e.jsxs("div",{className:t.metadataRow,children:[e.jsx("span",{className:k?t.labelTitle:t.label,children:`${k||"Flag"} `}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to next flag planned start",render:e.jsx(H,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-plannedStart",className:d([t.time,(!i||!j)&&t.muted,T==="due"&&t.dueTime]),children:T})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to next flag expected start",render:e.jsx(z,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-expectedStart",className:d([t.time,y===null&&t.muted,_==="due"&&t.dueTime]),children:_})]})]})}function Ge(){const{numEvents:a,selectedEventIndex:n}=q(),s=n!==null?n+1:w,l=a?`${s} of ${a||w}`:w;return e.jsx($,{label:"Progress",value:l,state:n===null?"muted":"active"})}function Re(){const{offset:a,playback:n}=K(),s=g(n),l=ae(s?a:null),c=te(s?a:null);return e.jsx(oe,{state:l,value:c,testId:"offset"})}function $e({shouldFormat:a,className:n}){const{clock:s}=B(),l=a?h(s):b(s);return e.jsx(de,{label:"Time now",className:n,render:c=>e.jsx(N,{className:c,time:l})})}function Me({className:a}){const n=J(),s=n.phase===L.Pending,l=s?"Count to start":"Running timer",c=b(s?n.secondaryTimer:n.current,{fallback:m}),u=s?"waiting":n.current===null?"muted":"active";return e.jsx($,{label:l,value:c,state:u,className:a})}export{$e as C,Ie as M,Re as O,Ge as P,Ce as S,Me as T,se as f};
2
+ //# sourceMappingURL=TimeElements-DbclWDbU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeElements-DbclWDbU.js","sources":["../../src/features/overview/overview.utils.ts","../../src/features/overview/composite/TimeLayout.tsx","../../src/features/overview/composite/TimeElements.tsx"],"sourcesContent":["import { MaybeNumber, TimerType } from 'ontime-types';\nimport { dayInMs, millisToString } from 'ontime-utils';\n\nimport { timerPlaceholder, timerPlaceholderMin } from '../../common/utils/styleUtils';\n\n/**\n * Composition to stop negative timers from being formatted\n * They should show a due string instead\n *\n * This is used for cases when a negative timer is unwanted\n * eg: count down to a milestone\n */\nexport function formatDueTime(\n time: MaybeNumber,\n segments: number = 3,\n direction?: TimerType.CountDown | TimerType.CountUp,\n dueString = 'due',\n): string {\n if (time !== null && time <= 0) return dueString;\n return formattedTime(time, segments, direction);\n}\n\n/**\n * Encapsulates the logic for formatting time in overview\n */\nexport function formattedTime(\n time: MaybeNumber,\n segments: number = 3,\n direction?: TimerType.CountDown | TimerType.CountUp,\n): string {\n return millisToString(time, { fallback: segments === 3 ? timerPlaceholder : timerPlaceholderMin, direction });\n}\n\n/**\n * Calculates how long a time is and how many days it spans\n */\nexport function calculateEndAndDaySpan(end: MaybeNumber): [MaybeNumber, number] {\n if (end !== null && end > dayInMs) {\n return [end % dayInMs, Math.floor(end / dayInMs)];\n }\n\n return [end, 0];\n}\n","import { ReactNode } from 'react';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TimeLayout.module.scss';\n\ninterface TimeLayoutProps {\n label: string;\n value: string;\n state?: 'muted' | 'waiting' | 'active';\n daySpan?: number;\n className?: string;\n testId?: string;\n}\n\nexport function TimeColumn({ label, value, state = 'active', className, testId }: TimeLayoutProps) {\n return (\n <div className={cx([style.column, className])} data-state={state}>\n <span className={style.label}>{label}</span>\n <span className={style.clock} data-testid={testId}>\n {value}\n </span>\n </div>\n );\n}\n\ninterface WrappedInTimeColumnProps {\n label: string;\n state?: 'muted' | 'waiting' | 'active';\n className?: string;\n render: (className: string) => ReactNode;\n}\n\nexport function WrappedInTimeColumn({ label, state = 'active', className, render }: WrappedInTimeColumnProps) {\n return (\n <div className={cx([style.column, className])} data-state={state}>\n <span className={style.label}>{label}</span>\n {render(style.clock)}\n </div>\n );\n}\ninterface OverUnderProps {\n state: 'over' | 'under' | 'muted' | null;\n value: string;\n testId: string;\n}\n\nexport function OverUnder({ state, value, testId }: OverUnderProps) {\n return (\n <div className={style.column} data-state={state}>\n <div className={style.label}>\n <span className={style.over}>Over</span>\n <span>/</span>\n <span className={style.under}>Under</span>\n </div>\n <span className={style.clock} data-testid={testId}>\n {value}\n </span>\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport {\n TbCalendarClock,\n TbCalendarPin,\n TbCalendarStar,\n TbFlagPin,\n TbFlagStar,\n TbFolderPin,\n TbFolderStar,\n} from 'react-icons/tb';\nimport { OffsetMode, OntimeEvent, OntimeGroup, TimerPhase, TimerType } from 'ontime-types';\nimport { dayInMs, isPlaybackActive, millisToString } from 'ontime-utils';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport {\n useClock,\n useCurrentGroupId,\n useFlagTimerOverView,\n useGroupTimerOverView,\n useNextFlag,\n useOffsetOverview,\n useProgressOverview,\n useRundownExpectedEnd,\n useStartTimesOverview,\n useTimer,\n} from '../../../common/hooks/useSocket';\nimport { useEntry } from '../../../common/hooks-query/useRundown';\nimport { getOffsetState, getOffsetText } from '../../../common/utils/offset';\nimport { cx, enDash, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport { formatTime } from '../../../common/utils/time';\nimport SuperscriptPeriod from '../../../views/common/superscript-time/SuperscriptPeriod';\nimport { calculateEndAndDaySpan, formatDueTime } from '../overview.utils';\n\nimport { OverUnder, TimeColumn, WrappedInTimeColumn } from './TimeLayout';\n\nimport style from './TimeElements.module.scss';\n\ninterface OverviewTimeElementsProps {\n shouldFormat?: boolean;\n}\n\nexport function StartTimes({ shouldFormat }: OverviewTimeElementsProps) {\n const { plannedEnd, plannedStart, actualStart } = useStartTimesOverview();\n\n const formatOptions = { format12: 'hh:mm:ss a', format24: 'HH:mm:ss' };\n\n const plannedStartText = (() => {\n if (plannedStart === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(plannedStart, formatOptions);\n return millisToString(plannedStart, { fallback: timerPlaceholder });\n })();\n\n const actualStartText = (() => {\n if (actualStart === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(actualStart, formatOptions);\n return millisToString(actualStart, { fallback: timerPlaceholder });\n })();\n\n const [maybePlannedEnd, maybePlannedDaySpan] = useMemo(() => calculateEndAndDaySpan(plannedEnd), [plannedEnd]);\n\n const plannedEndText = (() => {\n if (maybePlannedEnd === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(maybePlannedEnd, formatOptions);\n return millisToString(maybePlannedEnd, { fallback: timerPlaceholder });\n })();\n\n const multipleDays = maybePlannedDaySpan > 0;\n const plannedEndTooltip = multipleDays\n ? `Planned end time (rundown spans over ${maybePlannedDaySpan + 1} days)`\n : 'Planned end time';\n\n return (\n <div className={style.column}>\n <div className={style.row}>\n <span className={style.label}>Start</span>\n <Tooltip\n text='Planned start time'\n render={\n <div className={style.labelledElement}>\n <TbCalendarPin className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, plannedStart === null && style.muted])}\n time={plannedStartText}\n />\n </div>\n }\n />\n <Tooltip\n text='Actual start time'\n render={\n <div className={style.labelledElement} data-testid='actual-start-time'>\n <TbCalendarClock className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, actualStart === null && style.muted])}\n time={actualStartText}\n />\n </div>\n }\n />\n </div>\n\n <div className={style.row}>\n <span className={style.label}>End</span>\n <Tooltip\n text={plannedEndTooltip}\n render={\n <div className={style.labelledElement}>\n <TbCalendarPin className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, plannedEnd === null && style.muted])}\n time={plannedEndText}\n />\n {multipleDays && (\n <span className={cx([style.time, style.daySpan])} data-day-offset={maybePlannedDaySpan} />\n )}\n </div>\n }\n />\n <RundownExpectedEnd shouldFormat={shouldFormat} />\n </div>\n </div>\n );\n}\n\n/**\n * Shows the expected end for the rundown\n * Extracted to improve performance as this is a ticking value\n */\nfunction RundownExpectedEnd({ shouldFormat }: OverviewTimeElementsProps) {\n const { expectedEnd } = useRundownExpectedEnd();\n\n const [maybeExpectedEnd, maybeExpectedDaySpan] = useMemo(() => calculateEndAndDaySpan(expectedEnd), [expectedEnd]);\n const maybeExpectedEndText = (() => {\n if (maybeExpectedEnd === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(maybeExpectedEnd, { format12: 'hh:mm:ss a', format24: 'HH:mm:ss' });\n return millisToString(maybeExpectedEnd, { fallback: timerPlaceholder });\n })();\n\n const multipleDays = maybeExpectedEnd !== null && maybeExpectedDaySpan > 0;\n const tooltip = multipleDays\n ? `Expected end time (rundown spans over ${maybeExpectedDaySpan + 1} days)`\n : 'Expected end time';\n\n return (\n <Tooltip\n text={tooltip}\n render={\n <div className={style.labelledElement}>\n <TbCalendarStar className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, maybeExpectedEnd === null && style.muted])}\n time={maybeExpectedEndText}\n />\n {multipleDays && <span className={cx([style.time, style.daySpan])} data-day-offset={maybeExpectedDaySpan} />}\n </div>\n }\n />\n );\n}\n\nexport function MetadataTimes() {\n return (\n <div className={style.column}>\n <GroupTimes />\n <FlagTimes />\n </div>\n );\n}\n\nfunction GroupTimes() {\n const { clock, mode, groupExpectedEnd, actualGroupStart, currentDay, playback } = useGroupTimerOverView();\n const { currentGroupId } = useCurrentGroupId();\n const group = useEntry(currentGroupId) as OntimeGroup | null;\n\n const active = isPlaybackActive(playback);\n\n // the group end time dose not encode any day offsets so it is calculated with group start time and duration\n const plannedGroupEnd = (() => {\n if (!active) return null;\n if (!group || group.timeStart === null) return null;\n const normalizedClock = clock + currentDay * dayInMs;\n\n return mode === OffsetMode.Absolute\n ? group.timeStart + group.duration - normalizedClock\n : actualGroupStart + group.duration - normalizedClock;\n })();\n\n const plannedTimeUntilGroupEnd = formatDueTime(plannedGroupEnd, 3, TimerType.CountDown);\n\n const expectedGroupEnd = groupExpectedEnd !== null ? groupExpectedEnd - clock : null;\n const expectedTimeUntilGroupEnd = formatDueTime(expectedGroupEnd, 3, TimerType.CountDown);\n\n return (\n <div className={style.metadataRow}>\n <span className={group?.title ? style.labelTitle : style.label}>{`${group?.title || 'Group'} `}</span>\n <div className={style.labelledElement}>\n <Tooltip text='Time to planned group end' render={<TbFolderPin className={style.icon} />} />\n <span\n className={cx([\n style.time,\n (!group || !active) && style.muted,\n plannedTimeUntilGroupEnd === 'due' && style.dueTime,\n ])}\n >\n {plannedTimeUntilGroupEnd}\n </span>\n </div>\n <div className={style.labelledElement}>\n <Tooltip text='Time to expected group end' render={<TbFolderStar className={style.icon} />} />\n <span\n className={cx([\n style.time,\n !groupExpectedEnd && style.muted,\n expectedTimeUntilGroupEnd === 'due' && style.dueTime,\n ])}\n >\n {expectedTimeUntilGroupEnd}\n </span>\n </div>\n </div>\n );\n}\n\nfunction FlagTimes() {\n const { clock, mode, actualStart, plannedStart, playback, currentDay } = useFlagTimerOverView();\n const { id, expectedStart } = useNextFlag();\n const entry = useEntry(id) as OntimeEvent | null;\n\n const active = isPlaybackActive(playback);\n\n const plannedFlagStart = (() => {\n if (!active) return null;\n if (!entry) return null;\n const normalizedTimeStart = entry.timeStart + entry.dayOffset * dayInMs;\n const normalizedClock = clock + currentDay * dayInMs;\n return mode === OffsetMode.Absolute\n ? normalizedTimeStart - normalizedClock\n : normalizedTimeStart + actualStart - plannedStart - normalizedClock;\n })();\n\n const plannedTimeUntilDisplay = formatDueTime(plannedFlagStart, 3, TimerType.CountDown);\n\n const expectedTimeUntil = expectedStart !== null ? expectedStart - clock : null;\n const expectedTimeUntilDisplay = formatDueTime(expectedTimeUntil, 3, TimerType.CountDown);\n\n const title = entry?.title ?? null;\n\n return (\n <div className={style.metadataRow}>\n <span className={title ? style.labelTitle : style.label}>{`${title || 'Flag'} `}</span>\n <div className={style.labelledElement}>\n <Tooltip text='Time to next flag planned start' render={<TbFlagPin className={style.icon} />} />\n <span\n data-testid='flag-plannedStart'\n className={cx([\n style.time,\n (!entry || !active) && style.muted,\n plannedTimeUntilDisplay === 'due' && style.dueTime,\n ])}\n >\n {plannedTimeUntilDisplay}\n </span>\n </div>\n <div className={style.labelledElement}>\n <Tooltip text='Time to next flag expected start' render={<TbFlagStar className={style.icon} />} />\n <span\n data-testid='flag-expectedStart'\n className={cx([\n style.time,\n expectedTimeUntil === null && style.muted,\n expectedTimeUntilDisplay === 'due' && style.dueTime,\n ])}\n >\n {expectedTimeUntilDisplay}\n </span>\n </div>\n </div>\n );\n}\n\nexport function ProgressOverview() {\n const { numEvents, selectedEventIndex } = useProgressOverview();\n\n const current = selectedEventIndex !== null ? selectedEventIndex + 1 : enDash;\n const progressText = numEvents ? `${current} of ${numEvents || enDash}` : enDash;\n\n return <TimeColumn label='Progress' value={progressText} state={selectedEventIndex === null ? 'muted' : 'active'} />;\n}\n\nexport function OffsetOverview() {\n const { offset, playback } = useOffsetOverview();\n\n const isPlaying = isPlaybackActive(playback);\n const offsetState = getOffsetState(isPlaying ? offset : null);\n const offsetText = getOffsetText(isPlaying ? offset : null);\n\n return <OverUnder state={offsetState} value={offsetText} testId='offset' />;\n}\n\nexport function ClockOverview({ shouldFormat, className }: OverviewTimeElementsProps & { className?: string }) {\n const { clock } = useClock();\n const formattedClock = shouldFormat ? formatTime(clock) : millisToString(clock);\n\n return (\n <WrappedInTimeColumn\n label='Time now'\n className={className}\n render={(clockClasses) => <SuperscriptPeriod className={clockClasses} time={formattedClock} />}\n />\n );\n}\n\nexport function TimerOverview({ className }: { className?: string }) {\n const timer = useTimer();\n\n const isWaiting = timer.phase === TimerPhase.Pending;\n const title = isWaiting ? 'Count to start' : 'Running timer';\n const display = millisToString(isWaiting ? timer.secondaryTimer : timer.current, { fallback: timerPlaceholder });\n const timerState = (() => {\n if (isWaiting) return 'waiting';\n if (timer.current === null) return 'muted';\n return 'active';\n })();\n\n return <TimeColumn label={title} value={display} state={timerState} className={className} />;\n}\n"],"names":["formatDueTime","time","segments","direction","dueString","formattedTime","millisToString","fallback","timerPlaceholder","timerPlaceholderMin","calculateEndAndDaySpan","end","dayInMs","Math","floor","TimeColumn","label","value","state","className","testId","jsxs","cx","style","column","jsx","clock","WrappedInTimeColumn","render","OverUnder","over","under","StartTimes","shouldFormat","plannedEnd","plannedStart","actualStart","useStartTimesOverview","formatOptions","format12","format24","plannedStartText","formatTime","actualStartText","maybePlannedEnd","maybePlannedDaySpan","useMemo","plannedEndText","multipleDays","plannedEndTooltip","row","Tooltip","labelledElement","TbCalendarPin","icon","SuperscriptPeriod","muted","TbCalendarClock","daySpan","RundownExpectedEnd","expectedEnd","useRundownExpectedEnd","maybeExpectedEnd","maybeExpectedDaySpan","maybeExpectedEndText","tooltip","TbCalendarStar","MetadataTimes","GroupTimes","FlagTimes","mode","groupExpectedEnd","actualGroupStart","currentDay","playback","useGroupTimerOverView","currentGroupId","useCurrentGroupId","group","useEntry","active","isPlaybackActive","plannedGroupEnd","timeStart","normalizedClock","OffsetMode","Absolute","duration","plannedTimeUntilGroupEnd","TimerType","CountDown","expectedGroupEnd","expectedTimeUntilGroupEnd","metadataRow","title","labelTitle","TbFolderPin","dueTime","TbFolderStar","useFlagTimerOverView","id","expectedStart","useNextFlag","entry","plannedFlagStart","normalizedTimeStart","dayOffset","plannedTimeUntilDisplay","expectedTimeUntil","expectedTimeUntilDisplay","TbFlagPin","TbFlagStar","ProgressOverview","numEvents","selectedEventIndex","useProgressOverview","current","enDash","progressText","OffsetOverview","offset","useOffsetOverview","isPlaying","offsetState","getOffsetState","offsetText","getOffsetText","ClockOverview","useClock","formattedClock","clockClasses","TimerOverview","timer","useTimer","isWaiting","phase","TimerPhase","Pending","display","secondaryTimer","timerState"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{x as D,j as y,h as t}from"./vendor-q6fv0YT2.js";import{m as E,ah as T,e as N}from"./index-B81u4hxi.js";import{p as j}from"./parseUserTime-YeFR8t3F.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new s.Error().stack;n&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[n]="42cf55e5-b2cc-43b5-8c51-7d385e744529",s._sentryDebugIdIdentifier="sentry-dbid-42cf55e5-b2cc-43b5-8c51-7d385e744529")}catch{}})();const A="_link_6042u_17",R={link:A};function L({search:s,children:n}){const a=D(),r=()=>a({search:s});return y.jsx("button",{onClick:r,className:R.link,children:n})}const S="_timeInput_1u25s_17",w="_delayed_1u25s_23",b={timeInput:S,delayed:w};function M({id:s,name:n,submitHandler:a,time:r,placeholder:g,disabled:k,align:h="center",delayed:I,className:_}){const l=t.useRef(null),[m,o]=t.useState(""),i=t.useRef(!1),u=t.useCallback(()=>{typeof r!="number"||isNaN(r)?o("00:00:00"):o(E(r))},[r]),x=t.useCallback(()=>{var e;(e=l.current)==null||e.select()},[]),f=t.useCallback(e=>e===""?!1:e.startsWith("p")||e.startsWith("+")?(a(n,e),!0):j(e)===r?!1:(a(n,e),!0),[n,a,r]),d=t.useCallback(e=>{f(e)||u()},[f,u]),C=t.useCallback(e=>{var c,p;e.key==="Enter"&&((c=l.current)==null||c.blur()),e.key==="Escape"&&(i.current=!0,(p=l.current)==null||p.blur(),u())},[u]),v=t.useCallback(e=>{if(i.current){i.current=!1;return}d(e.target.value)},[d]);return t.useEffect(()=>{u()},[u]),y.jsx(T,{id:s,disabled:k,ref:l,"data-testid":`time-input-${n}`,className:N([b.timeInput,I&&b.delayed,_]),placeholder:g,onFocus:x,onChange:e=>o(e.target.value),onBlur:v,onKeyDown:C,value:m,maxLength:8,style:{textAlign:h}})}export{L as A,M as T,b as s};
2
+ //# sourceMappingURL=TimeInput-C8DQoFXv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput-Bu_5GlHP.js","sources":["../../src/common/components/link/app-link/AppLink.tsx","../../src/common/components/input/time-input/TimeInput.tsx"],"sourcesContent":["import { type PropsWithChildren } from 'react';\nimport { useNavigate } from 'react-router';\n\nimport style from './AppLink.module.scss';\n\ninterface AppLinkProps {\n search: string;\n}\n\n/**\n * Component used to navigate to an editor link inside the same window\n * Handles the path to respect Ontime Clouds base URL\n */\nexport default function AppLink({ search, children }: PropsWithChildren<AppLinkProps>) {\n const navigate = useNavigate();\n\n const handleClick = () => navigate({ search });\n\n return (\n <button onClick={handleClick} className={style.link}>\n {children}\n </button>\n );\n}\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface TimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: string) => void;\n time?: number;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n delayed?: boolean;\n className?: string;\n}\n\nexport default function TimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n placeholder,\n disabled,\n align = 'center',\n delayed,\n className,\n}: TimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue('00:00:00');\n } else {\n setValue(millisToString(time));\n }\n }, [time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // Check if there is anything there\n if (newValue === '') {\n return false;\n }\n\n // we dont know the values in the rundown, escalate to handler\n if (newValue.startsWith('p') || newValue.startsWith('+')) {\n submitHandler(name, newValue);\n return true;\n }\n\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, newValue);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, delayed && style.delayed, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n style={{\n textAlign: align,\n }}\n />\n );\n}\n"],"names":["AppLink","search","children","navigate","useNavigate","handleClick","style","TimeInput","id","name","submitHandler","time","placeholder","disabled","align","delayed","className","inputRef","useRef","value","setValue","useState","ignoreChange","resetValue","useCallback","millisToString","handleFocus","_a","handleSubmit","newValue","parseUserTime","validateAndSubmit","onKeyDownHandler","event","_b","onBlurHandler","useEffect","jsx","Input","cx"],"mappings":"4hBAaA,SAAwBA,EAAQ,CAAE,OAAAC,EAAQ,SAAAC,GAA6C,CACrF,MAAMC,EAAWC,EAAY,EAEvBC,EAAc,IAAMF,EAAS,CAAE,OAAAF,EAAQ,EAE7C,aACG,SAAO,CAAA,QAASI,EAAa,UAAWC,EAAM,KAC5C,SAAAJ,EACH,CAEJ,+ECHA,SAAwBK,EAA4B,CAClD,GAAAC,EACA,KAAAC,EACA,cAAAC,EACA,KAAAC,EACA,YAAAC,EACA,SAAAC,EACA,MAAAC,EAAQ,SACR,QAAAC,EACA,UAAAC,CACF,EAAsB,CACd,MAAAC,EAAWC,SAAgC,IAAI,EAC/C,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAiB,EAAE,EACvCC,EAAeJ,SAAO,EAAK,EAK3BK,EAAaC,EAAAA,YAAY,IAAM,CAC/B,OAAOb,GAAS,UAAY,MAAMA,CAAI,EACxCS,EAAS,UAAU,EAEVA,EAAAK,EAAed,CAAI,CAAC,CAC/B,EACC,CAACA,CAAI,CAAC,EAKHe,EAAcF,EAAAA,YAAY,IAAM,QACpCG,EAAAV,EAAS,UAAT,MAAAU,EAAkB,QACpB,EAAG,EAAE,EAMCC,EAAeJ,EAAA,YAClBK,GAEKA,IAAa,GACR,GAILA,EAAS,WAAW,GAAG,GAAKA,EAAS,WAAW,GAAG,GACrDnB,EAAcD,EAAMoB,CAAQ,EACrB,IAGaC,EAAcD,CAAQ,IACtBlB,EACb,IAGTD,EAAcD,EAAMoB,CAAQ,EACrB,IAET,CAACpB,EAAMC,EAAeC,CAAI,CAC5B,EAMMoB,EAAoBP,EAAA,YACvBK,GAAqB,CACJD,EAAaC,CAAQ,GAExBN,EAAA,CAEf,EACA,CAACK,EAAcL,CAAU,CAC3B,EAMMS,EAAmBR,EAAA,YACtBS,GAA2C,SACtCA,EAAM,MAAQ,WAChBN,EAAAV,EAAS,UAAT,MAAAU,EAAkB,QAEhBM,EAAM,MAAQ,WAChBX,EAAa,QAAU,IACvBY,EAAAjB,EAAS,UAAT,MAAAiB,EAAkB,OACPX,EAAA,EAEf,EACA,CAACA,CAAU,CACb,EAEMY,EAAgBX,EAAA,YACnBS,GAAwC,CACvC,GAAIX,EAAa,QAAS,CACxBA,EAAa,QAAU,GACvB,MAAA,CAEiBS,EAAAE,EAAM,OAA4B,KAAK,CAC5D,EACA,CAACF,CAAiB,CACpB,EAEAK,OAAAA,EAAAA,UAAU,IAAM,CACHb,EAAA,CAAA,EACV,CAACA,CAAU,CAAC,EAGbc,EAAA,IAACC,EAAA,CACC,GAAA9B,EACA,SAAAK,EACA,IAAKI,EACL,cAAa,cAAcR,CAAI,GAC/B,UAAW8B,EAAG,CAACjC,EAAM,UAAWS,GAAWT,EAAM,QAASU,CAAS,CAAC,EACpE,YAAAJ,EACA,QAASc,EACT,SAAWO,GAAUb,EAASa,EAAM,OAAO,KAAK,EAChD,OAAQE,EACR,UAAWH,EACX,MAAAb,EACA,UAAW,EACX,MAAO,CACL,UAAWL,CAAA,CACb,CACF,CAEJ"}
1
+ {"version":3,"file":"TimeInput-C8DQoFXv.js","sources":["../../src/common/components/link/app-link/AppLink.tsx","../../src/common/components/input/time-input/TimeInput.tsx"],"sourcesContent":["import { type PropsWithChildren } from 'react';\nimport { useNavigate } from 'react-router';\n\nimport style from './AppLink.module.scss';\n\ninterface AppLinkProps {\n search: string;\n}\n\n/**\n * Component used to navigate to an editor link inside the same window\n * Handles the path to respect Ontime Clouds base URL\n */\nexport default function AppLink({ search, children }: PropsWithChildren<AppLinkProps>) {\n const navigate = useNavigate();\n\n const handleClick = () => navigate({ search });\n\n return (\n <button onClick={handleClick} className={style.link}>\n {children}\n </button>\n );\n}\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface TimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: string) => void;\n time?: number;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n delayed?: boolean;\n className?: string;\n}\n\nexport default function TimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n placeholder,\n disabled,\n align = 'center',\n delayed,\n className,\n}: TimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue('00:00:00');\n } else {\n setValue(millisToString(time));\n }\n }, [time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // Check if there is anything there\n if (newValue === '') {\n return false;\n }\n\n // we dont know the values in the rundown, escalate to handler\n if (newValue.startsWith('p') || newValue.startsWith('+')) {\n submitHandler(name, newValue);\n return true;\n }\n\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, newValue);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, delayed && style.delayed, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n style={{\n textAlign: align,\n }}\n />\n );\n}\n"],"names":["AppLink","search","children","navigate","useNavigate","handleClick","style","link","TimeInput","id","name","submitHandler","time","placeholder","disabled","align","delayed","className","inputRef","useRef","value","setValue","useState","ignoreChange","resetValue","useCallback","isNaN","millisToString","handleFocus","current","select","handleSubmit","newValue","startsWith","parseUserTime","validateAndSubmit","onKeyDownHandler","event","key","blur","onBlurHandler","target","useEffect","Input","cx","timeInput","textAlign"],"mappings":"4hBAaA,SAAwBA,EAAQ,CAAEC,OAAAA,EAAQC,SAAAA,CAA0C,EAAG,CACrF,MAAMC,EAAWC,EAAY,EAEvBC,EAAcA,IAAMF,EAAS,CAAEF,OAAAA,CAAAA,CAAQ,EAE7C,aACG,SAAO,CAAA,QAASI,EAAa,UAAWC,EAAMC,KAC5CL,SAAAA,EACH,CAEJ,+ECHA,SAAwBM,EAA4B,CAClDC,GAAAA,EACAC,KAAAA,EACAC,cAAAA,EACAC,KAAAA,EACAC,YAAAA,EACAC,SAAAA,EACAC,MAAAA,EAAQ,SACRC,QAAAA,EACAC,UAAAA,CACiB,EAAG,CACdC,MAAAA,EAAWC,SAAgC,IAAI,EAC/C,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAiB,EAAE,EACvCC,EAAeJ,SAAO,EAAK,EAK3BK,EAAaC,EAAAA,YAAY,IAAM,CAC/B,OAAOb,GAAS,UAAYc,MAAMd,CAAI,EACxCS,EAAS,UAAU,EAEVM,EAAAA,EAAef,CAAI,CAAC,CAC/B,EACC,CAACA,CAAI,CAAC,EAKHgB,EAAcH,EAAAA,YAAY,IAAM,QACpCP,EAAAA,EAASW,UAATX,MAAAA,EAAkBY,QACpB,EAAG,EAAE,EAMCC,EAAeN,cAClBO,GAEKA,IAAa,GACR,GAILA,EAASC,WAAW,GAAG,GAAKD,EAASC,WAAW,GAAG,GACrDtB,EAAcD,EAAMsB,CAAQ,EACrB,IAGaE,EAAcF,CAAQ,IACtBpB,EACb,IAGTD,EAAcD,EAAMsB,CAAQ,EACrB,IAET,CAACtB,EAAMC,EAAeC,CAAI,CAC5B,EAMMuB,EAAoBV,cACvBO,GAAqB,CACJD,EAAaC,CAAQ,GAExBR,EAAA,CACb,EAEF,CAACO,EAAcP,CAAU,CAC3B,EAMMY,EAAmBX,cACtBY,GAA2C,SACtCA,EAAMC,MAAQ,WAChBpB,EAAAA,EAASW,UAATX,MAAAA,EAAkBqB,QAEhBF,EAAMC,MAAQ,WAChBf,EAAaM,QAAU,IACvBX,EAAAA,EAASW,UAATX,MAAAA,EAAkBqB,OACPf,EAAA,EACb,EAEF,CAACA,CAAU,CACb,EAEMgB,EAAgBf,cACnBY,GAAwC,CACvC,GAAId,EAAaM,QAAS,CACxBN,EAAaM,QAAU,GACvB,MAAA,CAEiBQ,EAAAA,EAAMI,OAA4BrB,KAAK,CAAA,EAE5D,CAACe,CAAiB,CACpB,EAEAO,OAAAA,EAAAA,UAAU,IAAM,CACHlB,EAAA,CAAA,EACV,CAACA,CAAU,CAAC,QAGZmB,EACC,CAAA,GAAAlC,EACA,SAAAK,EACA,IAAKI,EACL,cAAa,cAAcR,CAAI,GAC/B,UAAWkC,EAAG,CAACtC,EAAMuC,UAAW7B,GAAWV,EAAMU,QAASC,CAAS,CAAC,EACpE,YAAAJ,EACA,QAASe,EACT,SAAWS,GAAUhB,EAASgB,EAAMI,OAAOrB,KAAK,EAChD,OAAQoB,EACR,UAAWJ,EACX,MAAAhB,EACA,UAAW,EACX,MAAO,CACL0B,UAAW/B,CAAAA,EAEb,CAEN"}
@@ -0,0 +1,2 @@
1
+ import{h as p,l as R,j as i,o as U}from"./vendor-q6fv0YT2.js";import{s as S,P as W,I as E,k as N,M as C,f as O,J as F,e as _,K as G,q as V,d as M,w as q,b as J,L as K,o as Q,g as X,O as Y,v as Z}from"./index-B81u4hxi.js";import{E as tt}from"./EmptyPage-Bc358YpE.js";import{V as et}from"./ViewLogo-G7EosFIr.js";import{O as B,V as nt}from"./ViewParamsEditor-C2-TRP6e.js";import{u as st}from"./useWindowTitle-Bpmo_HzW.js";import{S as it}from"./SuperscriptTime-CA6S2R55.js";import{i as w,a as b,d as ot,u as at}from"./useRundown-Bn6ZPsz0.js";import{g as rt,a as lt}from"./viewLoader.utils-b42scp-I.js";import{i as I}from"./viewUtils-B8Dr4GHH.js";import{g as ct,a as D,b as ut,c as mt}from"./rundownUtils-CtVGQDQn.js";import{g as dt}from"./getProgress-cLuBFPjh.js";import{u as ft}from"./useProjectData-DdgKoYzk.js";import"./Empty-CJbZxh45.js";import"./Select-BGGVCKqU.js";import"./SwatchPicker-Cm5Eicvv.js";/* empty css */(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="0655c698-dd40-435e-9824-6720185c4711",e._sentryDebugIdIdentifier="sentry-dbid-0655c698-dd40-435e-9824-6720185c4711")}catch{}})();function ht(e,t){if(!t)return 0;const n=e.timeStart+e.dayOffset*S,s=t.timeStart+t.duration+t.dayOffset*S;return n===s?0:(n>s,n-s)}function z(e,t,n){if(!t.current)return;if(!(e!=null&&e.current)){t.current.scrollTo({left:0,behavior:"smooth"});return}const s=e.current.getBoundingClientRect(),a=t.current.getBoundingClientRect(),o=s.left-a.left+t.current.scrollLeft-n;t.current.scrollTo({left:o,behavior:"smooth"})}function pt({followRef:e,scrollRef:t,doFollow:n,selectedEventId:s,leftOffset:a=0,setScrollFlag:o}){return p.useEffect(()=>{!n||!t.current||(o==null||o(!0),window.requestAnimationFrame(()=>{z(s!==null?e:null,t,a),o==null||o(!1)}))},[e,t,n,a,o,s]),p.useCallback((m=e,u=t,c=a)=>{u.current&&z(s!==null?m:null,u,c)},[e,t,a,s])}const xt=e=>[{title:B.ClockOptions,collapsible:!0,options:[rt(e)]},{title:B.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"fixedSize",title:"Fixed timeline size",description:"Timeline will have a fixed size to prevent scrolling",type:"boolean",defaultValue:!1}]}];function yt(e,t){const n=s=>(t==null?void 0:t.get(s))??e.get(s);return{hidePast:I(n("hidePast")),fixedSize:I(n("fixedSize"))}}function $(){const[e]=R(),t=p.use(W);return p.useMemo(()=>{const s=t?new URLSearchParams(t.search):void 0;return yt(e,s)},[t,e])}function gt(e,t,n,s,a){const r=(t<e?t+S:t)-e,m=s*a/r;return{left:(n-e)*a/r,width:m}}function _t(e){return Math.floor(e/E)}function Tt(e){return Math.ceil(e/E)}function jt(e,t){const n=[];for(let s=e;s<t;s++)n.push(s);return n}function wt(e,t){return t==="done"||t==="live"?t:e<=0?"pending":N(e,e>C*10)}function St(e,t){const{hidePast:n}=$();return p.useMemo(()=>{if(e.length===0)return{scopedRundown:[],firstStart:0,totalDuration:0};const a=[];let o=t?1/0:-1,r=null,m=0,u=null;for(let c=0;c<e.length;c++){const l=e[c];if(w(l)&&b(l)){if(l.id===t&&(o=c),n&&c<o)continue;a.push(l),r===null&&(r=l.timeStart);const d=ht(l,u);d===0?m+=l.duration:d>0?m+=d+l.duration:d<0&&(m+=Math.max(l.duration+d,0)),ot(l,u)&&(u=l)}}return{scopedRundown:a,firstStart:r??0,totalDuration:m}},[n,e,t])}function vt(e,t){var o,r;if(e.length===0)return{now:null,next:null,followedBy:null};let n=t?ct(e,t):null;w(n)||(n=null);const s=n?(o=D(e,n.id))==null?void 0:o.nextEvent:ut(e).firstEvent,a=s?(r=D(e,s.id))==null?void 0:r.nextEvent:null;return{now:n,next:s,followedBy:a}}function bt(e,t,n,s,a,o=100){let r=1/0;const m=e.map(({start:l,duration:d})=>{const y=gt(t,n,l,d,s);return r=Math.min(r,y.width),y});if(!a)return{positions:m,scale:1,totalWidth:s};const u=r<o?o/r:1;return u===1?{positions:m,scale:1,totalWidth:s}:{positions:m.map(l=>({left:l.left*u,width:l.width*u})),scale:u,totalWidth:s*u}}const Et="_markers_gfywu_17",Nt={markers:Et};function Pt(e){const{startHour:t,endHour:n}=e,s=jt(t,n);return i.jsx("div",{className:Nt.markers,children:s.map(a=>i.jsx("span",{},a))})}const Lt="_timelineContainer_1qyn0_21",kt="_scroll_1qyn0_26",Ct="_timeline_1qyn0_21",Ot="_column_1qyn0_37",qt="_maybeInline_1qyn0_45",Mt="_timelineBlock_1qyn0_52",Bt="_smallArea_1qyn0_64",It="_content_1qyn0_64",Dt="_timeOverview_1qyn0_68",zt="_hide_1qyn0_72",Ht="_status_1qyn0_98",At="_due_1qyn0_112",Vt="_delay_1qyn0_116",$t="_cross_1qyn0_126",Rt="_separeLeft_1qyn0_132",h={timelineContainer:Lt,scroll:kt,timeline:Ct,column:Ot,maybeInline:qt,timelineBlock:Mt,smallArea:Bt,content:It,timeOverview:Dt,hide:zt,status:Ht,due:At,delay:Vt,cross:$t,separeLeft:Rt},H={format12:"h:mm a",format24:"HH:mm"};function Ut({colour:e,delay:t,duration:n,hasLink:s,left:a,status:o,start:r,dayOffset:m,totalGap:u,isLinkedToLoaded:c,title:l,width:d,cue:y,ref:v}){const P=O(r,H),L=N(n),T=r+t,j=t>0,f=F(e,.7),x=d>25,g=d<40;return i.jsxs("div",{ref:v,className:_([h.column,g&&h.smallArea]),style:{"--color":e,"--lighter":f??"",left:`${a}px`,width:`${d}px`},"data-testid":y,children:[o==="live"?i.jsx(Wt,{}):i.jsx("div",{"data-status":o,className:h.timelineBlock}),i.jsxs("div",{className:_([h.content,d<20&&h.hide,!s&&h.separeLeft]),"data-status":o,style:{"--color":e},children:[i.jsxs("div",{className:h.maybeInline,children:[i.jsx("div",{className:_([j&&h.cross]),children:P}),j&&i.jsx("div",{className:h.delay,children:O(T,H)}),g&&i.jsx(A,{delay:t,start:r,dayOffset:m,totalGap:u,isLinkedToLoaded:c,status:o})]}),x&&i.jsxs(i.Fragment,{children:[!g&&i.jsx(A,{delay:t,start:r,dayOffset:m,totalGap:u,isLinkedToLoaded:c,status:o}),i.jsx("div",{children:l})]})]}),i.jsx("div",{className:h.timeOverview,"data-status":o,children:o!=="done"&&i.jsx("div",{className:h.duration,children:L})})]})}function A({delay:e,start:t,dayOffset:n,totalGap:s,isLinkedToLoaded:a,status:o}){const r=V(),{getLocalizedString:m}=M(),{timeToStart:u}=q({timeStart:t,delay:e,dayOffset:n,totalGap:s,isLinkedToLoaded:a,countToEnd:!1,duration:0},r);let c=wt(u,o);c==="live"?c=m("timeline.live"):c==="pending"&&(c=m("timeline.due"));const l=o==="future"&&u<=0;return i.jsx("div",{className:_([h.status,l&&h.due]),children:c})}function Wt(){const{current:e,duration:t}=G(),n=dt(e,t);return i.jsx("div",{"data-status":"live",className:h.timelineBlock,style:{"--progress":`${n}%`}})}const Ft=p.memo(Gt);function Gt({firstStart:e,rundown:t,selectedEventId:n,totalDuration:s}){const{width:a}=U(),{hidePast:o,fixedSize:r}=$(),m=p.useRef(null),u=p.useRef(null),{lastEvent:c}=mt(t),l=_t(e),d=Tt(e+s+((c==null?void 0:c.delay)??0)),y=l*E,v=d*E;pt({followRef:m,scrollRef:u,doFollow:!r,selectedEventId:n,leftOffset:o?0:a/6});const{positions:P,totalWidth:L}=p.useMemo(()=>{const f=t.filter(x=>w(x)&&b(x)).map(x=>({start:x.timeStart+(x.dayOffset??0)*S+(x.delay??0),duration:x.duration}));return bt(f,y,v,a,!r)},[t,y,v,a,r]);if(s===0)return null;let T=n?"done":"future";const j={};return t.forEach(f=>{w(f)&&b(f)&&(T==="live"&&(T="future"),f.id===n&&(T="live"),j[f.id]=T)}),i.jsx("div",{ref:u,className:_([h.timelineContainer,!r&&h.scroll]),children:i.jsxs("div",{className:h.timeline,style:{width:L},children:[i.jsx(Pt,{startHour:l,endHour:d}),t.map((f,x)=>{if(!w(f)||!b(f))return null;const g=P[x];return g?i.jsx(Ut,{ref:f.id===n?m:void 0,colour:f.colour,delay:f.delay??0,duration:f.duration,hasLink:!!f.linkStart,left:g.left,status:j[f.id],start:f.timeStart+(f.dayOffset??0)*S,totalGap:f.totalGap,isLinkedToLoaded:f.isLinkedToLoaded,dayOffset:f.dayOffset,title:f.title,cue:f.cue,width:g.width},f.id):null})]})})}const k=p.memo(Jt);function Jt({category:e,content:t,title:n,status:s}){const a=_(["section",e==="now"&&"section--now"]),o=_(["section-content",t?`section-content--${e}`:"section-content--subdue"]);return i.jsxs("div",{className:a,"data-testid":e,children:[i.jsxs("div",{className:"section-title",children:[i.jsx("span",{className:"section-title__label",children:n}),s&&i.jsx("span",{className:"section-title__status",children:s})]}),i.jsx("div",{className:o,children:t??"-"})]})}function Kt({now:e,next:t,followedBy:n}){const{getLocalizedString:s}=M(),a=V(),o=(e==null?void 0:e.title)??"-",r=s("timeline.due").toUpperCase(),m=t!==null?t.title:"-",u=n!==null?n.title:"-";let c,l;if(t!==null){const{timeToStart:d}=q(t,a);d<=0?c=r:c=N(d,d>C*10)}if(n!==null){const{timeToStart:d}=q(n,a);d<=0?l=r:l=N(d,d>C*10)}return i.jsxs("div",{className:"title-grid",children:[i.jsx(k,{title:s("timeline.live"),content:o,category:"now"}),i.jsx(k,{title:s("common.next"),status:c,content:m,category:"next"}),i.jsx(k,{title:s("timeline.followedby"),status:l,content:u,category:"followedBy"})]})}function Qt(){const{data:e,status:t}=at(),{data:n,status:s}=ft(),{data:a,status:o}=J();return{data:{events:e,projectData:n,settings:a},status:lt([t,s,o])}}function xe(){const{data:e,status:t}=Qt();return st("Timeline"),t==="pending"?i.jsx(K,{}):t==="error"?i.jsx(tt,{text:"There was an error fetching data, please refresh the page."}):i.jsx(Xt,{...e})}function Xt({events:e,projectData:t,settings:n}){const{selectedEventId:s}=Q(),{scopedRundown:a,firstStart:o,totalDuration:r}=St(e,s),{now:m,next:u,followedBy:c}=p.useMemo(()=>vt(a,s),[a,s]),l=X(n==null?void 0:n.timeFormat),d=p.useMemo(()=>xt(l),[l]);return i.jsxs("div",{className:"timeline","data-testid":"timeline-view",children:[i.jsx(nt,{target:Y.Timeline,viewOptions:d}),i.jsxs("div",{className:"project-header",children:[(t==null?void 0:t.logo)&&i.jsx(et,{name:t.logo,className:"logo"}),i.jsx("div",{className:"title",children:t.title}),i.jsx(Yt,{})]}),i.jsx(Kt,{now:m,next:u,followedBy:c}),i.jsx(Ft,{firstStart:o,rundown:a,selectedEventId:s,totalDuration:r})]})}function Yt(){const{getLocalizedString:e}=M(),{clock:t}=Z(),n=O(t);return i.jsxs("div",{className:"clock-container",children:[i.jsx("div",{className:"label",children:e("common.time_now")}),i.jsx(it,{time:n,className:"time"})]})}export{xe as default};
2
+ //# sourceMappingURL=TimelinePage-Cgtl1qNp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelinePage-Cgtl1qNp.js","sources":["../../../../packages/utils/src/date-utils/getTimeFrom.ts","../../src/common/hooks/useHorizontalFollowComponent.ts","../../src/views/timeline/timeline.options.ts","../../src/views/timeline/timeline.utils.ts","../../src/views/timeline/timeline-markers/TimelineMarkers.tsx","../../src/views/timeline/TimelineEntry.tsx","../../src/views/timeline/Timeline.tsx","../../src/views/timeline/timeline-section/TimelineSection.tsx","../../src/views/timeline/TimelineSections.tsx","../../src/views/timeline/useTimelineData.ts","../../src/views/timeline/TimelinePage.tsx"],"sourcesContent":["import type { OntimeEvent } from 'ontime-types';\n\nimport { dayInMs } from './conversionUtils.js';\n\n/**\n * Utility returns the gap from a previous given event\n */\nexport function getTimeFrom(\n current: Pick<OntimeEvent, 'timeStart' | 'dayOffset'>,\n previous: Pick<OntimeEvent, 'timeStart' | 'duration' | 'dayOffset'> | null,\n): number {\n // there is no previous event\n if (!previous) {\n return 0;\n }\n\n const normalisedCurrentStart = current.timeStart + current.dayOffset * dayInMs;\n const normalisedPreviousEnd = previous.timeStart + previous.duration + previous.dayOffset * dayInMs;\n\n // event is linked to previous\n if (normalisedCurrentStart === normalisedPreviousEnd) {\n return 0;\n }\n\n // event has a gap from previous\n if (normalisedCurrentStart > normalisedPreviousEnd) {\n // time from previous is difference between start and previous end\n return normalisedCurrentStart - normalisedPreviousEnd;\n }\n\n // event overlaps with previous\n return normalisedCurrentStart - normalisedPreviousEnd;\n}\n","import { RefObject, useCallback, useEffect } from 'react';\nimport { EntryId } from 'ontime-types';\n\nfunction scrollToComponent<ComponentRef extends HTMLElement, ScrollRef extends HTMLElement>(\n componentRef: RefObject<ComponentRef> | null,\n scrollRef: RefObject<ScrollRef>,\n leftOffset: number,\n) {\n if (!scrollRef.current) {\n return;\n }\n\n if (!componentRef?.current) {\n // If no target component, scroll to start\n scrollRef.current.scrollTo({ left: 0, behavior: 'smooth' });\n return;\n }\n\n const componentRect = componentRef.current.getBoundingClientRect();\n const scrollRect = scrollRef.current.getBoundingClientRect();\n const left = componentRect.left - scrollRect.left + scrollRef.current.scrollLeft - leftOffset;\n\n scrollRef.current.scrollTo({ left, behavior: 'smooth' });\n}\n\ninterface UseHorizontalFollowComponentOptions {\n followRef: RefObject<HTMLElement | null>;\n scrollRef: RefObject<HTMLElement | null>;\n doFollow: boolean;\n selectedEventId: EntryId | null;\n leftOffset?: number;\n setScrollFlag?: (newValue: boolean) => void;\n}\n\n/**\n * This is a copy of useFollowComponent, but for horizontal scrolling\n * Designed with the timeline component in mind\n */\nexport default function useHorizontalFollowComponent({\n followRef,\n scrollRef,\n doFollow,\n selectedEventId,\n leftOffset = 0,\n setScrollFlag,\n}: UseHorizontalFollowComponentOptions) {\n useEffect(() => {\n if (!doFollow || !scrollRef.current) {\n return;\n }\n\n setScrollFlag?.(true);\n // Use requestAnimationFrame to ensure the component is fully loaded\n window.requestAnimationFrame(() => {\n scrollToComponent(\n selectedEventId !== null ? (followRef as RefObject<HTMLElement>) : null,\n scrollRef as RefObject<HTMLElement>,\n leftOffset,\n );\n setScrollFlag?.(false);\n });\n }, [followRef, scrollRef, doFollow, leftOffset, setScrollFlag, selectedEventId]);\n\n const scrollToRefComponent = useCallback(\n (componentRef = followRef, containerRef = scrollRef, offset = leftOffset) => {\n if (containerRef.current) {\n scrollToComponent(\n selectedEventId !== null ? (componentRef as RefObject<HTMLElement>) : null,\n containerRef as RefObject<HTMLElement>,\n offset,\n );\n }\n },\n [followRef, scrollRef, leftOffset, selectedEventId],\n );\n\n return scrollToRefComponent;\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../common/viewUtils';\n\nexport const getTimelineOptions = (timeFormat: string): ViewOption[] => {\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'fixedSize',\n title: 'Fixed timeline size',\n description: 'Timeline will have a fixed size to prevent scrolling',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype TimelineOptions = {\n hidePast: boolean;\n fixedSize: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): TimelineOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n return {\n hidePast: isStringBoolean(getValue('hidePast')),\n fixedSize: isStringBoolean(getValue('fixedSize')),\n };\n}\n\n/**\n * Hook exposes the timeline view options\n */\nexport function useTimelineOptions(): TimelineOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { useMemo } from 'react';\nimport { isOntimeEvent, isPlayableEvent, MaybeString, OntimeEntry, OntimeEvent, PlayableEvent } from 'ontime-types';\nimport {\n dayInMs,\n getEventWithId,\n getFirstEvent,\n getNextEvent,\n getTimeFrom,\n isNewLatest,\n MILLIS_PER_HOUR,\n MILLIS_PER_MINUTE,\n} from 'ontime-utils';\n\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatDuration } from '../../common/utils/time';\n\nimport { useTimelineOptions } from './timeline.options';\nimport type { ProgressStatus } from './TimelineEntry';\n\ntype CSSPosition = {\n left: number;\n width: number;\n};\n\n/**\n * Calculates the base position and width of an element based on schedule\n * The scaling of these values (if needed) is handled by calculateTimelineLayout\n */\nexport function getElementPosition(\n scheduleStart: number,\n scheduleEnd: number,\n eventStart: number,\n eventDuration: number,\n containerWidth: number,\n): CSSPosition {\n const normalEnd = scheduleEnd < scheduleStart ? scheduleEnd + dayInMs : scheduleEnd;\n const totalDuration = normalEnd - scheduleStart;\n\n // Calculate proportional width and position\n const width = (eventDuration * containerWidth) / totalDuration;\n const left = ((eventStart - scheduleStart) * containerWidth) / totalDuration;\n\n return { left, width };\n}\n\n/**\n * Gets rounded down hour for a given time\n */\nexport function getStartHour(startTime: number): number {\n const hours = Math.floor(startTime / MILLIS_PER_HOUR);\n return hours;\n}\n\n/**\n * Gets rounded up hour for a given time\n */\nexport function getEndHour(endTime: number): number {\n const hours = Math.ceil(endTime / MILLIS_PER_HOUR);\n return hours;\n}\n\n/**\n * converts a time span into an array of hours\n */\nexport function makeTimelineSections(firstHour: number, lastHour: number) {\n const timelineSections = [];\n for (let i = firstHour; i < lastHour; i++) {\n timelineSections.push(i);\n }\n return timelineSections;\n}\n\n/**\n * Returns a formatted label for a progress status\n */\nexport function getStatusLabel(timeToStart: number, status: ProgressStatus): string {\n if (status === 'done' || status === 'live') {\n return status;\n }\n\n if (timeToStart <= 0) {\n return 'pending';\n }\n\n return formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 10);\n}\n\ninterface ScopedRundownData {\n scopedRundown: ExtendedEntry<PlayableEvent>[];\n firstStart: number;\n totalDuration: number;\n}\n\nexport function useScopedRundown(\n rundown: ExtendedEntry<OntimeEntry>[],\n selectedEventId: MaybeString,\n): ScopedRundownData {\n const { hidePast } = useTimelineOptions();\n\n const data = useMemo(() => {\n if (rundown.length === 0) {\n return { scopedRundown: [], firstStart: 0, totalDuration: 0 };\n }\n\n const scopedRundown: ExtendedEntry<PlayableEvent>[] = [];\n let selectedIndex = selectedEventId ? Infinity : -1;\n let firstStart = null;\n let totalDuration = 0;\n let lastEntry: ExtendedEntry<PlayableEvent> | null = null;\n\n for (let i = 0; i < rundown.length; i++) {\n const currentEntry = rundown[i];\n // we only deal with playableEvents\n if (isOntimeEvent(currentEntry) && isPlayableEvent(currentEntry)) {\n if (currentEntry.id === selectedEventId) {\n selectedIndex = i;\n }\n\n // maybe filter past\n if (hidePast && i < selectedIndex) {\n continue;\n }\n\n // add to scopedRundown\n scopedRundown.push(currentEntry);\n\n /**\n * Derive timers\n * This logic is partially from rundownCache.generate\n * With the addition of deriving the current day offset\n */\n if (firstStart === null) {\n firstStart = currentEntry.timeStart;\n }\n\n const timeFromPrevious: number = getTimeFrom(currentEntry, lastEntry);\n\n if (timeFromPrevious === 0) {\n totalDuration += currentEntry.duration;\n } else if (timeFromPrevious > 0) {\n totalDuration += timeFromPrevious + currentEntry.duration;\n } else if (timeFromPrevious < 0) {\n totalDuration += Math.max(currentEntry.duration + timeFromPrevious, 0);\n }\n if (isNewLatest(currentEntry, lastEntry)) {\n lastEntry = currentEntry;\n }\n }\n }\n\n return { scopedRundown, firstStart: firstStart ?? 0, totalDuration };\n }, [hidePast, rundown, selectedEventId]);\n\n return data;\n}\n\ntype UpcomingEvents = {\n now: ExtendedEntry<OntimeEvent> | null;\n next: ExtendedEntry<OntimeEvent> | null;\n followedBy: ExtendedEntry<OntimeEvent> | null;\n};\n\n/**\n * Returns upcoming events from current: now, next and followedBy\n */\nexport function getUpcomingEvents(events: ExtendedEntry<PlayableEvent>[], selectedId: MaybeString): UpcomingEvents {\n if (events.length === 0) {\n return { now: null, next: null, followedBy: null };\n }\n\n let now = selectedId ? (getEventWithId(events, selectedId) as ExtendedEntry<OntimeEvent>) : null;\n if (!isOntimeEvent(now)) {\n now = null;\n }\n\n const next = now\n ? (getNextEvent(events, now.id)?.nextEvent as ExtendedEntry<OntimeEvent> | null)\n : (getFirstEvent(events).firstEvent as ExtendedEntry<OntimeEvent> | null);\n const followedBy = next ? (getNextEvent(events, next.id)?.nextEvent as ExtendedEntry<OntimeEvent> | null) : null;\n\n // Return the titles, handling nulls appropriately\n return {\n now,\n next,\n followedBy,\n };\n}\n\n/**\n * Utility function calculates time to start\n */\nexport function getTimeToStart(now: number, start: number, delay: number, offset: number): number {\n return start + delay - now + offset;\n}\n\ninterface TimelineLayout {\n positions: CSSPosition[];\n scale: number;\n totalWidth: number;\n}\n\n/**\n * Calculates positions for all events and applies scaling if needed\n */\nexport function calculateTimelineLayout(\n events: Array<{ start: number; duration: number }>,\n scheduleStart: number,\n scheduleEnd: number,\n containerWidth: number,\n canScroll: boolean,\n minWidth = 100,\n): TimelineLayout {\n // Calculate positions and track minimum width\n let smallestWidth = Infinity;\n const positions = events.map(({ start, duration }) => {\n const position = getElementPosition(scheduleStart, scheduleEnd, start, duration, containerWidth);\n smallestWidth = Math.min(smallestWidth, position.width);\n return position;\n });\n\n if (!canScroll) {\n return {\n positions: positions,\n scale: 1,\n totalWidth: containerWidth,\n };\n }\n\n // Determine if scaling is needed\n const scale = smallestWidth < minWidth ? minWidth / smallestWidth : 1;\n\n // If no scaling is needed, return base positions\n if (scale === 1) {\n return {\n positions,\n scale: 1,\n totalWidth: containerWidth,\n };\n }\n\n // Apply scale to all positions\n const scaledPositions = positions.map((pos) => ({\n left: pos.left * scale,\n width: pos.width * scale,\n }));\n\n return {\n positions: scaledPositions,\n scale,\n totalWidth: containerWidth * scale,\n };\n}\n","import { makeTimelineSections } from '../timeline.utils';\n\nimport style from './TimelineMarkers.module.scss';\n\ninterface TimelineMarkersProps {\n startHour: number;\n endHour: number;\n}\n\n/** Creates a line for every hour in the timeline */\nexport default function TimelineMarkers(props: TimelineMarkersProps) {\n const { startHour, endHour } = props;\n\n const elements = makeTimelineSections(startHour, endHour);\n\n return (\n <div className={style.markers}>\n {elements.map((tag) => (\n <span key={tag} />\n ))}\n </div>\n );\n}\n","import { RefObject } from 'react';\n\nimport { useExpectedStartData, useTimer } from '../../common/hooks/useSocket';\nimport { getProgress } from '../../common/utils/getProgress';\nimport { alpha, cx } from '../../common/utils/styleUtils';\nimport { formatDuration, formatTime, getExpectedTimesFromExtendedEvent } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\n\nimport { getStatusLabel } from './timeline.utils';\n\nimport style from './Timeline.module.scss';\n\nexport type ProgressStatus = 'done' | 'live' | 'future';\n\ninterface TimelineEntryProps {\n colour: string;\n delay: number;\n duration: number;\n hasLink: boolean;\n left: number;\n status: ProgressStatus;\n start: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n title: string;\n width: number;\n cue: string;\n ref?: RefObject<HTMLDivElement | null>;\n}\n\nconst formatOptions = {\n format12: 'h:mm a',\n format24: 'HH:mm',\n};\n\nexport function TimelineEntry({\n colour,\n delay,\n duration,\n hasLink,\n left,\n status,\n start,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n title,\n width,\n cue,\n ref,\n}: TimelineEntryProps) {\n const formattedStartTime = formatTime(start, formatOptions);\n const formattedDuration = formatDuration(duration);\n const delayedStart = start + delay;\n const hasDelay = delay > 0;\n\n const lighterColour = alpha(colour, 0.7);\n const showTitle = width > 25;\n const smallArea = width < 40;\n\n return (\n <div\n ref={ref}\n className={cx([style.column, smallArea && style.smallArea])}\n style={{\n '--color': colour,\n '--lighter': lighterColour ?? '',\n left: `${left}px`,\n width: `${width}px`,\n }}\n data-testid={cue}\n >\n {status === 'live' ? <ActiveBlock /> : <div data-status={status} className={style.timelineBlock} />}\n <div\n className={cx([style.content, width < 20 && style.hide, !hasLink && style.separeLeft])}\n data-status={status}\n style={{\n '--color': colour,\n }}\n >\n <div className={style.maybeInline}>\n <div className={cx([hasDelay && style.cross])}>{formattedStartTime}</div>\n {hasDelay && <div className={style.delay}>{formatTime(delayedStart, formatOptions)}</div>}\n {smallArea && (\n <TimelineEntryStatus\n delay={delay}\n start={start}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n status={status}\n />\n )}\n </div>\n {showTitle && (\n <>\n {!smallArea && (\n <TimelineEntryStatus\n delay={delay}\n start={start}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n status={status}\n />\n )}\n <div>{title}</div>\n </>\n )}\n </div>\n <div className={style.timeOverview} data-status={status}>\n {status !== 'done' && <div className={style.duration}>{formattedDuration}</div>}\n </div>\n </div>\n );\n}\n\ninterface TimelineEntryStatusProps {\n delay: number;\n start: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n status: ProgressStatus;\n}\n\n// extract component to isolate re-renders provoked by the clock changes\nfunction TimelineEntryStatus({\n delay,\n start,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n status,\n}: TimelineEntryStatusProps) {\n const state = useExpectedStartData();\n\n const { getLocalizedString } = useTranslation();\n\n const { timeToStart } = getExpectedTimesFromExtendedEvent(\n { timeStart: start, delay, dayOffset, totalGap, isLinkedToLoaded, countToEnd: false, duration: 0 },\n state,\n );\n\n let statusText = getStatusLabel(timeToStart, status);\n if (statusText === 'live') {\n statusText = getLocalizedString('timeline.live');\n } else if (statusText === 'pending') {\n statusText = getLocalizedString('timeline.due');\n }\n\n const isDue = status === 'future' && timeToStart <= 0;\n\n return <div className={cx([style.status, isDue && style.due])}>{statusText}</div>;\n}\n\n/** Generates a block level progress bar */\nfunction ActiveBlock() {\n const { current, duration } = useTimer();\n const progress = getProgress(current, duration);\n return <div data-status='live' className={style.timelineBlock} style={{ '--progress': `${progress}%` }} />;\n}\n","import { memo, useMemo, useRef } from 'react';\nimport { useViewportSize } from '@mantine/hooks';\nimport { isOntimeEvent, isPlayableEvent, OntimeEntry, PlayableEvent } from 'ontime-types';\nimport { dayInMs, getLastEvent, MILLIS_PER_HOUR } from 'ontime-utils';\n\nimport useHorizontalFollowComponent from '../../common/hooks/useHorizontalFollowComponent';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport TimelineMarkers from './timeline-markers/TimelineMarkers';\nimport { useTimelineOptions } from './timeline.options';\nimport { calculateTimelineLayout, getEndHour, getStartHour } from './timeline.utils';\nimport { ProgressStatus, TimelineEntry } from './TimelineEntry';\n\nimport style from './Timeline.module.scss';\n\ninterface TimelineProps {\n firstStart: number;\n rundown: ExtendedEntry<OntimeEntry>[];\n selectedEventId: string | null;\n totalDuration: number;\n}\n\nexport default memo(Timeline);\nfunction Timeline({ firstStart, rundown, selectedEventId, totalDuration }: TimelineProps) {\n const { width: screenWidth } = useViewportSize();\n const { hidePast, fixedSize } = useTimelineOptions();\n const selectedRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n const { lastEvent } = getLastEvent(rundown);\n const startHour = getStartHour(firstStart);\n const endHour = getEndHour(firstStart + totalDuration + (lastEvent?.delay ?? 0));\n const scheduleStart = startHour * MILLIS_PER_HOUR;\n const scheduleEnd = endHour * MILLIS_PER_HOUR;\n\n // use horizontal follow when scroll is enabled\n useHorizontalFollowComponent({\n followRef: selectedRef,\n scrollRef: scrollContainerRef,\n doFollow: !fixedSize,\n selectedEventId: selectedEventId,\n // No offset when hiding past events to ensure content starts at 0\n leftOffset: hidePast ? 0 : screenWidth / 6,\n });\n\n const { positions, totalWidth } = useMemo(() => {\n const playableEvents = rundown\n .filter((event): event is ExtendedEntry<PlayableEvent> => isOntimeEvent(event) && isPlayableEvent(event))\n .map((event) => ({\n start: event.timeStart + (event.dayOffset ?? 0) * dayInMs + (event.delay ?? 0),\n duration: event.duration,\n }));\n\n return calculateTimelineLayout(playableEvents, scheduleStart, scheduleEnd, screenWidth, !fixedSize);\n }, [rundown, scheduleStart, scheduleEnd, screenWidth, fixedSize]);\n\n if (totalDuration === 0) {\n return null;\n }\n\n // Pre-calculate event statuses\n let currentStatus: ProgressStatus = selectedEventId ? 'done' : 'future';\n const statusMap: Record<string, ProgressStatus> = {};\n rundown.forEach((event) => {\n if (isOntimeEvent(event) && isPlayableEvent(event)) {\n if (currentStatus === 'live') {\n currentStatus = 'future';\n }\n if (event.id === selectedEventId) {\n currentStatus = 'live';\n }\n statusMap[event.id] = currentStatus;\n }\n });\n\n return (\n <div ref={scrollContainerRef} className={cx([style.timelineContainer, !fixedSize && style.scroll])}>\n <div className={style.timeline} style={{ width: totalWidth }}>\n <TimelineMarkers startHour={startHour} endHour={endHour} />\n {rundown.map((event, index) => {\n if (!isOntimeEvent(event) || !isPlayableEvent(event)) {\n return null;\n }\n\n const position = positions[index];\n if (!position) return null;\n\n return (\n <TimelineEntry\n key={event.id}\n ref={event.id === selectedEventId ? selectedRef : undefined}\n colour={event.colour}\n delay={event.delay ?? 0}\n duration={event.duration}\n hasLink={Boolean(event.linkStart)}\n left={position.left}\n status={statusMap[event.id]}\n start={event.timeStart + (event.dayOffset ?? 0) * dayInMs}\n totalGap={event.totalGap}\n isLinkedToLoaded={event.isLinkedToLoaded}\n dayOffset={event.dayOffset}\n title={event.title}\n cue={event.cue}\n width={position.width}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import { memo } from 'react';\nimport { MaybeString } from 'ontime-types';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\ninterface SectionProps {\n category: 'now' | 'next' | 'followedBy';\n content: MaybeString;\n title: string;\n status?: string;\n}\n\nexport default memo(TimelineSection);\n\nfunction TimelineSection({ category, content, title, status }: SectionProps) {\n const sectionClasses = cx(['section', category === 'now' && 'section--now']);\n const contentClasses = cx(['section-content', content ? `section-content--${category}` : 'section-content--subdue']);\n return (\n <div className={sectionClasses} data-testid={category}>\n <div className='section-title'>\n <span className='section-title__label'>{title}</span>\n {status && <span className='section-title__status'>{status}</span>}\n </div>\n <div className={contentClasses}>{content ?? '-'}</div>\n </div>\n );\n}\n","import { OntimeEvent } from 'ontime-types';\nimport { MILLIS_PER_MINUTE } from 'ontime-utils';\n\nimport { useExpectedStartData } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatDuration, getExpectedTimesFromExtendedEvent } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\n\nimport TimelineSection from './timeline-section/TimelineSection';\n\ninterface TimelineSectionsProps {\n now: ExtendedEntry<OntimeEvent> | null;\n next: ExtendedEntry<OntimeEvent> | null;\n followedBy: ExtendedEntry<OntimeEvent> | null;\n}\n\nexport default function TimelineSections({ now, next, followedBy }: TimelineSectionsProps) {\n const { getLocalizedString } = useTranslation();\n const state = useExpectedStartData();\n\n // gather card data\n const titleNow = now?.title ?? '-';\n const dueText = getLocalizedString('timeline.due').toUpperCase();\n const nextText = next !== null ? next.title : '-';\n const followedByText = followedBy !== null ? followedBy.title : '-';\n let nextStatus: string | undefined;\n let followedByStatus: string | undefined;\n\n if (next !== null) {\n const { timeToStart } = getExpectedTimesFromExtendedEvent(next, state);\n if (timeToStart <= 0) {\n nextStatus = dueText;\n } else {\n nextStatus = formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 10);\n }\n }\n\n if (followedBy !== null) {\n const { timeToStart } = getExpectedTimesFromExtendedEvent(followedBy, state);\n if (timeToStart <= 0) {\n followedByStatus = dueText;\n } else {\n followedByStatus = formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 10);\n }\n }\n\n return (\n <div className='title-grid'>\n <TimelineSection title={getLocalizedString('timeline.live')} content={titleNow} category='now' />\n <TimelineSection\n title={getLocalizedString('common.next')}\n status={nextStatus}\n content={nextText}\n category='next'\n />\n <TimelineSection\n title={getLocalizedString('timeline.followedby')}\n status={followedByStatus}\n content={followedByText}\n category='followedBy'\n />\n </div>\n );\n}\n","import { OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimelineData {\n events: ExtendedEntry<OntimeEntry>[];\n projectData: ProjectData;\n settings: Settings;\n}\n\nexport function useTimelineData(): ViewData<TimelineData> {\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundownWithMetadata();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n events: rundownData,\n projectData,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useClock, useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport SuperscriptTime from '../common/superscript-time/SuperscriptTime';\n\nimport Timeline from './Timeline';\nimport { getTimelineOptions } from './timeline.options';\nimport { getUpcomingEvents, useScopedRundown } from './timeline.utils';\nimport TimelineSections from './TimelineSections';\nimport { TimelineData, useTimelineData } from './useTimelineData';\n\nimport './TimelinePage.scss';\n\nexport default function TimelinePageLoader() {\n const { data, status } = useTimelineData();\n\n useWindowTitle('Timeline');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <TimelinePage {...data} />;\n}\n\nfunction TimelinePage({ events, projectData, settings }: TimelineData) {\n const { selectedEventId } = useSelectedEventId();\n // holds copy of the rundown with only relevant events\n const { scopedRundown, firstStart, totalDuration } = useScopedRundown(events, selectedEventId);\n\n // gather card options\n const { now, next, followedBy } = useMemo(() => {\n return getUpcomingEvents(scopedRundown, selectedEventId);\n }, [scopedRundown, selectedEventId]);\n\n // populate options\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const progressOptions = useMemo(() => getTimelineOptions(defaultFormat), [defaultFormat]);\n\n return (\n <div className='timeline' data-testid='timeline-view'>\n <ViewParamsEditor target={OntimeView.Timeline} viewOptions={progressOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <TimelineClock />\n </div>\n\n <TimelineSections now={now} next={next} followedBy={followedBy} />\n\n <Timeline\n firstStart={firstStart}\n rundown={scopedRundown}\n selectedEventId={selectedEventId}\n totalDuration={totalDuration}\n />\n </div>\n );\n}\n\nfunction TimelineClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["getTimeFrom","current","previous","normalisedCurrentStart","timeStart","dayOffset","dayInMs","normalisedPreviousEnd","duration","scrollToComponent","componentRef","scrollRef","leftOffset","scrollTo","left","behavior","componentRect","getBoundingClientRect","scrollRect","scrollLeft","useHorizontalFollowComponent","followRef","doFollow","selectedEventId","setScrollFlag","useEffect","window","requestAnimationFrame","useCallback","containerRef","offset","getTimelineOptions","timeFormat","title","OptionTitle","ClockOptions","collapsible","options","getTimeOption","ElementVisibility","id","description","type","defaultValue","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","hidePast","isStringBoolean","fixedSize","useTimelineOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","URLSearchParams","search","undefined","getElementPosition","scheduleStart","scheduleEnd","eventStart","eventDuration","containerWidth","totalDuration","width","getStartHour","startTime","hours","Math","floor","MILLIS_PER_HOUR","getEndHour","endTime","ceil","makeTimelineSections","firstHour","lastHour","timelineSections","i","push","getStatusLabel","timeToStart","status","formatDuration","MILLIS_PER_MINUTE","useScopedRundown","rundown","data","length","scopedRundown","firstStart","selectedIndex","Infinity","lastEntry","currentEntry","isOntimeEvent","isPlayableEvent","timeFromPrevious","max","isNewLatest","getUpcomingEvents","events","selectedId","now","next","followedBy","getEventWithId","getNextEvent","nextEvent","getFirstEvent","firstEvent","calculateTimelineLayout","canScroll","minWidth","smallestWidth","positions","map","start","position","min","scale","totalWidth","pos","TimelineMarkers","props","startHour","endHour","elements","jsx","style","markers","tag","formatOptions","format12","format24","TimelineEntry","colour","delay","hasLink","totalGap","isLinkedToLoaded","cue","ref","formattedStartTime","formatTime","formattedDuration","delayedStart","hasDelay","lighterColour","alpha","showTitle","smallArea","jsxs","cx","column","ActiveBlock","timelineBlock","content","hide","separeLeft","maybeInline","cross","TimelineEntryStatus","Fragment","timeOverview","state","useExpectedStartData","getLocalizedString","useTranslation","getExpectedTimesFromExtendedEvent","countToEnd","statusText","isDue","due","useTimer","progress","getProgress","memo","Timeline","screenWidth","useViewportSize","selectedRef","useRef","scrollContainerRef","lastEvent","getLastEvent","playableEvents","filter","event","currentStatus","statusMap","forEach","timelineContainer","scroll","timeline","index","Boolean","linkStart","TimelineSection","category","sectionClasses","contentClasses","TimelineSections","titleNow","dueText","toUpperCase","nextText","followedByText","nextStatus","followedByStatus","useTimelineData","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","aggregateQueryStatus","TimelinePageLoader","useWindowTitle","Loader","EmptyPage","TimelinePage","useSelectedEventId","defaultFormat","getDefaultFormat","progressOptions","ViewParamsEditor","OntimeView","logo","ViewLogo","TimelineClock","clock","useClock","formattedClock","SuperscriptTime"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{l as fe,h as x,j as o}from"./vendor-q6fv0YT2.js";import{P as he,T as c,u as ye,a as ve,b as Te,L as be,c as xe,d as we,f as Se,g as Ce,e as m,O as ke}from"./index-B81u4hxi.js";import{g as Oe,a as Ne,b as Pe,c as je,d as Me,e as Ve,f as Fe,h as ze,i as Le,F as b}from"./timer.utils-rGyI9NYa.js";import{M as De}from"./MultiPartProgressBar-BXdLxJpy.js";import{E as Ee}from"./EmptyPage-Bc358YpE.js";import{T as E}from"./TitleCard-Xdr7xwzU.js";import{V as He}from"./ViewLogo-G7EosFIr.js";import{m as H,O as p,V as Ie}from"./ViewParamsEditor-C2-TRP6e.js";import{u as Be}from"./useWindowTitle-Bpmo_HzW.js";import{S as Ze}from"./SuperscriptTime-CA6S2R55.js";import{m as I,i as n,g as _e,a as We}from"./viewUtils-B8Dr4GHH.js";import{g as Ae}from"./presentation.utils-Cl-L3pHN.js";import{g as Ue,h as Re,s as Ke,a as Qe}from"./viewLoader.utils-b42scp-I.js";import{v as $e}from"./validateEvent-Do8yE_DJ.js";import{u as qe}from"./useCustomFields-k4piRt9n.js";import{u as Ge}from"./useProjectData-DdgKoYzk.js";import"./playbackstate-CPQdnF-k.js";import"./getProgress-cLuBFPjh.js";import"./Empty-CJbZxh45.js";import"./Select-BGGVCKqU.js";import"./SwatchPicker-Cm5Eicvv.js";/* empty css */(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="6f9f8085-43f9-4070-9ad8-01a1c8d7f187",s._sentryDebugIdIdentifier="sentry-dbid-6f9f8085-43f9-4070-9ad8-01a1c8d7f187")}catch{}})();const Je=[{value:"no-overrides",label:"No Overrides"},{value:c.CountUp,label:"Count Up"},{value:c.CountDown,label:"Count Down"},{value:c.Clock,label:"Clock"}],Xe=(s,t)=>{const e=H(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),i=H(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]);return[{title:p.ClockOptions,collapsible:!0,options:[Ue(s)]},{title:p.TimerOptions,collapsible:!0,options:[Re,Ke,{id:"timerType",title:"Timer type",description:"Override the timer type",type:"option",values:Je,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:p.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:e,defaultValue:"title"},{id:"secondary-src",title:"Secondary text",description:"Select the data source for the secondary text",type:"option",values:i,defaultValue:"none"}]},{title:p.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:p.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 Ye(s,t){const e=l=>(t==null?void 0:t.get(l))??s.get(l),i=$e(e("timerType"),c.None);return{hideClock:n(e("hideClock")),hideCards:n(e("hideCards")),hideProgress:n(e("hideProgress")),hideMessage:n(e("hideMessage")),hideSecondary:n(e("hideSecondary")),hideLogo:n(e("hideLogo")),hideTimerSeconds:n(e("hideTimerSeconds")),removeLeadingZeros:!n(e("showLeadingZeros")),mainSource:e("main"),secondarySource:e("secondary-src"),timerType:i===c.None?void 0:i,freezeOvertime:n(e("freezeOvertime")),freezeMessage:e("freezeMessage")??"",hidePhase:n(e("hidePhase")),font:e("font")??void 0,keyColour:I(e("keyColour")),timerColour:I(e("timerColour"))}}function et(){const[s]=fe(),t=x.use(he);return x.useMemo(()=>{const i=t?new URLSearchParams(t.search):void 0;return Ye(s,i)},[t,s])}function tt(){const s=ye(g=>g.mirror),{data:t,status:e}=Ge(),{data:i,status:l}=ve(),{data:f,status:d}=Te(),{data:r,status:a}=qe();return{data:{customFields:r,projectData:t,isMirrored:s,settings:f,viewSettings:i},status:Qe([e,l,d,a])}}function kt(){const{data:s,status:t}=tt();return Be("Timer"),t==="pending"?o.jsx(be,{}):t==="error"?o.jsx(Ee,{text:"There was an error fetching data, please refresh the page."}):o.jsx(ot,{...s})}function ot({customFields:s,projectData:t,isMirrored:e,settings:i,viewSettings:l}){const{eventNext:f,eventNow:d,message:r,time:a,clock:g,timerTypeNow:h,countToEndNow:B,auxTimer:y}=xe(),{hideClock:Z,hideCards:_,hideProgress:W,hideMessage:A,hideSecondary:U,hideLogo:R,hideTimerSeconds:w,removeLeadingZeros:S,mainSource:K,secondarySource:Q,timerType:C,freezeOvertime:k,freezeMessage:O,hidePhase:$,font:N,keyColour:P,timerColour:q}=et(),{getLocalizedString:j}=we(),M=j("common.minutes"),u=C??h,V=Oe(r.timer),{showEndMessage:G,showFinished:v,showWarning:J,showDanger:X}=Ne(h,B,a.phase,k,O,$),F=Pe(a.playback),Y=!Z&&je(u),ee=!W&&Me(u),{showNow:te,nowMain:oe,nowSecondary:se,showNext:ie,nextMain:re,nextSecondary:ae}=Ve(d,f,K,Q,a.playback,a.phase),ne=Fe(a.duration,a.addedTime),le=Se(g),de=_e(k,h,g,a,C),z=We(de,u,M,{removeSeconds:w,removeLeadingZero:S}),me=r.timer.secondarySource==="aux1"?y.aux1:r.timer.secondarySource==="aux2"?y.aux2:r.timer.secondarySource==="aux3"?y.aux3:null,T=ze(r,me,M,w,S,U),L=Ae(l,q,J,X),ce=Le(z,T),ue=!F&&u!==c.Clock,pe={...P&&{"--timer-bg":P},...L&&{"--timer-colour":L},...N&&{"--timer-font":N}},D=Ce(i==null?void 0:i.timeFormat),ge=x.useMemo(()=>Xe(D,s),[s,D]);return o.jsxs("div",{"data-testid":"timer-view",className:m(["stage-timer",e&&"mirror",v&&"stage-timer--finished"]),style:pe,children:[!R&&(t==null?void 0:t.logo)&&o.jsx(He,{name:t.logo,className:"logo"}),o.jsx(Ie,{target:ke.Timer,viewOptions:ge}),o.jsx("div",{className:m(["blackout",r.timer.blackout&&"blackout--active"])}),!A&&o.jsx("div",{className:m(["message-overlay",V&&"message-overlay--active"]),children:o.jsx(b,{mode:"multi",min:32,max:256,className:m(["message",r.timer.blink&&"blink"]),children:r.timer.text})}),Y&&o.jsxs("div",{className:"clock-container",children:[o.jsx("div",{className:"label",children:j("common.time_now")}),o.jsx(Ze,{time:le,className:"clock"})]}),o.jsxs("div",{className:m(["timer-container",r.timer.blink&&!V&&"blink"]),children:[G?o.jsx(b,{mode:"multi",min:64,max:256,className:"end-message",children:O}):o.jsx("div",{className:m(["timer",ue&&"timer--paused",v&&"timer--finished"]),style:{fontSize:`${ce}vw`},"data-type":u,"data-phase":a.phase,children:z}),o.jsx("div",{className:m(["secondary",!T&&"secondary--hidden"]),children:o.jsx(b,{mode:"multi",min:64,max:256,children:T})})]}),ee&&o.jsx(De,{className:m(["progress-container",!F&&"progress-container--paused"]),now:a.current,complete:ne,normalColor:l.normalColor,warning:d==null?void 0:d.timeWarning,warningColor:l.warningColor,danger:d==null?void 0:d.timeDanger,dangerColor:l.dangerColor,hideOvertime:!v}),!_&&o.jsxs(o.Fragment,{children:[te&&o.jsx(E,{className:"event now",label:"now",title:oe,secondary:se}),ie&&o.jsx(E,{className:"event next",label:"next",title:re,secondary:ae})]})]})}export{kt as default};
2
+ //# sourceMappingURL=Timer-BbixOGdj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timer-BbixOGdj.js","sources":["../../src/views/timer/timer.options.ts","../../src/views/timer/useTimerData.ts","../../src/views/timer/Timer.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, TimerType } from 'ontime-types';\nimport { validateTimerType } from 'ontime-utils';\n\nimport type { SelectOption } from '../../common/components/select/Select';\nimport {\n getTimeOption,\n hideTimerSeconds,\n showLeadingZeros,\n} from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean, makeColourString } from '../common/viewUtils';\n\n// manually match the properties of TimerType excluding the None\nconst timerDisplayOptions: SelectOption[] = [\n { value: 'no-overrides', label: 'No Overrides' },\n { value: TimerType.CountUp, label: 'Count Up' },\n { value: TimerType.CountDown, label: 'Count Down' },\n { value: TimerType.Clock, label: 'Clock' },\n];\n\nexport const getTimerOptions = (timeFormat: string, customFields: CustomFields): ViewOption[] => {\n const mainOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.TimerOptions,\n collapsible: true,\n options: [\n hideTimerSeconds,\n showLeadingZeros,\n {\n id: 'timerType',\n title: 'Timer type',\n description: 'Override the timer type',\n type: 'option',\n values: timerDisplayOptions,\n defaultValue: 'no-overrides',\n },\n {\n id: 'freezeOvertime',\n title: 'Freeze Overtime',\n description: 'If active, the timer will not count into negative numbers',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'freezeMessage',\n title: 'Freeze Message',\n description:\n 'An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)',\n type: 'string',\n defaultValue: '',\n placeholder: 'e.g. Time is up!',\n },\n {\n id: 'hidePhase',\n title: 'Hide progress styles',\n description: 'Whether to suppress the progress styles (warning, danger and overtime)',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary text',\n description: 'Select the data source for the secondary text',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideClock',\n title: 'Hide Time Now',\n description: 'Hides the Time Now field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideCards',\n title: 'Hide Cards',\n description: 'Hides the Now and Next cards',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideProgress',\n title: 'Hide progress bar',\n description: 'Hides the progress bar',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideMessage',\n title: 'Hide Timer Message',\n description: 'Prevents displaying fullscreen messages in the timer',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideSecondary',\n title: 'Hide Auxiliary timer / Secondary message',\n description: 'Prevents the screen from displaying the secondary timer field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideLogo',\n title: 'Hide the project logo',\n description: 'Prevents the screen from displaying the given project logo',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.StyleOverride,\n collapsible: true,\n options: [\n {\n id: 'font',\n title: 'Font',\n description: 'Font family, will use the fonts available in the system',\n type: 'string',\n placeholder: 'Open Sans (default)',\n },\n {\n id: 'keyColour',\n title: 'Key Colour',\n description: 'Background or key colour for entire view. Default: #101010',\n type: 'colour',\n defaultValue: '101010',\n },\n {\n id: 'timerColour',\n title: 'Timer Colour',\n description: 'Timer colour. Default: #f6f6f6',\n type: 'colour',\n defaultValue: 'f6f6f6',\n },\n ],\n },\n ];\n};\n\ntype TimerOptions = {\n hideClock: boolean;\n hideCards: boolean;\n hideProgress: boolean;\n hideMessage: boolean;\n hideSecondary: boolean;\n hideLogo: boolean;\n hideTimerSeconds: boolean;\n removeLeadingZeros: boolean;\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n timerType?: TimerType;\n freezeOvertime: boolean;\n freezeMessage: string;\n hidePhase: boolean;\n font?: string;\n keyColour?: string;\n timerColour?: string;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallbacks are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): TimerOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Get timerType from either source\n const timerType = validateTimerType(getValue('timerType'), TimerType.None);\n\n return {\n hideClock: isStringBoolean(getValue('hideClock')),\n hideCards: isStringBoolean(getValue('hideCards')),\n hideProgress: isStringBoolean(getValue('hideProgress')),\n hideMessage: isStringBoolean(getValue('hideMessage')),\n hideSecondary: isStringBoolean(getValue('hideSecondary')),\n hideLogo: isStringBoolean(getValue('hideLogo')),\n hideTimerSeconds: isStringBoolean(getValue('hideTimerSeconds')),\n removeLeadingZeros: !isStringBoolean(getValue('showLeadingZeros')),\n\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n\n // none doesnt make sense as a configuration of the view\n timerType: timerType === TimerType.None ? undefined : timerType,\n freezeOvertime: isStringBoolean(getValue('freezeOvertime')),\n freezeMessage: getValue('freezeMessage') ?? '',\n hidePhase: isStringBoolean(getValue('hidePhase')),\n\n font: getValue('font') ?? undefined,\n keyColour: makeColourString(getValue('keyColour')),\n timerColour: makeColourString(getValue('timerColour')),\n };\n}\n\n/**\n * Hook exposes the timer view options\n */\nexport function useTimerOptions(): TimerOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, ProjectData, Settings, ViewSettings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport useViewSettings from '../../common/hooks-query/useViewSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimerData {\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n}\n\nexport function useTimerData(): ViewData<TimerData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: viewSettings, status: viewSettingsStatus } = useViewSettings();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n projectData,\n isMirrored,\n settings,\n viewSettings,\n },\n status: aggregateQueryStatus([projectDataStatus, viewSettingsStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView, TimerType } from 'ontime-types';\n\nimport { FitText } from '../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useTimerSocket } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport SuperscriptTime from '../common/superscript-time/SuperscriptTime';\nimport { getFormattedTimer, getTimerByType } from '../common/viewUtils';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getTimerOptions, useTimerOptions } from './timer.options';\nimport {\n getCardData,\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowClock,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from './timer.utils';\nimport { TimerData, useTimerData } from './useTimerData';\n\nimport './Timer.scss';\n\nexport default function TimerLoader() {\n const { data, status } = useTimerData();\n\n useWindowTitle('Timer');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Timer {...data} />;\n}\n\nfunction Timer({ customFields, projectData, isMirrored, settings, viewSettings }: TimerData) {\n const { eventNext, eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n const {\n hideClock,\n hideCards,\n hideProgress,\n hideMessage,\n hideSecondary,\n hideLogo,\n hideTimerSeconds,\n removeLeadingZeros,\n mainSource,\n secondarySource,\n timerType,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n font,\n keyColour,\n timerColour,\n } = useTimerOptions();\n\n const { getLocalizedString } = useTranslation();\n const localisedMinutes = getLocalizedString('common.minutes');\n\n // gather modifiers\n const viewTimerType = timerType ?? timerTypeNow;\n const showOverlay = getShowMessage(message.timer);\n const { showEndMessage, showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showClock = !hideClock && getShowClock(viewTimerType);\n const showProgressBar = !hideProgress && getShowProgressBar(viewTimerType);\n\n // gather card data\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n mainSource,\n secondarySource,\n time.playback,\n time.phase,\n );\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const formattedClock = formatTime(clock);\n const stageTimer = getTimerByType(freezeOvertime, timerTypeNow, clock, time, timerType);\n const display = getFormattedTimer(stageTimer, viewTimerType, localisedMinutes, {\n removeSeconds: hideTimerSeconds,\n removeLeadingZero: removeLeadingZeros,\n });\n\n const currentAux = (() => {\n if (message.timer.secondarySource === 'aux1') {\n return auxTimer.aux1;\n }\n if (message.timer.secondarySource === 'aux2') {\n return auxTimer.aux2;\n }\n if (message.timer.secondarySource === 'aux3') {\n return auxTimer.aux3;\n }\n return null;\n })();\n\n const secondaryContent = getSecondaryDisplay(\n message,\n currentAux,\n localisedMinutes,\n hideTimerSeconds,\n removeLeadingZeros,\n hideSecondary,\n );\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, timerColour, showWarning, showDanger);\n const timerFontSize = getEstimatedFontSize(display, secondaryContent);\n const subduePaused = !isPlaying && viewTimerType !== TimerType.Clock;\n const userStyles = {\n ...(keyColour && { '--timer-bg': keyColour }),\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n ...(font && { '--timer-font': font }),\n };\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const timerOptions = useMemo(() => getTimerOptions(defaultFormat, customFields), [customFields, defaultFormat]);\n\n return (\n <div\n data-testid='timer-view'\n className={cx(['stage-timer', isMirrored && 'mirror', showFinished && 'stage-timer--finished'])}\n style={userStyles}\n >\n {!hideLogo && projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n\n <ViewParamsEditor target={OntimeView.Timer} viewOptions={timerOptions} />\n\n <div className={cx(['blackout', message.timer.blackout && 'blackout--active'])} />\n\n {!hideMessage && (\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={32} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n )}\n\n {showClock && (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='clock' />\n </div>\n )}\n\n <div className={cx(['timer-container', message.timer.blink && !showOverlay && 'blink'])}>\n {showEndMessage ? (\n <FitText mode='multi' min={64} max={256} className='end-message'>\n {freezeMessage}\n </FitText>\n ) : (\n <div\n className={cx(['timer', subduePaused && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-type={viewTimerType}\n data-phase={time.phase}\n >\n {display}\n </div>\n )}\n <div className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}>\n <FitText mode='multi' min={64} max={256}>\n {secondaryContent}\n </FitText>\n </div>\n </div>\n\n {showProgressBar && (\n <MultiPartProgressBar\n className={cx(['progress-container', !isPlaying && 'progress-container--paused'])}\n now={time.current}\n complete={totalTime}\n normalColor={viewSettings.normalColor}\n warning={eventNow?.timeWarning}\n warningColor={viewSettings.warningColor}\n danger={eventNow?.timeDanger}\n dangerColor={viewSettings.dangerColor}\n hideOvertime={!showFinished}\n />\n )}\n\n {!hideCards && (\n <>\n {showNow && <TitleCard className='event now' label='now' title={nowMain} secondary={nowSecondary} />}\n {showNext && <TitleCard className='event next' label='next' title={nextMain} secondary={nextSecondary} />}\n </>\n )}\n </div>\n );\n}\n"],"names":["timerDisplayOptions","value","label","TimerType","CountUp","CountDown","Clock","getTimerOptions","timeFormat","customFields","mainOptions","makeOptionsFromCustomFields","secondaryOptions","title","OptionTitle","ClockOptions","collapsible","options","getTimeOption","TimerOptions","hideTimerSeconds","showLeadingZeros","id","description","type","values","defaultValue","placeholder","DataSources","ElementVisibility","StyleOverride","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","timerType","validateTimerType","None","hideClock","isStringBoolean","hideCards","hideProgress","hideMessage","hideSecondary","hideLogo","removeLeadingZeros","mainSource","secondarySource","undefined","freezeOvertime","freezeMessage","hidePhase","font","keyColour","makeColourString","timerColour","useTimerOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","URLSearchParams","search","useTimerData","isMirrored","useViewOptionsStore","state","mirror","data","projectData","status","projectDataStatus","useProjectData","viewSettings","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","TimerLoader","useWindowTitle","Loader","jsx","EmptyPage","Timer","eventNext","eventNow","message","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","getLocalizedString","useTranslation","localisedMinutes","viewTimerType","showOverlay","getShowMessage","timer","showEndMessage","showFinished","showWarning","showDanger","getShowModifiers","phase","isPlaying","getIsPlaying","playback","showClock","getShowClock","showProgressBar","getShowProgressBar","showNow","nowMain","nowSecondary","showNext","nextMain","nextSecondary","getCardData","totalTime","getTotalTime","duration","addedTime","formattedClock","formatTime","stageTimer","getTimerByType","display","getFormattedTimer","removeSeconds","removeLeadingZero","currentAux","aux1","aux2","aux3","secondaryContent","getSecondaryDisplay","resolvedTimerColour","getTimerColour","timerFontSize","getEstimatedFontSize","subduePaused","userStyles","defaultFormat","getDefaultFormat","timerOptions","jsxs","cx","logo","ViewLogo","ViewParamsEditor","OntimeView","blackout","FitText","blink","text","SuperscriptTime","fontSize","MultiPartProgressBar","current","normalColor","timeWarning","warningColor","timeDanger","dangerColor","TitleCard"],"mappings":"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"}
@@ -1 +1 @@
1
- .blink{animation:blink 1s step-start infinite}@keyframes blink{0%{opacity:100%}50%{opacity:20%}}.fourtyfive{transform:rotate(45deg)}.mirror{transform:rotate(180deg)}.stage-timer{margin:0;box-sizing:border-box;overflow:hidden;width:100%;height:100vh;transition:opacity .5s ease-in-out;font-family:var(--font-family-override, "Open Sans", "Segoe UI", sans-serif);background:var(--timer-bg, var(--background-color-override, #101010));color:var(--color-override, rgba(255, 255, 255, .8));gap:min(2vh,16px);padding:min(2vh,16px) clamp(16px,2vw,24px);display:flex;flex-direction:column}.stage-timer--finished{outline:clamp(4px,1vw,16px) solid var(--timer-overtime-color-override, #FA5656);outline-offset:calc(clamp(4px,1vw,16px)*-1);transition:.5s}.stage-timer .blackout{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-color:#000;opacity:0;transition:opacity .5s}.stage-timer .blackout--active{z-index:101;opacity:1}.stage-timer .clock-container{margin-left:auto;font-weight:600;transition:opacity .5s}.stage-timer .clock-container .label{font-size:clamp(12px,1.25vw,20px);color:var(--label-color-override, rgba(255, 255, 255, .25));text-transform:uppercase}.stage-timer .clock-container .clock{font-size:clamp(24px,2.5vw,48px);color:var(--secondary-color-override, rgba(255, 255, 255, .45));letter-spacing:.05em;line-height:.95em}.stage-timer .clock-container--hidden{opacity:0}.stage-timer .event{background-color:var(--card-background-color-override, rgba(255, 255, 255, .05));padding:min(2vh,8px) clamp(16px,2vw,24px);border-radius:4px}.stage-timer .event.now{grid-area:now}.stage-timer .event.next{grid-area:next}.stage-timer .timer-container{flex:1;align-content:center;justify-self:center;align-self:center;width:100%;overflow:hidden}.stage-timer .timer-container .end-message{text-align:center;font-size:11.5vw;font-weight:600;color:var(--timer-overtime-color-override, #FA5656);padding:0;max-height:100%}.stage-timer .timer-container .timer{opacity:1;font-family:var(--timer-font, var(--font-family-override, "Open Sans", "Segoe UI", sans-serif));color:var(--timer-colour, var(--timer-color-override, #f6f6f6));line-height:.9em;text-align:center;letter-spacing:.05em;font-weight:600;transition-property:font-size;transition-duration:.5s}.stage-timer .timer-container .timer--paused{opacity:.6;transition:.5s}.stage-timer .timer-container .timer--finished{color:var(--timer-overtime-color-override, #FA5656)}.stage-timer .timer-container .timer[data-phase=warning]{color:var(--timer-colour, var(--timer-warning-color-override))}.stage-timer .timer-container .timer[data-phase=danger]{color:var(--timer-colour, var(--timer-danger-color-override))}.stage-timer .timer-container .timer[data-type=none]{transition:1s;opacity:0}.stage-timer .secondary{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:.125em;padding-block:.125em;font-weight:600;text-align:center;color:var(--external-color-override, rgba(255, 255, 255, .85));letter-spacing:.5px;line-height:1em;transition-property:opacity,height;transition-duration:.5s;border-top:1px solid color-mix(in srgb,var(--external-color-override, rgba(255, 255, 255, .85)) 10%,transparent)}.stage-timer .secondary--hidden{opacity:0;height:0}.stage-timer .progress-container{width:100%;margin:0 auto;opacity:1;transition:.5s}.stage-timer .progress-container--paused{opacity:.6;transition:.5s}.stage-timer .message-overlay{position:fixed;top:0;right:0;bottom:0;left:0;padding:2vw;background:var(--background-color-override, #101010);opacity:0;transition:opacity .5s}.stage-timer .message-overlay--active{z-index:100;opacity:1}.stage-timer .message{display:grid;place-content:center;height:100%;width:100%;color:var(--color-override, rgba(255, 255, 255, .8));text-align:center;font-weight:600}.stage-timer .logo{position:absolute;top:min(2vh,16px);left:clamp(16px,2vw,24px);max-width:min(200px,20vw)}@media screen and (max-width: 768px){.stage-timer .logo img{height:min(50px,10vh)}}
1
+ .blink{animation:blink 1s step-start infinite}@keyframes blink{0%{opacity:100%}50%{opacity:20%}}.fourtyfive{transform:rotate(45deg)}.mirror{transform:rotate(180deg)}.stage-timer{margin:0;box-sizing:border-box;overflow:hidden;width:100%;height:100vh;transition:opacity .5s ease-in-out;font-family:var(--font-family-override, "Open Sans", "Segoe UI", sans-serif);background:var(--timer-bg, var(--background-color-override, #101010));color:var(--color-override, rgba(255, 255, 255, .8));gap:min(2vh,16px);padding:min(2vh,16px) clamp(16px,2vw,24px);display:flex;flex-direction:column}.stage-timer--finished{outline:clamp(4px,1vw,16px) solid var(--timer-overtime-color-override, #FA5656);outline-offset:calc(clamp(4px,1vw,16px)*-1);transition:.5s}.stage-timer .blackout{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-color:#000;opacity:0;transition:opacity .5s}.stage-timer .blackout--active{z-index:101;opacity:1}.stage-timer .clock-container{margin-left:auto;font-weight:600;transition:opacity .5s}.stage-timer .clock-container .label{font-size:clamp(12px,1.25vw,20px);color:var(--label-color-override, rgba(255, 255, 255, .25));text-transform:uppercase}.stage-timer .clock-container .clock{font-size:clamp(24px,2.5vw,48px);color:var(--secondary-color-override, rgba(255, 255, 255, .45));letter-spacing:.05em;line-height:.95em}.stage-timer .clock-container--hidden{opacity:0}.stage-timer .event{background-color:var(--card-background-color-override, rgba(255, 255, 255, .05));padding:min(2vh,8px) clamp(16px,2vw,24px);border-radius:4px}.stage-timer .event.now{grid-area:now}.stage-timer .event.next{grid-area:next}.stage-timer .timer-container{flex:1;align-content:center;justify-self:center;align-self:center;width:100%;overflow:hidden}.stage-timer .timer-container .end-message{text-align:center;font-size:11.5vw;font-weight:600;color:var(--timer-overtime-color-override, #FA5656);padding:0;max-height:100%}.stage-timer .timer-container .timer{opacity:1;font-family:var(--timer-font, var(--font-family-override, "Open Sans", "Segoe UI", sans-serif));color:var(--timer-colour, var(--timer-color-override, #f6f6f6));line-height:.9em;text-align:center;letter-spacing:.05em;font-weight:600;transition-property:font-size;transition-duration:.5s}.stage-timer .timer-container .timer--paused{opacity:.6;transition:.5s}.stage-timer .timer-container .timer--finished{color:var(--timer-overtime-color-override, #FA5656)}.stage-timer .timer-container .timer[data-phase=warning]{color:var(--timer-colour, var(--timer-warning-color-override))}.stage-timer .timer-container .timer[data-phase=danger]{color:var(--timer-colour, var(--timer-danger-color-override))}.stage-timer .timer-container .timer[data-type=none]{transition:1s;opacity:0}.stage-timer .secondary{white-space:nowrap;max-height:100%;height:auto;margin-top:.125em;padding-block:.125em;font-weight:600;text-align:center;color:var(--external-color-override, rgba(255, 255, 255, .85));letter-spacing:.5px;line-height:1;transition-property:opacity,height;transition-duration:.5s;border-top:1px solid color-mix(in srgb,var(--external-color-override, rgba(255, 255, 255, .85)) 10%,transparent)}.stage-timer .secondary--hidden{opacity:0;height:0}.stage-timer .progress-container{width:100%;margin:0 auto;opacity:1;transition:.5s}.stage-timer .progress-container--paused{opacity:.6;transition:.5s}.stage-timer .message-overlay{position:fixed;top:0;right:0;bottom:0;left:0;padding:2vw;background:var(--background-color-override, #101010);opacity:0;transition:opacity .5s}.stage-timer .message-overlay--active{z-index:100;opacity:1}.stage-timer .message{display:grid;place-content:center;height:100%;width:100%;color:var(--color-override, rgba(255, 255, 255, .8));text-align:center;font-weight:600}.stage-timer .logo{position:absolute;top:min(2vh,16px);left:clamp(16px,2vw,24px);max-width:min(200px,20vw)}@media screen and (max-width: 768px){.stage-timer .logo img{height:min(50px,10vh)}}
@@ -0,0 +1,2 @@
1
+ import{h as w,j as t,ay as Q,bK as W,T as Y,av as Z,y as tt,bL as D,bM as $,bN as q,bO as et,bP as st,bQ as at}from"./vendor-q6fv0YT2.js";import{P as nt,C as ot}from"./EditorUtils-DuKjlUkF.js";import{h as n,y as N,e as E,I as it,bF as c,bG as lt,bH as P,bI as h,bJ as I,bK as rt,m as g,bk as A,K as ct,k as S,s as dt,bL as mt,ax as ut,bz as xt,b8 as _t,bA as pt}from"./index-B81u4hxi.js";import{P as bt}from"./ProtectRoute-BH-QvsU0.js";import{T as z,A as ht}from"./TimeInput-C8DQoFXv.js";import{p as M}from"./parseUserTime-YeFR8t3F.js";import{T as R}from"./Tooltip-B5vsLcFu.js";import{u as yt}from"./useReport-DSuFnUb9.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="d17d0725-44f7-4804-b0f9-20e9540bebb7",e._sentryDebugIdIdentifier="sentry-dbid-d17d0725-44f7-4804-b0f9-20e9540bebb7")}catch{}})();function jt(e,s){return{start:e!==n.Stop&&e!==n.Play,pause:e===n.Play,roll:e!==n.Roll&&s!==N.Overtime,stop:e!==n.Stop,reload:e!==n.Stop&&e!==n.Roll}}const ft="_blink_yewzx_1",vt="_fourtyfive_yewzx_13",gt="_tapButton_yewzx_17",kt="_neutral_yewzx_29",Ct="_active_yewzx_51",Tt="_play_yewzx_66",Nt="_roll_yewzx_93",wt="_pause_yewzx_120",It="_ontime_yewzx_147",Pt="_stop_yewzx_174",At="_square_yewzx_201",St="_tight_yewzx_206",Rt="_fill_yewzx_211",f={blink:ft,fourtyfive:vt,tapButton:gt,neutral:kt,active:Ct,play:Tt,roll:Nt,pause:wt,ontime:It,stop:Pt,square:At,tight:St,fill:Rt},r=w.forwardRef((e,s)=>{const{children:a,disabled:o,onClick:l,theme:i="neutral",aspect:m="normal",active:u,className:x}=e;return t.jsx("button",{className:E([f.tapButton,x,f[i],f[m],u&&f.active]),disabled:o,type:"button",onClick:l,ref:s,children:a})});r.displayName="TabButton";const Bt="_addTime_18oax_17",Dt="_addButtons_18oax_24",$t="_tallButtons_18oax_30",v={addTime:Bt,addButtons:Dt,tallButtons:$t};function qt(e){const{playback:s}=e,[a,o]=Q({key:"add-time",defaultValue:3e5}),l=(x,k)=>{const p=M(k);o(Math.min(p,it))},i=x=>{x==="add"?c.addTime(a):c.addTime(-1*a)},u=!(s===n.Play||s===n.Pause)||a===0;return t.jsxs("div",{className:v.addTime,children:[t.jsx(z,{name:"addtime",submitHandler:l,time:a,placeholder:"Add time"}),t.jsxs("div",{className:v.addButtons,children:[t.jsx(r,{onClick:()=>i("remove"),disabled:u,className:v.tallButtons,children:t.jsx(W,{})}),t.jsx(r,{onClick:()=>i("add"),disabled:u,className:v.tallButtons,children:t.jsx(Y,{})})]})]})}const Et="_label_tat6w_17",zt="_controls_tat6w_24",Mt="_input_tat6w_28",Lt="_twoSides_tat6w_34",Ft="_fakeInput_tat6w_42",y={label:Et,controls:zt,input:Mt,twoSides:Lt,fakeInput:Ft};function C({index:e}){const{playback:s,direction:a}=lt(e),{stop:o,setDirection:l}=I,i=()=>{const x=a===h.CountDown?h.CountUp:h.CountDown;l(e,x)},m=s!==P.Stop,u=s===P.Start?"pause":"play";return t.jsxs("label",{className:y.label,children:["Aux Timer ",e,t.jsxs("div",{className:y.controls,children:[t.jsxs("div",{className:y.input,children:[t.jsx(Ot,{index:e,isActive:m}),t.jsxs(r,{onClick:i,aspect:"tight",disabled:m,children:[a===h.CountDown&&t.jsx(Z,{"data-testid":`aux-timer-direction-${e}`}),a===h.CountUp&&t.jsx(tt,{"data-testid":`aux-timer-direction-${e}`})]})]}),t.jsxs("div",{className:y.twoSides,children:[t.jsx(Ut,{index:e,action:u}),t.jsx(r,{onClick:()=>o(e),theme:n.Stop,disabled:!m,children:t.jsx(D,{"data-testid":`aux-timer-stop-${e}`})})]})]})]})}function Ot({index:e,isActive:s}){const a=rt(e),{setDuration:o}=I,l=(i,m)=>{const u=M(m);o(e,u)};return s?t.jsx("div",{className:y.fakeInput,"data-testid":`time-label-aux${e}`,children:g(a)}):t.jsx(z,{submitHandler:l,name:`aux${e}`,time:a,placeholder:`Aux ${e}`})}function Ut({index:e,action:s}){const{start:a,pause:o}=I;return s==="play"?t.jsx(r,{onClick:()=>a(e),theme:n.Play,children:t.jsx($,{"data-testid":`aux-timer-start-${e}`})}):t.jsx(r,{onClick:()=>o(e),theme:n.Pause,children:t.jsx(q,{"data-testid":`aux-timer-pause-${e}`})})}const Ht="_buttonContainer_1mqxq_17",Xt="_go_1mqxq_25",Gt="_playbackContainer_1mqxq_30",Kt="_transportContainer_1mqxq_37",Vt="_extra_1mqxq_44",Jt="_invertX_1mqxq_51",_={buttonContainer:Ht,go:Xt,playbackContainer:Gt,transportContainer:Kt,extra:Vt,invertX:Jt};function Qt(e){const{playback:s,numEvents:a,selectedEventIndex:o,timerPhase:l}=e,i=s===n.Roll,m=s===n.Play,u=s===n.Pause,x=s===n.Armed,k=o===0,p=o===a-1,j=a===0,L=i||j,F=i||j||p,O=i||j||k,b=jt(s,l),U=!b.start,H=!b.pause,X=!b.roll||j,G=!b.stop,K=!b.reload,[V,J]=w.useMemo(()=>x?[c.start,"Start"]:p?[c.stop,"Finish"]:o===null?[c.startNext,"Start"]:[c.startNext,"Next"],[x,p,o]);return t.jsxs("div",{className:_.buttonContainer,children:[t.jsx(r,{disabled:L,onClick:V,aspect:"fill",className:_.go,children:J}),t.jsxs("div",{className:_.playbackContainer,children:[t.jsx(r,{onClick:c.start,disabled:U,theme:n.Play,active:m,children:t.jsx($,{})}),t.jsx(r,{onClick:c.pause,disabled:H,theme:n.Pause,active:u,children:t.jsx(q,{})})]}),t.jsxs("div",{className:_.transportContainer,children:[t.jsx(r,{onClick:c.previous,disabled:O,children:t.jsx(et,{})}),t.jsx(r,{onClick:c.next,disabled:F,children:t.jsx(st,{})})]}),t.jsxs("div",{className:_.extra,children:[t.jsx(r,{onClick:c.roll,disabled:X,theme:n.Roll,active:i,children:"Roll"}),t.jsx(r,{onClick:c.reload,disabled:K,children:t.jsx(at,{className:_.invertX})}),t.jsx(r,{onClick:c.stop,disabled:G,theme:n.Stop,children:t.jsx(D,{})})]})]})}const Wt="_timer_1f17d_21",Yt="_finished_1f17d_33",Zt="_muted_1f17d_36",T={timer:Wt,finished:Yt,muted:Zt};function te(e){const{time:s}=e,a=(s??0)<0,o=s==null?A:g(s,{fallback:A}).replace("-",""),l=E([T.timer,a?T.finished:null,s===null&&T.muted]);return t.jsx("div",{className:l,children:o})}const ee="_timeContainer_b9r86_17",se="_indicators_b9r86_25",ae="_indicatorRoll_b9r86_34",ne="_indicatorDelay_b9r86_35",oe="_indicatorNegative_b9r86_36",ie="_status_b9r86_65",le="_tag_b9r86_72",re="_time_b9r86_17",ce="_rolltag_b9r86_84",d={timeContainer:ee,indicators:se,indicatorRoll:ae,indicatorDelay:ne,indicatorNegative:oe,status:ie,tag:le,time:re,rolltag:ce};function de(e){return e>0?`Added ${S(e,!1)}`:e<0?`Removed ${S(Math.abs(e),!1)}`:""}function me({children:e}){const s=ct(),a=s.playback===n.Roll,o=s.phase===N.Pending,l=s.phase===N.Overtime,i=!!s.addedTime,m=a?"Roll mode active":"",u=de(s.addedTime);return t.jsxs("div",{className:d.timeContainer,children:[t.jsxs("div",{className:d.indicators,children:[t.jsx(R,{text:m,render:t.jsx("div",{}),className:d.indicatorRoll,"data-active":a}),t.jsx("div",{className:d.indicatorNegative,"data-active":l}),t.jsx(R,{text:u,render:t.jsx("div",{}),className:d.indicatorDelay,"data-active":i})]}),t.jsx(te,{time:o?s.secondaryTimer:s.current}),t.jsx("div",{className:d.status,children:o?t.jsx("span",{className:d.rolltag,children:"Roll: Countdown to start"}):t.jsx(ue,{startedAt:s.startedAt,expectedFinish:s.expectedFinish,playback:s.playback})}),e]})}function ue({startedAt:e,expectedFinish:s,playback:a}){if(a===n.Stop)return t.jsx(xe,{});const o=g(e),l=s!==null?s%dt:null,i=g(l);return t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:d.start,children:[t.jsx("span",{className:d.tag,children:"Started at"}),t.jsx("span",{className:d.time,children:o})]}),t.jsxs("span",{className:d.finish,children:[t.jsx("span",{className:d.tag,children:"Expect end"}),t.jsx("span",{className:d.time,children:i})]})]})}function xe(){const{data:e}=yt();return Object.keys(e).length>0?t.jsx(ht,{search:"settings=sharing__report",children:"Go to report management"}):null}const _e="_mainContainer_1qlxm_17",pe="_auxTimers_1qlxm_22",B={mainContainer:_e,auxTimers:pe};function be(){const e=mt();return t.jsxs("div",{className:B.mainContainer,children:[t.jsx(me,{children:t.jsx(qt,{playback:e.playback})}),t.jsx(Qt,{playback:e.playback,numEvents:e.numEvents,selectedEventIndex:e.selectedEventIndex,timerPhase:e.timerPhase}),t.jsxs("div",{className:B.auxTimers,children:[t.jsx(C,{index:1}),t.jsx(C,{index:2}),t.jsx(C,{index:3})]})]})}const he="_content_hnvy8_17",ye={content:he},Ie=w.memo(je);function je(){const e=window.location.pathname.includes("/timercontrol");return t.jsx(bt,{permission:"editor",children:t.jsxs(nt,{"data-testid":"panel-timer-control",children:[!e&&t.jsx(ot,{onClick:s=>ut("timercontrol",s)}),e&&t.jsx(xt,{suppressSettings:!0,isNavigationLocked:_t()}),t.jsx("div",{className:ye.content,children:t.jsx(pt,{children:t.jsx(be,{})})})]})})}export{Ie as default};
2
+ //# sourceMappingURL=TimerControlExport-Dx3SSGNG.js.map