@getontime/cli 4.1.0 → 4.2.1
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.
- package/client/assets/Backstage-WSlbFC9X.js +2 -0
- package/client/assets/Backstage-WSlbFC9X.js.br +0 -0
- package/client/assets/Backstage-WSlbFC9X.js.gz +0 -0
- package/client/assets/Backstage-WSlbFC9X.js.map +1 -0
- package/client/assets/Countdown-B32qlxYT.js +2 -0
- package/client/assets/Countdown-B32qlxYT.js.br +0 -0
- package/client/assets/Countdown-B32qlxYT.js.gz +0 -0
- package/client/assets/Countdown-B32qlxYT.js.map +1 -0
- package/client/assets/CustomTranslationModal-CtBvokyt.js +2 -0
- package/client/assets/CustomTranslationModal-CtBvokyt.js.br +0 -0
- package/client/assets/CustomTranslationModal-CtBvokyt.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-BBNxpds0.js.map → CustomTranslationModal-CtBvokyt.js.map} +1 -1
- package/client/assets/DelayIndicator-BFZFpsY5.js +2 -0
- package/client/assets/DelayIndicator-BFZFpsY5.js.br +0 -0
- package/client/assets/DelayIndicator-BFZFpsY5.js.gz +0 -0
- package/client/assets/{DelayIndicator-CFCDQ7FN.js.map → DelayIndicator-BFZFpsY5.js.map} +1 -1
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js +2 -0
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-D55c8JBz.js.map → EditorFeatureWrapper-DaMxgBMP.js.map} +1 -1
- package/client/assets/EditorUtils-CgF7UfHP.css +1 -0
- package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
- package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js +2 -0
- package/client/assets/EditorUtils-DoaSwWiz.js.br +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js.gz +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js.map +1 -0
- package/client/assets/Empty-D1UteOYj.js +2 -0
- package/client/assets/Empty-D1UteOYj.js.br +0 -0
- package/client/assets/Empty-D1UteOYj.js.gz +0 -0
- package/client/assets/{Empty-C-JO_XAr.js.map → Empty-D1UteOYj.js.map} +1 -1
- package/client/assets/EmptyPage-DeRjpRKZ.js +2 -0
- package/client/assets/EmptyPage-DeRjpRKZ.js.br +0 -0
- package/client/assets/EmptyPage-DeRjpRKZ.js.gz +0 -0
- package/client/assets/{EmptyPage-BSzsxpGg.js.map → EmptyPage-DeRjpRKZ.js.map} +1 -1
- package/client/assets/FollowButton-FodezDem.js +2 -0
- package/client/assets/FollowButton-FodezDem.js.br +0 -0
- package/client/assets/FollowButton-FodezDem.js.gz +0 -0
- package/client/assets/{FollowButton-Mox6N4JW.js.map → FollowButton-FodezDem.js.map} +1 -1
- package/client/assets/MessageControlExport-CFGgiwk_.js +3 -0
- package/client/assets/MessageControlExport-CFGgiwk_.js.br +0 -0
- package/client/assets/MessageControlExport-CFGgiwk_.js.gz +0 -0
- package/client/assets/MessageControlExport-CFGgiwk_.js.map +1 -0
- package/client/assets/MessageControlExport-DjoUioWA.css +1 -0
- package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
- package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js +2 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js.br +0 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js.gz +0 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js.map +1 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css +1 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css.br +0 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css.gz +0 -0
- package/client/assets/Modal-B8ZZbVMg.js +2 -0
- package/client/assets/Modal-B8ZZbVMg.js.br +0 -0
- package/client/assets/Modal-B8ZZbVMg.js.gz +0 -0
- package/client/assets/{Modal-krcwDRb-.js.map → Modal-B8ZZbVMg.js.map} +1 -1
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js +2 -0
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-BXQbpM-j.js.map → MultiPartProgressBar-BKHk19Hb.js.map} +1 -1
- package/client/assets/OperatorExport-BiBcgVKc.css +1 -0
- package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
- package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
- package/client/assets/OperatorExport-DQM14DsN.js +2 -0
- package/client/assets/OperatorExport-DQM14DsN.js.br +0 -0
- package/client/assets/OperatorExport-DQM14DsN.js.gz +0 -0
- package/client/assets/OperatorExport-DQM14DsN.js.map +1 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css +1 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css.br +0 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css.gz +0 -0
- package/client/assets/{OverviewWrapper-MGJ1uE5W.js → OverviewWrapper-D1hUkrRi.js} +2 -2
- package/client/assets/OverviewWrapper-D1hUkrRi.js.br +0 -0
- package/client/assets/OverviewWrapper-D1hUkrRi.js.gz +0 -0
- package/client/assets/{OverviewWrapper-MGJ1uE5W.js.map → OverviewWrapper-D1hUkrRi.js.map} +1 -1
- package/client/assets/PipHost-B9-cZ8Lm.js +2 -0
- package/client/assets/PipHost-B9-cZ8Lm.js.br +0 -0
- package/client/assets/PipHost-B9-cZ8Lm.js.gz +0 -0
- package/client/assets/PipHost-B9-cZ8Lm.js.map +1 -0
- package/client/assets/PipHost-DEhjTbGT.css +1 -0
- package/client/assets/PipHost-DEhjTbGT.css.br +0 -0
- package/client/assets/PipHost-DEhjTbGT.css.gz +0 -0
- package/client/assets/ProjectInfo-Dp1TZyBd.js +2 -0
- package/client/assets/ProjectInfo-Dp1TZyBd.js.br +0 -0
- package/client/assets/ProjectInfo-Dp1TZyBd.js.gz +0 -0
- package/client/assets/{ProjectInfo-CJ-GLvVG.js.map → ProjectInfo-Dp1TZyBd.js.map} +1 -1
- package/client/assets/ProtectRoute-EejQ5o_H.js +2 -0
- package/client/assets/ProtectRoute-EejQ5o_H.js.br +0 -0
- package/client/assets/ProtectRoute-EejQ5o_H.js.gz +0 -0
- package/client/assets/{ProtectRoute-DJ9xZnPI.js.map → ProtectRoute-EejQ5o_H.js.map} +1 -1
- package/client/assets/{ProtectedCuesheet-CMTscjjR.css → ProtectedCuesheet-C_tKodwo.css} +1 -1
- package/client/assets/ProtectedCuesheet-C_tKodwo.css.br +0 -0
- package/client/assets/ProtectedCuesheet-C_tKodwo.css.gz +0 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js +2 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js.br +0 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js.map +1 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js +3 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js.br +0 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js.gz +0 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js.map +1 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css +1 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css.gz +0 -0
- package/client/assets/RundownEntry-Blq5OsMH.css +1 -0
- package/client/assets/RundownEntry-Blq5OsMH.css.br +0 -0
- package/client/assets/RundownEntry-Blq5OsMH.css.gz +0 -0
- package/client/assets/RundownEntry-CwiStTnR.js +2 -0
- package/client/assets/RundownEntry-CwiStTnR.js.br +0 -0
- package/client/assets/RundownEntry-CwiStTnR.js.gz +0 -0
- package/client/assets/RundownEntry-CwiStTnR.js.map +1 -0
- package/client/assets/RundownExport-CCaOfHIr.js +3 -0
- package/client/assets/RundownExport-CCaOfHIr.js.br +0 -0
- package/client/assets/RundownExport-CCaOfHIr.js.gz +0 -0
- package/client/assets/RundownExport-CCaOfHIr.js.map +1 -0
- package/client/assets/{RundownExport-1zBZurIG.css → RundownExport-DtSvAfBG.css} +1 -1
- package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
- package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
- package/client/assets/{Select-BLA-yQMq.js → Select-cHK8JrMG.js} +2 -2
- package/client/assets/Select-cHK8JrMG.js.br +0 -0
- package/client/assets/Select-cHK8JrMG.js.gz +0 -0
- package/client/assets/{Select-BLA-yQMq.js.map → Select-cHK8JrMG.js.map} +1 -1
- package/client/assets/Studio-BzwFDYzk.js +2 -0
- package/client/assets/Studio-BzwFDYzk.js.br +0 -0
- package/client/assets/Studio-BzwFDYzk.js.gz +0 -0
- package/client/assets/Studio-BzwFDYzk.js.map +1 -0
- package/client/assets/StyleEditor-RZvkKHdf.js +2 -0
- package/client/assets/StyleEditor-RZvkKHdf.js.br +0 -0
- package/client/assets/StyleEditor-RZvkKHdf.js.gz +0 -0
- package/client/assets/{StyleEditor-DNjZ46Qf.js.map → StyleEditor-RZvkKHdf.js.map} +1 -1
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js +2 -0
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js.br +0 -0
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js.gz +0 -0
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js.map +1 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js +2 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js.br +0 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js.gz +0 -0
- package/client/assets/{SuperscriptTime-C8ypTVpH.js.map → SuperscriptTime-Mc0ZGBMo.js.map} +1 -1
- package/client/assets/TimeElements-c2rTHN98.css +1 -0
- package/client/assets/TimeElements-c2rTHN98.css.br +0 -0
- package/client/assets/TimeElements-c2rTHN98.css.gz +0 -0
- package/client/assets/TimeElements-dIvFHgcd.js +2 -0
- package/client/assets/TimeElements-dIvFHgcd.js.br +0 -0
- package/client/assets/TimeElements-dIvFHgcd.js.gz +0 -0
- package/client/assets/TimeElements-dIvFHgcd.js.map +1 -0
- package/client/assets/{TimeInput-BrVdiuOQ.css → TimeInput-Cu-N5DmX.css} +1 -1
- package/client/assets/TimeInput-Cu-N5DmX.css.br +0 -0
- package/client/assets/TimeInput-Cu-N5DmX.css.gz +0 -0
- package/client/assets/TimeInput-Duzx40TC.js +2 -0
- package/client/assets/TimeInput-Duzx40TC.js.br +0 -0
- package/client/assets/TimeInput-Duzx40TC.js.gz +0 -0
- package/client/assets/{TimeInput-DU09ewqh.js.map → TimeInput-Duzx40TC.js.map} +1 -1
- package/client/assets/TimelinePage-C-OHrCR8.js +2 -0
- package/client/assets/TimelinePage-C-OHrCR8.js.br +0 -0
- package/client/assets/TimelinePage-C-OHrCR8.js.gz +0 -0
- package/client/assets/TimelinePage-C-OHrCR8.js.map +1 -0
- package/client/assets/TimelinePage-CcFl3uul.css +1 -0
- package/client/assets/TimelinePage-CcFl3uul.css.br +0 -0
- package/client/assets/TimelinePage-CcFl3uul.css.gz +0 -0
- package/client/assets/Timer-CGqVtVEC.js +2 -0
- package/client/assets/Timer-CGqVtVEC.js.br +0 -0
- package/client/assets/Timer-CGqVtVEC.js.gz +0 -0
- package/client/assets/Timer-CGqVtVEC.js.map +1 -0
- package/client/assets/{Timer-B7nk3TMf.css → Timer-Jjolf5Ra.css} +1 -1
- package/client/assets/Timer-Jjolf5Ra.css.br +0 -0
- package/client/assets/Timer-Jjolf5Ra.css.gz +0 -0
- package/client/assets/{TimerControlExport-D8kqHQB0.css → TimerControlExport-DavNxY9p.css} +1 -1
- package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
- package/client/assets/TimerControlExport-DavNxY9p.css.gz +0 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js +2 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js.br +0 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js.gz +0 -0
- package/client/assets/{TimerControlExport-i0ZDpUx7.js.map → TimerControlExport-GJn4WWdH.js.map} +1 -1
- package/client/assets/TitleCard-BqbrUnHO.js +2 -0
- package/client/assets/TitleCard-BqbrUnHO.js.br +0 -0
- package/client/assets/TitleCard-BqbrUnHO.js.gz +0 -0
- package/client/assets/{TitleCard-BgOtucv6.js.map → TitleCard-BqbrUnHO.js.map} +1 -1
- package/client/assets/Tooltip-BQBvaIZx.js +2 -0
- package/client/assets/Tooltip-BQBvaIZx.js.br +0 -0
- package/client/assets/Tooltip-BQBvaIZx.js.gz +0 -0
- package/client/assets/{Tooltip-C0rGHLsB.js.map → Tooltip-BQBvaIZx.js.map} +1 -1
- package/client/assets/ViewLogo-BdL1hUV1.js +2 -0
- package/client/assets/ViewLogo-BdL1hUV1.js.br +0 -0
- package/client/assets/ViewLogo-BdL1hUV1.js.gz +0 -0
- package/client/assets/{ViewLogo--9miplQv.js.map → ViewLogo-BdL1hUV1.js.map} +1 -1
- package/client/assets/ViewParamsEditor-CFedpp6w.js +2 -0
- package/client/assets/ViewParamsEditor-CFedpp6w.js.br +0 -0
- package/client/assets/ViewParamsEditor-CFedpp6w.js.gz +0 -0
- package/client/assets/ViewParamsEditor-CFedpp6w.js.map +1 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css +1 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css.br +0 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css.gz +0 -0
- package/client/assets/dateConfig-BU1RZfIK.js +2 -0
- package/client/assets/dateConfig-BU1RZfIK.js.br +0 -0
- package/client/assets/dateConfig-BU1RZfIK.js.gz +0 -0
- package/client/assets/dateConfig-BU1RZfIK.js.map +1 -0
- package/client/assets/editorSettings-BMt-7s8I.js +2 -0
- package/client/assets/editorSettings-BMt-7s8I.js.br +0 -0
- package/client/assets/editorSettings-BMt-7s8I.js.gz +0 -0
- package/client/assets/{editorSettings-CCHx-wCx.js.map → editorSettings-BMt-7s8I.js.map} +1 -1
- package/client/assets/{getProgress-B94Ieskb.js → getProgress-sdxPEEPi.js} +2 -2
- package/client/assets/getProgress-sdxPEEPi.js.br +0 -0
- package/client/assets/getProgress-sdxPEEPi.js.gz +0 -0
- package/client/assets/{getProgress-B94Ieskb.js.map → getProgress-sdxPEEPi.js.map} +1 -1
- package/client/assets/{index-De0uf0Ta.css → index-BuJoGGff.css} +1 -1
- package/client/assets/index-BuJoGGff.css.br +0 -0
- package/client/assets/index-BuJoGGff.css.gz +0 -0
- package/client/assets/index-CoGiopcb.js +3 -0
- package/client/assets/index-CoGiopcb.js.br +0 -0
- package/client/assets/index-CoGiopcb.js.gz +0 -0
- package/client/assets/index-CoGiopcb.js.map +1 -0
- package/client/assets/offset-BS90Rks2.js +2 -0
- package/client/assets/offset-BS90Rks2.js.br +0 -0
- package/client/assets/offset-BS90Rks2.js.gz +0 -0
- package/client/assets/offset-BS90Rks2.js.map +1 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js +2 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js.br +0 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js.gz +0 -0
- package/client/assets/{parseUserTime-Bc1pSJR2.js.map → parseUserTime-DZJMcfuJ.js.map} +1 -1
- package/client/assets/playbackstate-CWexoP3a.js +2 -0
- package/client/assets/playbackstate-CWexoP3a.js.br +0 -0
- package/client/assets/playbackstate-CWexoP3a.js.gz +0 -0
- package/client/assets/{playbackstate-BpzbtG9F.js.map → playbackstate-CWexoP3a.js.map} +1 -1
- package/client/assets/{presentation.utils-B2baBe3j.js → presentation.utils-Zo5hNQje.js} +2 -2
- package/client/assets/presentation.utils-Zo5hNQje.js.br +0 -0
- package/client/assets/presentation.utils-Zo5hNQje.js.gz +0 -0
- package/client/assets/{presentation.utils-B2baBe3j.js.map → presentation.utils-Zo5hNQje.js.map} +1 -1
- package/client/assets/rundownUtils-Dl1x6NDv.js +2 -0
- package/client/assets/rundownUtils-Dl1x6NDv.js.br +0 -0
- package/client/assets/rundownUtils-Dl1x6NDv.js.gz +0 -0
- package/client/assets/{rundownUtils-H6xvQyre.js.map → rundownUtils-Dl1x6NDv.js.map} +1 -1
- package/client/assets/timer.utils-BnMyVO6Z.js +2 -0
- package/client/assets/timer.utils-BnMyVO6Z.js.br +0 -0
- package/client/assets/timer.utils-BnMyVO6Z.js.gz +0 -0
- package/client/assets/timer.utils-BnMyVO6Z.js.map +1 -0
- package/client/assets/{useCustomFields-Da0Li7nQ.js → useCustomFields-CcTb-GQM.js} +2 -2
- package/client/assets/useCustomFields-CcTb-GQM.js.br +0 -0
- package/client/assets/useCustomFields-CcTb-GQM.js.gz +0 -0
- package/client/assets/{useCustomFields-Da0Li7nQ.js.map → useCustomFields-CcTb-GQM.js.map} +1 -1
- package/client/assets/useFollowComponent-BjhV6Uv8.js +2 -0
- package/client/assets/useFollowComponent-BjhV6Uv8.js.br +0 -0
- package/client/assets/useFollowComponent-BjhV6Uv8.js.gz +0 -0
- package/client/assets/{useFollowComponent-Qo3FobyV.js.map → useFollowComponent-BjhV6Uv8.js.map} +1 -1
- package/client/assets/{useProjectData-DW06zQvF.js → useProjectData-B5mjXsMj.js} +2 -2
- package/client/assets/useProjectData-B5mjXsMj.js.br +0 -0
- package/client/assets/useProjectData-B5mjXsMj.js.gz +0 -0
- package/client/assets/{useProjectData-DW06zQvF.js.map → useProjectData-B5mjXsMj.js.map} +1 -1
- package/client/assets/useReport-zMbyWwpn.js +2 -0
- package/client/assets/useReport-zMbyWwpn.js.br +0 -0
- package/client/assets/useReport-zMbyWwpn.js.gz +0 -0
- package/client/assets/{useReport-DhFY2L8v.js.map → useReport-zMbyWwpn.js.map} +1 -1
- package/client/assets/useRundown-CHsh5rnl.js +2 -0
- package/client/assets/useRundown-CHsh5rnl.js.br +0 -0
- package/client/assets/useRundown-CHsh5rnl.js.gz +0 -0
- package/client/assets/useRundown-CHsh5rnl.js.map +1 -0
- package/client/assets/useWindowTitle-mLKt65i7.js +2 -0
- package/client/assets/useWindowTitle-mLKt65i7.js.br +0 -0
- package/client/assets/useWindowTitle-mLKt65i7.js.gz +0 -0
- package/client/assets/{useWindowTitle-B2UzPuki.js.map → useWindowTitle-mLKt65i7.js.map} +1 -1
- package/client/assets/{validateEvent-BJMwP_mq.js → validateEvent-CUmvjN95.js} +2 -2
- package/client/assets/validateEvent-CUmvjN95.js.br +0 -0
- package/client/assets/validateEvent-CUmvjN95.js.gz +0 -0
- package/client/assets/{validateEvent-BJMwP_mq.js.map → validateEvent-CUmvjN95.js.map} +1 -1
- package/client/assets/{vendor-9UkPSc5K.js → vendor-Cdwxo8bP.js} +23 -23
- package/client/assets/vendor-Cdwxo8bP.js.br +0 -0
- package/client/assets/vendor-Cdwxo8bP.js.gz +0 -0
- package/client/assets/{vendor-9UkPSc5K.js.map → vendor-Cdwxo8bP.js.map} +1 -1
- package/client/assets/{viewLoader.utils-DQGhrjSp.js → viewLoader.utils-DuXjY5zb.js} +2 -2
- package/client/assets/viewLoader.utils-DuXjY5zb.js.br +0 -0
- package/client/assets/viewLoader.utils-DuXjY5zb.js.gz +0 -0
- package/client/assets/{viewLoader.utils-DQGhrjSp.js.map → viewLoader.utils-DuXjY5zb.js.map} +1 -1
- package/client/assets/viewUtils-dKRKkb_F.js +2 -0
- package/client/assets/viewUtils-dKRKkb_F.js.br +0 -0
- package/client/assets/viewUtils-dKRKkb_F.js.gz +0 -0
- package/client/assets/viewUtils-dKRKkb_F.js.map +1 -0
- package/client/index.html +3 -3
- package/package.json +1 -1
- package/server/index.cjs +97 -97
- package/client/assets/Backstage-BhtXVpms.js +0 -2
- package/client/assets/Backstage-BhtXVpms.js.br +0 -0
- package/client/assets/Backstage-BhtXVpms.js.gz +0 -0
- package/client/assets/Backstage-BhtXVpms.js.map +0 -1
- package/client/assets/Countdown-NmGi1KMx.js +0 -2
- package/client/assets/Countdown-NmGi1KMx.js.br +0 -0
- package/client/assets/Countdown-NmGi1KMx.js.gz +0 -0
- package/client/assets/Countdown-NmGi1KMx.js.map +0 -1
- package/client/assets/CustomTranslationModal-BBNxpds0.js +0 -2
- package/client/assets/CustomTranslationModal-BBNxpds0.js.br +0 -0
- package/client/assets/CustomTranslationModal-BBNxpds0.js.gz +0 -0
- package/client/assets/DelayIndicator-CFCDQ7FN.js +0 -2
- package/client/assets/DelayIndicator-CFCDQ7FN.js.br +0 -0
- package/client/assets/DelayIndicator-CFCDQ7FN.js.gz +0 -0
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js +0 -2
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js.gz +0 -0
- package/client/assets/EditorUtils-BXko-IuN.css +0 -1
- package/client/assets/EditorUtils-BXko-IuN.css.br +0 -0
- package/client/assets/EditorUtils-BXko-IuN.css.gz +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js +0 -2
- package/client/assets/EditorUtils-CFE106qQ.js.br +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js.gz +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js.map +0 -1
- package/client/assets/Empty-C-JO_XAr.js +0 -2
- package/client/assets/Empty-C-JO_XAr.js.br +0 -2
- package/client/assets/Empty-C-JO_XAr.js.gz +0 -0
- package/client/assets/EmptyPage-BSzsxpGg.js +0 -2
- package/client/assets/EmptyPage-BSzsxpGg.js.br +0 -1
- package/client/assets/EmptyPage-BSzsxpGg.js.gz +0 -0
- package/client/assets/FollowButton-Mox6N4JW.js +0 -2
- package/client/assets/FollowButton-Mox6N4JW.js.br +0 -0
- package/client/assets/FollowButton-Mox6N4JW.js.gz +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js +0 -2
- package/client/assets/MessageControlExport-BL2ip9qN.js.br +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.gz +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.map +0 -1
- package/client/assets/MessageControlExport-DPgqVb-4.css +0 -1
- package/client/assets/MessageControlExport-DPgqVb-4.css.br +0 -0
- package/client/assets/MessageControlExport-DPgqVb-4.css.gz +0 -0
- package/client/assets/MilestoneEditor-906SVj5M.css +0 -1
- package/client/assets/MilestoneEditor-906SVj5M.css.br +0 -0
- package/client/assets/MilestoneEditor-906SVj5M.css.gz +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js +0 -2
- package/client/assets/MilestoneEditor-DcWPGKNK.js.br +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js.gz +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js.map +0 -1
- package/client/assets/Modal-krcwDRb-.js +0 -2
- package/client/assets/Modal-krcwDRb-.js.br +0 -0
- package/client/assets/Modal-krcwDRb-.js.gz +0 -0
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js +0 -2
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.gz +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js +0 -2
- package/client/assets/OperatorExport-C50KHBrD.js.br +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js.gz +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js.map +0 -1
- package/client/assets/OperatorExport-QyLn8tmf.css +0 -1
- package/client/assets/OperatorExport-QyLn8tmf.css.br +0 -0
- package/client/assets/OperatorExport-QyLn8tmf.css.gz +0 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.br +0 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.gz +0 -0
- package/client/assets/OverviewWrapper-a18gep4m.css +0 -1
- package/client/assets/OverviewWrapper-a18gep4m.css.br +0 -0
- package/client/assets/OverviewWrapper-a18gep4m.css.gz +0 -0
- package/client/assets/ProjectInfo-CJ-GLvVG.js +0 -2
- package/client/assets/ProjectInfo-CJ-GLvVG.js.br +0 -0
- package/client/assets/ProjectInfo-CJ-GLvVG.js.gz +0 -0
- package/client/assets/ProtectRoute-DJ9xZnPI.js +0 -2
- package/client/assets/ProtectRoute-DJ9xZnPI.js.br +0 -0
- package/client/assets/ProtectRoute-DJ9xZnPI.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js +0 -2
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.br +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.map +0 -1
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.br +0 -0
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.gz +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js +0 -3
- package/client/assets/ProtectedEditor-Bl4wV72N.js.br +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js.gz +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js.map +0 -1
- package/client/assets/ProtectedEditor-BoiAT_IR.css +0 -1
- package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
- package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
- package/client/assets/RundownEntry-3gFEEUnw.css +0 -1
- package/client/assets/RundownEntry-3gFEEUnw.css.br +0 -0
- package/client/assets/RundownEntry-3gFEEUnw.css.gz +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js +0 -2
- package/client/assets/RundownEntry-D9tXNXPy.js.br +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js.gz +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js.map +0 -1
- package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
- package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js +0 -3
- package/client/assets/RundownExport-D6uAmFbb.js.br +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js.gz +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js.map +0 -1
- package/client/assets/Select-BLA-yQMq.js.br +0 -0
- package/client/assets/Select-BLA-yQMq.js.gz +0 -0
- package/client/assets/Studio-DbP92DTf.js +0 -2
- package/client/assets/Studio-DbP92DTf.js.br +0 -0
- package/client/assets/Studio-DbP92DTf.js.gz +0 -0
- package/client/assets/Studio-DbP92DTf.js.map +0 -1
- package/client/assets/StyleEditor-DNjZ46Qf.js +0 -2
- package/client/assets/StyleEditor-DNjZ46Qf.js.br +0 -0
- package/client/assets/StyleEditor-DNjZ46Qf.js.gz +0 -0
- package/client/assets/SuperscriptTime-C8ypTVpH.js +0 -2
- package/client/assets/SuperscriptTime-C8ypTVpH.js.br +0 -0
- package/client/assets/SuperscriptTime-C8ypTVpH.js.gz +0 -0
- package/client/assets/TimeElements-BcQdm4ZV.css +0 -1
- package/client/assets/TimeElements-BcQdm4ZV.css.br +0 -0
- package/client/assets/TimeElements-BcQdm4ZV.css.gz +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js +0 -2
- package/client/assets/TimeElements-DlEBhXe0.js.br +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js.gz +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js.map +0 -1
- package/client/assets/TimeInput-BrVdiuOQ.css.br +0 -0
- package/client/assets/TimeInput-BrVdiuOQ.css.gz +0 -0
- package/client/assets/TimeInput-DU09ewqh.js +0 -2
- package/client/assets/TimeInput-DU09ewqh.js.br +0 -0
- package/client/assets/TimeInput-DU09ewqh.js.gz +0 -0
- package/client/assets/TimelinePage-BJav6PAb.css +0 -1
- package/client/assets/TimelinePage-BJav6PAb.css.br +0 -0
- package/client/assets/TimelinePage-BJav6PAb.css.gz +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js +0 -2
- package/client/assets/TimelinePage-DTwqRihn.js.br +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js.gz +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js.map +0 -1
- package/client/assets/Timer-B7nk3TMf.css.br +0 -0
- package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
- package/client/assets/Timer-jjWAunJc.js +0 -2
- package/client/assets/Timer-jjWAunJc.js.br +0 -0
- package/client/assets/Timer-jjWAunJc.js.gz +0 -0
- package/client/assets/Timer-jjWAunJc.js.map +0 -1
- package/client/assets/TimerControlExport-D8kqHQB0.css.br +0 -0
- package/client/assets/TimerControlExport-D8kqHQB0.css.gz +0 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js +0 -2
- package/client/assets/TimerControlExport-i0ZDpUx7.js.br +0 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js.gz +0 -0
- package/client/assets/TitleCard-BgOtucv6.js +0 -2
- package/client/assets/TitleCard-BgOtucv6.js.br +0 -0
- package/client/assets/TitleCard-BgOtucv6.js.gz +0 -0
- package/client/assets/Tooltip-C0rGHLsB.js +0 -2
- package/client/assets/Tooltip-C0rGHLsB.js.br +0 -0
- package/client/assets/Tooltip-C0rGHLsB.js.gz +0 -0
- package/client/assets/ViewLogo--9miplQv.js +0 -2
- package/client/assets/ViewLogo--9miplQv.js.br +0 -0
- package/client/assets/ViewLogo--9miplQv.js.gz +0 -0
- package/client/assets/ViewParamsEditor-1Ok39npF.css +0 -1
- package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
- package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js +0 -2
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.br +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.gz +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.map +0 -1
- package/client/assets/dateConfig-WYqMzV9D.js +0 -2
- package/client/assets/dateConfig-WYqMzV9D.js.br +0 -0
- package/client/assets/dateConfig-WYqMzV9D.js.gz +0 -0
- package/client/assets/dateConfig-WYqMzV9D.js.map +0 -1
- package/client/assets/editorSettings-CCHx-wCx.js +0 -2
- package/client/assets/editorSettings-CCHx-wCx.js.br +0 -0
- package/client/assets/editorSettings-CCHx-wCx.js.gz +0 -0
- package/client/assets/getProgress-B94Ieskb.js.br +0 -0
- package/client/assets/getProgress-B94Ieskb.js.gz +0 -0
- package/client/assets/index-De0uf0Ta.css.br +0 -0
- package/client/assets/index-De0uf0Ta.css.gz +0 -0
- package/client/assets/index-njXwwjfn.js +0 -3
- package/client/assets/index-njXwwjfn.js.br +0 -0
- package/client/assets/index-njXwwjfn.js.gz +0 -0
- package/client/assets/index-njXwwjfn.js.map +0 -1
- package/client/assets/offset-D1q-72D-.js +0 -2
- package/client/assets/offset-D1q-72D-.js.br +0 -0
- package/client/assets/offset-D1q-72D-.js.gz +0 -0
- package/client/assets/offset-D1q-72D-.js.map +0 -1
- package/client/assets/parseUserTime-Bc1pSJR2.js +0 -2
- package/client/assets/parseUserTime-Bc1pSJR2.js.br +0 -0
- package/client/assets/parseUserTime-Bc1pSJR2.js.gz +0 -0
- package/client/assets/playbackstate-BpzbtG9F.js +0 -2
- package/client/assets/playbackstate-BpzbtG9F.js.br +0 -0
- package/client/assets/playbackstate-BpzbtG9F.js.gz +0 -0
- package/client/assets/presentation.utils-B2baBe3j.js.br +0 -0
- package/client/assets/presentation.utils-B2baBe3j.js.gz +0 -0
- package/client/assets/rundownUtils-H6xvQyre.js +0 -2
- package/client/assets/rundownUtils-H6xvQyre.js.br +0 -0
- package/client/assets/rundownUtils-H6xvQyre.js.gz +0 -0
- package/client/assets/useCustomFields-Da0Li7nQ.js.br +0 -0
- package/client/assets/useCustomFields-Da0Li7nQ.js.gz +0 -0
- package/client/assets/useFollowComponent-Qo3FobyV.js +0 -2
- package/client/assets/useFollowComponent-Qo3FobyV.js.br +0 -0
- package/client/assets/useFollowComponent-Qo3FobyV.js.gz +0 -0
- package/client/assets/useProjectData-DW06zQvF.js.br +0 -0
- package/client/assets/useProjectData-DW06zQvF.js.gz +0 -0
- package/client/assets/useReport-DhFY2L8v.js +0 -2
- package/client/assets/useReport-DhFY2L8v.js.br +0 -0
- package/client/assets/useReport-DhFY2L8v.js.gz +0 -0
- package/client/assets/useRundown-ihoU8qBi.js +0 -2
- package/client/assets/useRundown-ihoU8qBi.js.br +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.gz +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.map +0 -1
- package/client/assets/useWindowTitle-B2UzPuki.js +0 -2
- package/client/assets/useWindowTitle-B2UzPuki.js.br +0 -0
- package/client/assets/useWindowTitle-B2UzPuki.js.gz +0 -0
- package/client/assets/validateEvent-BJMwP_mq.js.br +0 -0
- package/client/assets/validateEvent-BJMwP_mq.js.gz +0 -0
- package/client/assets/vendor-9UkPSc5K.js.br +0 -0
- package/client/assets/vendor-9UkPSc5K.js.gz +0 -0
- package/client/assets/viewLoader.utils-DQGhrjSp.js.br +0 -0
- package/client/assets/viewLoader.utils-DQGhrjSp.js.gz +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":["reorderArray","array","fromIndex","toIndex","modifiedArray","reorderedItem","splice","isMacOS","userAgent","navigator","toLowerCase","includes","deviceAlt","deviceMod","useEventSelection","create","set","get","selectedEvents","Set","anchoredIndex","cursor","entryMode","setSingleEntrySelection","id","setSelectedEvents","index","selectMode","rundownData","ontimeQueryClient","getQueryData","RUNDOWN","has","add","delete","nextIndex","order","findIndex","eventId","i","isOntimeEvent","entries","length","eventIds","flatOrder","forEach","event","push","start","Math","min","end","max","selectedEventIds","slice","clearSelectedEvents","clearMultiSelect","firstSelected","unselect","size","getSelectionMode","metaKey","ctrlKey","shiftKey","memo","EventEditorFooter","cue","loadById","loadByCue","jsxs","style","footer","jsx","CopyTag","EventEditorEmpty","entryEditor","shortcutSection","Editor.Title","prompt","shortcuts","Kbd","AuxKey","spacer","children","divider","kbd","RundownEntryEditor","state","data","useRundown","entry","setEntry","useState","useEffect","selectedEventId","Array","from","at","isOntimeDelay","rundownEditor","EventEditor","isOntimeMilestone","MilestoneEditor","isOntimeGroup","GroupEditor","maxResults","useFinder","rundownId","useFlatRundown","results","setResults","error","setError","lastSearchString","useRef","collapsedGroups","setCollapsedGroups","useSessionStorage","key","defaultValue","find","useCallback","target","value","searchValue","current","startsWith","searchString","trim","searchByIndex","searchByCue","searchByTitle","searchIndex","Number","isNaN","eventIndex","type","SupportedEntry","Event","title","colour","parent","remaining","Group","Milestone","select","selectedEvent","newGroups","filter","Finder","isOpen","onClose","selected","setSelected","debouncedFind","useDebouncedCallback","navigate","prev","preventDefault","stopPropagation","submit","handleMouseMoveEvent","li","closest","dataset","Modal","Input","scrollContainer","empty","map","isSelected","displayIndex","displayCue","em","FinderPlacement","handler","useDisclosure","useHotkeys","toggle","close","useContextMenuStore","position","x","y","options","setContextMenu","setIsOpen","newIsOpen","RundownContextMenu","PositionedDropdownMenu","RundownMenu","handlers","editorMode","sessionKeys","AppMode","Edit","deleteAllEntries","useEntryActions","deleteAll","Fragment","Toolbar.Button","Button","open","Run","apart","IoTrash","Dialog","RundownHeader","setEditorMode","offsetMode","useOffsetMode","toggleAppMode","mode","newValue","toggleOffsetMode","setOffsetMode","Toolbar.Root","header","ToggleGroup","group","Toggle","radioButton","Editor.Separator","separator","OffsetMode","Absolute","Relative","useEntryCopy","entryCopyId","setEntryCopyId","QuickAddButtons","previousEventId","parentGroup","backgroundColor","addEntry","addEvent","after","lastEventId","addDelay","Delay","addMilestone","addGroup","groupColour","cx","quickAdd","Boolean","indent","IoAdd","QuickAddInline","referenceEntryId","placement","handleAddEntry","before","DropdownMenu","icon","label","onClick","disabled","IconButton","addButton","useContextMenu","contextMenuEvent","pageX","pageY","TitleEditor","entryId","placeholder","className","updateEntry","ref","submitCallback","text","cleanVal","onChange","onBlur","onKeyDown","useReactiveTextInput","submitOnEnter","classes","eventTitle","noTitle","RundownGroup","hasCursor","collapsed","onCollapse","handleRef","clone","ungroup","deleteEntry","onContextMenu","IoDuplicateOutline","IoFolderOpenOutline","attributes","dragAttributes","listeners","dragListeners","setNodeRef","transform","transition","isDragging","isOver","over","useSortable","animateLayoutChanges","handleFocusClick","button","binderColours","getAccessibleColour","isValidDrop","canDrop","planOffset","planOffsetLabel","targetDuration","offset","duration","absOffset","abs","formatDuration","MILLIS_PER_MINUTE","getOffsetState","dragStyle","zIndex","CSS","Translate","toString","expanded","binder","drag","notAllowed","IoReorderTwo","titleRow","IoChevronUp","IoChevronDown","metaRow","metaEntry","millisToString","timeStart","fallback","timerPlaceholder","timeEnd","strike","RundownGroupEnd","Transform","groupEnd","RundownEmpty","props","handleAddNew","Empty","marginTop","marginBottom","inline","RundownEntry","lazy","__vitePreload","Rundown","t0","$","_c","rundownMetadata","featureData","useRundownEditor","t1","makeSortableList","sortableData","setSortableData","metadata","setMetadata","t2","t3","Symbol","for","t4","t5","collapsedGroupSet","move","reorderEntry","_temp","t6","_temp2","_temp3","_temp4","cursorRef","scrollRef","t7","t8","followRef","doFollow","followTrigger","useFollowComponent","t9","activationConstraint","distance","sensors","useSensors","useSensor","PointerSensor","t10","cursor_0","getPreviousNormal","deleteAtCursor","t11","atId","t12","above","undefined","getState","normalisedAtId","elementToCopy","refElement","insertCopyAtId","patch","id_0","t13","above_0","insertAtId","cursor_1","direction","newCursor","getLastNormal","getFirstNormal","selected_0","getPreviousGroupNormal","getNextGroupNormal","selectGroup","t14","cursor_2","direction_0","selected_1","selected_2","getNextNormal","selectEntry","t15","groupId","getIsCollapsed","t16","groupId_0","isCollapsed","id_1","handleCollapseGroup","t17","cursor_3","direction_1","movedIntoGroupId","moveEntry","t18","t19","usePhysicalKeys","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","t44","t45","t46","t47","t48","t49","t50","t51","t52","t53","t54","t55","t56","t57","t58","t59","t60","t61","t62","t63","t64","t65","t66","t67","t68","t69","t70","t71","t72","t73","t74","t75","t76","t77","t78","index_0","maybeParent","prev_0","id_3","t79","active","sortable","destinationId","isDraggingGroup","replace","currentEntries","catch","_","handleOnDragEnd","t80","event_0","collapseDraggedGroups","t81","event_1","groupId_1","expandOverGroup","t82","isEditMode","lastEntryId","t83","t84","nextEventId","playback","index_1","parentId","split","isGroupCollapsed","parentMetadata","groupEntries","entry_0","entryMetadata","isNext","isFirst","isLast","parentIdForBefore","thisId","parentIdForAfter","entryWrapper","entryIndex","flag","TbFlagFilled","isPast","isLoaded","isNextDay","Playback","Roll","totalGap","isLinkedToLoaded","t85","lastMetadataKey","t86","t87","list","t88","SortableContext","verticalListSortingStrategy","t89","rundownContainer","DndContext","closestCenter","state_2","state_1","state_0","RundownWrapper","isSmallDevice","status","useRundownWithMetadata","styles","rundownWrapper","RundownHeaderMobile","RundownExport","isExtracted","window","location","pathname","useIsSmallDevice","ProtectRoute","rundownExport","extracted","ViewNavigationMenu","rundown","ErrorBoundary","hideSideBar","getIsNavigationLocked","CornerExtract","handleLinks","side"],"ignoreList":[],"sources":["../../../../packages/utils/src/common/arrayUtils.ts","../../src/common/utils/deviceUtils.ts","../../src/features/rundown/useEventSelection.ts","../../src/features/rundown/entry-editor/composite/EventEditorFooter.tsx","../../src/features/rundown/entry-editor/EventEditorEmpty.tsx","../../src/features/rundown/entry-editor/RundownEntryEditor.tsx","../../src/views/editor/finder/useFinder.tsx","../../src/views/editor/finder/Finder.tsx","../../src/features/rundown/placements/FinderPlacement.tsx","../../src/features/rundown/rundown-context-menu/RundownContextMenu.tsx","../../src/features/rundown/rundown-header/RundownMenu.tsx","../../src/features/rundown/rundown-header/RundownHeader.tsx","../../src/features/rundown/rundown-header/RundownHeaderMobile.tsx","../../src/common/stores/entryCopyStore.ts","../../src/features/rundown/entry-editor/quick-add-buttons/QuickAddButtons.tsx","../../src/features/rundown/entry-editor/quick-add-cursor/QuickAddInline.tsx","../../src/common/hooks/useContextMenu.tsx","../../src/features/rundown/common/TitleEditor.tsx","../../src/features/rundown/rundown-group/RundownGroup.tsx","../../src/features/rundown/rundown-group/RundownGroupEnd.tsx","../../src/features/rundown/RundownEmpty.tsx","../../src/features/rundown/Rundown.tsx","../../src/features/rundown/RundownWrapper.tsx","../../src/features/rundown/RundownExport.tsx"],"sourcesContent":["/**\n * Inserts an item in an array at a given index\n * @param index\n * @param item\n * @param array\n */\nexport function insertAtIndex<T>(index: number, item: T, array: T[]): T[] {\n const modifiedArray = [...array];\n\n // Insert at beginning\n if (index === 0) {\n modifiedArray.unshift(item);\n }\n\n // insert at end\n else if (index >= modifiedArray.length) {\n modifiedArray.push(item);\n }\n\n // insert in the middle\n else {\n modifiedArray.splice(index, 0, item);\n }\n\n return modifiedArray;\n}\n\n/**\n * Inserts an array into another one of the same type at a given index\n */\nexport function mergeAtIndex<T>(index: number, newArray: T[], currentArray: T[]): T[] {\n // Insert at beginning\n if (index === 0) {\n return [...newArray, ...currentArray];\n }\n\n // insert at end\n else if (index >= currentArray.length) {\n return [...currentArray, ...newArray];\n }\n\n // insert in the middle\n return currentArray.toSpliced(index, 0, ...newArray);\n}\n\n/**\n * Deletes array element at a given index\n * @param index\n * @param array\n */\nexport function deleteAtIndex<T>(index: number, array: T[]) {\n return array.filter((_, i) => i !== index);\n}\n\n/**\n * Reorders two objects in an array\n */\nexport function reorderArray<T>(array: T[], fromIndex: number, toIndex: number): T[] {\n if (fromIndex === toIndex) {\n return array; // No change needed, return the original array\n }\n\n const modifiedArray = [...array];\n\n // delete in from\n const [reorderedItem] = modifiedArray.splice(fromIndex, 1);\n\n // reinsert item at to\n modifiedArray.splice(toIndex, 0, reorderedItem);\n return modifiedArray;\n}\n","export function isMacOS() {\n const userAgent = navigator.userAgent.toLowerCase();\n return userAgent.includes('macintosh') || userAgent.includes('mac os');\n}\n\nexport const deviceAlt = isMacOS() ? 'Option' : 'Alt';\n\nexport const deviceMod = isMacOS() ? 'Cmd' : 'Ctrl';\n","import { MouseEvent } from 'react';\nimport { EntryId, isOntimeEvent, MaybeNumber, MaybeString, Rundown } from 'ontime-types';\nimport { create } from 'zustand';\n\nimport { RUNDOWN } from '../../common/api/constants';\nimport { ontimeQueryClient } from '../../common/queryClient';\nimport { isMacOS } from '../../common/utils/deviceUtils';\n\ntype SelectionMode = 'shift' | 'click' | 'ctrl';\n\ninterface EventSelectionStore {\n selectedEvents: Set<EntryId>;\n anchoredIndex: MaybeNumber;\n cursor: MaybeString;\n entryMode: 'event' | 'single' | null;\n setSingleEntrySelection: (selectionArgs: { id: EntryId }) => void;\n setSelectedEvents: (selectionArgs: { id: EntryId; index: number; selectMode: SelectionMode }) => void;\n clearSelectedEvents: () => void;\n clearMultiSelect: () => void;\n unselect: (id: EntryId) => void;\n}\n\nexport const useEventSelection = create<EventSelectionStore>()((set, get) => ({\n selectedEvents: new Set(),\n anchoredIndex: null,\n cursor: null,\n entryMode: null,\n setSingleEntrySelection: ({ id }) => {\n set({ selectedEvents: new Set([id]), anchoredIndex: null, cursor: id, entryMode: 'single' });\n },\n setSelectedEvents: ({ id, index, selectMode }) => {\n const { selectedEvents, anchoredIndex, entryMode } = get();\n\n // if we are in single mode, we replace the selection and change the mode\n if (entryMode === 'single') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on click, we replace selection with event\n if (selectMode === 'click') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on ctrl + click, we toggle the selection of that event\n if (selectMode === 'ctrl') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // if it doesnt exist, simply add to the list and set an anchor\n if (!selectedEvents.has(id)) {\n return set({\n selectedEvents: selectedEvents.add(id),\n anchoredIndex: index,\n cursor: id,\n entryMode: 'event',\n });\n }\n\n // if event is already selected, we remove it from selection\n // and set the anchor to the event after\n selectedEvents.delete(id);\n\n const nextIndex = rundownData.order.findIndex(\n (eventId, i) => i > index && isOntimeEvent(rundownData.entries[eventId]) && selectedEvents.has(eventId),\n );\n\n // if we didnt find anything after, set the anchor to the last event\n return set({\n selectedEvents,\n anchoredIndex: nextIndex < 0 ? rundownData.order.length - 1 : nextIndex,\n entryMode: 'event',\n });\n }\n\n // on shift + click, we select a range of events up to the clicked event\n if (selectMode === 'shift') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // get list of rundown with only ontime events\n const eventIds: EntryId[] = [];\n rundownData.flatOrder.forEach((eventId) => {\n const event = rundownData.entries[eventId];\n if (isOntimeEvent(event)) {\n eventIds.push(event.id);\n }\n });\n\n const start = anchoredIndex === null ? 0 : Math.min(anchoredIndex, index);\n const end = anchoredIndex === null ? index : Math.max(anchoredIndex, index + 1);\n\n // create new set with range of ids from start to end\n const selectedEventIds = eventIds.slice(start, end);\n\n return set({\n selectedEvents: new Set([...selectedEvents, ...selectedEventIds]),\n anchoredIndex: index,\n entryMode: 'event',\n });\n }\n },\n clearSelectedEvents: () => set({ selectedEvents: new Set(), anchoredIndex: null, cursor: null, entryMode: null }),\n clearMultiSelect: () => {\n const { selectedEvents } = get();\n const [firstSelected] = selectedEvents;\n set({\n selectedEvents: new Set(firstSelected ? [firstSelected] : []),\n anchoredIndex: null,\n entryMode: null,\n });\n },\n unselect: (id: string) => {\n const { entryMode, selectedEvents } = get();\n selectedEvents.delete(id);\n set({\n selectedEvents,\n entryMode: selectedEvents.size === 0 ? null : entryMode,\n });\n },\n}));\n\nexport function getSelectionMode(event: MouseEvent): SelectionMode {\n if ((isMacOS() && event.metaKey) || event.ctrlKey) {\n return 'ctrl';\n }\n\n if (event.shiftKey) {\n return 'shift';\n }\n\n return 'click';\n}\n","import { memo } from 'react';\n\nimport CopyTag from '../../../../common/components/copy-tag/CopyTag';\n\nimport style from './EventEditorFooter.module.scss';\n\ninterface EventEditorFooterProps {\n id: string;\n cue: string;\n}\n\nexport default memo(EventEditorFooter);\nfunction EventEditorFooter({ id, cue }: EventEditorFooterProps) {\n const loadById = `/ontime/load/id \"${id}\"`;\n const loadByCue = `/ontime/load/cue \"${cue}\"`;\n\n return (\n <div className={style.footer}>\n <CopyTag copyValue={loadById}>{loadById}</CopyTag>\n <CopyTag copyValue={loadByCue}>{loadByCue}</CopyTag>\n </div>\n );\n}\n","import { memo, PropsWithChildren } from 'react';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { deviceAlt, deviceMod } from '../../../common/utils/deviceUtils';\n\nimport style from './EventEditorEmpty.module.scss';\n\nexport default memo(EventEditorEmpty);\n\nfunction EventEditorEmpty() {\n return (\n <div className={style.entryEditor} data-testid='editor-container'>\n <div className={style.shortcutSection}>\n <Editor.Title className={style.prompt}>Rundown shortcuts</Editor.Title>\n <table className={style.shortcuts}>\n <tbody>\n <tr>\n <td>Find in rundown</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>F</Kbd>\n </td>\n </tr>\n <tr>\n <td>Open Settings</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>,</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Select entry</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Select group</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Deselect entry</td>\n <td>\n <Kbd>Esc</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Reorder selected entry</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Copy selected entry</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>C</Kbd>\n </td>\n </tr>\n <tr>\n <td>Paste above</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>V</Kbd>\n </td>\n </tr>\n <tr>\n <td>Paste below</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>V</Kbd>\n </td>\n </tr>\n <tr>\n <td>Delete selected entry</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Backspace</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Add event below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>E</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add event above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>E</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add group below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>G</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add group above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>M</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add milestone below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>G</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add milestone above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>M</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add delay below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>D</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add delay above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>D</Kbd>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction AuxKey({ children }: PropsWithChildren) {\n return <span className={style.divider}>{children}</span>;\n}\n\nfunction Kbd({ children }: PropsWithChildren) {\n return <span className={style.kbd}>{children}</span>;\n}\n","import { useEffect, useState } from 'react';\nimport {\n isOntimeDelay,\n isOntimeEvent,\n isOntimeGroup,\n isOntimeMilestone,\n OntimeEvent,\n OntimeGroup,\n OntimeMilestone,\n} from 'ontime-types';\n\nimport useRundown from '../../../common/hooks-query/useRundown';\nimport { useEventSelection } from '../useEventSelection';\n\nimport EventEditorFooter from './composite/EventEditorFooter';\nimport EventEditor from './EventEditor';\nimport EventEditorEmpty from './EventEditorEmpty';\nimport GroupEditor from './GroupEditor';\nimport MilestoneEditor from './MilestoneEditor';\n\nimport style from './EntryEditor.module.scss';\n\nexport default function RundownEntryEditor() {\n const selectedEvents = useEventSelection((state) => state.selectedEvents);\n const { data } = useRundown();\n\n const [entry, setEntry] = useState<OntimeEvent | OntimeGroup | OntimeMilestone | null>(null);\n\n useEffect(() => {\n if (data.order.length === 0) {\n setEntry(null);\n return;\n }\n\n const selectedEventId = Array.from(selectedEvents).at(0);\n if (!selectedEventId) {\n setEntry(null);\n return;\n }\n const event = data.entries[selectedEventId];\n\n if (event && !isOntimeDelay(event)) {\n setEntry(event);\n } else {\n setEntry(null);\n }\n }, [data.order, data.entries, selectedEvents]);\n\n if (!entry) {\n return <EventEditorEmpty />;\n }\n\n if (isOntimeEvent(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <EventEditor event={entry} />\n <EventEditorFooter id={entry.id} cue={entry.cue} />\n </div>\n );\n }\n\n if (isOntimeMilestone(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <MilestoneEditor milestone={entry} />\n </div>\n );\n }\n\n if (isOntimeGroup(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <GroupEditor group={entry} />\n </div>\n );\n }\n\n return null;\n}\n","import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { EntryId, isOntimeEvent, isOntimeGroup, isOntimeMilestone, MaybeString, SupportedEntry } from 'ontime-types';\n\nimport { useFlatRundown } from '../../../common/hooks-query/useRundown';\nimport { useEventSelection } from '../../../features/rundown/useEventSelection';\n\nconst maxResults = 12;\n\ntype FilterableGroup = {\n type: SupportedEntry.Group;\n id: EntryId;\n index: number;\n title: string;\n colour: string;\n};\n\ntype FilterableEvent = {\n type: SupportedEntry.Event;\n id: EntryId;\n index: number;\n eventIndex: number;\n title: string;\n cue: string;\n colour: string;\n parent: MaybeString;\n};\n\ntype FilterableMilestone = {\n type: SupportedEntry.Milestone;\n id: EntryId;\n index: number;\n title: string;\n cue: string;\n colour: string;\n parent: MaybeString;\n};\n\ntype FilterableEntry = FilterableGroup | FilterableEvent | FilterableMilestone;\n\nexport default function useFinder() {\n const { data, rundownId } = useFlatRundown();\n const [results, setResults] = useState<FilterableEntry[]>([]);\n const [error, setError] = useState<MaybeString>(null);\n const lastSearchString = useRef('');\n\n const setSelectedEvents = useEventSelection((state) => state.setSelectedEvents);\n\n const [collapsedGroups, setCollapsedGroups] = useSessionStorage<EntryId[]>({\n // we ensure that this is unique to the rundown\n key: `rundown.${rundownId}-editor-collapsed-groups`,\n defaultValue: [],\n });\n\n /** Filters the rundown to a given evaluation */\n const find = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (!data || data.length === 0) {\n setError('No data');\n return;\n }\n setError(null);\n\n if (event.target.value === '') {\n setResults([]);\n return;\n }\n\n const searchValue = event.target.value.toLowerCase();\n lastSearchString.current = searchValue;\n\n if (searchValue.startsWith('index ')) {\n const searchString = searchValue.slice('index '.length).trim();\n const { results, error } = searchByIndex(searchString);\n setResults(results);\n setError(error);\n return;\n }\n\n if (searchValue.startsWith('cue ')) {\n const searchString = searchValue.slice('cue '.length).trim();\n const { results, error } = searchByCue(searchString);\n setResults(results);\n setError(error);\n return;\n }\n\n const searchString = searchValue.startsWith('title ') ? searchValue.slice('title '.length).trim() : searchValue;\n const { results, error } = searchByTitle(searchString);\n setResults(results);\n setError(error);\n\n /** Returns a single item with a matching index */\n function searchByIndex(searchString: string) {\n const searchIndex = Number(searchString);\n if (isNaN(searchIndex) || searchIndex < 1) {\n return { results: [], error: 'Invalid index' };\n }\n\n if (searchIndex > data.length) {\n return { results: [], error: null };\n }\n\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n const results: FilterableEvent[] = [];\n for (let i = 0; i < data.length; i++) {\n const event = data[i];\n if (isOntimeEvent(event)) {\n if (eventIndex === searchIndex) {\n results.push({\n type: SupportedEntry.Event,\n id: event.id,\n index: i,\n eventIndex,\n title: event.title,\n cue: event.cue,\n colour: event.colour,\n parent: event.parent,\n } satisfies FilterableEvent);\n break;\n }\n eventIndex++;\n }\n }\n\n return { results, error: null };\n }\n\n /** Returns maxResults of OntimeEvents that match the cue field */\n function searchByCue(searchString: string) {\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n // limit amount of results we show\n let remaining = maxResults;\n const results: FilterableEvent[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (remaining <= 0) {\n break;\n }\n const event = data[i];\n if (isOntimeEvent(event)) {\n if (event.cue.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Event,\n id: event.id,\n index: i,\n eventIndex,\n title: event.title,\n cue: event.cue,\n colour: event.colour,\n parent: event.parent,\n } satisfies FilterableEvent);\n }\n eventIndex++;\n }\n }\n return { results, error: null };\n }\n\n /** Returns maxResults of OntimeEvents that match the title field*/\n function searchByTitle(searchString: string) {\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n // limit amount of results we show\n let remaining = maxResults;\n const results: FilterableEntry[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (remaining <= 0) {\n break;\n }\n\n const entry = data[i];\n if (isOntimeEvent(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Event,\n id: entry.id,\n index: i,\n eventIndex,\n title: entry.title,\n cue: entry.cue,\n colour: entry.colour,\n parent: entry.parent,\n } satisfies FilterableEvent);\n }\n eventIndex++;\n } else if (isOntimeGroup(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Group,\n id: entry.id,\n index: i,\n title: entry.title,\n colour: entry.colour,\n } satisfies FilterableGroup);\n }\n } else if (isOntimeMilestone(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Milestone,\n id: entry.id,\n index: i,\n title: entry.title,\n cue: entry.cue,\n colour: entry.colour,\n parent: entry.parent,\n } satisfies FilterableMilestone);\n }\n }\n }\n return { results, error: null };\n }\n },\n [data],\n );\n\n const select = useCallback(\n (selectedEvent: FilterableEntry) => {\n // First expand the parent group if this is an event inside a group\n if ('parent' in selectedEvent && selectedEvent.parent !== null) {\n // Try direct state update instead of using callback\n const currentGroups = [...new Set(collapsedGroups)];\n const newGroups = currentGroups.filter((id) => id !== selectedEvent.parent);\n // Force a direct update\n setCollapsedGroups(newGroups);\n }\n\n // Then select the event\n setSelectedEvents({ id: selectedEvent.id, index: selectedEvent.index, selectMode: 'click' });\n },\n [collapsedGroups, setCollapsedGroups, setSelectedEvents],\n );\n\n /** clear results when source data changes */\n useEffect(() => {\n setResults([]);\n setError(null);\n // fake a submit event to re-run the search\n if (lastSearchString.current) {\n find({ target: { value: lastSearchString.current } } as ChangeEvent<HTMLInputElement>);\n }\n }, [data, find]);\n\n return { find, select, results, error };\n}\n","import { KeyboardEvent, useState } from 'react';\nimport { useDebouncedCallback } from '@mantine/hooks';\nimport { SupportedEntry } from 'ontime-types';\n\nimport Input from '../../../common/components/input/input/Input';\nimport Modal from '../../../common/components/modal/Modal';\n\nimport useFinder from './useFinder';\n\nimport style from './Finder.module.scss';\n\ninterface FinderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function Finder({ isOpen, onClose }: FinderProps) {\n const { find, select, results, error } = useFinder();\n const [selected, setSelected] = useState(0);\n\n const debouncedFind = useDebouncedCallback(find, 100);\n\n const navigate = (event: KeyboardEvent<HTMLDivElement>) => {\n // all operations need results\n if (results.length === 0) {\n return;\n }\n if (event.key === 'ArrowDown') {\n setSelected((prev) => (prev + 1) % results.length);\n }\n if (event.key === 'ArrowUp') {\n setSelected((prev) => (prev - 1 + results.length) % results.length);\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n submit();\n }\n };\n\n const submit = () => {\n const selectedEvent = results[selected];\n select(selectedEvent);\n onClose();\n };\n\n const handleMouseMoveEvent = (event: React.MouseEvent<HTMLUListElement>) => {\n const target = event.target as HTMLElement;\n const li = target.closest('li');\n if (li) {\n const index = Number(li.dataset.index);\n if (!isNaN(index)) {\n setSelected(index);\n }\n }\n };\n\n return (\n <Modal\n title=''\n isOpen={isOpen}\n onClose={onClose}\n showBackdrop\n bodyElements={\n <div onKeyDown={navigate}>\n <Input height='large' fluid onChange={debouncedFind} placeholder='Search...' />\n <ul className={style.scrollContainer} onMouseMove={handleMouseMoveEvent}>\n {error && <li className={style.error}>{error}</li>}\n {results.length === 0 && <li className={style.empty}>No results</li>}\n {results.length > 0 &&\n results.map((entry, index) => {\n const isSelected = selected === index;\n const displayIndex = entry.type === SupportedEntry.Event ? entry.eventIndex : '-';\n const displayCue = 'cue' in entry ? entry.cue : '';\n\n return (\n <li\n key={entry.id}\n className={style.entry}\n data-selected={isSelected}\n data-index={index}\n onClick={submit}\n >\n <div className={style.data}>\n <div className={style.index} style={{ '--color': entry.colour }}>\n {displayIndex}\n </div>\n <div className={style.cue}>{displayCue}</div>\n <div className={style.title}>{entry.title}</div>\n </div>\n {isSelected && <span>Go ⏎</span>}\n </li>\n );\n })}\n </ul>\n </div>\n }\n footerElements={\n <div className={style.footer}>\n Use the keywords <span className={style.em}>cue</span>, <span className={style.em}>index</span> or\n <span className={style.em}>title</span> to filter search.\n </div>\n }\n />\n );\n}\n","import { memo } from 'react';\nimport { useDisclosure, useHotkeys } from '@mantine/hooks';\n\nimport Finder from '../../../views/editor/finder/Finder';\n\nexport default memo(FinderPlacement);\n\nfunction FinderPlacement() {\n const [isOpen, handler] = useDisclosure();\n\n useHotkeys([\n ['mod + f', handler.toggle],\n ['Escape', handler.close],\n ]);\n\n if (isOpen) {\n return <Finder isOpen={isOpen} onClose={handler.close} />;\n }\n\n return null;\n}\n","import type { PropsWithChildren } from 'react';\nimport { create } from 'zustand';\n\nimport { DropdownMenuOption, PositionedDropdownMenu } from '../../../common/components/dropdown-menu/DropdownMenu';\n\ntype Position = {\n x: number;\n y: number;\n};\n\ntype ContextMenuStore = {\n position: Position;\n options: DropdownMenuOption[];\n isOpen: boolean;\n setContextMenu: (position: Position, options: DropdownMenuOption[]) => void;\n setIsOpen: (newIsOpen: boolean) => void;\n};\n\nexport const useContextMenuStore = create<ContextMenuStore>((set) => ({\n position: { x: 0, y: 0 },\n options: [],\n isOpen: false,\n setContextMenu: (position, options) => set(() => ({ position, options, isOpen: true })),\n setIsOpen: (newIsOpen) => set(() => ({ isOpen: newIsOpen })),\n}));\n\nexport function RundownContextMenu({ children }: PropsWithChildren) {\n const { position, options, isOpen, setIsOpen } = useContextMenuStore();\n\n const onClose = () => {\n return setIsOpen(false);\n };\n\n if (!isOpen) {\n return children;\n }\n\n return (\n <>\n {children}\n <PositionedDropdownMenu isOpen position={position} onClose={onClose} items={options} />\n </>\n );\n}\n","import { memo, useCallback } from 'react';\nimport { IoTrash } from 'react-icons/io5';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useDisclosure, useSessionStorage } from '@mantine/hooks';\n\nimport Button from '../../../common/components/buttons/Button';\nimport Dialog from '../../../common/components/dialog/Dialog';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownMenu);\nfunction RundownMenu() {\n const [isOpen, handlers] = useDisclosure();\n\n const clearSelectedEvents = useEventSelection((state) => state.clearSelectedEvents);\n const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const { deleteAllEntries } = useEntryActions();\n\n const deleteAll = useCallback(() => {\n deleteAllEntries();\n clearSelectedEvents();\n handlers.close();\n }, [clearSelectedEvents, deleteAllEntries, handlers]);\n\n return (\n <>\n <Toolbar.Button\n render={<Button variant='subtle-destructive' />}\n onClick={handlers.open}\n disabled={editorMode === AppMode.Run}\n className={style.apart}\n >\n <IoTrash />\n Clear all\n </Toolbar.Button>\n <Dialog\n isOpen={isOpen}\n onClose={handlers.close}\n title='Clear rundown'\n showBackdrop\n showCloseButton\n bodyElements={\n <>\n You will lose all data in your rundown. <br /> Are you sure?\n </>\n }\n footerElements={\n <>\n <Button variant='ghosted-white' size='large' onClick={handlers.close}>\n Cancel\n </Button>\n <Button variant='destructive' size='large' onClick={deleteAll}>\n Delete all\n </Button>\n </>\n }\n />\n </>\n );\n}\n","import { memo } from 'react';\nimport { Toggle } from '@base-ui-components/react/toggle';\nimport { ToggleGroup } from '@base-ui-components/react/toggle-group';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { OffsetMode } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { setOffsetMode, useOffsetMode } from '../../../common/hooks/useSocket';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\n\nimport RundownMenu from './RundownMenu';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownHeader);\nfunction RundownHeader() {\n const [editorMode, setEditorMode] = useSessionStorage({ key: sessionKeys.editorMode, defaultValue: AppMode.Edit });\n\n const { offsetMode } = useOffsetMode();\n\n const toggleAppMode = (mode: AppMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setEditorMode(newValue);\n };\n\n const toggleOffsetMode = (mode: OffsetMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setOffsetMode(newValue);\n };\n\n return (\n <Toolbar.Root className={style.header}>\n <ToggleGroup value={[editorMode]} onValueChange={toggleAppMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>\n Run\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>\n Edit\n </Toolbar.Button>\n </ToggleGroup>\n\n <Editor.Separator className={style.separator} />\n\n <ToggleGroup value={[offsetMode]} onValueChange={toggleOffsetMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Absolute} className={style.radioButton}>\n Absolute\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Relative} className={style.radioButton}>\n Relative\n </Toolbar.Button>\n </ToggleGroup>\n\n <RundownMenu />\n </Toolbar.Root>\n );\n}\n","import { memo } from 'react';\nimport { Toggle } from '@base-ui-components/react/toggle';\nimport { ToggleGroup } from '@base-ui-components/react/toggle-group';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { OffsetMode } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { setOffsetMode, useOffsetMode } from '../../../common/hooks/useSocket';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownHeader);\nfunction RundownHeader() {\n const [editorMode, setEditorMode] = useSessionStorage<AppMode>({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n\n const { offsetMode } = useOffsetMode();\n\n const toggleAppMode = (mode: AppMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setEditorMode(newValue);\n };\n\n const toggleOffsetMode = (mode: OffsetMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setOffsetMode(newValue);\n };\n\n return (\n <Toolbar.Root className={style.header}>\n <ToggleGroup value={[editorMode]} onValueChange={toggleAppMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>\n Run\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>\n Edit\n </Toolbar.Button>\n </ToggleGroup>\n\n <Editor.Separator className={style.separator} />\n\n <ToggleGroup value={[offsetMode]} onValueChange={toggleOffsetMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Absolute} className={style.radioButton}>\n Absolute\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Relative} className={style.radioButton}>\n Relative\n </Toolbar.Button>\n </ToggleGroup>\n </Toolbar.Root>\n );\n}\n","import { create } from 'zustand';\n\ntype EntryCopyStore = {\n entryCopyId: string | null;\n setEntryCopyId: (eventId: string | null) => void;\n};\n\nexport const useEntryCopy = create<EntryCopyStore>()((set) => ({\n entryCopyId: null,\n setEntryCopyId: (entryCopyId: string | null) => set({ entryCopyId }),\n}));\n","import { memo } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { MaybeString, SupportedEntry } from 'ontime-types';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './QuickAddButtons.module.scss';\n\ninterface QuickAddButtonsProps {\n previousEventId: MaybeString;\n parentGroup: MaybeString;\n backgroundColor?: string;\n}\n\nexport default memo(QuickAddButtons);\nfunction QuickAddButtons({ previousEventId, parentGroup, backgroundColor }: QuickAddButtonsProps) {\n const { addEntry } = useEntryActions();\n\n const addEvent = () => {\n addEntry(\n {\n type: SupportedEntry.Event,\n parent: parentGroup,\n },\n {\n after: previousEventId,\n lastEventId: previousEventId,\n },\n );\n };\n\n const addDelay = () => {\n addEntry(\n { type: SupportedEntry.Delay, parent: parentGroup },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n const addMilestone = () => {\n addEntry(\n { type: SupportedEntry.Milestone, parent: parentGroup },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n const addGroup = () => {\n if (parentGroup !== null) {\n return;\n }\n addEntry(\n { type: SupportedEntry.Group },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n /**\n * If the colour is empty string ''\n * ie: we are inside a group, but there is no defined colour\n * we default to $gray-500 #9d9d9d\n */\n const groupColour = backgroundColor === '' ? '#9d9d9d' : backgroundColor;\n\n return (\n <Toolbar.Root\n className={cx([style.quickAdd, Boolean(parentGroup) && style.indent])}\n style={groupColour ? { '--user-bg': groupColour } : {}}\n data-testid='quick-add-buttons'\n >\n <Toolbar.Button render={<Button size='small' />} onClick={addEvent}>\n <IoAdd />\n Event\n </Toolbar.Button>\n\n <Toolbar.Button render={<Button size='small' />} onClick={addDelay}>\n <IoAdd />\n Delay\n </Toolbar.Button>\n\n <Toolbar.Button render={<Button size='small' />} onClick={addMilestone}>\n <IoAdd />\n Milestone\n </Toolbar.Button>\n\n {parentGroup === null && (\n <Toolbar.Button render={<Button size='small' />} onClick={addGroup}>\n <IoAdd />\n Group\n </Toolbar.Button>\n )}\n </Toolbar.Root>\n );\n}\n","import { memo } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { MaybeString, SupportedEntry } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport { DropdownMenu } from '../../../../common/components/dropdown-menu/DropdownMenu';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\n\nimport style from './QuickAddInline.module.scss';\n\ninterface QuickAddInlineProps {\n referenceEntryId: MaybeString;\n parentGroup: MaybeString;\n placement: 'before' | 'after';\n}\n\nexport default memo(QuickAddInline);\nfunction QuickAddInline({ referenceEntryId, parentGroup, placement }: QuickAddInlineProps) {\n const { addEntry } = useEntryActions();\n\n const handleAddEntry = (type: SupportedEntry) => {\n if (placement === 'before') {\n addEntry(\n { type, parent: type !== SupportedEntry.Group ? parentGroup : null },\n {\n before: referenceEntryId,\n },\n );\n } else {\n addEntry(\n { type, parent: type !== SupportedEntry.Group ? parentGroup : null },\n {\n lastEventId: referenceEntryId,\n after: referenceEntryId,\n },\n );\n }\n };\n\n return (\n <div className={style.quickAdd} data-testid='quick-add-inline'>\n <DropdownMenu\n items={[\n { type: 'item', icon: IoAdd, label: 'Add Event', onClick: () => handleAddEntry(SupportedEntry.Event) },\n { type: 'item', icon: IoAdd, label: 'Add Delay', onClick: () => handleAddEntry(SupportedEntry.Delay) },\n {\n type: 'item',\n icon: IoAdd,\n label: 'Add Milestone',\n onClick: () => handleAddEntry(SupportedEntry.Milestone),\n },\n {\n type: 'item',\n icon: IoAdd,\n label: 'Add Group',\n onClick: () => handleAddEntry(SupportedEntry.Group),\n disabled: parentGroup !== null,\n },\n ]}\n render={<IconButton size='small' variant='primary' className={style.addButton} />}\n >\n <IoAdd />\n </DropdownMenu>\n </div>\n );\n}\n","import { MouseEvent } from 'react';\n\nimport { useContextMenuStore } from '../../features/rundown/rundown-context-menu/RundownContextMenu';\nimport { DropdownMenuOption } from '../components/dropdown-menu/DropdownMenu';\n\nexport const useContextMenu = <T extends HTMLElement>(options: DropdownMenuOption[]) => {\n const setContextMenu = useContextMenuStore((state) => state.setContextMenu);\n\n const localCreateContextMenu = (contextMenuEvent: MouseEvent<T, globalThis.MouseEvent>) => {\n // prevent browser default context menu from showing up\n contextMenuEvent.preventDefault();\n\n const { pageX, pageY } = contextMenuEvent;\n return setContextMenu({ x: pageX, y: pageY }, options);\n };\n\n return [localCreateContextMenu];\n};\n","import { useCallback, useRef } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TitleEditor.module.scss';\n\ninterface TitleEditorProps {\n title: string;\n entryId: string;\n placeholder: string;\n className?: string;\n}\n\nexport default function TitleEditor({ title, entryId, placeholder, className }: TitleEditorProps) {\n const { updateEntry } = useEntryActions();\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback(\n (text: string) => {\n if (text === title) {\n return;\n }\n\n const cleanVal = text.trim();\n updateEntry({ id: entryId, title: cleanVal });\n },\n [title, updateEntry, entryId],\n );\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(title, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n const classes = cx([className, style.eventTitle, !value ? style.noTitle : null]);\n\n return (\n <Input\n data-testid='entry__title'\n variant='ghosted'\n fluid\n ref={ref}\n value={value}\n className={classes}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import { MouseEvent, useRef } from 'react';\nimport {\n IoChevronDown,\n IoChevronUp,\n IoDuplicateOutline,\n IoFolderOpenOutline,\n IoReorderTwo,\n IoTrash,\n} from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EntryId, OntimeGroup } from 'ontime-types';\nimport { MILLIS_PER_MINUTE, millisToString } from 'ontime-utils';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { cx, getAccessibleColour, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport { formatDuration } from '../../../common/utils/time';\nimport TitleEditor from '../common/TitleEditor';\nimport { canDrop } from '../rundown.utils';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownGroup.module.scss';\n\ninterface RundownGroupProps {\n data: OntimeGroup;\n hasCursor: boolean;\n collapsed: boolean;\n onCollapse: (collapsed: boolean, groupId: EntryId) => void;\n}\n\n//TODO: the group should maybe include a multiple day indicator\nexport default function RundownGroup({ data, hasCursor, collapsed, onCollapse }: RundownGroupProps) {\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const { clone, ungroup, deleteEntry } = useEntryActions();\n const { selectedEvents, setSingleEntrySelection } = useEventSelection();\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>([\n {\n type: 'item',\n label: 'Clone Group',\n icon: IoDuplicateOutline,\n onClick: () => clone(data.id),\n },\n {\n type: 'item',\n label: 'Ungroup',\n icon: IoFolderOpenOutline,\n onClick: () => ungroup(data.id),\n disabled: data.entries.length === 0,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete Group',\n icon: IoTrash,\n onClick: () => deleteEntry([data.id]),\n },\n ]);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n isOver,\n over,\n } = useSortable({\n id: data.id,\n data: {\n type: 'group',\n },\n animateLayoutChanges: () => false,\n });\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n setSingleEntrySelection({ id: data.id });\n };\n\n const binderColours = data.colour && getAccessibleColour(data.colour);\n const isValidDrop = isDragging && over?.id && canDrop(over.data.current?.type, over.data.current?.parent);\n\n const [planOffset, planOffsetLabel] = (() => {\n if (data.targetDuration === null) {\n return [null, null];\n }\n\n const offset = data.duration - data.targetDuration;\n if (offset === 0) {\n return [null, 'under'];\n }\n const absOffset = Math.abs(offset);\n return [\n `${offset < 0 ? '-' : '+'}${formatDuration(absOffset, absOffset > 2 * MILLIS_PER_MINUTE)}`,\n getOffsetState(offset),\n ];\n })();\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n cursor: isOver ? (isValidDrop ? 'grabbing' : 'no-drop') : 'inherit',\n };\n\n return (\n <div\n className={cx([style.group, hasCursor && style.hasCursor, !collapsed && style.expanded])}\n ref={setNodeRef}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n style={{\n ...dragStyle,\n '--user-bg': data.colour || '#929292',\n }}\n data-testid='rundown-group'\n >\n <div className={style.binder} style={{ ...binderColours }} tabIndex={-1}>\n <span\n className={cx([style.drag, isDragging && style.isDragging, isDragging && !isValidDrop && style.notAllowed])}\n ref={handleRef}\n {...dragAttributes}\n {...dragListeners}\n >\n <IoReorderTwo />\n </span>\n </div>\n <div className={style.header}>\n <div className={style.titleRow}>\n <TitleEditor title={data.title} entryId={data.id} placeholder='Group title' />\n <IconButton aria-label='Collapse' variant='subtle-white' onClick={() => onCollapse(!collapsed, data.id)}>\n {collapsed ? <IoChevronUp /> : <IoChevronDown />}\n </IconButton>\n </div>\n <div className={style.metaRow}>\n <div className={style.metaEntry}>\n <div>Start</div>\n <div>{millisToString(data.timeStart, { fallback: timerPlaceholder })}</div>\n </div>\n <div className={style.metaEntry}>\n <div>End</div>\n <div>{millisToString(data.timeEnd, { fallback: timerPlaceholder })}</div>\n </div>\n <div className={style.metaEntry}>\n <div>Duration</div>\n {planOffset === null ? (\n <div className={cx([planOffsetLabel !== null && style[planOffsetLabel]])}>\n {formatDuration(data.duration)}\n </div>\n ) : (\n <div>\n <span className={style.strike}>{formatDuration(data.duration)}</span>\n <span className={cx([planOffsetLabel !== null && style[planOffsetLabel]])}>{planOffset}</span>\n </div>\n )}\n </div>\n <div className={style.metaEntry}>\n <div>Entries</div>\n <div>{data.entries.length}</div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport style from './RundownGroupEnd.module.scss';\n\ninterface RundownGroupEndProps {\n id: string;\n colour?: string;\n}\n\nexport default function RundownGroupEnd({ id, colour }: RundownGroupEndProps) {\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({\n id,\n data: {\n type: 'end-group',\n },\n animateLayoutChanges: () => false,\n disabled: true, // we do not want to drag end groups\n });\n\n const dragStyle = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n return (\n <div\n className={style.groupEnd}\n ref={setNodeRef}\n {...dragAttributes}\n {...dragListeners}\n style={{\n ...dragStyle,\n ...(colour ? { '--user-bg': colour } : {}),\n }}\n tabIndex={-1}\n />\n );\n}\n","import { IoAdd } from 'react-icons/io5';\nimport { SupportedEntry } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport * as Editor from '../../common/components/editor-utils/EditorUtils';\nimport Empty from '../../common/components/state/Empty';\n\nimport style from './Empty.module.scss';\n\ninterface RundownEmptyProps {\n handleAddNew: (type: SupportedEntry) => void;\n}\n\nexport default function RundownEmpty(props: RundownEmptyProps) {\n const { handleAddNew } = props;\n\n return (\n <div className={style.empty}>\n <Empty injectedStyles={{ marginTop: '5vh', marginBottom: '3rem' }} />\n <div className={style.inline}>\n <Button onClick={() => handleAddNew(SupportedEntry.Event)} variant='primary' size='large'>\n <IoAdd />\n Create Event\n </Button>\n\n <Editor.Separator />\n\n <Button onClick={() => handleAddNew(SupportedEntry.Group)} variant='primary' size='large'>\n <IoAdd /> Create Group\n </Button>\n </div>\n </div>\n );\n}\n","import { Fragment, lazy, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { TbFlagFilled } from 'react-icons/tb';\nimport {\n closestCenter,\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragStartEvent,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { useHotkeys, useSessionStorage } from '@mantine/hooks';\nimport {\n type EntryId,\n type MaybeString,\n type Rundown,\n isOntimeEvent,\n isOntimeGroup,\n OntimeEntry,\n Playback,\n SupportedEntry,\n} from 'ontime-types';\nimport {\n getFirstNormal,\n getLastNormal,\n getNextGroupNormal,\n getNextNormal,\n getPreviousGroupNormal,\n getPreviousNormal,\n reorderArray,\n} from 'ontime-utils';\n\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useRundownEditor } from '../../common/hooks/useSocket';\nimport { useEntryCopy } from '../../common/stores/entryCopyStore';\nimport { lastMetadataKey, RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { AppMode, sessionKeys } from '../../ontimeConfig';\n\nimport QuickAddButtons from './entry-editor/quick-add-buttons/QuickAddButtons';\nimport QuickAddInline from './entry-editor/quick-add-cursor/QuickAddInline';\nimport RundownGroup from './rundown-group/RundownGroup';\nimport RundownGroupEnd from './rundown-group/RundownGroupEnd';\nimport { canDrop, makeSortableList } from './rundown.utils';\nimport RundownEmpty from './RundownEmpty';\nimport { useEventSelection } from './useEventSelection';\n\nimport style from './Rundown.module.scss';\n\nconst RundownEntry = lazy(() => import('./RundownEntry'));\n\ninterface RundownProps {\n data: Rundown;\n rundownMetadata: RundownMetadataObject;\n}\n\nexport default function Rundown({ data, rundownMetadata }: RundownProps) {\n 'use memo';\n\n const { order, entries, id } = data;\n // we create a copy of the rundown with a data structured aligned with what dnd-kit needs\n const featureData = useRundownEditor();\n const [sortableData, setSortableData] = useState<EntryId[]>(() => makeSortableList(order, entries));\n const [metadata, setMetadata] = useState(rundownMetadata);\n const [collapsedGroups, setCollapsedGroups] = useSessionStorage<EntryId[]>({\n // we ensure that this is unique to the rundown\n key: `rundown.${id}-editor-collapsed-groups`,\n defaultValue: [],\n });\n const collapsedGroupSet = useMemo(() => new Set(collapsedGroups), [collapsedGroups]);\n\n const { addEntry, clone, deleteEntry, move, reorderEntry } = useEntryActions();\n const setEntryCopyId = useEntryCopy((state) => state.setEntryCopyId);\n\n // cursor\n const [editorMode] = useSessionStorage<AppMode>({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n\n const clearSelectedEvents = useEventSelection((state) => state.clearSelectedEvents);\n const setSelectedEvents = useEventSelection((state) => state.setSelectedEvents);\n const cursor = useEventSelection((state) => state.cursor);\n\n const cursorRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n useFollowComponent({\n followRef: cursorRef,\n scrollRef,\n doFollow: true,\n followTrigger: editorMode === AppMode.Edit ? cursor : featureData?.selectedEventId,\n });\n\n // DND KIT\n const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 10 } }));\n\n const deleteAtCursor = useCallback(\n (cursor: string | null) => {\n if (!cursor) return;\n const { entry, index } = getPreviousNormal(entries, order, cursor);\n deleteEntry([cursor]);\n if (entry && index !== null) {\n setSelectedEvents({ id: entry.id, selectMode: 'click', index });\n }\n },\n [entries, order, deleteEntry, setSelectedEvents],\n );\n\n const insertCopyAtId = useCallback(\n (atId: string | null, above = false) => {\n // lazily get the value from the store\n const { entryCopyId } = useEntryCopy.getState();\n if (entryCopyId === null || !entries[entryCopyId]) {\n // we cant clone without selection\n return;\n }\n\n let normalisedAtId = atId;\n\n const elementToCopy = entries[entryCopyId];\n const refElement = atId ? entries[atId] : undefined;\n\n if (refElement && 'parent' in refElement && refElement.parent && elementToCopy.type === SupportedEntry.Group) {\n normalisedAtId = refElement.parent;\n }\n\n clone(entryCopyId, {\n after: above ? undefined : normalisedAtId ?? undefined,\n // if we don't have a cursor add the new event on top\n before: above ? normalisedAtId ?? undefined : undefined,\n });\n },\n [entries, clone],\n );\n\n /**\n * Add a new item referring to an existing one\n */\n const insertAtId = useCallback(\n (patch: Partial<OntimeEntry> & { type: SupportedEntry }, id: MaybeString, above = false) => {\n addEntry(patch, {\n after: id && !above ? id : undefined,\n before: id && above ? id : undefined,\n lastEventId: !above && id ? id : undefined,\n });\n },\n [addEntry],\n );\n\n const selectGroup = useCallback(\n (cursor: string | null, direction: 'up' | 'down') => {\n if (order.length < 1) {\n return;\n }\n let newCursor = cursor;\n if (cursor === null) {\n // there is no cursor, we select the first or last depending on direction\n const selected = direction === 'up' ? getLastNormal(entries, order) : getFirstNormal(entries, order);\n\n if (isOntimeGroup(selected)) {\n setSelectedEvents({ id: selected.id, selectMode: 'click', index: direction === 'up' ? order.length : 0 });\n return;\n }\n newCursor = selected?.id ?? null;\n }\n\n if (newCursor === null) {\n return;\n }\n\n // otherwise we select the next or previous\n const selected =\n direction === 'up'\n ? getPreviousGroupNormal(entries, order, newCursor)\n : getNextGroupNormal(entries, order, newCursor);\n\n if (selected.entry !== null && selected.index !== null) {\n setSelectedEvents({ id: selected.entry.id, selectMode: 'click', index: selected.index });\n }\n },\n [order, entries, setSelectedEvents],\n );\n\n const selectEntry = useCallback(\n (cursor: string | null, direction: 'up' | 'down') => {\n if (order.length < 1) {\n return;\n }\n\n if (cursor === null) {\n // there is no cursor, we select the first or last depending on direction if it exists\n const selected = direction === 'up' ? getLastNormal(entries, order) : getFirstNormal(entries, order);\n if (selected !== null) {\n setSelectedEvents({ id: selected.id, selectMode: 'click', index: direction === 'up' ? order.length : 0 });\n }\n return;\n }\n\n // otherwise we select the next or previous\n const selected =\n direction === 'up' ? getPreviousNormal(entries, order, cursor) : getNextNormal(entries, order, cursor);\n\n if (selected.entry !== null && selected.index !== null) {\n setSelectedEvents({ id: selected.entry.id, selectMode: 'click', index: selected.index });\n }\n },\n [order, entries, setSelectedEvents],\n );\n\n /**\n * Checks whether a group is collapsed\n */\n const getIsCollapsed = useCallback(\n (groupId: EntryId): boolean => {\n return collapsedGroupSet.has(groupId);\n },\n [collapsedGroupSet],\n );\n\n /**\n * Handles logic for collapsing groups\n */\n const handleCollapseGroup = useCallback(\n (collapsed: boolean, groupId: EntryId) => {\n setCollapsedGroups((prev) => {\n const isCollapsed = getIsCollapsed(groupId);\n if (collapsed && !isCollapsed) {\n const newSet = new Set(prev).add(groupId);\n return [...newSet];\n }\n if (!collapsed && isCollapsed) {\n return [...prev].filter((id) => id !== groupId);\n }\n return prev;\n });\n },\n [getIsCollapsed, setCollapsedGroups],\n );\n\n const moveEntry = useCallback(\n async (cursor: EntryId | null, direction: 'up' | 'down') => {\n if (cursor == null) {\n return;\n }\n\n const movedIntoGroupId = await move(cursor, direction);\n // if we are moving into a group, we need to make sure it is expanded\n if (movedIntoGroupId) {\n handleCollapseGroup(false, movedIntoGroupId);\n }\n },\n [handleCollapseGroup, move],\n );\n\n // shortcuts\n useHotkeys([\n ['alt + ArrowDown', () => selectEntry(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + ArrowUp', () => selectEntry(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['alt + shift + ArrowDown', () => selectGroup(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + shift + ArrowUp', () => selectGroup(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['alt + mod + ArrowDown', () => moveEntry(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + mod + ArrowUp', () => moveEntry(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['Escape', () => clearSelectedEvents(), { preventDefault: true, usePhysicalKeys: true }],\n\n ['mod + Backspace', () => deleteAtCursor(cursor), { preventDefault: true, usePhysicalKeys: true }],\n\n [\n 'alt + E',\n () => insertAtId({ type: SupportedEntry.Event }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + E',\n () => insertAtId({ type: SupportedEntry.Event }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + G',\n () => insertAtId({ type: SupportedEntry.Group }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + G',\n () => insertAtId({ type: SupportedEntry.Group }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + D',\n () => insertAtId({ type: SupportedEntry.Delay }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + D',\n () => insertAtId({ type: SupportedEntry.Delay }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + M',\n () => insertAtId({ type: SupportedEntry.Milestone }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + M',\n () => insertAtId({ type: SupportedEntry.Milestone }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n ['mod + C', () => setEntryCopyId(cursor)],\n ['mod + V', () => insertCopyAtId(cursor)],\n ['mod + shift + V', () => insertCopyAtId(cursor, true), { preventDefault: true, usePhysicalKeys: true }],\n\n ['alt + backspace', () => deleteAtCursor(cursor), { preventDefault: true, usePhysicalKeys: true }],\n ]);\n\n // we copy the state from the store here\n // to workaround async updates on the drag mutations\n useEffect(() => {\n setSortableData(makeSortableList(order, entries));\n setMetadata(rundownMetadata);\n }, [order, entries, rundownMetadata]);\n\n // in run mode, we follow the playback selection and open groups as needed\n useEffect(() => {\n if (editorMode !== AppMode.Run || !featureData?.selectedEventId) {\n return;\n }\n const index = order.findIndex((id) => id === featureData.selectedEventId);\n // @ts-expect-error -- but we safely check if the parent property exists\n const maybeParent = entries[featureData.selectedEventId]?.parent;\n if (maybeParent) {\n // open the group\n setCollapsedGroups((prev) => [...prev].filter((id) => id !== maybeParent));\n }\n\n setSelectedEvents({ id: featureData.selectedEventId, selectMode: 'click', index });\n }, [editorMode, entries, featureData.selectedEventId, order, setCollapsedGroups, setSelectedEvents]);\n\n /**\n * On drag end, we reorder the events\n */\n const handleOnDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over?.id || active.id === over.id) {\n return;\n }\n\n if (!active.data.current || !over.data.current) {\n return;\n }\n\n const fromIndex: number = active.data.current.sortable.index;\n const toIndex: number = over.data.current.sortable.index;\n let placement: 'before' | 'after' | 'insert' = fromIndex < toIndex ? 'after' : 'before';\n\n let destinationId = over.id as EntryId;\n const isDraggingGroup = active.data.current?.type === SupportedEntry.Group;\n\n // prevent dropping a group inside another\n if (\n isDraggingGroup &&\n !canDrop(over.data.current.type, over.data.current.parent, placement, getIsCollapsed(destinationId))\n ) {\n return;\n }\n\n /**\n * We need to specially handle the end-group\n * Dragging before a end-group will add the entry to the end of the group\n * Dragging after a end-group will add the event after the group itself\n * Dragging to the top of a group either place before first entry or if no entries do insert\n */\n if (destinationId.startsWith('end-')) {\n destinationId = destinationId.replace('end-', '');\n // if we are moving before the end, we use the insert operation\n if (placement === 'before') {\n placement = 'insert';\n }\n } else {\n const group = data.entries[destinationId];\n // if dragging into a group\n if (isOntimeGroup(group) && placement === 'after') {\n if (isDraggingGroup) {\n // ... and the dragged entry is a group, we know that the group is collapsed, because of the safe check canDrop from before\n // so we can safely push the dragged event after the group\n destinationId = group.id;\n } else if (group.entries.length === 0) {\n // ... and the group is entry, we insert\n destinationId = group.id;\n placement = 'insert';\n } else {\n // otherwise we add it to before the first group child\n destinationId = group.entries[0];\n placement = 'before';\n }\n }\n }\n\n // keep copy of the current state in case we need to revert\n const currentEntries = [...sortableData];\n // we keep a copy of the state as a hack to handle inconsistencies between dnd-kit and async store updates\n setSortableData((currentEntries) => {\n return reorderArray(currentEntries, fromIndex, toIndex);\n });\n reorderEntry(active.id as EntryId, destinationId, placement).catch((_) => {\n setSortableData(currentEntries);\n });\n };\n\n /**\n * When we drag a group, we force collapse it\n * This avoids strange scenarios like dropping a group inside itself\n */\n const collapseDraggedGroups = (event: DragStartEvent) => {\n const isGroup = event.active.data.current?.type === SupportedEntry.Group;\n if (isGroup) {\n handleCollapseGroup(true, event.active.id as EntryId);\n }\n };\n\n /**\n * When we drag over a group, we expand it if it is collapsed\n */\n const expandOverGroup = (event: DragOverEvent) => {\n // if we are dragging a group, the drop operation is invalid so we dont expand\n if (event.active.data.current?.type === 'group') {\n return;\n }\n if (event.over?.data.current?.type !== 'group') {\n return;\n }\n const groupId = event.over?.id as EntryId;\n const isCollapsed = getIsCollapsed(groupId);\n if (isCollapsed) {\n handleCollapseGroup(false, groupId);\n }\n };\n\n if (sortableData.length < 1) {\n return <RundownEmpty handleAddNew={(type: SupportedEntry) => addEntry({ type })} />;\n }\n\n // gather presentation options\n const isEditMode = editorMode === AppMode.Edit;\n\n // gather rundown wide data\n const lastEntryId = order.at(-1);\n\n return (\n <div className={style.rundownContainer} ref={scrollRef} data-testid='rundown'>\n <DndContext\n onDragEnd={handleOnDragEnd}\n onDragStart={collapseDraggedGroups}\n onDragOver={expandOverGroup}\n sensors={sensors}\n collisionDetection={closestCenter}\n >\n <SortableContext items={sortableData} strategy={verticalListSortingStrategy}>\n <div className={style.list}>\n {isEditMode && <QuickAddButtons previousEventId={null} parentGroup={null} />}\n {sortableData.map((entryId, index) => {\n // the entry might be a pseudo end-group which does not generate metadata and should not be processed\n if (entryId.startsWith('end-')) {\n const parentId = entryId.split('end-')[1];\n const isGroupCollapsed = getIsCollapsed(parentId);\n const parentMetadata = metadata[parentId];\n\n if (isGroupCollapsed) {\n return null;\n }\n\n // if the previous element is selected, it will have its own QuickAddInline\n // we use thisId instead of previousEntryId because the end-group does not process\n // and it does not cause the reassignment of the iteration id to the previous entry\n return (\n <Fragment key={entryId}>\n {isEditMode && parentMetadata?.groupEntries === 0 && (\n <QuickAddButtons\n previousEventId={null}\n parentGroup={parentId}\n backgroundColor={parentMetadata?.groupColour}\n />\n )}\n <RundownGroupEnd key={entryId} id={entryId} colour={parentMetadata?.groupColour} />\n </Fragment>\n );\n }\n\n // we iterate through a stateful copy of order to make the dnd operations smoother\n // this means that this can be out of sync with order until the useEffect runs\n // instead of writing all the logic guards, we simply short circuit rendering here\n const entry = entries[entryId];\n const entryMetadata = metadata[entryId];\n if (!entry || !entryMetadata) return null;\n\n // if the entry has a parent, and it is collapsed, render nothing\n if (\n entry.type !== SupportedEntry.Group &&\n entryMetadata.groupId !== null &&\n getIsCollapsed(entryMetadata.groupId)\n ) {\n return null;\n }\n\n const isNext = featureData?.nextEventId === entry.id;\n const hasCursor = entry.id === cursor;\n\n /**\n * Outside a group, the value will be undefined\n * If the colour is empty string ''\n * ie: we are inside a group, but there is no defined colour\n * we default to $gray-500 #9d9d9d\n */\n const groupColour = entryMetadata.groupColour === '' ? '#9d9d9d' : entryMetadata.groupColour;\n\n const isFirst = index === 0;\n const isLast = entryId === lastEntryId;\n\n /**\n * We need to provide the parent ID for the QuickAdd components\n * This should be different depending on whether we are adding before or after an element\n * - when adding before, we need to avoid a group referencing itself as the parent\n * - when adding after, we can use the group ID directly to insert at the top of the group\n */\n\n const parentIdForBefore = entryMetadata.thisId !== entryMetadata.groupId ? entryMetadata.groupId : null;\n const parentIdForAfter = entryMetadata.groupId;\n\n return (\n <Fragment key={entry.id}>\n {/**\n * Before the entry\n * - edit mode only\n * - if there is a cursor\n * - if it is not the first entry (the buttons would be there)\n */}\n {isEditMode && hasCursor && !isFirst && (\n <QuickAddInline placement='before' referenceEntryId={entry.id} parentGroup={parentIdForBefore} />\n )}\n {isOntimeGroup(entry) ? (\n <RundownGroup\n data={entry}\n hasCursor={hasCursor}\n collapsed={getIsCollapsed(entry.id)}\n onCollapse={handleCollapseGroup}\n />\n ) : (\n <div\n className={style.entryWrapper}\n data-testid={`entry-${entryMetadata.eventIndex}`}\n style={groupColour ? { '--user-bg': groupColour } : {}}\n >\n {isOntimeEvent(entry) && (\n <div className={style.entryIndex}>\n {entry.flag && <TbFlagFilled className={style.flag} />}\n <div className={style.index}>{entryMetadata.eventIndex}</div>\n </div>\n )}\n <div className={style.entry} key={entry.id} ref={hasCursor ? cursorRef : undefined}>\n <RundownEntry\n type={entry.type}\n isPast={entryMetadata.isPast}\n eventIndex={entryMetadata.eventIndex}\n data={entry}\n loaded={entryMetadata.isLoaded}\n hasCursor={hasCursor}\n isNext={isNext}\n isNextDay={entryMetadata.isNextDay}\n playback={entryMetadata.isLoaded ? featureData.playback : undefined}\n isRolling={featureData.playback === Playback.Roll}\n totalGap={entryMetadata.totalGap}\n isLinkedToLoaded={entryMetadata.isLinkedToLoaded}\n />\n </div>\n </div>\n )}\n {/**\n * After the entry\n * - edit mode only\n * - if there is a cursor\n * - if it is not the last entry (the buttons would be there)\n * - if the entry is not the group header\n */}\n {isEditMode && hasCursor && !isLast && (\n <QuickAddInline placement='after' referenceEntryId={entry.id} parentGroup={parentIdForAfter} />\n )}\n </Fragment>\n );\n })}\n {isEditMode && (\n <QuickAddButtons\n previousEventId={metadata[lastMetadataKey]?.groupId ?? metadata[lastMetadataKey].thisId}\n parentGroup={null}\n />\n )}\n <div className={style.spacer} />\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n}\n","import Empty from '../../common/components/state/Empty';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\n\nimport RundownHeader from './rundown-header/RundownHeader';\nimport RundownHeaderMobile from './rundown-header/RundownHeaderMobile';\nimport Rundown from './Rundown';\n\nimport styles from './Rundown.module.scss';\n\ninterface RundownWrapperProps {\n isSmallDevice?: boolean;\n}\n\nexport default function RundownWrapper({ isSmallDevice }: RundownWrapperProps) {\n const { data, status, rundownMetadata } = useRundownWithMetadata();\n\n return (\n <div className={styles.rundownWrapper}>\n {isSmallDevice ? <RundownHeaderMobile /> : <RundownHeader />}\n {status === 'success' && data && rundownMetadata ? (\n <Rundown data={data} rundownMetadata={rundownMetadata} />\n ) : (\n <Empty text='Connecting to server' />\n )}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { useSessionStorage } from '@mantine/hooks';\n\nimport { CornerExtract } from '../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../common/components/protect-route/ProtectRoute';\nimport { useIsSmallDevice } from '../../common/hooks/useIsSmallDevice';\nimport { handleLinks } from '../../common/utils/linkUtils';\nimport { cx } from '../../common/utils/styleUtils';\nimport { getIsNavigationLocked } from '../../externals';\nimport { AppMode, sessionKeys } from '../../ontimeConfig';\n\nimport RundownEntryEditor from './entry-editor/RundownEntryEditor';\nimport FinderPlacement from './placements/FinderPlacement';\nimport { RundownContextMenu } from './rundown-context-menu/RundownContextMenu';\nimport RundownWrapper from './RundownWrapper';\n\nimport style from './RundownExport.module.scss';\n\nexport default memo(RundownExport);\n\nfunction RundownExport() {\n const isExtracted = window.location.pathname.includes('/rundown');\n const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const isSmallDevice = useIsSmallDevice();\n\n if (isSmallDevice && isExtracted) {\n return (\n <ProtectRoute permission='editor'>\n <div\n className={cx([style.rundownExport, style.extracted])}\n data-target='small-device'\n data-testid='panel-rundown'\n >\n <FinderPlacement />\n <ViewNavigationMenu suppressSettings />\n <div className={style.rundown}>\n <ErrorBoundary>\n <RundownContextMenu>\n <RundownWrapper isSmallDevice />\n </RundownContextMenu>\n </ErrorBoundary>\n </div>\n </div>\n </ProtectRoute>\n );\n }\n\n const hideSideBar = isExtracted && editorMode === 'run';\n\n return (\n <ProtectRoute permission='editor'>\n <div className={cx([style.rundownExport, isExtracted && style.extracted])} data-testid='panel-rundown'>\n <FinderPlacement />\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n <div className={style.rundown}>\n <div className={style.list}>\n <ErrorBoundary>\n {!isExtracted && <CornerExtract onClick={(event) => handleLinks('rundown', event)} />}\n <RundownContextMenu>\n <RundownWrapper />\n </RundownContextMenu>\n </ErrorBoundary>\n </div>\n {!hideSideBar && (\n <div className={style.side}>\n <ErrorBoundary>\n <RundownEntryEditor />\n </ErrorBoundary>\n </div>\n )}\n </div>\n </div>\n </ProtectRoute>\n );\n}\n"],"file":"assets/RundownExport-CCaOfHIr.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
._blink_44w0f_1{animation:_blink_44w0f_1 1s step-start infinite}@keyframes _blink_44w0f_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_44w0f_13{transform:rotate(45deg)}._footer_44w0f_17{border-top:1px solid rgba(255,255,255,.1);padding-top:1rem;display:flex;flex-wrap:wrap;gap:.5rem}.
|
|
1
|
+
._blink_44w0f_1{animation:_blink_44w0f_1 1s step-start infinite}@keyframes _blink_44w0f_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_44w0f_13{transform:rotate(45deg)}._footer_44w0f_17{border-top:1px solid rgba(255,255,255,.1);padding-top:1rem;display:flex;flex-wrap:wrap;gap:.5rem}._blink_z06bn_1{animation:_blink_z06bn_1 1s step-start infinite}@keyframes _blink_z06bn_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_z06bn_13{transform:rotate(45deg)}._entryEditor_z06bn_17{color:#8a8a8a;height:100%;max-height:100%;overflow-y:auto;padding:.5rem;display:flex;flex-direction:column;overflow-x:auto}._shortcutSection_z06bn_28{flex:1;display:grid;place-content:center;gap:1rem}._shortcuts_z06bn_35{font-size:calc(1rem - 3px);border-collapse:separate;border-spacing:4rem 0}._shortcuts_z06bn_35 tr td:nth-child(odd){text-align:left}._shortcuts_z06bn_35 tr td:nth-child(2n){text-align:right;white-space:nowrap}._spacer_z06bn_48{height:1rem}._prompt_z06bn_52{margin-left:4rem}._divider_z06bn_56{display:inline-block;text-align:center;width:1em}._kbd_z06bn_62{font-family:monospace;white-space:nowrap;font-size:calc(1rem - 2px);padding:.125rem .5rem;background-color:#262626;color:#f6f6f6;border-radius:2px;font-weight:400;box-shadow:0 0 3px #0006}._blink_142nw_1{animation:_blink_142nw_1 1s step-start infinite}@keyframes _blink_142nw_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_142nw_13{transform:rotate(45deg)}._entry_142nw_17,._empty_142nw_18,._error_142nw_19{padding-inline:.5rem;font-size:1rem;height:3rem;display:flex;align-items:center;justify-content:space-between}._entry_142nw_17[data-selected=true]{background-color:#2b5abc}._empty_142nw_18{color:#8a8a8a}._error_142nw_19{color:#fa5656}._data_142nw_40{display:grid;grid-template-areas:"index cue" "index title";column-gap:1rem;grid-template-rows:min-content 1fr}._data_142nw_40 ._index_142nw_46{grid-area:index;background-color:var(--color, #404040);border-radius:2px;padding-block:.25rem;width:3.5rem;align-self:center;text-align:center}._data_142nw_40 ._title_142nw_55{grid-area:title}._data_142nw_40 ._cue_142nw_58{grid-area:cue;font-size:calc(1rem - 2px);color:#8a8a8a;max-height:1em;min-height:0}._footer_142nw_66{font-size:calc(1rem - 2px);color:#8a8a8a}._em_142nw_18{color:#f6f6f6;margin-inline:.25rem}._scrollContainer_142nw_76{max-height:70vh;overflow:auto;padding-top:1rem}._blink_156wk_1{animation:_blink_156wk_1 1s step-start infinite}@keyframes _blink_156wk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_156wk_13{transform:rotate(45deg)}._header_156wk_17{padding-inline:1rem 2rem;display:flex;align-items:center}:is([data-target=small-device]) ._header_156wk_17{padding-inline:0;overflow-x:auto}._group_156wk_28{display:flex;align-items:center;gap:2px;padding-inline:2px;background:#2d2d2d;border-radius:3px;height:2rem}._radioButton_156wk_39{box-sizing:border-box;display:flex;align-items:center;justify-content:center;height:calc(2rem - 4px);padding-inline:1em;border:1px solid transparent;border-radius:3px;color:#b1b1b1;font-size:calc(1rem - 2px);font-weight:600}._radioButton_156wk_39:focus-visible{background:transparent;outline:1px solid #578AF4}._radioButton_156wk_39:hover:not(:disabled):not(:active){background:#404040}._radioButton_156wk_39:active{background:#2d2d2d}._radioButton_156wk_39[data-pressed]{background:#2b5abc;color:#f6f6f6}._radioButton_156wk_39[data-pressed]:hover:not(:disabled):not(:active){background:#3e75e8}._apart_156wk_70{margin-left:auto}._separator_156wk_74{margin-inline:1rem}._blink_96pwt_1{animation:_blink_96pwt_1 1s step-start infinite}@keyframes _blink_96pwt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_96pwt_13{transform:rotate(45deg)}._quickAdd_96pwt_17{display:flex;align-items:center;gap:1rem;padding-block:.5rem;background:color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._quickAdd_96pwt_17._indent_96pwt_24{padding-left:calc(2em + .5rem)}._blink_gr8nb_1{animation:_blink_gr8nb_1 1s step-start infinite}@keyframes _blink_gr8nb_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_gr8nb_13{transform:rotate(45deg)}._quickAdd_gr8nb_17{display:flex;align-items:center;gap:1rem;height:0;position:relative;z-index:100}._quickAdd_gr8nb_17:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:#578af4}._addButton_gr8nb_35{position:relative}._blink_zrdm3_1{animation:_blink_zrdm3_1 1s step-start infinite}@keyframes _blink_zrdm3_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_zrdm3_13{transform:rotate(45deg)}._titleEditor_zrdm3_17{display:block;font-size:calc(1rem + 2px);max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._noTitle_zrdm3_26 ._preview_zrdm3_26{opacity:.4}._blink_15o4l_1{animation:_blink_15o4l_1 1s step-start infinite}@keyframes _blink_15o4l_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_15o4l_13{transform:rotate(45deg)}._group_15o4l_17{box-sizing:content-box;border:1px solid rgba(255,255,255,.07);border-radius:3px;position:relative;color:#f6f6f6;overflow:hidden;min-width:32rem;margin-block:.5rem;display:grid;grid-template-columns:2rem 1fr;grid-template-areas:"binder header";align-items:center}._group_15o4l_17._hasCursor_15o4l_31{outline:1px solid #FFCC78}._group_15o4l_17._expanded_15o4l_34{margin-block:.5rem 0;border-radius:3px 3px 0 0;border-bottom:.25rem solid color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._group_15o4l_17 ._binder_15o4l_39{grid-area:binder;height:100%;background-color:var(--user-bg, #303030);color:#f6f6f6;font-size:1rem;display:grid;place-content:center;position:relative;cursor:pointer}._group_15o4l_17 ._binder_15o4l_39:focus{outline:1px solid #578AF4;outline-offset:-1px}._group_15o4l_17 ._header_15o4l_54{grid-area:header;padding-inline:.5rem;background-color:#303030;display:flex;flex-direction:column;gap:.5rem}._group_15o4l_17 ._titleRow_15o4l_62{display:flex;align-items:center;gap:.5rem}._group_15o4l_17 ._metaRow_15o4l_67{display:flex;gap:3rem;margin-bottom:.25rem;white-space:nowrap}._group_15o4l_17 ._metaEntry_15o4l_73{width:4.5em}._group_15o4l_17 ._metaEntry_15o4l_73 :first-child{font-size:calc(1rem - 3px);color:#8a8a8a}._strike_15o4l_81{text-decoration:line-through}._over_15o4l_85{color:#f57c13}._under_15o4l_89{color:#55b469}._drag_15o4l_93{font-size:20px;justify-self:center;opacity:.3;cursor:grab;transition:opacity .3s}._drag_15o4l_93:hover{opacity:1}._drag_15o4l_93:focus{box-shadow:none;outline:none}._drag_15o4l_93{position:absolute;margin-top:.25rem}._drag_15o4l_93._isDragging_15o4l_111{cursor:grabbing}._drag_15o4l_93._notAllowed_15o4l_114{cursor:not-allowed}._blink_1mlc9_1{animation:_blink_1mlc9_1 1s step-start infinite}@keyframes _blink_1mlc9_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1mlc9_13{transform:rotate(45deg)}._groupEnd_1mlc9_17{cursor:default;height:1rem;background-color:var(--user-bg, #303030);border-radius:0 0 3px 3px;margin-bottom:.5rem}._blink_pqnxu_1{animation:_blink_pqnxu_1 1s step-start infinite}@keyframes _blink_pqnxu_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_pqnxu_13{transform:rotate(45deg)}._empty_pqnxu_17{padding-block:1.5rem;text-align:center}._inline_pqnxu_22{display:flex;align-items:center;justify-content:center;gap:1rem}._blink_1s5di_1{animation:_blink_1s5di_1 1s step-start infinite}@keyframes _blink_1s5di_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1s5di_13{transform:rotate(45deg)}._rundownWrapper_1s5di_17{height:calc(100% - 1.5rem);width:100%}._rundownContainer_1s5di_22{margin-top:1rem;overflow-y:scroll;height:100%}._list_1s5di_28{overflow-x:clip;display:flex;flex-direction:column;padding-inline:1rem}:is([data-target=small-device]) ._list_1s5di_28{padding-inline:0;overflow-x:auto}._empty_1s5di_39{opacity:.3;align-self:center}._spacer_1s5di_44{min-height:50vh}._entryWrapper_1s5di_48{display:flex;gap:.5rem;align-items:center;background:color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._entryIndex_1s5di_55{padding-block:.25rem;display:grid;grid-template-rows:1fr 1fr 1fr;justify-items:end;min-width:2em;color:#8a8a8a;font-size:calc(1rem - 3px);height:6.5rem}._flag_1s5di_66{grid-row:1;color:#77c785;font-size:1rem}._index_1s5di_72{grid-row:2;align-content:center}._entry_1s5di_48{flex:1}._blink_h38r0_1{animation:_blink_h38r0_1 1s step-start infinite}@keyframes _blink_h38r0_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_h38r0_13{transform:rotate(45deg)}:root{--editor--panel__br: 8px}._rundownExport_h38r0_21{height:100%;flex:1 1 auto}._rundownExport_h38r0_21._extracted_h38r0_25 ._list_h38r0_25,._rundownExport_h38r0_21._extracted_h38r0_25 ._side_h38r0_29{flex:1;max-width:none}._rundown_h38r0_21{display:flex;max-height:100%;height:100%}._list_h38r0_25{display:flex;position:relative;border-radius:var(--editor--panel__br);height:100%;background-color:#1a1a1a;padding:1rem;height:inherit;padding-inline:0;box-shadow:#00000026 3px 0 3px;flex:1 1 0;min-width:38rem;max-width:none;width:0}._side_h38r0_29{max-height:100%;margin:.5rem 0;padding:1rem;padding-right:0;background-color:#151515;border-radius:0 8px 8px 0;flex:1 1 0;min-width:36.5rem;width:0}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e,bV as
|
|
2
|
-
//# sourceMappingURL=Select-
|
|
1
|
+
import{j as e,bV as n,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-Cdwxo8bP.js";import{e as N}from"./index-CoGiopcb.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},i=new t.Error().stack;i&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[i]="0ec3226b-dac7-429f-90ff-5a0a7584b909",t._sentryDebugIdIdentifier="sentry-dbid-0ec3226b-dac7-429f-90ff-5a0a7584b909")}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:t,fluid:i,size:c="medium",...o}){return e.jsxs(n,{items:t,...o,children:[e.jsxs(d,{className:N([s.select,s[c],i&&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:t.map(({disabled:r,label:a,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:a})]},String(l)))})]}),e.jsx(y,{className:s.scrollArrow})]})})]})}export{$ as S};
|
|
2
|
+
//# sourceMappingURL=Select-cHK8JrMG.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select-
|
|
1
|
+
{"version":3,"file":"Select-cHK8JrMG.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","select","jsx","BaseSelect.Value","BaseSelect.Icon","selectIcon","LuChevronsUpDown","BaseSelect.Portal","BaseSelect.Positioner","BaseSelect.ScrollUpArrow","scrollArrow","BaseSelect.Popup","popup","BaseSelect.Arrow","BaseSelect.List","list","map","disabled","label","value","BaseSelect.Item","item","BaseSelect.ItemIndicator","itemIndicator","IoCheckmark","itemIndicatorIcon","BaseSelect.ItemText","itemLabel","String","BaseSelect.ScrollDownArrow"],"mappings":"+gCAoBA,SAAwBA,EAAU,CAAEC,QAAAA,EAASC,MAAAA,EAAOC,KAAAA,EAAO,SAAU,GAAGC,CAAgC,EAAG,CACzG,cACGC,EAAA,CAAgB,MAAOJ,EAAS,GAAIG,EACnC,SAAA,CAAAE,EAAA,KAACC,EAAA,CAAmB,UAAWC,EAAG,CAACC,EAAOC,OAAQD,EAAON,CAAI,EAAGD,GAASO,EAAOP,KAAK,CAAC,EACpF,SAAA,CAACS,EAAA,IAAAC,EAAA,EAAgB,EACjBD,MAACE,EAAA,CAAgB,UAAWJ,EAAOK,WACjC,SAACH,EAAA,IAAAI,EAAA,CAAA,CAAgB,CACnB,CAAA,CAAA,EACF,EACAJ,EAAAA,IAACK,EAAA,CACC,SAAAV,OAACW,EAAA,CAAsB,KAAK,SAAS,MAAM,QACzC,SAAA,CAAAN,EAAAA,IAACO,EAAA,CAAyB,UAAWT,EAAOU,WAAY,CAAA,SACvDC,EAAA,CAAiB,UAAWX,EAAOY,MAClC,SAAA,CAACV,EAAA,IAAAW,EAAA,EAAgB,EACjBX,MAACY,EAAA,CAAgB,UAAWd,EAAOe,KAChCvB,SAAQwB,EAAAA,IAAI,CAAC,CAAEC,SAAAA,EAAUC,MAAAA,EAAOC,MAAAA,CAAAA,WAC9BC,EAAA,CAAoC,UAAWpB,EAAOqB,KAAM,MAAAF,EAAc,SAAAF,EACzE,SAAA,CAACf,EAAAA,IAAAoB,EAAA,CAAyB,UAAWtB,EAAOuB,cAC1C,SAAArB,MAACsB,EAAY,CAAA,UAAWxB,EAAOyB,iBAAAA,CAAkB,CACnD,CAAA,QACCC,EAAA,CAAoB,UAAW1B,EAAO2B,UAAYT,SAAMA,CAAA,CAAA,CAAA,CAAA,EAJrCU,OAAOT,CAAK,CAKlC,CACD,CACH,CAAA,CAAA,EACF,QACCU,EAAA,CAA2B,UAAW7B,EAAOU,WAAY,CAAA,CAAA,CAAA,CAC5D,CACF,CAAA,CAAA,EACF,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{l as k,h as j,j as e}from"./vendor-Cdwxo8bP.js";import{P as w,f as m,C as T,D as O,E as C,h as N,e as d,m as x,d as E,G as A,y as f,H as P,u as I,a as M,b as F,L as V,g as D,O as L}from"./index-CoGiopcb.js";import{E as H}from"./EmptyPage-DeRjpRKZ.js";import{V as R}from"./ViewLogo-BdL1hUV1.js";import{O as g,V as W}from"./ViewParamsEditor-CFedpp6w.js";import{u as z}from"./useWindowTitle-mLKt65i7.js";import{g as B,a as $}from"./viewLoader.utils-DuXjY5zb.js";import{i as G}from"./viewUtils-dKRKkb_F.js";import{S as Q}from"./SuperscriptTime-Mc0ZGBMo.js";import{a as U,g as X}from"./offset-BS90Rks2.js";import{g as Y}from"./presentation.utils-Zo5hNQje.js";import{u as q}from"./useProjectData-B5mjXsMj.js";import"./Empty-D1UteOYj.js";import"./Select-cHK8JrMG.js";/* empty css */(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="f5a3efb8-e306-4c67-a08f-59a76f7afc3c",s._sentryDebugIdIdentifier="sentry-dbid-f5a3efb8-e306-4c67-a08f-59a76f7afc3c")}catch{}})();const J=s=>[{title:g.ClockOptions,collapsible:!0,options:[B(s)]},{title:g.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:G((a=>(t==null?void 0:t.get(a))??s.get(a))("hideCards"))}}function Z(){const[s]=k(),t=j.use(w);return j.useMemo(()=>{const a=t?new URLSearchParams(t.search):void 0;return K(s,a)},[t,s])}function ee(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:T(s),display:t,meridian:i}}const se=[...Array(12).keys()],te=[...Array(60).keys()];function ae({hideCards:s}){const t=O(),{clock:i,playback:a}=C(),r=a!==N.Stop;if(t&&!s)return e.jsx(ie,{clock:i,onAir:r});const{seconds:c,display:n,meridian:l}=ee(i);return e.jsx("div",{className:"studio__clock",children:e.jsxs("div",{className:"clock-container",children:[te.map(o=>e.jsx("div",{className:d(["tick",o<=c&&"tick--active"]),style:{transform:`rotate(${180+o*6}deg) translateY(var(--half-size))`}},o)),se.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 ie({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 h={format12:"h:mm a",format24:"HH:mm"};function re(s){return{actualStart:m(s.actualStart,h),expectedEnd:m(s.expectedEnd,h),offset:U(s.offset)}}function ce(s,t){return{title:(s==null?void 0:s.title)||"-",startedAt:m(t.startedAt,h),expectedEnd:m(t.expectedFinish,h),timer:x(t.current)}}function de({viewSettings:s}){const{getLocalizedString:t}=E(),{eventNow:i,eventNext:a,message:r,time:c,offset:n,rundown:l,expectedRundownEnd:o}=A(),v=re({offset:n,actualStart:l.actualStart,expectedEnd:o}),u=ce(i,c),S=(a==null?void 0:a.title)||"-",b=r.timer.visible&&r.timer.text||"-",p=r.timer.secondarySource==="secondary"&&r.secondary||"-",y=Y(s,void 0,c.phase===f.Warning,c.phase===f.Danger),_=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:v.actualStart})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label center",children:"Over / under"}),e.jsx("div",{className:d(["runtime-timer","center",!i&&"muted",_]),children:v.offset})]}),e.jsxs("div",{children:[e.jsx("div",{className:"label right",children:t("common.expected_end")}),e.jsx("div",{className:"runtime-timer right",children:v.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:S})]})]}),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===f.Overtime&&"event-timer--finished",c.playback===N.Pause&&"event-timer--paused"]),style:{"--phase-color":y},"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(ne,{}),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 ne(){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 oe(){const s=I(l=>l.mirror),{data:t,status:i}=q(),{data:a,status:r}=M(),{data:c,status:n}=F();return{data:{projectData:t,isMirrored:s,settings:c,viewSettings:a},status:$([i,r,n])}}function we(){const{data:s,status:t}=oe();return z("Studio Clock"),t==="pending"?e.jsx(V,{}):t==="error"?e.jsx(H,{text:"There was an error fetching data, please refresh the page."}):e.jsx(le,{...s})}function le({projectData:s,isMirrored:t,settings:i,viewSettings:a}){const{hideCards:r}=Z(),c=D(i==null?void 0:i.timeFormat),n=j.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(R,{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(ae,{hideCards:r}),!r&&e.jsx(de,{viewSettings:a})]})]})}export{we as default};
|
|
2
|
+
//# sourceMappingURL=Studio-BzwFDYzk.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Studio-BzwFDYzk.js","sources":["../../src/views/studio/studio.options.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 { 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])}>{schedule.offset}</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","title","OptionTitle","ClockOptions","collapsible","options","getTimeOption","ElementVisibility","id","description","type","defaultValue","getOptionsFromParams","searchParams","defaultValues","hideCards","isStringBoolean","key","get","useStudioOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","URLSearchParams","search","undefined","getLargeClockData","clock","display","meridian","formatted","formatTime","endsWith","slice","seconds","secondsInMillis","activeIndicators","Array","keys","secondsIndicators","StudioClock","isSmallScreen","useIsSmallScreen","playback","useStudioClockSocket","onAir","Playback","Stop","jsx","StudioClockMobile","jsxs","map","i","cx","transform","Boolean","displayClock","SuperscriptTime","format12","format24","getFormattedScheduleTimes","data","actualStart","expectedEnd","offset","getOffsetText","getFormattedEventData","eventNow","timer","startedAt","expectedFinish","millisToString","current","StudioTimers","viewSettings","getLocalizedString","useTranslation","eventNext","message","time","rundown","expectedRundownEnd","useStudioTimersSocket","schedule","event","eventNextTitle","formattedTimerMessage","visible","text","formattedSecondaryMessage","secondarySource","secondary","timerColour","getTimerColour","phase","TimerPhase","Warning","Danger","offsetState","getOffsetState","Overtime","Pause","StudioTimersAux","auxTimer","useAuxTimersTime","aux1","aux2","aux3","useStudioData","isMirrored","useViewOptionsStore","state","mirror","projectData","status","projectDataStatus","useProjectData","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","aggregateQueryStatus","StudioLoader","useWindowTitle","Loader","EmptyPage","Studio","defaultFormat","getDefaultFormat","studioOptions","ViewParamsEditor","OntimeView","logo","ViewLogo"],"mappings":"+nCASaA,MAAAA,EAAoBC,GAAqC,CACpE,CAAEC,MAAOC,EAAYC,aAAcC,YAAa,GAAMC,QAAS,CAACC,EAAcN,CAAU,CAAC,CAAE,EAC3F,CACEC,MAAOC,EAAYK,kBACnBH,YAAa,GACbC,QAAS,CACP,CACEG,GAAI,YACJP,MAAO,qBACPQ,YAAa,yCACbC,KAAM,UACNC,aAAc,EACf,CAAA,CAEL,CAAC,EAWH,SAASC,EAAqBC,EAA+BC,EAAgD,CAIpG,MAAA,CACLC,UAAWC,GAHKC,IAAgBH,GAAAA,YAAAA,EAAeI,IAAID,KAAQJ,EAAaK,IAAID,CAAG,GAG3C,WAAW,CAAC,CAClD,CACF,CAKO,SAASE,GAAkC,CAC1C,KAAA,CAACN,CAAY,EAAIO,EAAgB,EACjCC,EAAcC,MAAIC,CAAa,EAO9BlB,OALSmB,EAAAA,QAAQ,IAAM,CAC5B,MAAMV,EAAgBO,EAAc,IAAII,gBAAgBJ,EAAYK,MAAM,EAAIC,OACvEf,OAAAA,EAAqBC,EAAcC,CAAa,CAAA,EACtD,CAACO,EAAaR,CAAY,CAAC,CAGhC,CCjDO,SAASe,GAAkBC,EAAe,CAC/C,KAAM,CAACC,EAASC,CAAQ,GAAK,IAAM,CAC3BC,MAAAA,EAAYC,EAAWJ,CAAK,EAC9BG,OAAAA,EAAUE,SAAS,IAAI,EAClB,CAACF,EAAUG,MAAM,EAAG,EAAE,EAAG,IAAI,EAElCH,EAAUE,SAAS,IAAI,EAClB,CAACF,EAAUG,MAAM,EAAG,EAAE,EAAG,IAAI,EAE/B,CAACH,EAAWL,MAAS,CAAA,GAC3B,EAEI,MAAA,CAAES,QAASC,EAAgBR,CAAK,EAAGC,QAAAA,EAASC,SAAAA,CAAS,CAC9D,CCRA,MAAMO,GAAmB,CAAC,GAAGC,MAAM,EAAE,EAAEC,MAAM,EACvCC,GAAoB,CAAC,GAAGF,MAAM,EAAE,EAAEC,MAAM,EAM9C,SAAwBE,GAAY,CAAE3B,UAAAA,CAA4B,EAAG,CACnE,MAAM4B,EAAgBC,EAAiB,EACjC,CAAEf,MAAAA,EAAOgB,SAAAA,GAAaC,EAAqB,EAC3CC,EAAQF,IAAaG,EAASC,KAGhCN,GAAAA,GAAiB,CAAC5B,EACb,OAAAmC,EAAA,IAACC,GAAkB,CAAA,MAAAtB,EAAc,MAAAkB,CAAgB,CAAA,EAGpD,KAAA,CAAEX,QAAAA,EAASN,QAAAA,EAASC,SAAAA,CAAAA,EAAaH,GAAkBC,CAAK,EAE9D,aACG,MAAI,CAAA,UAAU,gBACb,SAACuB,EAAA,KAAA,MAAA,CAAI,UAAU,kBACZX,SAAAA,CAAAA,GAAkBY,IAAWC,GAE1BJ,MAAC,MAEC,CAAA,UAAWK,EAAG,CAAC,OAAQD,GAAKlB,GAAW,cAAc,CAAC,EACtD,MAAO,CAAEoB,UAAW,UAAU,IAAMF,EAAI,CAAC,sCAFpCA,CAGL,CAEL,EACAhB,GAAiBe,IAAKC,SACpB,MAEC,CAAA,UAAU,oBACV,MAAO,CACLE,UAAW,UAAU,IAAMF,EAAI,EAAE,2CAAA,CACnC,EAJKA,EAMR,EACAJ,EAAAA,IAAA,MAAA,CAAI,UAAWK,EAAG,CAAC,OAAQE,EAAQ1B,GAAa,cAAc,CAAC,EAAIA,SAASA,CAAA,CAAA,EAC5EmB,EAAA,IAAA,MAAA,CAAI,UAAU,mBAAoBpB,SAAQA,EAAA,EAC3CoB,EAAAA,IAAC,MAAI,CAAA,UAAWK,EAAG,CAAC,SAAUR,GAAS,gBAAgB,CAAC,EAAG,SAAM,QAAA,CAAA,CAAA,CAAA,CACnE,CACF,CAAA,CAEJ,CAOA,SAASI,GAAkB,CAAEtB,MAAAA,EAAOkB,MAAAA,CAA8B,EAAG,CAC7DW,MAAAA,EAAezB,EAAWJ,CAAK,EAGnC,OAAAuB,EAAA,KAAC,MAAI,CAAA,UAAU,qCACb,SAAA,CAAAF,EAAA,IAACS,EAAgB,CAAA,UAAU,mBAAmB,KAAMD,EAAa,EACjER,EAAAA,IAAC,MAAI,CAAA,UAAWK,EAAG,CAAC,SAAUR,GAAS,gBAAgB,CAAC,EAAG,SAAM,QAAA,CAAA,CAAA,EACnE,CAEJ,CCpEA,MAAM/C,EAAa,CAAE4D,SAAU,SAAUC,SAAU,OAAQ,EACpD,SAASC,GAA0BC,EAIvC,CACM,MAAA,CACLC,YAAa/B,EAAW8B,EAAKC,YAAahE,CAAU,EACpDiE,YAAahC,EAAW8B,EAAKE,YAAajE,CAAU,EACpDkE,OAAQC,EAAcJ,EAAKG,MAAM,CACnC,CACF,CAEgBE,SAAAA,GAAsBC,EAA8BC,EAAmB,CAC9E,MAAA,CACLrE,OAAOoE,GAAAA,YAAAA,EAAUpE,QAAS,IAC1BsE,UAAWtC,EAAWqC,EAAMC,UAAWvE,CAAU,EACjDiE,YAAahC,EAAWqC,EAAME,eAAgBxE,CAAU,EACxDsE,MAAOG,EAAeH,EAAMI,OAAO,CACrC,CACF,CCTA,SAAwBC,GAAa,CAAEC,aAAAA,CAAgC,EAAG,CAClE,KAAA,CAAEC,mBAAAA,GAAuBC,EAAe,EACxC,CAAET,SAAAA,EAAUU,UAAAA,EAAWC,QAAAA,EAASC,KAAAA,EAAMf,OAAAA,EAAQgB,QAAAA,EAASC,mBAAAA,GAAuBC,EAAsB,EAEpGC,EAAWvB,GAA0B,CACzCI,OAAAA,EACAF,YAAakB,EAAQlB,YACrBC,YAAakB,CAAAA,CACd,EACKG,EAAQlB,GAAsBC,EAAUY,CAAI,EAC5CM,GAAiBR,GAAAA,YAAAA,EAAW9E,QAAS,IACrCuF,EAAyBR,EAAQV,MAAMmB,SAAWT,EAAQV,MAAMoB,MAAS,IACzEC,EAA4BX,EAAQV,MAAMsB,kBAAoB,aAAcZ,EAAQa,WAAa,IAGjGC,EAAcC,EAClBnB,EACAjD,OACAsD,EAAKe,QAAUC,EAAWC,QAC1BjB,EAAKe,QAAUC,EAAWE,MAC5B,EAEMC,EAAcC,EAAenC,CAAM,EAGvC,OAAAd,EAAA,KAAC,MAAI,CAAA,UAAU,iBACb,SAAA,CAACF,EAAAA,IAAA,MAAA,CAAI,UAAU,OAAO,GAAG,gBACvB,SAACE,EAAA,KAAA,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAAAF,MAAC,MAAI,CAAA,UAAU,QAAS2B,SAAAA,EAAmB,mBAAmB,EAAE,EAC/D3B,EAAA,IAAA,MAAA,CAAI,UAAU,gBAAiBmC,WAASrB,WAAY,CAAA,CAAA,EACvD,SACC,MACC,CAAA,SAAA,CAACd,EAAA,IAAA,MAAA,CAAI,UAAU,eAAe,SAAY,eAAA,EACzCA,EAAA,IAAA,MAAA,CAAI,UAAWK,EAAG,CAAC,gBAAiB,SAAU,CAACc,GAAY,QAAS+B,CAAW,CAAC,EAAIf,WAASnB,MAAO,CAAA,CAAA,EACvG,SACC,MACC,CAAA,SAAA,CAAAhB,MAAC,MAAI,CAAA,UAAU,cAAe2B,SAAAA,EAAmB,qBAAqB,EAAE,EACvE3B,EAAA,IAAA,MAAA,CAAI,UAAU,sBAAuBmC,WAASpB,WAAY,CAAA,CAAA,CAC7D,CAAA,CAAA,CAAA,CACF,CACF,CAAA,EAECb,EAAA,KAAA,MAAA,CAAI,UAAU,OAAO,GAAG,iBACvB,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAAAF,MAAC,MAAI,CAAA,UAAU,QAAS2B,SAAAA,EAAmB,YAAY,EAAE,EACxD3B,EAAA,IAAA,MAAA,CAAI,UAAU,QAASoC,WAAMrF,KAAM,CAAA,CAAA,EACtC,SACC,MACC,CAAA,SAAA,CAAAiD,MAAC,MAAI,CAAA,UAAU,cAAe2B,SAAAA,EAAmB,aAAa,EAAE,EAC/D3B,EAAA,IAAA,MAAA,CAAI,UAAU,cAAeqC,SAAeA,CAAA,CAAA,CAAA,CAC/C,CAAA,CAAA,EACF,EAEAnC,EAAAA,KAAC,MAAI,CAAA,UAAU,YACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAAAF,MAAC,MAAI,CAAA,UAAU,QAAS2B,SAAAA,EAAmB,mBAAmB,EAAE,EAC/D3B,EAAA,IAAA,MAAA,CAAI,UAAU,gBAAiBoC,WAAMf,SAAU,CAAA,CAAA,EAClD,SACC,MACC,CAAA,SAAA,CAACrB,EAAAA,IAAA,MAAA,CAAI,UAAU,OAAO,CAAA,QACrB,MACC,CAAA,UAAWK,EAAG,CACZ,cACA0B,EAAKe,QAAUC,EAAWK,UAAY,wBACtCrB,EAAKpC,WAAaG,EAASuD,OAAS,qBAAqB,CAC1D,EACD,MAAO,CACL,gBAAiBT,CAAAA,EAEnB,aAAYb,EAAKe,MAEhBV,WAAMhB,KACT,CAAA,CAAA,EACF,SACC,MACC,CAAA,SAAA,CAAApB,MAAC,MAAI,CAAA,UAAU,cAAe2B,SAAAA,EAAmB,qBAAqB,EAAE,EACvE3B,EAAA,IAAA,MAAA,CAAI,UAAU,sBAAuBoC,WAAMrB,WAAY,CAAA,CAAA,CAC1D,CAAA,CAAA,CACF,CAAA,CAAA,EACF,QAECuC,GAAe,EAAA,QAEf,MAAI,CAAA,UAAU,OAAO,GAAG,qBACvB,gBAAC,MACC,CAAA,SAAA,CAACtD,EAAA,IAAA,MAAA,CAAI,UAAU,QAAQ,SAAa,gBAAA,EACpCA,MAAC,MAAI,CAAA,UAAWK,EAAG,CAAC,QAAS,EAAiC,CAAC,EAAIiC,SAAsBA,CAAA,CAAA,CAAA,CAAA,CAC3F,CACF,CAAA,QAEC,MAAI,CAAA,UAAU,OAAO,GAAG,yBACvB,gBAAC,MACC,CAAA,SAAA,CAACtC,EAAA,IAAA,MAAA,CAAI,UAAU,QAAQ,SAAiB,oBAAA,EACxCA,EAAAA,IAAC,MAAI,CAAA,UAAWK,EAAG,CAAC,QAAS,CAACoC,GAA6B,OAAO,CAAC,EAAIA,SAA0BA,CAAA,CAAA,CAAA,CAAA,CACnG,CACF,CAAA,CAAA,EACF,CAEJ,CAEA,SAASa,IAAkB,CACzB,MAAMC,EAAWC,EAAiB,EAGhC,OAAAxD,EAAA,IAAC,OAAI,UAAU,OAAO,GAAG,WACvB,SAAAE,EAAA,KAAC,MAAI,CAAA,UAAU,YACb,SAAA,CAAAA,OAAC,MACC,CAAA,SAAA,CAACF,EAAA,IAAA,MAAA,CAAI,UAAU,QAAQ,SAAK,QAAA,QAC3B,MAAI,CAAA,UAAU,QAASuB,SAAegC,EAAAA,EAASE,IAAI,CAAE,CAAA,CAAA,EACxD,SAEC,MACC,CAAA,SAAA,CAACzD,EAAA,IAAA,MAAA,CAAI,UAAU,eAAe,SAAK,QAAA,QAClC,MAAI,CAAA,UAAU,eAAgBuB,SAAegC,EAAAA,EAASG,IAAI,CAAE,CAAA,CAAA,EAC/D,SAEC,MACC,CAAA,SAAA,CAAC1D,EAAA,IAAA,MAAA,CAAI,UAAU,cAAc,SAAK,QAAA,QACjC,MAAI,CAAA,UAAU,cAAeuB,SAAegC,EAAAA,EAASI,IAAI,CAAE,CAAA,CAAA,CAC9D,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ,CC/HO,SAASC,IAAsC,CAEpD,MAAMC,EAAaC,EAA+BC,GAAAA,EAAMC,MAAM,EAGxD,CAAEnD,KAAMoD,EAAaC,OAAQC,GAAsBC,EAAe,EAClE,CAAEvD,KAAMa,EAAcwC,OAAQG,GAAuBC,EAAgB,EACrE,CAAEzD,KAAM0D,EAAUL,OAAQM,GAAmBC,EAAY,EAExD,MAAA,CACL5D,KAAM,CACJoD,YAAAA,EACAJ,WAAAA,EACAU,SAAAA,EACA7C,aAAAA,CACF,EACAwC,OAAQQ,EAAqB,CAACP,EAAmBE,EAAoBG,CAAc,CAAC,CACtF,CACF,CCfA,SAAwBG,IAAe,CAC/B,KAAA,CAAE9D,KAAAA,EAAMqD,OAAAA,GAAWN,GAAc,EAIvC,OAFAgB,EAAe,cAAc,EAEzBV,IAAW,gBACLW,EAAS,EAAA,EAGfX,IAAW,QACNlE,EAAA,IAAC8E,EAAU,CAAA,KAAK,4DAA+D,CAAA,EAGjF9E,MAAC+E,GAAWlE,CAAAA,GAAAA,CAAQ,CAAA,CAC7B,CAEA,SAASkE,GAAO,CAAEd,YAAAA,EAAaJ,WAAAA,EAAYU,SAAAA,EAAU7C,aAAAA,CAAyB,EAAG,CACzE,KAAA,CAAE7D,UAAAA,GAAcI,EAAiB,EAGjC+G,EAAgBC,EAAiBV,GAAAA,YAAAA,EAAUzH,UAAU,EACrDoI,EAAgB5G,EAAAA,QAAQ,IAAMzB,EAAiBmI,CAAa,EAAG,CAACA,CAAa,CAAC,EAGlF,OAAA9E,EAAA,KAAC,MAAI,CAAA,UAAWG,EAAG,CAAC,SAAUwD,GAAc,QAAQ,CAAC,EAAG,cAAY,cAClE,SAAA,CAAA7D,EAAA,IAACmF,EAAiB,CAAA,OAAQC,EAAW5F,YAAa,YAAa0F,EAAc,EAE7EhF,EAAAA,KAAC,MAAI,CAAA,UAAU,iBACZ+D,SAAAA,EAAAA,GAAAA,YAAAA,EAAaoB,OAASrF,EAAA,IAAAsF,EAAA,CAAS,KAAMrB,EAAYoB,KAAM,UAAU,OAAS,EAC1ErF,EAAA,IAAA,MAAA,CAAI,UAAU,QAASiE,WAAYlH,KAAM,CAAA,CAAA,EAC5C,EAEAmD,OAAC,OAAI,UAAWG,EAAG,CAAC,kBAAmBxC,GAAa,yBAAyB,CAAC,EAC5E,SAAA,CAAAmC,MAACR,IAAY,UAAA3B,EAAqB,EACjC,CAACA,GAAcmC,EAAAA,IAAAyB,GAAA,CAAa,aAAAC,CAA8B,CAAA,CAAA,CAC7D,CAAA,CAAA,EACF,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{h as s,j as u,cf as y,cg as g}from"./vendor-Cdwxo8bP.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="c02a01ff-d919-488a-8393-ba4a5dd3dfb3",e._sentryDebugIdIdentifier="sentry-dbid-c02a01ff-d919-488a-8393-ba4a5dd3dfb3")}catch{}})();const h="_wrapper_1l24u_17",b={wrapper:h},c=s.forwardRef((e,r)=>{const{language:d,initialValue:t,isDirty:i,setIsDirty:o}=e,[a,f]=s.useState(t),p=n=>{const l=g.languages[d];return l?g.highlight(n,l,d):n},m=n=>{f(n)};return s.useImperativeHandle(r,()=>({getCss:()=>a})),s.useEffect(()=>{f(t)},[t]),s.useEffect(()=>{t.trim()!==a.trim()&&!i&&a.length!==0&&o(!0),t.trim()===a.trim()&&i&&o(!1)},[t,a,i,o]),u.jsx("div",{className:b.wrapper,children:u.jsx(y,{value:a,padding:15,onValueChange:m,highlight:p,style:{fontFamily:"monospace",fontSize:12,minHeight:500,background:"#2d2d2d"}})})});c.displayName="StyleEditor";const E=s.memo(c);export{E as default};
|
|
2
|
+
//# sourceMappingURL=StyleEditor-RZvkKHdf.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StyleEditor-
|
|
1
|
+
{"version":3,"file":"StyleEditor-RZvkKHdf.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","languages","handleChange","newCode","useImperativeHandle","getCss","useEffect","trim","length","jsx","style","wrapper","Editor","fontFamily","fontSize","minHeight","background","displayName","memo"],"mappings":"ocAeMA,EAAaC,EAAAA,WAAW,CAACC,EAAwBC,IAAW,CAC1D,KAAA,CAAEC,SAAAA,EAAUC,aAAAA,EAAcC,QAAAA,EAASC,WAAAA,CAAAA,EAAeL,EAElD,CAACM,EAAMC,CAAO,EAAIC,EAAAA,SAASL,CAAY,EAEvCM,EAAaH,GAAiB,CAC5BI,MAAAA,EAAUC,EAAMC,UAAUV,CAAQ,EACxC,OAAOQ,EAAUC,EAAMF,UAAUH,EAAMI,EAASR,CAAQ,EAAII,CAC9D,EAEMO,EAAgBC,GAAoB,CACxCP,EAAQO,CAAO,CACjB,EAEAC,OAAAA,EAAAA,oBAAoBd,EAAQ,KACnB,CACLe,OAAQA,IAAMV,CAChB,EACD,EAGDW,EAAAA,UAAU,IAAM,CACdV,EAAQJ,CAAY,CAAA,EACnB,CAACA,CAAY,CAAC,EAGjBc,EAAAA,UAAU,IAAM,CACVd,EAAae,KAAK,IAAMZ,EAAKY,QAAU,CAACd,GAAWE,EAAKa,SAAW,GACrEd,EAAW,EAAI,EAGbF,EAAae,KAAK,IAAMZ,EAAKY,KAAAA,GAAUd,GACzCC,EAAW,EAAK,GAEjB,CAACF,EAAcG,EAAMF,EAASC,CAAU,CAAC,EAGzCe,EAAAA,IAAA,MAAA,CAAI,UAAWC,EAAMC,QACpB,SAACF,MAAAG,EAAA,CACC,MAAOjB,EACP,QAAS,GACT,cAAeO,EACf,UAAAJ,EACA,MAAO,CACLe,WAAY,YACZC,SAAU,GACVC,UAAW,IACXC,WAAY,WACZ,CAEN,CAAA,CAEJ,CAAC,EAED7B,EAAW8B,YAAc,cAEzB,MAAeC,EAAAA,EAAAA,KAAK/B,CAAU"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as r}from"./vendor-Cdwxo8bP.js";/* empty css */(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]="b1dfaf34-929a-4832-9b14-d8e906a6e532",e._sentryDebugIdIdentifier="sentry-dbid-b1dfaf34-929a-4832-9b14-d8e906a6e532")}catch{}})();function o({time:e,className:d}){const[i,n]=e.split(" ");return r.jsxs("div",{className:d,children:[i,n&&r.jsx("sup",{className:"period",children:n})]})}export{o as S};
|
|
2
|
+
//# sourceMappingURL=SuperscriptPeriod-DaZq1rr6.js.map
|
|
Binary file
|
|
Binary file
|