@getontime/cli 4.0.0-beta.5 → 4.0.2

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 (380) hide show
  1. package/client/assets/Backstage-CAjkmeJm.js +2 -0
  2. package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
  3. package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
  4. package/client/assets/Backstage-CAjkmeJm.js.map +1 -0
  5. package/client/assets/Countdown-ChuA9az_.js +2 -0
  6. package/client/assets/Countdown-ChuA9az_.js.br +0 -0
  7. package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
  8. package/client/assets/{Countdown-BaaR4j9x.js.map → Countdown-ChuA9az_.js.map} +1 -1
  9. package/client/assets/CustomTranslationModal-C3R_2T5s.js +2 -0
  10. package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-CcNNjbmZ.js.map → CustomTranslationModal-C3R_2T5s.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-DXDACqpc.js → DelayIndicator-vT7n8ypf.js} +2 -2
  14. package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
  15. package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-DXDACqpc.js.map → DelayIndicator-vT7n8ypf.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js → EditorFeatureWrapper-DHfuO3EA.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js.map → EditorFeatureWrapper-DHfuO3EA.js.map} +1 -1
  21. package/client/assets/{EditorUtils-DxjFOwpn.js → EditorUtils-Da5ALK1P.js} +2 -2
  22. package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
  23. package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
  24. package/client/assets/{EditorUtils-DxjFOwpn.js.map → EditorUtils-Da5ALK1P.js.map} +1 -1
  25. package/client/assets/{Empty-DiBXyIA8.js → Empty-gWT_HMeu.js} +2 -2
  26. package/client/assets/Empty-gWT_HMeu.js.br +0 -0
  27. package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
  28. package/client/assets/{Empty-DiBXyIA8.js.map → Empty-gWT_HMeu.js.map} +1 -1
  29. package/client/assets/{EmptyPage-X6EO1Y5W.js → EmptyPage-Dcbg6rmF.js} +2 -2
  30. package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
  31. package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
  32. package/client/assets/{EmptyPage-X6EO1Y5W.js.map → EmptyPage-Dcbg6rmF.js.map} +1 -1
  33. package/client/assets/{FollowButton-Cr-HA2-6.js → FollowButton-CSqJSvix.js} +2 -2
  34. package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
  35. package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
  36. package/client/assets/{FollowButton-Cr-HA2-6.js.map → FollowButton-CSqJSvix.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-VUkIayAJ.js → MessageControlExport-lXK21piH.js} +2 -2
  38. package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
  39. package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-VUkIayAJ.js.map → MessageControlExport-lXK21piH.js.map} +1 -1
  41. package/client/assets/MilestoneEditor-Bge8xLrV.js +2 -0
  42. package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
  43. package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-Da8oxrHI.js.map → MilestoneEditor-Bge8xLrV.js.map} +1 -1
  45. package/client/assets/Modal-BgJx3SNK.css +1 -0
  46. package/client/assets/Modal-BgJx3SNK.css.br +0 -0
  47. package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
  48. package/client/assets/Modal-C2sFA0zf.js +2 -0
  49. package/client/assets/Modal-C2sFA0zf.js.br +0 -0
  50. package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
  51. package/client/assets/Modal-C2sFA0zf.js.map +1 -0
  52. package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js → MultiPartProgressBar-D3jJZjb5.js} +2 -2
  53. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
  54. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
  55. package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js.map → MultiPartProgressBar-D3jJZjb5.js.map} +1 -1
  56. package/client/assets/OperatorExport-BUhxjLUx.js +2 -0
  57. package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
  58. package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
  59. package/client/assets/OperatorExport-BUhxjLUx.js.map +1 -0
  60. package/client/assets/{OverviewWrapper-BMuW_wiO.js → OverviewWrapper-BveJ6GjK.js} +2 -2
  61. package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
  62. package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
  63. package/client/assets/{OverviewWrapper-BMuW_wiO.js.map → OverviewWrapper-BveJ6GjK.js.map} +1 -1
  64. package/client/assets/{ProjectInfo-BYi1lzPk.js → ProjectInfo-z4k3cipS.js} +2 -2
  65. package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
  66. package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
  67. package/client/assets/{ProjectInfo-BYi1lzPk.js.map → ProjectInfo-z4k3cipS.js.map} +1 -1
  68. package/client/assets/{ProtectRoute-DnUCrlh6.js → ProtectRoute-CrcWfOlG.js} +2 -2
  69. package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
  70. package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
  71. package/client/assets/{ProtectRoute-DnUCrlh6.js.map → ProtectRoute-CrcWfOlG.js.map} +1 -1
  72. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js +2 -0
  73. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
  74. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
  75. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.map +1 -0
  76. package/client/assets/ProtectedEditor-BoiAT_IR.css +1 -0
  77. package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
  78. package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
  79. package/client/assets/ProtectedEditor-C_SYWpL2.js +3 -0
  80. package/client/assets/ProtectedEditor-C_SYWpL2.js.br +0 -0
  81. package/client/assets/ProtectedEditor-C_SYWpL2.js.gz +0 -0
  82. package/client/assets/ProtectedEditor-C_SYWpL2.js.map +1 -0
  83. package/client/assets/RundownEntry-D61IqkXb.js +2 -0
  84. package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
  85. package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
  86. package/client/assets/{RundownEntry-Dl4Cb_pZ.js.map → RundownEntry-D61IqkXb.js.map} +1 -1
  87. package/client/assets/RundownExport-1zBZurIG.css +1 -0
  88. package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
  89. package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
  90. package/client/assets/RundownExport-C6YhMGOC.js +3 -0
  91. package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
  92. package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
  93. package/client/assets/{RundownExport-BPDLhvsM.js.map → RundownExport-C6YhMGOC.js.map} +1 -1
  94. package/client/assets/{Select-CUjlJirY.js → Select-CedN80WS.js} +2 -2
  95. package/client/assets/Select-CedN80WS.js.br +0 -0
  96. package/client/assets/Select-CedN80WS.js.gz +0 -0
  97. package/client/assets/{Select-CUjlJirY.js.map → Select-CedN80WS.js.map} +1 -1
  98. package/client/assets/Studio-DUzPBS6P.js +2 -0
  99. package/client/assets/Studio-DUzPBS6P.js.br +0 -0
  100. package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
  101. package/client/assets/{Studio-BLCIas53.js.map → Studio-DUzPBS6P.js.map} +1 -1
  102. package/client/assets/{StyleEditor-DTNiR-0P.js → StyleEditor-D2z65PB7.js} +2 -2
  103. package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
  104. package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
  105. package/client/assets/{StyleEditor-DTNiR-0P.js.map → StyleEditor-D2z65PB7.js.map} +1 -1
  106. package/client/assets/SuperscriptTime-CIrcMcyg.js +2 -0
  107. package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
  108. package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
  109. package/client/assets/SuperscriptTime-CIrcMcyg.js.map +1 -0
  110. package/client/assets/TimeElements-CALNfv6u.js +2 -0
  111. package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
  112. package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
  113. package/client/assets/{TimeElements-rlwX9Mgy.js.map → TimeElements-CALNfv6u.js.map} +1 -1
  114. package/client/assets/{TimeInput-C0_Nl63x.js → TimeInput-Dg1naiy3.js} +2 -2
  115. package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
  116. package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
  117. package/client/assets/{TimeInput-C0_Nl63x.js.map → TimeInput-Dg1naiy3.js.map} +1 -1
  118. package/client/assets/TimelinePage-Cwm0svjN.js +2 -0
  119. package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
  120. package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
  121. package/client/assets/{TimelinePage-BC-pnISF.js.map → TimelinePage-Cwm0svjN.js.map} +1 -1
  122. package/client/assets/Timer-BVXskRjc.js +2 -0
  123. package/client/assets/Timer-BVXskRjc.js.br +0 -0
  124. package/client/assets/Timer-BVXskRjc.js.gz +0 -0
  125. package/client/assets/Timer-BVXskRjc.js.map +1 -0
  126. package/client/assets/Timer-BvEmZbmF.css +1 -0
  127. package/client/assets/Timer-BvEmZbmF.css.br +0 -0
  128. package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
  129. package/client/assets/{TimerControlExport-C_Jbwxog.js → TimerControlExport-C8ECtLBd.js} +2 -2
  130. package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
  131. package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
  132. package/client/assets/{TimerControlExport-C_Jbwxog.js.map → TimerControlExport-C8ECtLBd.js.map} +1 -1
  133. package/client/assets/{TitleCard-C-Tw72nZ.js → TitleCard-CZl9wSHS.js} +2 -2
  134. package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
  135. package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
  136. package/client/assets/{TitleCard-C-Tw72nZ.js.map → TitleCard-CZl9wSHS.js.map} +1 -1
  137. package/client/assets/{Tooltip-BZrLdTBU.js → Tooltip-D9XRnwOW.js} +2 -2
  138. package/client/assets/Tooltip-D9XRnwOW.js.br +4 -0
  139. package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
  140. package/client/assets/{Tooltip-BZrLdTBU.js.map → Tooltip-D9XRnwOW.js.map} +1 -1
  141. package/client/assets/{ViewLogo-CdsW41HC.js → ViewLogo-_3Z1hIHi.js} +2 -2
  142. package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
  143. package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
  144. package/client/assets/{ViewLogo-CdsW41HC.js.map → ViewLogo-_3Z1hIHi.js.map} +1 -1
  145. package/client/assets/{ViewParamsEditor-kNKEOAwm.css → ViewParamsEditor-1Ok39npF.css} +1 -1
  146. package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
  147. package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
  148. package/client/assets/{ViewParamsEditor-YoYxps2g.js → ViewParamsEditor-Bca1TIDW.js} +2 -2
  149. package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
  150. package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
  151. package/client/assets/{ViewParamsEditor-YoYxps2g.js.map → ViewParamsEditor-Bca1TIDW.js.map} +1 -1
  152. package/client/assets/{dateConfig-CqC6Ta_8.js → dateConfig-DRQGMWDF.js} +2 -2
  153. package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
  154. package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
  155. package/client/assets/{dateConfig-CqC6Ta_8.js.map → dateConfig-DRQGMWDF.js.map} +1 -1
  156. package/client/assets/{editorSettings-CL1TjKzU.js → editorSettings-BU0pTMSY.js} +2 -2
  157. package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
  158. package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
  159. package/client/assets/{editorSettings-CL1TjKzU.js.map → editorSettings-BU0pTMSY.js.map} +1 -1
  160. package/client/assets/{getProgress-Dh-Yy44B.js → getProgress-Cw79NL_O.js} +2 -2
  161. package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
  162. package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
  163. package/client/assets/{getProgress-Dh-Yy44B.js.map → getProgress-Cw79NL_O.js.map} +1 -1
  164. package/client/assets/index-BQEUaoAf.js +3 -0
  165. package/client/assets/index-BQEUaoAf.js.br +0 -0
  166. package/client/assets/index-BQEUaoAf.js.gz +0 -0
  167. package/client/assets/index-BQEUaoAf.js.map +1 -0
  168. package/client/assets/{index-pvMSlFrO.css → index-De0uf0Ta.css} +1 -1
  169. package/client/assets/index-De0uf0Ta.css.br +0 -0
  170. package/client/assets/index-De0uf0Ta.css.gz +0 -0
  171. package/client/assets/{offset-BnfjZ6JI.js → offset-DJAHqjFW.js} +2 -2
  172. package/client/assets/offset-DJAHqjFW.js.br +0 -0
  173. package/client/assets/offset-DJAHqjFW.js.gz +0 -0
  174. package/client/assets/{offset-BnfjZ6JI.js.map → offset-DJAHqjFW.js.map} +1 -1
  175. package/client/assets/{parseUserTime-DNXIMX9s.js → parseUserTime-BeTKj08M.js} +2 -2
  176. package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
  177. package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
  178. package/client/assets/{parseUserTime-DNXIMX9s.js.map → parseUserTime-BeTKj08M.js.map} +1 -1
  179. package/client/assets/{playbackstate-DzSEaiNW.js → playbackstate-B_khF6xU.js} +2 -2
  180. package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
  181. package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
  182. package/client/assets/{playbackstate-DzSEaiNW.js.map → playbackstate-B_khF6xU.js.map} +1 -1
  183. package/client/assets/{presentation.utils-BfcniGcl.js → presentation.utils-KwY-ACf7.js} +2 -2
  184. package/client/assets/presentation.utils-KwY-ACf7.js.br +0 -0
  185. package/client/assets/presentation.utils-KwY-ACf7.js.gz +0 -0
  186. package/client/assets/{presentation.utils-BfcniGcl.js.map → presentation.utils-KwY-ACf7.js.map} +1 -1
  187. package/client/assets/{rundownUtils-CPBsEZ2m.js → rundownUtils-BZHazkXR.js} +2 -2
  188. package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
  189. package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
  190. package/client/assets/{rundownUtils-CPBsEZ2m.js.map → rundownUtils-BZHazkXR.js.map} +1 -1
  191. package/client/assets/{useCustomFields-DY13Ir96.js → useCustomFields-DqCYz8Kt.js} +2 -2
  192. package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
  193. package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
  194. package/client/assets/{useCustomFields-DY13Ir96.js.map → useCustomFields-DqCYz8Kt.js.map} +1 -1
  195. package/client/assets/{useFollowComponent-C42-1XCu.js → useFollowComponent-Ctfhf2or.js} +2 -2
  196. package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
  197. package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
  198. package/client/assets/{useFollowComponent-C42-1XCu.js.map → useFollowComponent-Ctfhf2or.js.map} +1 -1
  199. package/client/assets/{useProjectData-BF2F6qPB.js → useProjectData-C1hVamxc.js} +2 -2
  200. package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
  201. package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
  202. package/client/assets/{useProjectData-BF2F6qPB.js.map → useProjectData-C1hVamxc.js.map} +1 -1
  203. package/client/assets/useReport-B4dMYcNL.js +2 -0
  204. package/client/assets/useReport-B4dMYcNL.js.br +0 -0
  205. package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
  206. package/client/assets/{useReport-DPqY9XXp.js.map → useReport-B4dMYcNL.js.map} +1 -1
  207. package/client/assets/useRundown-BfpjcCEJ.js +2 -0
  208. package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
  209. package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
  210. package/client/assets/{useRundown-uuXixjnX.js.map → useRundown-BfpjcCEJ.js.map} +1 -1
  211. package/client/assets/{useWindowTitle-BQ1kqXfk.js → useWindowTitle-DqdFTWns.js} +2 -2
  212. package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
  213. package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
  214. package/client/assets/{useWindowTitle-BQ1kqXfk.js.map → useWindowTitle-DqdFTWns.js.map} +1 -1
  215. package/client/assets/{validateEvent-Cy-jEiwB.js → validateEvent-P9sf7C10.js} +2 -2
  216. package/client/assets/validateEvent-P9sf7C10.js.br +3 -0
  217. package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
  218. package/client/assets/{validateEvent-Cy-jEiwB.js.map → validateEvent-P9sf7C10.js.map} +1 -1
  219. package/client/assets/{vendor-Cnciq4o_.js → vendor-CCiSQ9k9.js} +3 -3
  220. package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
  221. package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
  222. package/client/assets/{vendor-Cnciq4o_.js.map → vendor-CCiSQ9k9.js.map} +1 -1
  223. package/client/assets/{common.options-p5f_zJ2-.js → viewLoader.utils-CmM-4-pk.js} +2 -2
  224. package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
  225. package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
  226. package/client/assets/viewLoader.utils-CmM-4-pk.js.map +1 -0
  227. package/client/index.html +3 -3
  228. package/external/demo/app.js +2 -2
  229. package/package.json +1 -1
  230. package/server/index.cjs +115 -106
  231. package/client/assets/Backstage-B-_iTDRg.js +0 -2
  232. package/client/assets/Backstage-B-_iTDRg.js.br +0 -0
  233. package/client/assets/Backstage-B-_iTDRg.js.gz +0 -0
  234. package/client/assets/Backstage-B-_iTDRg.js.map +0 -1
  235. package/client/assets/Countdown-BaaR4j9x.js +0 -2
  236. package/client/assets/Countdown-BaaR4j9x.js.br +0 -0
  237. package/client/assets/Countdown-BaaR4j9x.js.gz +0 -0
  238. package/client/assets/CustomTranslationModal-CcNNjbmZ.js +0 -2
  239. package/client/assets/CustomTranslationModal-CcNNjbmZ.js.br +0 -0
  240. package/client/assets/CustomTranslationModal-CcNNjbmZ.js.gz +0 -0
  241. package/client/assets/DelayIndicator-DXDACqpc.js.br +0 -0
  242. package/client/assets/DelayIndicator-DXDACqpc.js.gz +0 -0
  243. package/client/assets/DropdownMenu-Bn0VHzKx.js +0 -2
  244. package/client/assets/DropdownMenu-Bn0VHzKx.js.br +0 -0
  245. package/client/assets/DropdownMenu-Bn0VHzKx.js.gz +0 -0
  246. package/client/assets/DropdownMenu-Bn0VHzKx.js.map +0 -1
  247. package/client/assets/DropdownMenu-ByBDeesm.css +0 -1
  248. package/client/assets/DropdownMenu-ByBDeesm.css.br +0 -0
  249. package/client/assets/DropdownMenu-ByBDeesm.css.gz +0 -0
  250. package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.br +0 -0
  251. package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.gz +0 -0
  252. package/client/assets/EditorUtils-DxjFOwpn.js.br +0 -0
  253. package/client/assets/EditorUtils-DxjFOwpn.js.gz +0 -0
  254. package/client/assets/Empty-DiBXyIA8.js.br +0 -2
  255. package/client/assets/Empty-DiBXyIA8.js.gz +0 -0
  256. package/client/assets/EmptyPage-X6EO1Y5W.js.br +0 -0
  257. package/client/assets/EmptyPage-X6EO1Y5W.js.gz +0 -0
  258. package/client/assets/FollowButton-Cr-HA2-6.js.br +0 -0
  259. package/client/assets/FollowButton-Cr-HA2-6.js.gz +0 -0
  260. package/client/assets/MessageControlExport-VUkIayAJ.js.br +0 -0
  261. package/client/assets/MessageControlExport-VUkIayAJ.js.gz +0 -0
  262. package/client/assets/MilestoneEditor-Da8oxrHI.js +0 -2
  263. package/client/assets/MilestoneEditor-Da8oxrHI.js.br +0 -0
  264. package/client/assets/MilestoneEditor-Da8oxrHI.js.gz +0 -0
  265. package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.br +0 -0
  266. package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.gz +0 -0
  267. package/client/assets/OperatorExport-BeuWuV6I.js +0 -2
  268. package/client/assets/OperatorExport-BeuWuV6I.js.br +0 -0
  269. package/client/assets/OperatorExport-BeuWuV6I.js.gz +0 -0
  270. package/client/assets/OperatorExport-BeuWuV6I.js.map +0 -1
  271. package/client/assets/OverviewWrapper-BMuW_wiO.js.br +0 -0
  272. package/client/assets/OverviewWrapper-BMuW_wiO.js.gz +0 -0
  273. package/client/assets/ProjectInfo-BYi1lzPk.js.br +0 -0
  274. package/client/assets/ProjectInfo-BYi1lzPk.js.gz +0 -0
  275. package/client/assets/ProtectRoute-DnUCrlh6.js.br +0 -0
  276. package/client/assets/ProtectRoute-DnUCrlh6.js.gz +0 -0
  277. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js +0 -2
  278. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.br +0 -0
  279. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.gz +0 -0
  280. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.map +0 -1
  281. package/client/assets/ProtectedEditor-C4beOxz1.css +0 -1
  282. package/client/assets/ProtectedEditor-C4beOxz1.css.br +0 -0
  283. package/client/assets/ProtectedEditor-C4beOxz1.css.gz +0 -0
  284. package/client/assets/ProtectedEditor-KcsoZKKo.js +0 -3
  285. package/client/assets/ProtectedEditor-KcsoZKKo.js.br +0 -0
  286. package/client/assets/ProtectedEditor-KcsoZKKo.js.gz +0 -0
  287. package/client/assets/ProtectedEditor-KcsoZKKo.js.map +0 -1
  288. package/client/assets/RundownEntry-Dl4Cb_pZ.js +0 -2
  289. package/client/assets/RundownEntry-Dl4Cb_pZ.js.br +0 -0
  290. package/client/assets/RundownEntry-Dl4Cb_pZ.js.gz +0 -0
  291. package/client/assets/RundownExport-BPDLhvsM.js +0 -3
  292. package/client/assets/RundownExport-BPDLhvsM.js.br +0 -0
  293. package/client/assets/RundownExport-BPDLhvsM.js.gz +0 -0
  294. package/client/assets/RundownExport-CUtaG16H.css +0 -1
  295. package/client/assets/RundownExport-CUtaG16H.css.br +0 -0
  296. package/client/assets/RundownExport-CUtaG16H.css.gz +0 -0
  297. package/client/assets/Select-CUjlJirY.js.br +0 -0
  298. package/client/assets/Select-CUjlJirY.js.gz +0 -0
  299. package/client/assets/Studio-BLCIas53.js +0 -2
  300. package/client/assets/Studio-BLCIas53.js.br +0 -0
  301. package/client/assets/Studio-BLCIas53.js.gz +0 -0
  302. package/client/assets/StyleEditor-DTNiR-0P.js.br +0 -0
  303. package/client/assets/StyleEditor-DTNiR-0P.js.gz +0 -0
  304. package/client/assets/TimeElements-rlwX9Mgy.js +0 -2
  305. package/client/assets/TimeElements-rlwX9Mgy.js.br +0 -0
  306. package/client/assets/TimeElements-rlwX9Mgy.js.gz +0 -0
  307. package/client/assets/TimeInput-C0_Nl63x.js.br +0 -0
  308. package/client/assets/TimeInput-C0_Nl63x.js.gz +0 -0
  309. package/client/assets/TimelinePage-BC-pnISF.js +0 -2
  310. package/client/assets/TimelinePage-BC-pnISF.js.br +0 -0
  311. package/client/assets/TimelinePage-BC-pnISF.js.gz +0 -0
  312. package/client/assets/Timer-DGNfbBKM.css +0 -1
  313. package/client/assets/Timer-DGNfbBKM.css.br +0 -0
  314. package/client/assets/Timer-DGNfbBKM.css.gz +0 -0
  315. package/client/assets/Timer-DgmA0De-.js +0 -2
  316. package/client/assets/Timer-DgmA0De-.js.br +0 -0
  317. package/client/assets/Timer-DgmA0De-.js.gz +0 -0
  318. package/client/assets/Timer-DgmA0De-.js.map +0 -1
  319. package/client/assets/TimerControlExport-C_Jbwxog.js.br +0 -0
  320. package/client/assets/TimerControlExport-C_Jbwxog.js.gz +0 -0
  321. package/client/assets/TitleCard-C-Tw72nZ.js.br +0 -0
  322. package/client/assets/TitleCard-C-Tw72nZ.js.gz +0 -0
  323. package/client/assets/Tooltip-BZrLdTBU.js.br +0 -0
  324. package/client/assets/Tooltip-BZrLdTBU.js.gz +0 -0
  325. package/client/assets/ViewLogo-CdsW41HC.js.br +0 -0
  326. package/client/assets/ViewLogo-CdsW41HC.js.gz +0 -0
  327. package/client/assets/ViewParamsEditor-YoYxps2g.js.br +0 -0
  328. package/client/assets/ViewParamsEditor-YoYxps2g.js.gz +0 -0
  329. package/client/assets/ViewParamsEditor-kNKEOAwm.css.br +0 -0
  330. package/client/assets/ViewParamsEditor-kNKEOAwm.css.gz +0 -0
  331. package/client/assets/common.options-p5f_zJ2-.js.br +0 -0
  332. package/client/assets/common.options-p5f_zJ2-.js.gz +0 -0
  333. package/client/assets/common.options-p5f_zJ2-.js.map +0 -1
  334. package/client/assets/dateConfig-CqC6Ta_8.js.br +0 -0
  335. package/client/assets/dateConfig-CqC6Ta_8.js.gz +0 -0
  336. package/client/assets/editorSettings-CL1TjKzU.js.br +0 -0
  337. package/client/assets/editorSettings-CL1TjKzU.js.gz +0 -0
  338. package/client/assets/getProgress-Dh-Yy44B.js.br +0 -0
  339. package/client/assets/getProgress-Dh-Yy44B.js.gz +0 -0
  340. package/client/assets/index-DdPXqLQ6.js +0 -3
  341. package/client/assets/index-DdPXqLQ6.js.br +0 -0
  342. package/client/assets/index-DdPXqLQ6.js.gz +0 -0
  343. package/client/assets/index-DdPXqLQ6.js.map +0 -1
  344. package/client/assets/index-pvMSlFrO.css.br +0 -0
  345. package/client/assets/index-pvMSlFrO.css.gz +0 -0
  346. package/client/assets/offset-BnfjZ6JI.js.br +0 -2
  347. package/client/assets/offset-BnfjZ6JI.js.gz +0 -0
  348. package/client/assets/parseUserTime-DNXIMX9s.js.br +0 -0
  349. package/client/assets/parseUserTime-DNXIMX9s.js.gz +0 -0
  350. package/client/assets/playbackstate-DzSEaiNW.js.br +0 -0
  351. package/client/assets/playbackstate-DzSEaiNW.js.gz +0 -0
  352. package/client/assets/presentation.utils-BfcniGcl.js.br +0 -0
  353. package/client/assets/presentation.utils-BfcniGcl.js.gz +0 -0
  354. package/client/assets/rundownUtils-CPBsEZ2m.js.br +0 -0
  355. package/client/assets/rundownUtils-CPBsEZ2m.js.gz +0 -0
  356. package/client/assets/useCustomFields-DY13Ir96.js.br +0 -0
  357. package/client/assets/useCustomFields-DY13Ir96.js.gz +0 -0
  358. package/client/assets/useFollowComponent-C42-1XCu.js.br +0 -0
  359. package/client/assets/useFollowComponent-C42-1XCu.js.gz +0 -0
  360. package/client/assets/useProjectData-BF2F6qPB.js.br +0 -0
  361. package/client/assets/useProjectData-BF2F6qPB.js.gz +0 -0
  362. package/client/assets/useReport-DPqY9XXp.js +0 -2
  363. package/client/assets/useReport-DPqY9XXp.js.br +0 -0
  364. package/client/assets/useReport-DPqY9XXp.js.gz +0 -0
  365. package/client/assets/useRundown-uuXixjnX.js +0 -2
  366. package/client/assets/useRundown-uuXixjnX.js.br +0 -0
  367. package/client/assets/useRundown-uuXixjnX.js.gz +0 -0
  368. package/client/assets/useWindowTitle-BQ1kqXfk.js.br +0 -0
  369. package/client/assets/useWindowTitle-BQ1kqXfk.js.gz +0 -0
  370. package/client/assets/validateEvent-Cy-jEiwB.js.br +0 -0
  371. package/client/assets/validateEvent-Cy-jEiwB.js.gz +0 -0
  372. package/client/assets/vendor-Cnciq4o_.js.br +0 -0
  373. package/client/assets/vendor-Cnciq4o_.js.gz +0 -0
  374. package/client/assets/viewLoader.utils-CYlNKkLE.js +0 -2
  375. package/client/assets/viewLoader.utils-CYlNKkLE.js.br +0 -0
  376. package/client/assets/viewLoader.utils-CYlNKkLE.js.gz +0 -0
  377. package/client/assets/viewLoader.utils-CYlNKkLE.js.map +0 -1
  378. /package/client/assets/{viewLoader-Bk5IU6zG.css → SuperscriptTime-Bk5IU6zG.css} +0 -0
  379. /package/client/assets/{viewLoader-Bk5IU6zG.css.br → SuperscriptTime-Bk5IU6zG.css.br} +0 -0
  380. /package/client/assets/{viewLoader-Bk5IU6zG.css.gz → SuperscriptTime-Bk5IU6zG.css.gz} +0 -0
@@ -1,2 +1,2 @@
1
- import{j as e,bV as a,bW as d,bX as _,bY as m,bZ as f,b_ as j,b$ as u,c0 as b,c1 as I,c2 as p,c3 as x,c4 as S,c5 as g,A as h,c6 as w,c7 as y}from"./vendor-Cnciq4o_.js";import{i as N}from"./index-DdPXqLQ6.js";(function(){try{var i=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new i.Error().stack;t&&(i._sentryDebugIds=i._sentryDebugIds||{},i._sentryDebugIds[t]="85b4ff8c-c7d0-4cd3-8034-4548fb9ede50",i._sentryDebugIdIdentifier="sentry-dbid-85b4ff8c-c7d0-4cd3-8034-4548fb9ede50")}catch{}})();const A="_blink_fi0ij_1",k="_fourtyfive_fi0ij_13",D="_select_fi0ij_17",L="_medium_fi0ij_51",v="_large_fi0ij_55",T="_fluid_fi0ij_59",P="_selectIcon_fi0ij_63",C="_popup_fi0ij_67",E="_list_fi0ij_82",R="_item_fi0ij_92",U="_itemIndicator_fi0ij_110",V="_itemIndicatorIcon_fi0ij_114",W="_itemLabel_fi0ij_120",X="_scrollArrow_fi0ij_124",s={blink:A,fourtyfive:k,select:D,medium:L,large:v,fluid:T,selectIcon:P,popup:C,list:E,item:R,itemIndicator:U,itemIndicatorIcon:V,itemLabel:W,scrollArrow:X};function $({options:i,fluid:t,size:c="medium",...o}){return e.jsxs(a,{items:i,...o,children:[e.jsxs(d,{className:N([s.select,s[c],t&&s.fluid]),children:[e.jsx(_,{}),e.jsx(m,{className:s.selectIcon,children:e.jsx(f,{})})]}),e.jsx(j,{children:e.jsxs(u,{side:"bottom",align:"start",children:[e.jsx(b,{className:s.scrollArrow}),e.jsxs(I,{className:s.popup,children:[e.jsx(p,{}),e.jsx(x,{className:s.list,children:i.map(({disabled:r,label:n,value:l})=>e.jsxs(S,{className:s.item,value:l,disabled:r,children:[e.jsx(g,{className:s.itemIndicator,children:e.jsx(h,{className:s.itemIndicatorIcon})}),e.jsx(w,{className:s.itemLabel,children:n})]},String(l)))})]}),e.jsx(y,{className:s.scrollArrow})]})})]})}export{$ as S};
2
- //# sourceMappingURL=Select-CUjlJirY.js.map
1
+ import{j as e,bV as a,bW as d,bX as _,bY as m,bZ as f,b_ as j,b$ as u,c0 as b,c1 as I,c2 as p,c3 as x,c4 as S,c5 as g,A as h,c6 as w,c7 as y}from"./vendor-CCiSQ9k9.js";import{i as N}from"./index-BQEUaoAf.js";(function(){try{var i=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new i.Error().stack;t&&(i._sentryDebugIds=i._sentryDebugIds||{},i._sentryDebugIds[t]="85b4ff8c-c7d0-4cd3-8034-4548fb9ede50",i._sentryDebugIdIdentifier="sentry-dbid-85b4ff8c-c7d0-4cd3-8034-4548fb9ede50")}catch{}})();const A="_blink_fi0ij_1",k="_fourtyfive_fi0ij_13",D="_select_fi0ij_17",L="_medium_fi0ij_51",v="_large_fi0ij_55",T="_fluid_fi0ij_59",P="_selectIcon_fi0ij_63",C="_popup_fi0ij_67",E="_list_fi0ij_82",R="_item_fi0ij_92",U="_itemIndicator_fi0ij_110",V="_itemIndicatorIcon_fi0ij_114",W="_itemLabel_fi0ij_120",X="_scrollArrow_fi0ij_124",s={blink:A,fourtyfive:k,select:D,medium:L,large:v,fluid:T,selectIcon:P,popup:C,list:E,item:R,itemIndicator:U,itemIndicatorIcon:V,itemLabel:W,scrollArrow:X};function $({options:i,fluid:t,size:c="medium",...o}){return e.jsxs(a,{items:i,...o,children:[e.jsxs(d,{className:N([s.select,s[c],t&&s.fluid]),children:[e.jsx(_,{}),e.jsx(m,{className:s.selectIcon,children:e.jsx(f,{})})]}),e.jsx(j,{children:e.jsxs(u,{side:"bottom",align:"start",children:[e.jsx(b,{className:s.scrollArrow}),e.jsxs(I,{className:s.popup,children:[e.jsx(p,{}),e.jsx(x,{className:s.list,children:i.map(({disabled:r,label:n,value:l})=>e.jsxs(S,{className:s.item,value:l,disabled:r,children:[e.jsx(g,{className:s.itemIndicator,children:e.jsx(h,{className:s.itemIndicatorIcon})}),e.jsx(w,{className:s.itemLabel,children:n})]},String(l)))})]}),e.jsx(y,{className:s.scrollArrow})]})})]})}export{$ as S};
2
+ //# sourceMappingURL=Select-CedN80WS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select-CUjlJirY.js","sources":["../../src/common/components/select/Select.tsx"],"sourcesContent":["import { IoCheckmark } from 'react-icons/io5';\nimport { LuChevronsUpDown } from 'react-icons/lu';\nimport { Select as BaseSelect } from '@base-ui-components/react/select';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport styles from './Select.module.scss';\n\nexport type SelectOption<T = string> = {\n value: T;\n label: string;\n disabled?: boolean;\n};\n\ninterface SelectProps<T> extends Omit<BaseSelect.Root.Props<T>, 'items'> {\n options: SelectOption<T>[];\n fluid?: boolean;\n size?: 'medium' | 'large';\n}\n\nexport default function Select<T>({ options, fluid, size = 'medium', ...selectRootProps }: SelectProps<T>) {\n return (\n <BaseSelect.Root items={options} {...selectRootProps}>\n <BaseSelect.Trigger className={cx([styles.select, styles[size], fluid && styles.fluid])}>\n <BaseSelect.Value />\n <BaseSelect.Icon className={styles.selectIcon}>\n <LuChevronsUpDown />\n </BaseSelect.Icon>\n </BaseSelect.Trigger>\n <BaseSelect.Portal>\n <BaseSelect.Positioner side='bottom' align='start'>\n <BaseSelect.ScrollUpArrow className={styles.scrollArrow} />\n <BaseSelect.Popup className={styles.popup}>\n <BaseSelect.Arrow />\n <BaseSelect.List className={styles.list}>\n {options.map(({ disabled, label, value }) => (\n <BaseSelect.Item key={String(value)} className={styles.item} value={value} disabled={disabled}>\n <BaseSelect.ItemIndicator className={styles.itemIndicator}>\n <IoCheckmark className={styles.itemIndicatorIcon} />\n </BaseSelect.ItemIndicator>\n <BaseSelect.ItemText className={styles.itemLabel}>{label}</BaseSelect.ItemText>\n </BaseSelect.Item>\n ))}\n </BaseSelect.List>\n </BaseSelect.Popup>\n <BaseSelect.ScrollDownArrow className={styles.scrollArrow} />\n </BaseSelect.Positioner>\n </BaseSelect.Portal>\n </BaseSelect.Root>\n );\n}\n"],"names":["Select","options","fluid","size","selectRootProps","BaseSelect.Root","jsxs","BaseSelect.Trigger","cx","styles","jsx","BaseSelect.Value","BaseSelect.Icon","LuChevronsUpDown","BaseSelect.Portal","BaseSelect.Positioner","BaseSelect.ScrollUpArrow","BaseSelect.Popup","BaseSelect.Arrow","BaseSelect.List","disabled","label","value","BaseSelect.Item","BaseSelect.ItemIndicator","IoCheckmark","BaseSelect.ItemText","BaseSelect.ScrollDownArrow"],"mappings":"+gCAoBwB,SAAAA,EAAU,CAAE,QAAAC,EAAS,MAAAC,EAAO,KAAAC,EAAO,SAAU,GAAGC,GAAmC,CACzG,cACGC,EAAA,CAAgB,MAAOJ,EAAU,GAAGG,EACnC,SAAA,CAAAE,EAAA,KAACC,EAAA,CAAmB,UAAWC,EAAG,CAACC,EAAO,OAAQA,EAAON,CAAI,EAAGD,GAASO,EAAO,KAAK,CAAC,EACpF,SAAA,CAACC,EAAA,IAAAC,EAAA,EAAiB,EAClBD,MAACE,EAAA,CAAgB,UAAWH,EAAO,WACjC,SAACC,EAAA,IAAAG,EAAA,CAAA,CAAiB,CACpB,CAAA,CAAA,EACF,EACAH,EAAAA,IAACI,EAAA,CACC,SAAAR,OAACS,EAAA,CAAsB,KAAK,SAAS,MAAM,QACzC,SAAA,CAAAL,EAAAA,IAACM,EAAA,CAAyB,UAAWP,EAAO,WAAa,CAAA,SACxDQ,EAAA,CAAiB,UAAWR,EAAO,MAClC,SAAA,CAACC,EAAA,IAAAQ,EAAA,EAAiB,EAClBR,MAACS,EAAA,CAAgB,UAAWV,EAAO,KAChC,SAAQR,EAAA,IAAI,CAAC,CAAE,SAAAmB,EAAU,MAAAC,EAAO,MAAAC,CAC/B,IAAAhB,OAACiB,EAAA,CAAoC,UAAWd,EAAO,KAAM,MAAAa,EAAc,SAAAF,EACzE,SAAA,CAACV,EAAAA,IAAAc,EAAA,CAAyB,UAAWf,EAAO,cAC1C,SAAAC,MAACe,EAAY,CAAA,UAAWhB,EAAO,iBAAA,CAAmB,CACpD,CAAA,QACCiB,EAAA,CAAoB,UAAWjB,EAAO,UAAY,SAAMY,CAAA,CAAA,CAAA,CAAA,EAJrC,OAAOC,CAAK,CAKlC,CACD,CACH,CAAA,CAAA,EACF,QACCK,EAAA,CAA2B,UAAWlB,EAAO,WAAa,CAAA,CAAA,CAAA,CAC7D,CACF,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"Select-CedN80WS.js","sources":["../../src/common/components/select/Select.tsx"],"sourcesContent":["import { IoCheckmark } from 'react-icons/io5';\nimport { LuChevronsUpDown } from 'react-icons/lu';\nimport { Select as BaseSelect } from '@base-ui-components/react/select';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport styles from './Select.module.scss';\n\nexport type SelectOption<T = string> = {\n value: T;\n label: string;\n disabled?: boolean;\n};\n\ninterface SelectProps<T> extends Omit<BaseSelect.Root.Props<T>, 'items'> {\n options: SelectOption<T>[];\n fluid?: boolean;\n size?: 'medium' | 'large';\n}\n\nexport default function Select<T>({ options, fluid, size = 'medium', ...selectRootProps }: SelectProps<T>) {\n return (\n <BaseSelect.Root items={options} {...selectRootProps}>\n <BaseSelect.Trigger className={cx([styles.select, styles[size], fluid && styles.fluid])}>\n <BaseSelect.Value />\n <BaseSelect.Icon className={styles.selectIcon}>\n <LuChevronsUpDown />\n </BaseSelect.Icon>\n </BaseSelect.Trigger>\n <BaseSelect.Portal>\n <BaseSelect.Positioner side='bottom' align='start'>\n <BaseSelect.ScrollUpArrow className={styles.scrollArrow} />\n <BaseSelect.Popup className={styles.popup}>\n <BaseSelect.Arrow />\n <BaseSelect.List className={styles.list}>\n {options.map(({ disabled, label, value }) => (\n <BaseSelect.Item key={String(value)} className={styles.item} value={value} disabled={disabled}>\n <BaseSelect.ItemIndicator className={styles.itemIndicator}>\n <IoCheckmark className={styles.itemIndicatorIcon} />\n </BaseSelect.ItemIndicator>\n <BaseSelect.ItemText className={styles.itemLabel}>{label}</BaseSelect.ItemText>\n </BaseSelect.Item>\n ))}\n </BaseSelect.List>\n </BaseSelect.Popup>\n <BaseSelect.ScrollDownArrow className={styles.scrollArrow} />\n </BaseSelect.Positioner>\n </BaseSelect.Portal>\n </BaseSelect.Root>\n );\n}\n"],"names":["Select","options","fluid","size","selectRootProps","BaseSelect.Root","jsxs","BaseSelect.Trigger","cx","styles","jsx","BaseSelect.Value","BaseSelect.Icon","LuChevronsUpDown","BaseSelect.Portal","BaseSelect.Positioner","BaseSelect.ScrollUpArrow","BaseSelect.Popup","BaseSelect.Arrow","BaseSelect.List","disabled","label","value","BaseSelect.Item","BaseSelect.ItemIndicator","IoCheckmark","BaseSelect.ItemText","BaseSelect.ScrollDownArrow"],"mappings":"+gCAoBwB,SAAAA,EAAU,CAAE,QAAAC,EAAS,MAAAC,EAAO,KAAAC,EAAO,SAAU,GAAGC,GAAmC,CACzG,cACGC,EAAA,CAAgB,MAAOJ,EAAU,GAAGG,EACnC,SAAA,CAAAE,EAAA,KAACC,EAAA,CAAmB,UAAWC,EAAG,CAACC,EAAO,OAAQA,EAAON,CAAI,EAAGD,GAASO,EAAO,KAAK,CAAC,EACpF,SAAA,CAACC,EAAA,IAAAC,EAAA,EAAiB,EAClBD,MAACE,EAAA,CAAgB,UAAWH,EAAO,WACjC,SAACC,EAAA,IAAAG,EAAA,CAAA,CAAiB,CACpB,CAAA,CAAA,EACF,EACAH,EAAAA,IAACI,EAAA,CACC,SAAAR,OAACS,EAAA,CAAsB,KAAK,SAAS,MAAM,QACzC,SAAA,CAAAL,EAAAA,IAACM,EAAA,CAAyB,UAAWP,EAAO,WAAa,CAAA,SACxDQ,EAAA,CAAiB,UAAWR,EAAO,MAClC,SAAA,CAACC,EAAA,IAAAQ,EAAA,EAAiB,EAClBR,MAACS,EAAA,CAAgB,UAAWV,EAAO,KAChC,SAAQR,EAAA,IAAI,CAAC,CAAE,SAAAmB,EAAU,MAAAC,EAAO,MAAAC,CAC/B,IAAAhB,OAACiB,EAAA,CAAoC,UAAWd,EAAO,KAAM,MAAAa,EAAc,SAAAF,EACzE,SAAA,CAACV,EAAAA,IAAAc,EAAA,CAAyB,UAAWf,EAAO,cAC1C,SAAAC,MAACe,EAAY,CAAA,UAAWhB,EAAO,iBAAA,CAAmB,CACpD,CAAA,QACCiB,EAAA,CAAoB,UAAWjB,EAAO,UAAY,SAAMY,CAAA,CAAA,CAAA,CAAA,EAJrC,OAAOC,CAAK,CAKlC,CACD,CACH,CAAA,CAAA,EACF,QACCK,EAAA,CAA2B,UAAWlB,EAAO,WAAa,CAAA,CAAA,CAAA,CAC7D,CACF,CAAA,CAAA,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{l as _,h,y as k,j as e}from"./vendor-CCiSQ9k9.js";import{P as T,g as m,C as O,D as C,b as S,i as d,y as x,f as E,E as A,a as j,G as P,u as M,c as I,d as V,L as F,h as D,O as L}from"./index-BQEUaoAf.js";import{E as R}from"./EmptyPage-Dcbg6rmF.js";import{V as z}from"./ViewLogo-_3Z1hIHi.js";import{O as N,i as H,V as W}from"./ViewParamsEditor-Bca1TIDW.js";import{u as B}from"./useWindowTitle-DqdFTWns.js";import{g as $,a as G}from"./viewLoader.utils-CmM-4-pk.js";import{S as Q}from"./SuperscriptTime-CIrcMcyg.js";import{a as U,g as X}from"./offset-DJAHqjFW.js";import{g as Y}from"./presentation.utils-KwY-ACf7.js";import{u as q}from"./useProjectData-C1hVamxc.js";import"./Empty-gWT_HMeu.js";import"./Select-CedN80WS.js";(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]="cf8e3094-1acd-4682-aa28-4813ea29f498",s._sentryDebugIdIdentifier="sentry-dbid-cf8e3094-1acd-4682-aa28-4813ea29f498")}catch{}})();const J=s=>[{title:N.ClockOptions,collapsible:!0,options:[$(s)]},{title:N.ElementVisibility,collapsible:!0,options:[{id:"hideCards",title:"Hide cards section",description:"Hides the card section with the timers",type:"boolean",defaultValue:!1}]}];function K(s,t){return{hideCards:H((a=>(t==null?void 0:t.get(a))??s.get(a))("hideCards"))}}function Z(){const[s]=_(),t=h.use(T);return h.useMemo(()=>{const a=t?new URLSearchParams(t.search):void 0;return K(s,a)},[t,s])}function ee(){const{width:s}=k();return h.useMemo(()=>s<1300,[s])}function se(s){const[t,i]=(()=>{const a=m(s);return a.endsWith("AM")?[a.slice(0,-2),"AM"]:a.endsWith("PM")?[a.slice(0,-2),"PM"]:[a,void 0]})();return{seconds:O(s),display:t,meridian:i}}const te=[...Array(12).keys()],ae=[...Array(60).keys()];function ie({hideCards:s}){const t=ee(),{clock:i,playback:a}=C(),r=a!==S.Stop;if(t&&!s)return e.jsx(re,{clock:i,onAir:r});const{seconds:c,display:n,meridian:l}=se(i);return e.jsx("div",{className:"studio__clock",children:e.jsxs("div",{className:"clock-container",children:[ae.map(o=>e.jsx("div",{className:d(["tick",o<=c&&"tick--active"]),style:{transform:`rotate(${180+o*6}deg) translateY(var(--half-size))`}},o)),te.map(o=>e.jsx("div",{className:"tick tick--active",style:{transform:`rotate(${180+o*30}deg) translateX(var(--smaller-half-size))`}},o)),e.jsx("div",{className:d(["ampm",!!l&&"ampm--active"]),children:l}),e.jsx("div",{className:"time time--large",children:n}),e.jsx("div",{className:d(["on-air",r&&"on-air--active"]),children:"ON AIR"})]})})}function re({clock:s,onAir:t}){const i=m(s);return e.jsxs("div",{className:"studio__clock studio__clock--small",children:[e.jsx(Q,{className:"time time--small",time:i}),e.jsx("div",{className:d(["on-air",t&&"on-air--active"]),children:"ON AIR"})]})}const v={format12:"h:mm a",format24:"HH:mm"};function ce(s){return{actualStart:m(s.actualStart,v),expectedEnd:m(s.expectedEnd,v),offset:U(s.offset)}}function de(s,t){return{title:(s==null?void 0:s.title)||"-",startedAt:m(t.startedAt,v),expectedEnd:m(t.expectedFinish,v),timer:x(t.current)}}function ne({viewSettings:s}){const{getLocalizedString:t}=E(),{eventNow:i,eventNext:a,message:r,time:c,offset:n,rundown:l,expectedRundownEnd:o}=A(),f=ce({offset:n,actualStart:l.actualStart,expectedEnd:o}),u=de(i,c),y=(a==null?void 0:a.title)||"-",b=r.timer.visible&&r.timer.text||"-",p=r.timer.secondarySource==="secondary"&&r.secondary||"-",w=Y(s,void 0,c.phase===j.Warning,c.phase===j.Danger),g=X(n);return e.jsxs("div",{className:"studio__timers",children:[e.jsx("div",{className:"card",id:"card-schedule",children:e.jsxs("div",{className:"card__row",children:[e.jsxs("div",{children:[e.jsx("div",{className:"label",children:t("common.started_at")}),e.jsx("div",{className:"runtime-timer",children:f.actualStart})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label center",children:"Over / under"}),e.jsx("div",{className:d(["runtime-timer","center",!i&&"muted",g&&g]),children:f.offset})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label right",children:t("common.expected_end")}),e.jsx("div",{className:"runtime-timer right",children:f.expectedEnd})]})]})}),e.jsxs("div",{className:"card",id:"card-event-now",children:[e.jsxs("div",{className:"card__row",children:[e.jsxs("div",{children:[e.jsx("div",{className:"label",children:t("common.now")}),e.jsx("div",{className:"title",children:u.title})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label right",children:t("common.next")}),e.jsx("div",{className:"title right",children:y})]})]}),e.jsxs("div",{className:"card__row",children:[e.jsxs("div",{children:[e.jsx("div",{className:"label",children:t("common.started_at")}),e.jsx("div",{className:"runtime-timer",children:u.startedAt})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label"}),e.jsx("div",{className:d(["event-timer",c.phase===j.Overtime&&"event-timer--finished",c.playback===S.Pause&&"event-timer--paused"]),style:{"--phase-color":w},"data-phase":c.phase,children:u.timer})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label right",children:t("common.expected_end")}),e.jsx("div",{className:"runtime-timer right",children:u.expectedEnd})]})]})]}),e.jsx(oe,{}),e.jsx("div",{className:"card",id:"card-timer-message",children:e.jsxs("div",{children:[e.jsx("div",{className:"label",children:"Timer message"}),e.jsx("div",{className:d(["extra",!1]),children:b})]})}),e.jsx("div",{className:"card",id:"card-secondary-message",children:e.jsxs("div",{children:[e.jsx("div",{className:"label",children:"Secondary message"}),e.jsx("div",{className:d(["extra",!p&&"muted"]),children:p})]})})]})}function oe(){const s=P();return e.jsx("div",{className:"card",id:"card-aux",children:e.jsxs("div",{className:"card__row",children:[e.jsxs("div",{children:[e.jsx("div",{className:"label",children:"Aux 1"}),e.jsx("div",{className:"extra",children:x(s.aux1)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label center",children:"Aux 2"}),e.jsx("div",{className:"extra center",children:x(s.aux2)})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label right",children:"Aux 3"}),e.jsx("div",{className:"extra right",children:x(s.aux3)})]})]})})}function le(){const s=M(l=>l.mirror),{data:t,status:i}=q(),{data:a,status:r}=I(),{data:c,status:n}=V();return{data:{projectData:t,isMirrored:s,settings:c,viewSettings:a},status:G([i,r,n])}}function _e(){const{data:s,status:t}=le();return B("Studio Clock"),t==="pending"?e.jsx(F,{}):t==="error"?e.jsx(R,{text:"There was an error fetching data, please refresh the page."}):e.jsx(me,{...s})}function me({projectData:s,isMirrored:t,settings:i,viewSettings:a}){const{hideCards:r}=Z(),c=D(i==null?void 0:i.timeFormat),n=h.useMemo(()=>J(c),[c]);return e.jsxs("div",{className:d(["studio",t&&"mirror"]),"data-testid":"studio-view",children:[e.jsx(W,{target:L.StudioClock,viewOptions:n}),e.jsxs("div",{className:"project-header",children:[(s==null?void 0:s.logo)&&e.jsx(z,{name:s.logo,className:"logo"}),e.jsx("div",{className:"title",children:s.title})]}),e.jsxs("div",{className:d(["studio-contents",r&&"studio-contents--onecol"]),children:[e.jsx(ie,{hideCards:r}),!r&&e.jsx(ne,{viewSettings:a})]})]})}export{_e as default};
2
+ //# sourceMappingURL=Studio-DUzPBS6P.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Studio-BLCIas53.js","sources":["../../src/views/studio/studio.options.ts","../../src/common/hooks/useIsSmallScreen.ts","../../src/views/studio/studioClock.utils.ts","../../src/views/studio/StudioClock.tsx","../../src/views/studio/studioTimers.utils.ts","../../src/views/studio/StudioTimers.tsx","../../src/views/studio/useStudioData.ts","../../src/views/studio/Studio.tsx"],"sourcesContent":["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 '../../features/viewers/common/viewUtils';\n\nexport const getStudioOptions = (timeFormat: string): ViewOption[] => [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideCards',\n title: 'Hide cards section',\n description: 'Hides the card section with the timers',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n];\n\ntype StudioOptions = {\n hideCards: 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): StudioOptions {\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 hideCards: isStringBoolean(getValue('hideCards')),\n };\n}\n\n/**\n * Hook exposes the backstage view options\n */\nexport function useStudioOptions(): StudioOptions {\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 { useViewportSize } from '@mantine/hooks';\n\nexport function useIsSmallScreen(): boolean {\n const { width } = useViewportSize();\n\n return useMemo(() => width < 1300, [width]);\n}\n","import { secondsInMillis } from 'ontime-utils';\n\nimport { formatTime } from '../../common/utils/time';\n\n/**\n * Gathers display elements for the large studio clock\n */\nexport function getLargeClockData(clock: number) {\n const [display, meridian] = (() => {\n const formatted = formatTime(clock);\n if (formatted.endsWith('AM')) {\n return [formatted.slice(0, -2), 'AM'];\n }\n if (formatted.endsWith('PM')) {\n return [formatted.slice(0, -2), 'PM'];\n }\n return [formatted, undefined];\n })();\n\n return { seconds: secondsInMillis(clock), display, meridian };\n}\n","import { Playback } from 'ontime-types';\n\nimport { useIsSmallScreen } from '../../common/hooks/useIsSmallScreen';\nimport { useStudioClockSocket } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\n\nimport { getLargeClockData } from './studioClock.utils';\n\nimport './StudioClock.scss';\n\nconst activeIndicators = [...Array(12).keys()];\nconst secondsIndicators = [...Array(60).keys()];\n\ninterface StudioClockProps {\n hideCards: boolean;\n}\n\nexport default function StudioClock({ hideCards }: StudioClockProps) {\n const isSmallScreen = useIsSmallScreen();\n const { clock, playback } = useStudioClockSocket();\n const onAir = playback !== Playback.Stop;\n\n // if we are on mobile and have to show the cards\n if (isSmallScreen && !hideCards) {\n return <StudioClockMobile clock={clock} onAir={onAir} />;\n }\n\n const { seconds, display, meridian } = getLargeClockData(clock);\n\n return (\n <div className='studio__clock'>\n <div className='clock-container'>\n {secondsIndicators.map((i) => {\n return (\n <div\n key={i}\n className={cx(['tick', i <= seconds && 'tick--active'])}\n style={{ transform: `rotate(${180 + i * 6}deg) translateY(var(--half-size))` }}\n />\n );\n })}\n {activeIndicators.map((i) => (\n <div\n key={i}\n className='tick tick--active'\n style={{\n transform: `rotate(${180 + i * 30}deg) translateX(var(--smaller-half-size))`,\n }}\n />\n ))}\n <div className={cx(['ampm', Boolean(meridian) && 'ampm--active'])}>{meridian}</div>\n <div className='time time--large'>{display}</div>\n <div className={cx(['on-air', onAir && 'on-air--active'])}>ON AIR</div>\n </div>\n </div>\n );\n}\n\ninterface StudioClockMobileProps {\n clock: number;\n onAir: boolean;\n}\n\nfunction StudioClockMobile({ clock, onAir }: StudioClockMobileProps) {\n const displayClock = formatTime(clock);\n\n return (\n <div className='studio__clock studio__clock--small'>\n <SuperscriptTime className='time time--small' time={displayClock} />\n <div className={cx(['on-air', onAir && 'on-air--active'])}>ON AIR</div>\n </div>\n );\n}\n","import { MaybeNumber, OntimeEvent, TimerState } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { getOffsetText } from '../../common/utils/offset';\nimport { formatTime } from '../../common/utils/time';\n\nconst timeFormat = { format12: 'h:mm a', format24: 'HH:mm' };\nexport function getFormattedScheduleTimes(data: {\n offset: number;\n actualStart: MaybeNumber;\n expectedEnd: MaybeNumber;\n}) {\n return {\n actualStart: formatTime(data.actualStart, timeFormat),\n expectedEnd: formatTime(data.expectedEnd, timeFormat),\n offset: getOffsetText(data.offset),\n };\n}\n\nexport function getFormattedEventData(eventNow: OntimeEvent | null, timer: TimerState) {\n return {\n title: eventNow?.title || '-',\n startedAt: formatTime(timer.startedAt, timeFormat),\n expectedEnd: formatTime(timer.expectedFinish, timeFormat),\n timer: millisToString(timer.current),\n };\n}\n","import { Playback, TimerPhase, ViewSettings } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { useAuxTimersTime, useStudioTimersSocket } from '../../common/hooks/useSocket';\nimport { getOffsetState } from '../../common/utils/offset';\nimport { cx } from '../../common/utils/styleUtils';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getFormattedEventData, getFormattedScheduleTimes } from './studioTimers.utils';\n\nimport './StudioTimers.scss';\n\ninterface StudioTimersProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StudioTimers({ viewSettings }: StudioTimersProps) {\n const { getLocalizedString } = useTranslation();\n const { eventNow, eventNext, message, time, offset, rundown, expectedRundownEnd } = useStudioTimersSocket();\n\n const schedule = getFormattedScheduleTimes({\n offset: offset,\n actualStart: rundown.actualStart,\n expectedEnd: expectedRundownEnd,\n });\n const event = getFormattedEventData(eventNow, time);\n const eventNextTitle = eventNext?.title || '-';\n const formattedTimerMessage = (message.timer.visible && message.timer.text) || '-';\n const formattedSecondaryMessage = message.timer.secondarySource === 'secondary' ? message.secondary || '-' : '-';\n\n // gather presentation styles\n const timerColour = getTimerColour(\n viewSettings,\n undefined,\n time.phase === TimerPhase.Warning,\n time.phase === TimerPhase.Danger,\n );\n\n const offsetState = getOffsetState(offset);\n\n return (\n <div className='studio__timers'>\n <div className='card' id='card-schedule'>\n <div className='card__row'>\n <div>\n <div className='label'>{getLocalizedString('common.started_at')}</div>\n <div className='runtime-timer'>{schedule.actualStart}</div>\n </div>\n <div>\n <div className='label center'>Over / under</div>\n <div className={cx(['runtime-timer', 'center', !eventNow && 'muted', offsetState && offsetState])}>\n {schedule.offset}\n </div>\n </div>\n <div>\n <div className='label right'>{getLocalizedString('common.expected_end')}</div>\n <div className='runtime-timer right'>{schedule.expectedEnd}</div>\n </div>\n </div>\n </div>\n\n <div className='card' id='card-event-now'>\n <div className='card__row'>\n <div>\n <div className='label'>{getLocalizedString('common.now')}</div>\n <div className='title'>{event.title}</div>\n </div>\n <div>\n <div className='label right'>{getLocalizedString('common.next')}</div>\n <div className='title right'>{eventNextTitle}</div>\n </div>\n </div>\n\n <div className='card__row'>\n <div>\n <div className='label'>{getLocalizedString('common.started_at')}</div>\n <div className='runtime-timer'>{event.startedAt}</div>\n </div>\n <div>\n <div className='label' />\n <div\n className={cx([\n 'event-timer',\n time.phase === TimerPhase.Overtime && 'event-timer--finished',\n time.playback === Playback.Pause && 'event-timer--paused',\n ])}\n style={{\n '--phase-color': timerColour,\n }}\n data-phase={time.phase}\n >\n {event.timer}\n </div>\n </div>\n <div>\n <div className='label right'>{getLocalizedString('common.expected_end')}</div>\n <div className='runtime-timer right'>{event.expectedEnd}</div>\n </div>\n </div>\n </div>\n\n <StudioTimersAux />\n\n <div className='card' id='card-timer-message'>\n <div>\n <div className='label'>Timer message</div>\n <div className={cx(['extra', !formattedTimerMessage && 'muted'])}>{formattedTimerMessage}</div>\n </div>\n </div>\n\n <div className='card' id='card-secondary-message'>\n <div>\n <div className='label'>Secondary message</div>\n <div className={cx(['extra', !formattedSecondaryMessage && 'muted'])}>{formattedSecondaryMessage}</div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction StudioTimersAux() {\n const auxTimer = useAuxTimersTime();\n\n return (\n <div className='card' id='card-aux'>\n <div className='card__row'>\n <div>\n <div className='label'>Aux 1</div>\n <div className='extra'>{millisToString(auxTimer.aux1)}</div>\n </div>\n\n <div>\n <div className='label center'>Aux 2</div>\n <div className='extra center'>{millisToString(auxTimer.aux2)}</div>\n </div>\n\n <div>\n <div className='label right'>Aux 3</div>\n <div className='extra right'>{millisToString(auxTimer.aux3)}</div>\n </div>\n </div>\n </div>\n );\n}\n","import { ProjectData, Settings, ViewSettings } from 'ontime-types';\n\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 StudioData {\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n}\n\nexport function useStudioData(): ViewData<StudioData> {\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\n return {\n data: {\n projectData,\n isMirrored,\n settings,\n viewSettings,\n },\n status: aggregateQueryStatus([projectDataStatus, viewSettingsStatus, 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 { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport Loader from '../common/loader/Loader';\n\nimport { getStudioOptions, useStudioOptions } from './studio.options';\nimport StudioClock from './StudioClock';\nimport StudioTimers from './StudioTimers';\nimport { StudioData, useStudioData } from './useStudioData';\n\nimport './Studio.scss';\n\nexport default function StudioLoader() {\n const { data, status } = useStudioData();\n\n useWindowTitle('Studio Clock');\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 <Studio {...data} />;\n}\n\nfunction Studio({ projectData, isMirrored, settings, viewSettings }: StudioData) {\n const { hideCards } = useStudioOptions();\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const studioOptions = useMemo(() => getStudioOptions(defaultFormat), [defaultFormat]);\n\n return (\n <div className={cx(['studio', isMirrored && 'mirror'])} data-testid='studio-view'>\n <ViewParamsEditor target={OntimeView.StudioClock} viewOptions={studioOptions} />\n\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n </div>\n\n <div className={cx(['studio-contents', hideCards && 'studio-contents--onecol'])}>\n <StudioClock hideCards={hideCards} />\n {!hideCards && <StudioTimers viewSettings={viewSettings} />}\n </div>\n </div>\n );\n}\n"],"names":["getStudioOptions","timeFormat","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","isStringBoolean","key","useStudioOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","useIsSmallScreen","width","useViewportSize","getLargeClockData","clock","display","meridian","formatted","formatTime","secondsInMillis","activeIndicators","secondsIndicators","StudioClock","hideCards","isSmallScreen","playback","useStudioClockSocket","onAir","Playback","jsx","StudioClockMobile","seconds","jsxs","i","cx","displayClock","SuperscriptTime","getFormattedScheduleTimes","data","getOffsetText","getFormattedEventData","eventNow","timer","millisToString","StudioTimers","viewSettings","getLocalizedString","useTranslation","eventNext","message","time","offset","rundown","expectedRundownEnd","useStudioTimersSocket","schedule","event","eventNextTitle","formattedTimerMessage","formattedSecondaryMessage","timerColour","getTimerColour","TimerPhase","offsetState","getOffsetState","StudioTimersAux","auxTimer","useAuxTimersTime","useStudioData","isMirrored","useViewOptionsStore","state","projectData","projectDataStatus","useProjectData","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","aggregateQueryStatus","StudioLoader","status","useWindowTitle","Loader","EmptyPage","Studio","defaultFormat","getDefaultFormat","studioOptions","ViewParamsEditor","OntimeView","ViewLogo"],"mappings":"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"}
1
+ {"version":3,"file":"Studio-DUzPBS6P.js","sources":["../../src/views/studio/studio.options.ts","../../src/common/hooks/useIsSmallScreen.ts","../../src/views/studio/studioClock.utils.ts","../../src/views/studio/StudioClock.tsx","../../src/views/studio/studioTimers.utils.ts","../../src/views/studio/StudioTimers.tsx","../../src/views/studio/useStudioData.ts","../../src/views/studio/Studio.tsx"],"sourcesContent":["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 '../../features/viewers/common/viewUtils';\n\nexport const getStudioOptions = (timeFormat: string): ViewOption[] => [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideCards',\n title: 'Hide cards section',\n description: 'Hides the card section with the timers',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n];\n\ntype StudioOptions = {\n hideCards: 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): StudioOptions {\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 hideCards: isStringBoolean(getValue('hideCards')),\n };\n}\n\n/**\n * Hook exposes the backstage view options\n */\nexport function useStudioOptions(): StudioOptions {\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 { useViewportSize } from '@mantine/hooks';\n\nexport function useIsSmallScreen(): boolean {\n const { width } = useViewportSize();\n\n return useMemo(() => width < 1300, [width]);\n}\n","import { secondsInMillis } from 'ontime-utils';\n\nimport { formatTime } from '../../common/utils/time';\n\n/**\n * Gathers display elements for the large studio clock\n */\nexport function getLargeClockData(clock: number) {\n const [display, meridian] = (() => {\n const formatted = formatTime(clock);\n if (formatted.endsWith('AM')) {\n return [formatted.slice(0, -2), 'AM'];\n }\n if (formatted.endsWith('PM')) {\n return [formatted.slice(0, -2), 'PM'];\n }\n return [formatted, undefined];\n })();\n\n return { seconds: secondsInMillis(clock), display, meridian };\n}\n","import { Playback } from 'ontime-types';\n\nimport { useIsSmallScreen } from '../../common/hooks/useIsSmallScreen';\nimport { useStudioClockSocket } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\n\nimport { getLargeClockData } from './studioClock.utils';\n\nimport './StudioClock.scss';\n\nconst activeIndicators = [...Array(12).keys()];\nconst secondsIndicators = [...Array(60).keys()];\n\ninterface StudioClockProps {\n hideCards: boolean;\n}\n\nexport default function StudioClock({ hideCards }: StudioClockProps) {\n const isSmallScreen = useIsSmallScreen();\n const { clock, playback } = useStudioClockSocket();\n const onAir = playback !== Playback.Stop;\n\n // if we are on mobile and have to show the cards\n if (isSmallScreen && !hideCards) {\n return <StudioClockMobile clock={clock} onAir={onAir} />;\n }\n\n const { seconds, display, meridian } = getLargeClockData(clock);\n\n return (\n <div className='studio__clock'>\n <div className='clock-container'>\n {secondsIndicators.map((i) => {\n return (\n <div\n key={i}\n className={cx(['tick', i <= seconds && 'tick--active'])}\n style={{ transform: `rotate(${180 + i * 6}deg) translateY(var(--half-size))` }}\n />\n );\n })}\n {activeIndicators.map((i) => (\n <div\n key={i}\n className='tick tick--active'\n style={{\n transform: `rotate(${180 + i * 30}deg) translateX(var(--smaller-half-size))`,\n }}\n />\n ))}\n <div className={cx(['ampm', Boolean(meridian) && 'ampm--active'])}>{meridian}</div>\n <div className='time time--large'>{display}</div>\n <div className={cx(['on-air', onAir && 'on-air--active'])}>ON AIR</div>\n </div>\n </div>\n );\n}\n\ninterface StudioClockMobileProps {\n clock: number;\n onAir: boolean;\n}\n\nfunction StudioClockMobile({ clock, onAir }: StudioClockMobileProps) {\n const displayClock = formatTime(clock);\n\n return (\n <div className='studio__clock studio__clock--small'>\n <SuperscriptTime className='time time--small' time={displayClock} />\n <div className={cx(['on-air', onAir && 'on-air--active'])}>ON AIR</div>\n </div>\n );\n}\n","import { MaybeNumber, OntimeEvent, TimerState } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { getOffsetText } from '../../common/utils/offset';\nimport { formatTime } from '../../common/utils/time';\n\nconst timeFormat = { format12: 'h:mm a', format24: 'HH:mm' };\nexport function getFormattedScheduleTimes(data: {\n offset: number;\n actualStart: MaybeNumber;\n expectedEnd: MaybeNumber;\n}) {\n return {\n actualStart: formatTime(data.actualStart, timeFormat),\n expectedEnd: formatTime(data.expectedEnd, timeFormat),\n offset: getOffsetText(data.offset),\n };\n}\n\nexport function getFormattedEventData(eventNow: OntimeEvent | null, timer: TimerState) {\n return {\n title: eventNow?.title || '-',\n startedAt: formatTime(timer.startedAt, timeFormat),\n expectedEnd: formatTime(timer.expectedFinish, timeFormat),\n timer: millisToString(timer.current),\n };\n}\n","import { Playback, TimerPhase, ViewSettings } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { useAuxTimersTime, useStudioTimersSocket } from '../../common/hooks/useSocket';\nimport { getOffsetState } from '../../common/utils/offset';\nimport { cx } from '../../common/utils/styleUtils';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getFormattedEventData, getFormattedScheduleTimes } from './studioTimers.utils';\n\nimport './StudioTimers.scss';\n\ninterface StudioTimersProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StudioTimers({ viewSettings }: StudioTimersProps) {\n const { getLocalizedString } = useTranslation();\n const { eventNow, eventNext, message, time, offset, rundown, expectedRundownEnd } = useStudioTimersSocket();\n\n const schedule = getFormattedScheduleTimes({\n offset: offset,\n actualStart: rundown.actualStart,\n expectedEnd: expectedRundownEnd,\n });\n const event = getFormattedEventData(eventNow, time);\n const eventNextTitle = eventNext?.title || '-';\n const formattedTimerMessage = (message.timer.visible && message.timer.text) || '-';\n const formattedSecondaryMessage = message.timer.secondarySource === 'secondary' ? message.secondary || '-' : '-';\n\n // gather presentation styles\n const timerColour = getTimerColour(\n viewSettings,\n undefined,\n time.phase === TimerPhase.Warning,\n time.phase === TimerPhase.Danger,\n );\n\n const offsetState = getOffsetState(offset);\n\n return (\n <div className='studio__timers'>\n <div className='card' id='card-schedule'>\n <div className='card__row'>\n <div>\n <div className='label'>{getLocalizedString('common.started_at')}</div>\n <div className='runtime-timer'>{schedule.actualStart}</div>\n </div>\n <div>\n <div className='label center'>Over / under</div>\n <div className={cx(['runtime-timer', 'center', !eventNow && 'muted', offsetState && offsetState])}>\n {schedule.offset}\n </div>\n </div>\n <div>\n <div className='label right'>{getLocalizedString('common.expected_end')}</div>\n <div className='runtime-timer right'>{schedule.expectedEnd}</div>\n </div>\n </div>\n </div>\n\n <div className='card' id='card-event-now'>\n <div className='card__row'>\n <div>\n <div className='label'>{getLocalizedString('common.now')}</div>\n <div className='title'>{event.title}</div>\n </div>\n <div>\n <div className='label right'>{getLocalizedString('common.next')}</div>\n <div className='title right'>{eventNextTitle}</div>\n </div>\n </div>\n\n <div className='card__row'>\n <div>\n <div className='label'>{getLocalizedString('common.started_at')}</div>\n <div className='runtime-timer'>{event.startedAt}</div>\n </div>\n <div>\n <div className='label' />\n <div\n className={cx([\n 'event-timer',\n time.phase === TimerPhase.Overtime && 'event-timer--finished',\n time.playback === Playback.Pause && 'event-timer--paused',\n ])}\n style={{\n '--phase-color': timerColour,\n }}\n data-phase={time.phase}\n >\n {event.timer}\n </div>\n </div>\n <div>\n <div className='label right'>{getLocalizedString('common.expected_end')}</div>\n <div className='runtime-timer right'>{event.expectedEnd}</div>\n </div>\n </div>\n </div>\n\n <StudioTimersAux />\n\n <div className='card' id='card-timer-message'>\n <div>\n <div className='label'>Timer message</div>\n <div className={cx(['extra', !formattedTimerMessage && 'muted'])}>{formattedTimerMessage}</div>\n </div>\n </div>\n\n <div className='card' id='card-secondary-message'>\n <div>\n <div className='label'>Secondary message</div>\n <div className={cx(['extra', !formattedSecondaryMessage && 'muted'])}>{formattedSecondaryMessage}</div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction StudioTimersAux() {\n const auxTimer = useAuxTimersTime();\n\n return (\n <div className='card' id='card-aux'>\n <div className='card__row'>\n <div>\n <div className='label'>Aux 1</div>\n <div className='extra'>{millisToString(auxTimer.aux1)}</div>\n </div>\n\n <div>\n <div className='label center'>Aux 2</div>\n <div className='extra center'>{millisToString(auxTimer.aux2)}</div>\n </div>\n\n <div>\n <div className='label right'>Aux 3</div>\n <div className='extra right'>{millisToString(auxTimer.aux3)}</div>\n </div>\n </div>\n </div>\n );\n}\n","import { ProjectData, Settings, ViewSettings } from 'ontime-types';\n\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 StudioData {\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n}\n\nexport function useStudioData(): ViewData<StudioData> {\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\n return {\n data: {\n projectData,\n isMirrored,\n settings,\n viewSettings,\n },\n status: aggregateQueryStatus([projectDataStatus, viewSettingsStatus, 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 { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport Loader from '../common/loader/Loader';\n\nimport { getStudioOptions, useStudioOptions } from './studio.options';\nimport StudioClock from './StudioClock';\nimport StudioTimers from './StudioTimers';\nimport { StudioData, useStudioData } from './useStudioData';\n\nimport './Studio.scss';\n\nexport default function StudioLoader() {\n const { data, status } = useStudioData();\n\n useWindowTitle('Studio Clock');\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 <Studio {...data} />;\n}\n\nfunction Studio({ projectData, isMirrored, settings, viewSettings }: StudioData) {\n const { hideCards } = useStudioOptions();\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const studioOptions = useMemo(() => getStudioOptions(defaultFormat), [defaultFormat]);\n\n return (\n <div className={cx(['studio', isMirrored && 'mirror'])} data-testid='studio-view'>\n <ViewParamsEditor target={OntimeView.StudioClock} viewOptions={studioOptions} />\n\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n </div>\n\n <div className={cx(['studio-contents', hideCards && 'studio-contents--onecol'])}>\n <StudioClock hideCards={hideCards} />\n {!hideCards && <StudioTimers viewSettings={viewSettings} />}\n </div>\n </div>\n );\n}\n"],"names":["getStudioOptions","timeFormat","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","isStringBoolean","key","useStudioOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","useIsSmallScreen","width","useViewportSize","getLargeClockData","clock","display","meridian","formatted","formatTime","secondsInMillis","activeIndicators","secondsIndicators","StudioClock","hideCards","isSmallScreen","playback","useStudioClockSocket","onAir","Playback","jsx","StudioClockMobile","seconds","jsxs","i","cx","displayClock","SuperscriptTime","getFormattedScheduleTimes","data","getOffsetText","getFormattedEventData","eventNow","timer","millisToString","StudioTimers","viewSettings","getLocalizedString","useTranslation","eventNext","message","time","offset","rundown","expectedRundownEnd","useStudioTimersSocket","schedule","event","eventNextTitle","formattedTimerMessage","formattedSecondaryMessage","timerColour","getTimerColour","TimerPhase","offsetState","getOffsetState","StudioTimersAux","auxTimer","useAuxTimersTime","useStudioData","isMirrored","useViewOptionsStore","state","projectData","projectDataStatus","useProjectData","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","aggregateQueryStatus","StudioLoader","status","useWindowTitle","Loader","EmptyPage","Studio","defaultFormat","getDefaultFormat","studioOptions","ViewParamsEditor","OntimeView","ViewLogo"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as r,j as f,ce as y,cf as u}from"./vendor-Cnciq4o_.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},d=new e.Error().stack;d&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[d]="1f3dfbc7-c4dd-4622-b85d-6c3b53dc55dc",e._sentryDebugIdIdentifier="sentry-dbid-1f3dfbc7-c4dd-4622-b85d-6c3b53dc55dc")}catch{}})();const b="_wrapper_1l24u_17",h={wrapper:b},g=r.forwardRef((e,d)=>{const{language:a,initialValue:t,isDirty:i,setIsDirty:o}=e,[s,c]=r.useState(t),p=n=>{const l=u.languages[a];return l?u.highlight(n,l,a):n},m=n=>{c(n)};return r.useImperativeHandle(d,()=>({getCss:()=>s})),r.useEffect(()=>{c(t)},[t]),r.useEffect(()=>{t.trim()!==s.trim()&&!i&&s.length!==0&&o(!0),t.trim()===s.trim()&&i&&o(!1)},[t,s,i,o]),f.jsx("div",{className:h.wrapper,children:f.jsx(y,{value:s,padding:15,onValueChange:m,highlight:p,style:{fontFamily:"monospace",fontSize:12,minHeight:500,background:"#2d2d2d"}})})});g.displayName="StyleEditor";const E=r.memo(g);export{E as default};
2
- //# sourceMappingURL=StyleEditor-DTNiR-0P.js.map
1
+ import{h as r,j as f,ce as y,cf as u}from"./vendor-CCiSQ9k9.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},d=new e.Error().stack;d&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[d]="1f3dfbc7-c4dd-4622-b85d-6c3b53dc55dc",e._sentryDebugIdIdentifier="sentry-dbid-1f3dfbc7-c4dd-4622-b85d-6c3b53dc55dc")}catch{}})();const b="_wrapper_1l24u_17",h={wrapper:b},g=r.forwardRef((e,d)=>{const{language:a,initialValue:t,isDirty:i,setIsDirty:o}=e,[s,c]=r.useState(t),p=n=>{const l=u.languages[a];return l?u.highlight(n,l,a):n},m=n=>{c(n)};return r.useImperativeHandle(d,()=>({getCss:()=>s})),r.useEffect(()=>{c(t)},[t]),r.useEffect(()=>{t.trim()!==s.trim()&&!i&&s.length!==0&&o(!0),t.trim()===s.trim()&&i&&o(!1)},[t,s,i,o]),f.jsx("div",{className:h.wrapper,children:f.jsx(y,{value:s,padding:15,onValueChange:m,highlight:p,style:{fontFamily:"monospace",fontSize:12,minHeight:500,background:"#2d2d2d"}})})});g.displayName="StyleEditor";const E=r.memo(g);export{E as default};
2
+ //# sourceMappingURL=StyleEditor-D2z65PB7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StyleEditor-DTNiR-0P.js","sources":["../../src/features/app-settings/panel/settings-panel/composite/StyleEditor.tsx"],"sourcesContent":["import { forwardRef, memo, useEffect, useImperativeHandle, useState } from 'react';\nimport Editor from 'react-simple-code-editor';\nimport Prism from 'prismjs/components/prism-core';\n\nimport 'prismjs/components/prism-css';\nimport 'prismjs/themes/prism-tomorrow.min.css';\nimport style from './StyleEditor.module.scss';\n\ninterface CodeEditorProps {\n language: string;\n initialValue: string;\n isDirty: boolean;\n setIsDirty: (value: boolean) => void;\n}\n\nconst CodeEditor = forwardRef((props: CodeEditorProps, cssRef) => {\n const { language, initialValue, isDirty, setIsDirty } = props;\n\n const [code, setCode] = useState(initialValue);\n\n const highlight = (code: string) => {\n const grammar = Prism.languages[language];\n return grammar ? Prism.highlight(code, grammar, language) : code;\n };\n\n const handleChange = (newCode: string) => {\n setCode(newCode);\n };\n\n useImperativeHandle(cssRef, () => {\n return {\n getCss: () => code,\n };\n });\n\n // add contents to editor on mount and any change in initialValue\n useEffect(() => {\n setCode(initialValue);\n }, [initialValue]);\n\n // handle dirty state on change\n useEffect(() => {\n if (initialValue.trim() !== code.trim() && !isDirty && code.length !== 0) {\n setIsDirty(true);\n }\n\n if (initialValue.trim() === code.trim() && isDirty) {\n setIsDirty(false);\n }\n }, [initialValue, code, isDirty, setIsDirty]);\n\n return (\n <div className={style.wrapper}>\n <Editor\n value={code}\n padding={15}\n onValueChange={handleChange}\n highlight={highlight}\n style={{\n fontFamily: 'monospace',\n fontSize: 12,\n minHeight: 500,\n background: '#2d2d2d', // Background of tomorrow theme\n }}\n />\n </div>\n );\n});\n\nCodeEditor.displayName = 'StyleEditor';\n\nexport default memo(CodeEditor);\n"],"names":["CodeEditor","forwardRef","props","cssRef","language","initialValue","isDirty","setIsDirty","code","setCode","useState","highlight","grammar","Prism","handleChange","newCode","useImperativeHandle","useEffect","jsx","style","Editor","memo"],"mappings":"ocAeMA,EAAaC,EAAA,WAAW,CAACC,EAAwBC,IAAW,CAChE,KAAM,CAAE,SAAAC,EAAU,aAAAC,EAAc,QAAAC,EAAS,WAAAC,CAAe,EAAAL,EAElD,CAACM,EAAMC,CAAO,EAAIC,EAAAA,SAASL,CAAY,EAEvCM,EAAaH,GAAiB,CAC5B,MAAAI,EAAUC,EAAM,UAAUT,CAAQ,EACxC,OAAOQ,EAAUC,EAAM,UAAUL,EAAMI,EAASR,CAAQ,EAAII,CAC9D,EAEMM,EAAgBC,GAAoB,CACxCN,EAAQM,CAAO,CACjB,EAEAC,OAAAA,EAAA,oBAAoBb,EAAQ,KACnB,CACL,OAAQ,IAAMK,CAChB,EACD,EAGDS,EAAAA,UAAU,IAAM,CACdR,EAAQJ,CAAY,CAAA,EACnB,CAACA,CAAY,CAAC,EAGjBY,EAAAA,UAAU,IAAM,CACVZ,EAAa,KAAK,IAAMG,EAAK,QAAU,CAACF,GAAWE,EAAK,SAAW,GACrED,EAAW,EAAI,EAGbF,EAAa,KAAK,IAAMG,EAAK,KAAA,GAAUF,GACzCC,EAAW,EAAK,GAEjB,CAACF,EAAcG,EAAMF,EAASC,CAAU,CAAC,EAGzCW,EAAAA,IAAA,MAAA,CAAI,UAAWC,EAAM,QACpB,SAAAD,EAAA,IAACE,EAAA,CACC,MAAOZ,EACP,QAAS,GACT,cAAeM,EACf,UAAAH,EACA,MAAO,CACL,WAAY,YACZ,SAAU,GACV,UAAW,IACX,WAAY,SAAA,CACd,CAAA,EAEJ,CAEJ,CAAC,EAEDX,EAAW,YAAc,cAEzB,MAAeqB,EAAAA,EAAAA,KAAKrB,CAAU"}
1
+ {"version":3,"file":"StyleEditor-D2z65PB7.js","sources":["../../src/features/app-settings/panel/settings-panel/composite/StyleEditor.tsx"],"sourcesContent":["import { forwardRef, memo, useEffect, useImperativeHandle, useState } from 'react';\nimport Editor from 'react-simple-code-editor';\nimport Prism from 'prismjs/components/prism-core';\n\nimport 'prismjs/components/prism-css';\nimport 'prismjs/themes/prism-tomorrow.min.css';\nimport style from './StyleEditor.module.scss';\n\ninterface CodeEditorProps {\n language: string;\n initialValue: string;\n isDirty: boolean;\n setIsDirty: (value: boolean) => void;\n}\n\nconst CodeEditor = forwardRef((props: CodeEditorProps, cssRef) => {\n const { language, initialValue, isDirty, setIsDirty } = props;\n\n const [code, setCode] = useState(initialValue);\n\n const highlight = (code: string) => {\n const grammar = Prism.languages[language];\n return grammar ? Prism.highlight(code, grammar, language) : code;\n };\n\n const handleChange = (newCode: string) => {\n setCode(newCode);\n };\n\n useImperativeHandle(cssRef, () => {\n return {\n getCss: () => code,\n };\n });\n\n // add contents to editor on mount and any change in initialValue\n useEffect(() => {\n setCode(initialValue);\n }, [initialValue]);\n\n // handle dirty state on change\n useEffect(() => {\n if (initialValue.trim() !== code.trim() && !isDirty && code.length !== 0) {\n setIsDirty(true);\n }\n\n if (initialValue.trim() === code.trim() && isDirty) {\n setIsDirty(false);\n }\n }, [initialValue, code, isDirty, setIsDirty]);\n\n return (\n <div className={style.wrapper}>\n <Editor\n value={code}\n padding={15}\n onValueChange={handleChange}\n highlight={highlight}\n style={{\n fontFamily: 'monospace',\n fontSize: 12,\n minHeight: 500,\n background: '#2d2d2d', // Background of tomorrow theme\n }}\n />\n </div>\n );\n});\n\nCodeEditor.displayName = 'StyleEditor';\n\nexport default memo(CodeEditor);\n"],"names":["CodeEditor","forwardRef","props","cssRef","language","initialValue","isDirty","setIsDirty","code","setCode","useState","highlight","grammar","Prism","handleChange","newCode","useImperativeHandle","useEffect","jsx","style","Editor","memo"],"mappings":"ocAeMA,EAAaC,EAAA,WAAW,CAACC,EAAwBC,IAAW,CAChE,KAAM,CAAE,SAAAC,EAAU,aAAAC,EAAc,QAAAC,EAAS,WAAAC,CAAe,EAAAL,EAElD,CAACM,EAAMC,CAAO,EAAIC,EAAAA,SAASL,CAAY,EAEvCM,EAAaH,GAAiB,CAC5B,MAAAI,EAAUC,EAAM,UAAUT,CAAQ,EACxC,OAAOQ,EAAUC,EAAM,UAAUL,EAAMI,EAASR,CAAQ,EAAII,CAC9D,EAEMM,EAAgBC,GAAoB,CACxCN,EAAQM,CAAO,CACjB,EAEAC,OAAAA,EAAA,oBAAoBb,EAAQ,KACnB,CACL,OAAQ,IAAMK,CAChB,EACD,EAGDS,EAAAA,UAAU,IAAM,CACdR,EAAQJ,CAAY,CAAA,EACnB,CAACA,CAAY,CAAC,EAGjBY,EAAAA,UAAU,IAAM,CACVZ,EAAa,KAAK,IAAMG,EAAK,QAAU,CAACF,GAAWE,EAAK,SAAW,GACrED,EAAW,EAAI,EAGbF,EAAa,KAAK,IAAMG,EAAK,KAAA,GAAUF,GACzCC,EAAW,EAAK,GAEjB,CAACF,EAAcG,EAAMF,EAASC,CAAU,CAAC,EAGzCW,EAAAA,IAAA,MAAA,CAAI,UAAWC,EAAM,QACpB,SAAAD,EAAA,IAACE,EAAA,CACC,MAAOZ,EACP,QAAS,GACT,cAAeM,EACf,UAAAH,EACA,MAAO,CACL,WAAY,YACZ,SAAU,GACV,UAAW,IACX,WAAY,SAAA,CACd,CAAA,EAEJ,CAEJ,CAAC,EAEDX,EAAW,YAAc,cAEzB,MAAeqB,EAAAA,EAAAA,KAAKrB,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{j as n}from"./vendor-CCiSQ9k9.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]="7e8dd7d6-c3d2-461f-98e2-ff7cf3cc106d",e._sentryDebugIdIdentifier="sentry-dbid-7e8dd7d6-c3d2-461f-98e2-ff7cf3cc106d")}catch{}})();function f(e){return e.length!==8?[e,""]:[e.slice(0,5),e.slice(5)]}function l({time:e,className:s,style:d}){const[t,r]=e.split(" "),[c,i]=f(t);return n.jsxs("div",{className:s,style:d,children:[c,i&&n.jsx("span",{className:"subscript",children:i}),r&&n.jsx("sup",{className:"period",children:r})]})}export{l as S};
2
+ //# sourceMappingURL=SuperscriptTime-CIrcMcyg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuperscriptTime-CIrcMcyg.js","sources":["../../src/features/viewers/common/superscript-time/SuperscriptTime.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\nimport './SuperscriptTime.scss';\n\ninterface SuperscriptTimeProps {\n time: string;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * When the timer includes seconds, we want to split it from the rest\n */\nfunction getTimerParts(time: string) {\n if (time.length !== 8) {\n return [time, ''];\n }\n\n return [time.slice(0, 5), time.slice(5)];\n}\n\n/**\n * Receives a time string and formats it with a subscript or superscript\n * @example 12:00 AM -> AM becomes a superscript\n * @example 12:00:10 -> the seconds become a subscript\n */\nexport default function SuperscriptTime({ time, className, style }: SuperscriptTimeProps) {\n // we assume anything after space is a period tag\n const [timeString, period] = time.split(' ');\n const [mainTime, subscript] = getTimerParts(timeString);\n\n return (\n <div className={className} style={style}>\n {mainTime}\n {subscript && <span className='subscript'>{subscript}</span>}\n {period && <sup className='period'>{period}</sup>}\n </div>\n );\n}\n"],"names":["getTimerParts","time","SuperscriptTime","className","style","timeString","period","mainTime","subscript","jsxs","jsx"],"mappings":"mYAaA,SAASA,EAAcC,EAAc,CAC/B,OAAAA,EAAK,SAAW,EACX,CAACA,EAAM,EAAE,EAGX,CAACA,EAAK,MAAM,EAAG,CAAC,EAAGA,EAAK,MAAM,CAAC,CAAC,CACzC,CAOA,SAAwBC,EAAgB,CAAE,KAAAD,EAAM,UAAAE,EAAW,MAAAC,GAA+B,CAExF,KAAM,CAACC,EAAYC,CAAM,EAAIL,EAAK,MAAM,GAAG,EACrC,CAACM,EAAUC,CAAS,EAAIR,EAAcK,CAAU,EAGpD,OAAAI,EAAA,KAAC,MAAI,CAAA,UAAAN,EAAsB,MAAAC,EACxB,SAAA,CAAAG,EACAC,GAAaE,EAAA,IAAC,OAAK,CAAA,UAAU,YAAa,SAAUF,EAAA,EACpDF,GAAUI,EAAA,IAAC,MAAI,CAAA,UAAU,SAAU,SAAOJ,CAAA,CAAA,CAAA,EAC7C,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e,h as D,b3 as P,b4 as $,b5 as M,b6 as U,b7 as A,b8 as z,b9 as V}from"./vendor-CCiSQ9k9.js";import{r as b,y as I,bg as h,A as J,i as d,bi as W,g as w,bj as q,w as g,bk as B,s as H,J as K,a as L,bl as Q,bm as X,bn as F,T as N,bo as Y,bp as Z}from"./index-BQEUaoAf.js";import{T as o}from"./Tooltip-D9XRnwOW.js";import{s as R}from"./useRundown-BfpjcCEJ.js";import{a as ee,g as te}from"./offset-DJAHqjFW.js";import{i as E}from"./playbackstate-B_khF6xU.js";(function(){try{var a=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new a.Error().stack;s&&(a._sentryDebugIds=a._sentryDebugIds||{},a._sentryDebugIds[s]="ba6f5f2e-76f5-4606-9f3c-20a687ec7e89",a._sentryDebugIdIdentifier="sentry-dbid-ba6f5f2e-76f5-4606-9f3c-20a687ec7e89")}catch{}})();function y(a,s=3,n,r="due"){return a!==null&&a<=0?r:_(a,s,n)}function _(a,s=3,n){return I(a,{fallback:s===3?h:J,direction:n})}function G(a){return a!==null&&a>b?[a%b,Math.floor(a/b)]:[a,0]}const ae="_label_1k32k_18",se="_clock_1k32k_23",ne="_column_1k32k_35",le="_over_1k32k_50",re="_under_1k32k_56",u={label:ae,clock:se,column:ne,over:le,under:re};function S({label:a,value:s,state:n="active",className:r,testId:i}){return e.jsxs("div",{className:d([u.column,r]),"data-state":n,children:[e.jsx("span",{className:u.label,children:a}),e.jsx("span",{className:u.clock,"data-testid":i,children:s})]})}function ce({state:a,value:s,testId:n}){return e.jsxs("div",{className:u.column,"data-state":a,children:[e.jsxs("div",{className:u.label,children:[e.jsx("span",{className:u.over,children:"Over"}),e.jsx("span",{children:"/"}),e.jsx("span",{className:u.under,children:"Under"})]}),e.jsx("span",{className:u.clock,"data-testid":n,children:s})]})}const ie="_column_1x7b2_17",de="_row_1x7b2_26",oe="_metadataRow_1x7b2_33",me="_labelledElement_1x7b2_40",ue="_icon_1x7b2_46",xe="_label_1x7b2_40",pe="_time_1x7b2_57",be="_daySpan_1x7b2_64",fe="_muted_1x7b2_72",je="_labelTitle_1x7b2_76",Te="_dueTime_1x7b2_85",t={column:ie,row:de,metadataRow:oe,labelledElement:me,icon:ue,label:xe,time:pe,daySpan:be,muted:fe,labelTitle:je,dueTime:Te};function Se(){const{plannedEnd:a,plannedStart:s,actualStart:n,expectedEnd:r}=W(),i=s===null?h:w(s),[m,x]=D.useMemo(()=>G(a),[a]),[l,c]=D.useMemo(()=>G(r),[r]),p=m===null?h:w(m);return e.jsxs("div",{className:t.column,children:[e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"Start"}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(o,{text:"Planned start time",render:e.jsx(P,{className:t.icon})}),e.jsx("span",{className:d([t.time,s===null&&t.muted]),children:i})]}),e.jsxs("div",{className:t.labelledElement,"data-testid":"actual-start-time",children:[e.jsx(o,{text:"Actual start time",render:e.jsx($,{className:t.icon})}),e.jsx("span",{className:d([t.time,n===null&&t.muted]),children:_(n)})]})]}),e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"End"}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(o,{text:"Planned end time",render:e.jsx(P,{className:t.icon})}),x>0?e.jsx(o,{text:`Rundown spans over ${x+1} days`,render:e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":x}),children:p}):e.jsx("span",{className:d([t.time,a===null&&t.muted]),children:p})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(o,{text:"Expected end time",render:e.jsx(M,{className:t.icon})}),l!==null&&c>0?e.jsx(o,{text:`Rundown spans over ${c+1} days`,render:e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":c}),children:_(l)}):e.jsx("span",{className:d([t.time,l===null&&t.muted]),children:_(l)})]})]})]})}function ke(){return e.jsxs("div",{className:t.column,children:[e.jsx(ve,{}),e.jsx(_e,{})]})}function ve(){const{clock:a,mode:s,groupExpectedEnd:n,actualGroupStart:r,currentDay:i,playback:m}=Q(),{currentGroupId:x}=X(),l=R(x),c=E(m),p=(()=>{if(!c||!l||l.timeStart===null)return null;const j=a+i*b;return s===F.Absolute?l.timeStart+l.duration-j:r+l.duration-j})(),T=y(p,3,N.CountDown),v=n!==null?n-a:null,f=y(v,3,N.CountDown);return e.jsxs("div",{className:t.metadataRow,children:[e.jsx("span",{className:l!=null&&l.title?t.labelTitle:t.label,children:`${(l==null?void 0:l.title)||"Group"} `}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(o,{text:"Time to planned group end",render:e.jsx(U,{className:t.icon})}),e.jsx("span",{className:d([t.time,(!l||!c)&&t.muted,T==="due"&&t.dueTime]),children:T})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(o,{text:"Time to expected group end",render:e.jsx(A,{className:t.icon})}),e.jsx("span",{className:d([t.time,!n&&t.muted,f==="due"&&t.dueTime]),children:f})]})]})}function _e(){const{clock:a,mode:s,actualStart:n,plannedStart:r,playback:i,currentDay:m}=Y(),{id:x,expectedStart:l}=Z(),c=R(x),p=E(i),T=(()=>{if(!p||!c)return null;const O=c.timeStart+c.dayOffset*b,C=a+m*b;return s===F.Absolute?O-C:O+n-r-C})(),v=y(T,3,N.CountDown),f=l!==null?l-a:null,j=y(f,3,N.CountDown),k=(c==null?void 0:c.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(o,{text:"Time to next flag planned start",render:e.jsx(z,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-plannedStart",className:d([t.time,(!c||!p)&&t.muted,v==="due"&&t.dueTime]),children:v})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(o,{text:"Time to next flag expected start",render:e.jsx(V,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-expectedStart",className:d([t.time,f===null&&t.muted,j==="due"&&t.dueTime]),children:j})]})]})}function Oe(){const{numEvents:a,selectedEventIndex:s}=q(),n=s!==null?s+1:g,r=a?`${n} of ${a||g}`:g;return e.jsx(S,{label:"Progress",value:r,state:s===null?"muted":"active"})}function Ce(){const{offset:a,playback:s}=B(),n=E(s),r=te(n?a:null),i=ee(n?a:null);return e.jsx(ce,{state:r,value:i,testId:"offset"})}function De({className:a}){const{clock:s}=H(),n=w(s);return e.jsx(S,{label:"Time now",value:n,className:a})}function Pe({className:a}){const s=K(),n=s.phase===L.Pending,r=n?"Count to start":"Running timer",i=I(n?s.secondaryTimer:s.current,{fallback:h}),m=n?"waiting":s.current===null?"muted":"active";return e.jsx(S,{label:r,value:i,state:m,className:a})}export{De as C,ke as M,Ce as O,Oe as P,Se as S,Pe as T,_ as f};
2
+ //# sourceMappingURL=TimeElements-CALNfv6u.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimeElements-rlwX9Mgy.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 { 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 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 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 { calculateEndAndDaySpan, formatDueTime, formattedTime } from '../overview.utils';\n\nimport { OverUnder, TimeColumn } from './TimeLayout';\n\nimport style from './TimeElements.module.scss';\n\nexport function StartTimes() {\n const { plannedEnd, plannedStart, actualStart, expectedEnd } = useStartTimesOverview();\n\n const plannedStartText = plannedStart === null ? timerPlaceholder : formatTime(plannedStart);\n\n const [maybePlannedEnd, maybePlannedDaySpan] = useMemo(() => calculateEndAndDaySpan(plannedEnd), [plannedEnd]);\n const [maybeExpectedEnd, maybeExpectedDaySpan] = useMemo(() => calculateEndAndDaySpan(expectedEnd), [expectedEnd]);\n const plannedEndText = maybePlannedEnd === null ? timerPlaceholder : formatTime(maybePlannedEnd);\n\n return (\n <div className={style.column}>\n <div className={style.row}>\n <span className={style.label}>Start</span>\n <div className={style.labelledElement}>\n <Tooltip text='Planned start time' render={<TbCalendarPin className={style.icon} />} />\n <span className={cx([style.time, plannedStart === null && style.muted])}>{plannedStartText}</span>\n </div>\n <div className={style.labelledElement} data-testid='actual-start-time'>\n <Tooltip text='Actual start time' render={<TbCalendarClock className={style.icon} />} />\n <span className={cx([style.time, actualStart === null && style.muted])}>{formattedTime(actualStart)}</span>\n </div>\n </div>\n <div className={style.row}>\n <span className={style.label}>End</span>\n <div className={style.labelledElement}>\n <Tooltip text='Planned end time' render={<TbCalendarPin className={style.icon} />} />\n {maybePlannedDaySpan > 0 ? (\n <Tooltip\n text={`Rundown spans over ${maybePlannedDaySpan + 1} days`}\n render={<span className={cx([style.time, style.daySpan])} data-day-offset={maybePlannedDaySpan} />}\n >\n {plannedEndText}\n </Tooltip>\n ) : (\n <span className={cx([style.time, plannedEnd === null && style.muted])}>{plannedEndText}</span>\n )}\n </div>\n <div className={style.labelledElement}>\n <Tooltip text='Expected end time' render={<TbCalendarStar className={style.icon} />} />\n {maybeExpectedEnd !== null && maybeExpectedDaySpan > 0 ? (\n <Tooltip\n text={`Rundown spans over ${maybeExpectedDaySpan + 1} days`}\n render={<span className={cx([style.time, style.daySpan])} data-day-offset={maybeExpectedDaySpan} />}\n >\n {formattedTime(maybeExpectedEnd)}\n </Tooltip>\n ) : (\n <span className={cx([style.time, maybeExpectedEnd === null && style.muted])}>\n {formattedTime(maybeExpectedEnd)}\n </span>\n )}\n </div>\n </div>\n </div>\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({ className }: { className?: string }) {\n const { clock } = useClock();\n const formattedClock = formatTime(clock);\n\n return <TimeColumn label='Time now' value={formattedClock} className={className} />;\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","timerPlaceholder","timerPlaceholderMin","calculateEndAndDaySpan","end","dayInMs","TimeColumn","label","value","state","className","testId","jsxs","cx","style","jsx","OverUnder","StartTimes","plannedEnd","plannedStart","actualStart","expectedEnd","useStartTimesOverview","plannedStartText","formatTime","maybePlannedEnd","maybePlannedDaySpan","useMemo","maybeExpectedEnd","maybeExpectedDaySpan","plannedEndText","Tooltip","TbCalendarPin","TbCalendarClock","TbCalendarStar","MetadataTimes","GroupTimes","FlagTimes","clock","mode","groupExpectedEnd","actualGroupStart","currentDay","playback","useGroupTimerOverView","currentGroupId","useCurrentGroupId","group","useEntry","active","isPlaybackActive","plannedGroupEnd","normalizedClock","OffsetMode","plannedTimeUntilGroupEnd","TimerType","expectedGroupEnd","expectedTimeUntilGroupEnd","TbFolderPin","TbFolderStar","useFlagTimerOverView","id","expectedStart","useNextFlag","entry","plannedFlagStart","normalizedTimeStart","plannedTimeUntilDisplay","expectedTimeUntil","expectedTimeUntilDisplay","title","TbFlagPin","TbFlagStar","ProgressOverview","numEvents","selectedEventIndex","useProgressOverview","current","enDash","progressText","OffsetOverview","offset","useOffsetOverview","isPlaying","offsetState","getOffsetState","offsetText","getOffsetText","ClockOverview","useClock","formattedClock","TimerOverview","timer","useTimer","isWaiting","TimerPhase","display","timerState"],"mappings":"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"}
1
+ {"version":3,"file":"TimeElements-CALNfv6u.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 { 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 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 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 { calculateEndAndDaySpan, formatDueTime, formattedTime } from '../overview.utils';\n\nimport { OverUnder, TimeColumn } from './TimeLayout';\n\nimport style from './TimeElements.module.scss';\n\nexport function StartTimes() {\n const { plannedEnd, plannedStart, actualStart, expectedEnd } = useStartTimesOverview();\n\n const plannedStartText = plannedStart === null ? timerPlaceholder : formatTime(plannedStart);\n\n const [maybePlannedEnd, maybePlannedDaySpan] = useMemo(() => calculateEndAndDaySpan(plannedEnd), [plannedEnd]);\n const [maybeExpectedEnd, maybeExpectedDaySpan] = useMemo(() => calculateEndAndDaySpan(expectedEnd), [expectedEnd]);\n const plannedEndText = maybePlannedEnd === null ? timerPlaceholder : formatTime(maybePlannedEnd);\n\n return (\n <div className={style.column}>\n <div className={style.row}>\n <span className={style.label}>Start</span>\n <div className={style.labelledElement}>\n <Tooltip text='Planned start time' render={<TbCalendarPin className={style.icon} />} />\n <span className={cx([style.time, plannedStart === null && style.muted])}>{plannedStartText}</span>\n </div>\n <div className={style.labelledElement} data-testid='actual-start-time'>\n <Tooltip text='Actual start time' render={<TbCalendarClock className={style.icon} />} />\n <span className={cx([style.time, actualStart === null && style.muted])}>{formattedTime(actualStart)}</span>\n </div>\n </div>\n <div className={style.row}>\n <span className={style.label}>End</span>\n <div className={style.labelledElement}>\n <Tooltip text='Planned end time' render={<TbCalendarPin className={style.icon} />} />\n {maybePlannedDaySpan > 0 ? (\n <Tooltip\n text={`Rundown spans over ${maybePlannedDaySpan + 1} days`}\n render={<span className={cx([style.time, style.daySpan])} data-day-offset={maybePlannedDaySpan} />}\n >\n {plannedEndText}\n </Tooltip>\n ) : (\n <span className={cx([style.time, plannedEnd === null && style.muted])}>{plannedEndText}</span>\n )}\n </div>\n <div className={style.labelledElement}>\n <Tooltip text='Expected end time' render={<TbCalendarStar className={style.icon} />} />\n {maybeExpectedEnd !== null && maybeExpectedDaySpan > 0 ? (\n <Tooltip\n text={`Rundown spans over ${maybeExpectedDaySpan + 1} days`}\n render={<span className={cx([style.time, style.daySpan])} data-day-offset={maybeExpectedDaySpan} />}\n >\n {formattedTime(maybeExpectedEnd)}\n </Tooltip>\n ) : (\n <span className={cx([style.time, maybeExpectedEnd === null && style.muted])}>\n {formattedTime(maybeExpectedEnd)}\n </span>\n )}\n </div>\n </div>\n </div>\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({ className }: { className?: string }) {\n const { clock } = useClock();\n const formattedClock = formatTime(clock);\n\n return <TimeColumn label='Time now' value={formattedClock} className={className} />;\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","timerPlaceholder","timerPlaceholderMin","calculateEndAndDaySpan","end","dayInMs","TimeColumn","label","value","state","className","testId","jsxs","cx","style","jsx","OverUnder","StartTimes","plannedEnd","plannedStart","actualStart","expectedEnd","useStartTimesOverview","plannedStartText","formatTime","maybePlannedEnd","maybePlannedDaySpan","useMemo","maybeExpectedEnd","maybeExpectedDaySpan","plannedEndText","Tooltip","TbCalendarPin","TbCalendarClock","TbCalendarStar","MetadataTimes","GroupTimes","FlagTimes","clock","mode","groupExpectedEnd","actualGroupStart","currentDay","playback","useGroupTimerOverView","currentGroupId","useCurrentGroupId","group","useEntry","active","isPlaybackActive","plannedGroupEnd","normalizedClock","OffsetMode","plannedTimeUntilGroupEnd","TimerType","expectedGroupEnd","expectedTimeUntilGroupEnd","TbFolderPin","TbFolderStar","useFlagTimerOverView","id","expectedStart","useNextFlag","entry","plannedFlagStart","normalizedTimeStart","plannedTimeUntilDisplay","expectedTimeUntil","expectedTimeUntilDisplay","title","TbFlagPin","TbFlagStar","ProgressOverview","numEvents","selectedEventIndex","useProgressOverview","current","enDash","progressText","OffsetOverview","offset","useOffsetOverview","isPlaying","offsetState","getOffsetState","offsetText","getOffsetText","ClockOverview","useClock","formattedClock","TimerOverview","timer","useTimer","isWaiting","TimerPhase","display","timerState"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{v as D,j as y,h as t}from"./vendor-Cnciq4o_.js";import{y as E,af as T,i as N}from"./index-DdPXqLQ6.js";import{p as j}from"./parseUserTime-DNXIMX9s.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]="9eebc2bb-beb6-4d32-9344-4a0efa77cd31",s._sentryDebugIdIdentifier="sentry-dbid-9eebc2bb-beb6-4d32-9344-4a0efa77cd31")}catch{}})();const A="_link_1myua_17",R={link:A};function L({search:s,children:n}){const r=D(),a=()=>r({search:s});return y.jsx("button",{onClick:a,className:R.link,children:n})}const S="_timeInput_1u25s_17",w="_delayed_1u25s_23",p={timeInput:S,delayed:w};function M({id:s,name:n,submitHandler:r,time:a,placeholder:g,disabled:k,align:I="center",delayed:_,className:h}){const l=t.useRef(null),[m,o]=t.useState(""),i=t.useRef(!1),u=t.useCallback(()=>{typeof a!="number"||isNaN(a)?o("00:00:00"):o(E(a))},[a]),C=t.useCallback(()=>{var e;(e=l.current)==null||e.select()},[]),f=t.useCallback(e=>e===""?!1:e.startsWith("p")||e.startsWith("+")?(r(n,e),!0):j(e)===a?!1:(r(n,e),!0),[n,r,a]),d=t.useCallback(e=>{f(e)||u()},[f,u]),v=t.useCallback(e=>{var c,b;e.key==="Enter"&&((c=l.current)==null||c.blur()),e.key==="Escape"&&(i.current=!0,(b=l.current)==null||b.blur(),u())},[u]),x=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([p.timeInput,_&&p.delayed,h]),placeholder:g,onFocus:C,onChange:e=>o(e.target.value),onBlur:x,onKeyDown:v,value:m,maxLength:8,style:{textAlign:I}})}export{L as A,M as T,p as s};
2
- //# sourceMappingURL=TimeInput-C0_Nl63x.js.map
1
+ import{v as D,j as y,h as t}from"./vendor-CCiSQ9k9.js";import{y as E,af as T,i as N}from"./index-BQEUaoAf.js";import{p as j}from"./parseUserTime-BeTKj08M.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]="9eebc2bb-beb6-4d32-9344-4a0efa77cd31",s._sentryDebugIdIdentifier="sentry-dbid-9eebc2bb-beb6-4d32-9344-4a0efa77cd31")}catch{}})();const A="_link_1myua_17",R={link:A};function L({search:s,children:n}){const r=D(),a=()=>r({search:s});return y.jsx("button",{onClick:a,className:R.link,children:n})}const S="_timeInput_1u25s_17",w="_delayed_1u25s_23",p={timeInput:S,delayed:w};function M({id:s,name:n,submitHandler:r,time:a,placeholder:g,disabled:k,align:I="center",delayed:_,className:h}){const l=t.useRef(null),[m,o]=t.useState(""),i=t.useRef(!1),u=t.useCallback(()=>{typeof a!="number"||isNaN(a)?o("00:00:00"):o(E(a))},[a]),C=t.useCallback(()=>{var e;(e=l.current)==null||e.select()},[]),f=t.useCallback(e=>e===""?!1:e.startsWith("p")||e.startsWith("+")?(r(n,e),!0):j(e)===a?!1:(r(n,e),!0),[n,r,a]),d=t.useCallback(e=>{f(e)||u()},[f,u]),v=t.useCallback(e=>{var c,b;e.key==="Enter"&&((c=l.current)==null||c.blur()),e.key==="Escape"&&(i.current=!0,(b=l.current)==null||b.blur(),u())},[u]),x=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([p.timeInput,_&&p.delayed,h]),placeholder:g,onFocus:C,onChange:e=>o(e.target.value),onBlur:x,onKeyDown:v,value:m,maxLength:8,style:{textAlign:I}})}export{L as A,M as T,p as s};
2
+ //# sourceMappingURL=TimeInput-Dg1naiy3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput-C0_Nl63x.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-Dg1naiy3.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"}
@@ -0,0 +1,2 @@
1
+ import{h as p,l as U,j as i,y as W}from"./vendor-CCiSQ9k9.js";import{r as w,P as q,H as E,l as N,M as C,g as O,I as F,i as b,J as G,q as $,f as B,v as M,d as J,L as Q,o as K,h as X,O as Y,s as Z}from"./index-BQEUaoAf.js";import{E as tt}from"./EmptyPage-Dcbg6rmF.js";import{V as et}from"./ViewLogo-_3Z1hIHi.js";import{O as I,i as H,V as st}from"./ViewParamsEditor-Bca1TIDW.js";import{u as nt}from"./useWindowTitle-DqdFTWns.js";import{S as it}from"./SuperscriptTime-CIrcMcyg.js";import{i as j,a as v,d as ot,u as at}from"./useRundown-BfpjcCEJ.js";import{g as rt,a as lt}from"./viewLoader.utils-CmM-4-pk.js";import{g as ct,a as z,b as ut,c as mt}from"./rundownUtils-BZHazkXR.js";import{g as dt}from"./getProgress-Cw79NL_O.js";import{u as ft}from"./useProjectData-C1hVamxc.js";import"./Empty-gWT_HMeu.js";import"./Select-CedN80WS.js";(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]="dfaa0d47-8699-4c7a-a83a-9e2e9fabfe7e",e._sentryDebugIdIdentifier="sentry-dbid-dfaa0d47-8699-4c7a-a83a-9e2e9fabfe7e")}catch{}})();function ht(e,t){if(!t)return 0;const s=e.timeStart+e.dayOffset*w,n=t.timeStart+t.duration+t.dayOffset*w;return s===n?0:(s>n,s-n)}function D(e,t,s){if(!t.current)return;if(!(e!=null&&e.current)){t.current.scrollTo({left:0,behavior:"smooth"});return}const n=e.current.getBoundingClientRect(),a=t.current.getBoundingClientRect(),o=n.left-a.left+t.current.scrollLeft-s;t.current.scrollTo({left:o,behavior:"smooth"})}function pt({followRef:e,scrollRef:t,doFollow:s,selectedEventId:n,leftOffset:a=0,setScrollFlag:o}){return p.useEffect(()=>{!s||!t.current||(o==null||o(!0),window.requestAnimationFrame(()=>{D(n!==null?e:null,t,a),o==null||o(!1)}))},[e,t,s,a,o,n]),p.useCallback((u=e,m=t,c=a)=>{m.current&&D(n!==null?u:null,m,c)},[e,t,a,n])}const xt=e=>[{title:I.ClockOptions,collapsible:!0,options:[rt(e)]},{title:I.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"autosize",title:"Autosize timeline",description:"Timeline will adjust sizes to help with readability and automatically scroll if necessary",type:"boolean",defaultValue:!1}]}];function gt(e,t){const s=n=>(t==null?void 0:t.get(n))??e.get(n);return{hidePast:H(s("hidePast")),autosize:H(s("autosize"))}}function R(){const[e]=U(),t=p.use(q);return p.useMemo(()=>{const n=t?new URLSearchParams(t.search):void 0;return gt(e,n)},[t,e])}function _t(e,t,s,n,a){const r=(t<e?t+w:t)-e,u=n*a/r;return{left:(s-e)*a/r,width:u}}function yt(e){return Math.floor(e/E)}function bt(e){return Math.ceil(e/E)}function Tt(e,t){const s=[];for(let n=e;n<t;n++)s.push(n);return s}function jt(e,t){return t==="done"||t==="live"?t:e<=0?"pending":N(e,e>C*2)}function wt(e,t){const{hidePast:s}=R();return p.useMemo(()=>{if(e.length===0)return{scopedRundown:[],firstStart:0,totalDuration:0};const a=[];let o=t?1/0:-1,r=null,u=0,m=null;for(let c=0;c<e.length;c++){const l=e[c];if(j(l)&&v(l)){if(l.id===t&&(o=c),s&&c<o)continue;a.push(l),r===null&&(r=l.timeStart);const d=ht(l,m);d===0?u+=l.duration:d>0?u+=d+l.duration:d<0&&(u+=Math.max(l.duration+d,0)),ot(l,m)&&(m=l)}}return{scopedRundown:a,firstStart:r??0,totalDuration:u}},[s,e,t])}function St(e,t){var o,r;if(e.length===0)return{now:null,next:null,followedBy:null};let s=t?ct(e,t):null;j(s)||(s=null);const n=s?(o=z(e,s.id))==null?void 0:o.nextEvent:ut(e).firstEvent,a=n?(r=z(e,n.id))==null?void 0:r.nextEvent:null;return{now:s,next:n,followedBy:a}}function vt(e,t,s,n,a,o=100){let r=1/0;const u=e.map(({start:l,duration:d})=>{const g=_t(t,s,l,d,n);return r=Math.min(r,g.width),g});if(!a)return{positions:u,scale:1,totalWidth:n};const m=r<o?o/r:1;return m===1?{positions:u,scale:1,totalWidth:n}:{positions:u.map(l=>({left:l.left*m,width:l.width*m})),scale:m,totalWidth:n*m}}const Et="_markers_gfywu_17",Nt={markers:Et};function Pt(e){const{startHour:t,endHour:s}=e,n=Tt(t,s);return i.jsx("div",{className:Nt.markers,children:n.map(a=>i.jsx("span",{},a))})}const Lt="_timelineContainer_4bums_21",kt="_scroll_4bums_26",Ct="_timeline_4bums_21",Ot="_column_4bums_37",Mt="_maybeInline_4bums_45",Bt="_timelineBlock_4bums_52",It="_smallArea_4bums_64",Ht="_content_4bums_64",zt="_timeOverview_4bums_68",Dt="_hide_4bums_72",At="_status_4bums_98",Vt="_delay_4bums_105",$t="_cross_4bums_115",Rt="_separeLeft_4bums_121",h={timelineContainer:Lt,scroll:kt,timeline:Ct,column:Ot,maybeInline:Mt,timelineBlock:Bt,smallArea:It,content:Ht,timeOverview:zt,hide:Dt,status:At,delay:Vt,cross:$t,separeLeft:Rt},A={format12:"hh:mm a",format24:"HH:mm"};function Ut({colour:e,delay:t,duration:s,hasLink:n,left:a,status:o,start:r,dayOffset:u,totalGap:m,isLinkedToLoaded:c,title:l,width:d,cue:g,ref:S}){const P=O(r,A),L=N(s),y=r+t,T=t>0,f=F(e,.7),x=d>25,_=d<40;return i.jsxs("div",{ref:S,className:b([h.column,_&&h.smallArea]),style:{"--color":e,"--lighter":f??"",left:`${a}px`,width:`${d}px`},"data-testid":g,children:[o==="live"?i.jsx(Wt,{}):i.jsx("div",{"data-status":o,className:h.timelineBlock}),i.jsxs("div",{className:b([h.content,d<20&&h.hide,!n&&h.separeLeft]),"data-status":o,style:{"--color":e},children:[i.jsxs("div",{className:h.maybeInline,children:[i.jsx("div",{className:b([T&&h.cross]),children:P}),T&&i.jsx("div",{className:h.delay,children:O(y,A)}),_&&i.jsx(V,{delay:t,start:r,dayOffset:u,totalGap:m,isLinkedToLoaded:c,status:o})]}),x&&i.jsxs(i.Fragment,{children:[!_&&i.jsx(V,{delay:t,start:r,dayOffset:u,totalGap:m,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 V({delay:e,start:t,dayOffset:s,totalGap:n,isLinkedToLoaded:a,status:o}){const r=$(),{getLocalizedString:u}=B(),{timeToStart:m}=M({timeStart:t,delay:e,dayOffset:s,totalGap:n,isLinkedToLoaded:a,countToEnd:!1,duration:0},r);let c=jt(m,o);return c==="live"?c=u("timeline.live"):c==="pending"&&(c=u("timeline.due")),i.jsx("div",{className:h.status,children:c})}function Wt(){const{current:e,duration:t}=G(),s=dt(e,t);return i.jsx("div",{"data-status":"live",className:h.timelineBlock,style:{"--progress":`${s}%`}})}const qt=p.memo(Ft);function Ft({firstStart:e,rundown:t,selectedEventId:s,totalDuration:n}){const{width:a}=W(),{hidePast:o,autosize:r}=R(),u=p.useRef(null),m=p.useRef(null),{lastEvent:c}=mt(t),l=yt(e),d=bt(e+n+((c==null?void 0:c.delay)??0)),g=l*E,S=d*E;pt({followRef:u,scrollRef:m,doFollow:r,selectedEventId:s,leftOffset:o?0:a/6});const{positions:P,totalWidth:L}=p.useMemo(()=>{const f=t.filter(x=>j(x)&&v(x)).map(x=>({start:x.timeStart+(x.dayOffset??0)*w+(x.delay??0),duration:x.duration}));return vt(f,g,S,a,r)},[t,g,S,a,r]);if(n===0)return null;let y=s?"done":"future";const T={};return t.forEach(f=>{j(f)&&v(f)&&(y==="live"&&(y="future"),f.id===s&&(y="live"),T[f.id]=y)}),i.jsx("div",{ref:m,className:b([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(!j(f)||!v(f))return null;const _=P[x];return _?i.jsx(Ut,{ref:f.id===s?u:void 0,colour:f.colour,delay:f.delay??0,duration:f.duration,hasLink:!!f.linkStart,left:_.left,status:T[f.id],start:f.timeStart+(f.dayOffset??0)*w,totalGap:f.totalGap,isLinkedToLoaded:f.isLinkedToLoaded,dayOffset:f.dayOffset,title:f.title,cue:f.cue,width:_.width},f.id):null})]})})}const k=p.memo(Gt);function Gt({category:e,content:t,title:s,status:n}){const a=b(["section",e==="now"&&"section--now"]),o=b(["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:s}),n&&i.jsx("span",{className:"section-title__status",children:n})]}),i.jsx("div",{className:o,children:t??"-"})]})}function Jt({now:e,next:t,followedBy:s}){const{getLocalizedString:n}=B(),a=$(),o=(e==null?void 0:e.title)??"-",r=n("timeline.due").toUpperCase(),u=t!==null?t.title:"-",m=s!==null?s.title:"-";let c,l;if(t!==null){const{timeToStart:d}=M(t,a);d<=0?c=r:c=N(d,d>C*2)}if(s!==null){const{timeToStart:d}=M(s,a);d<=0?l=r:l=N(d,d>C*2)}return i.jsxs("div",{className:"title-grid",children:[i.jsx(k,{title:n("timeline.live"),content:o,category:"now"}),i.jsx(k,{title:n("common.next"),status:c,content:u,category:"next"}),i.jsx(k,{title:n("timeline.followedby"),status:l,content:m,category:"followedBy"})]})}function Qt(){const{data:e,status:t}=at(),{data:s,status:n}=ft(),{data:a,status:o}=J();return{data:{events:e,projectData:s,settings:a},status:lt([t,n,o])}}function de(){const{data:e,status:t}=Qt();return nt("Timeline"),t==="pending"?i.jsx(Q,{}):t==="error"?i.jsx(tt,{text:"There was an error fetching data, please refresh the page."}):i.jsx(Kt,{...e})}function Kt({events:e,projectData:t,settings:s}){const{selectedEventId:n}=K(),{scopedRundown:a,firstStart:o,totalDuration:r}=wt(e,n),{now:u,next:m,followedBy:c}=p.useMemo(()=>St(a,n),[a,n]),l=X(s==null?void 0:s.timeFormat),d=p.useMemo(()=>xt(l),[l]);return i.jsxs("div",{className:"timeline","data-testid":"timeline-view",children:[i.jsx(st,{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(Xt,{})]}),i.jsx(Jt,{now:u,next:m,followedBy:c}),i.jsx(qt,{firstStart:o,rundown:a,selectedEventId:n,totalDuration:r})]})}function Xt(){const{getLocalizedString:e}=B(),{clock:t}=Z(),s=O(t);return i.jsxs("div",{className:"clock-container",children:[i.jsx("div",{className:"label",children:e("common.time_now")}),i.jsx(it,{time:s,className:"time"})]})}export{de as default};
2
+ //# sourceMappingURL=TimelinePage-Cwm0svjN.js.map