diff --git a/apps/client/src/features/app-settings/panel/general-panel/ViewSettingsForm.tsx b/apps/client/src/features/app-settings/panel/general-panel/ViewSettingsForm.tsx
index 9e842d04b..d3dbb08ae 100644
--- a/apps/client/src/features/app-settings/panel/general-panel/ViewSettingsForm.tsx
+++ b/apps/client/src/features/app-settings/panel/general-panel/ViewSettingsForm.tsx
@@ -13,7 +13,7 @@ import * as Panel from '../PanelUtils';
import style from './GeneralPanel.module.scss';
-const cssOverrideDocsUrl = 'https://ontime.gitbook.io/v2/features/custom-styling';
+const cssOverrideDocsUrl = 'https://docs.getontime.no/features/custom-styling/';
export default function ViewSettingsForm() {
const { data, status, refetch, isFetching } = useViewSettings();
diff --git a/apps/client/src/features/app-settings/panel/integrations-panel/IntegrationsPanel.tsx b/apps/client/src/features/app-settings/panel/integrations-panel/IntegrationsPanel.tsx
index f78519645..8da16b5fa 100644
--- a/apps/client/src/features/app-settings/panel/integrations-panel/IntegrationsPanel.tsx
+++ b/apps/client/src/features/app-settings/panel/integrations-panel/IntegrationsPanel.tsx
@@ -6,7 +6,7 @@ import * as Panel from '../PanelUtils';
import HttpIntegrations from './HttpIntegrations';
import OscIntegrations from './OscIntegrations';
-const integrationDocsUrl = 'https://ontime.gitbook.io/v2/control-and-feedback/integrations';
+const integrationDocsUrl = 'https://docs.getontime.no/api/integrations/';
export default function IntegrationsPanel() {
return (
diff --git a/apps/client/src/features/app-settings/panel/project-panel/ProjectCreateForm.tsx b/apps/client/src/features/app-settings/panel/project-panel/ProjectCreateForm.tsx
index e4f3dbe16..cb9743297 100644
--- a/apps/client/src/features/app-settings/panel/project-panel/ProjectCreateForm.tsx
+++ b/apps/client/src/features/app-settings/panel/project-panel/ProjectCreateForm.tsx
@@ -147,7 +147,7 @@ export default function ProjectCreateForm(props: ProjectCreateFromProps) {
diff --git a/apps/client/src/features/app-settings/panel/project-panel/ProjectData.tsx b/apps/client/src/features/app-settings/panel/project-panel/ProjectData.tsx
index b2b770f9e..7dad84a75 100644
--- a/apps/client/src/features/app-settings/panel/project-panel/ProjectData.tsx
+++ b/apps/client/src/features/app-settings/panel/project-panel/ProjectData.tsx
@@ -142,7 +142,7 @@ export default function ProjectData() {
diff --git a/apps/client/src/features/app-settings/panel/project-settings-panel/ProjectSettingsPanel.tsx b/apps/client/src/features/app-settings/panel/project-settings-panel/ProjectSettingsPanel.tsx
index d72e311d9..b279a566d 100644
--- a/apps/client/src/features/app-settings/panel/project-settings-panel/ProjectSettingsPanel.tsx
+++ b/apps/client/src/features/app-settings/panel/project-settings-panel/ProjectSettingsPanel.tsx
@@ -11,7 +11,7 @@ import * as Panel from '../PanelUtils';
import CustomFieldEntry from './CustomFieldEntry';
import CustomFieldForm from './CustomFieldForm';
-const customFieldsDocsUrl = 'https://ontime.gitbook.io/v2/features/user-fields';
+const customFieldsDocsUrl = 'https://docs.getontime.no/features/custom-fields/';
export default function ProjectSettingsPanel() {
const { data, refetch } = useCustomFields();
diff --git a/apps/client/src/features/app-settings/panel/sources-panel/GSheetInfo.tsx b/apps/client/src/features/app-settings/panel/sources-panel/GSheetInfo.tsx
index 959ad4cca..e05871a33 100644
--- a/apps/client/src/features/app-settings/panel/sources-panel/GSheetInfo.tsx
+++ b/apps/client/src/features/app-settings/panel/sources-panel/GSheetInfo.tsx
@@ -1,7 +1,7 @@
import { Alert, AlertDescription, AlertIcon } from '@chakra-ui/react';
import ExternalLink from '../../../../common/components/external-link/ExternalLink';
-const googleSheetDocsUrl = 'https://ontime.gitbook.io/v2/features/google-sheet';
+const googleSheetDocsUrl = 'https://docs.getontime.no/features/import-spreadsheet-gsheet/';
export default function GSheetInfo() {
return (
diff --git a/apps/client/src/features/control/playback/timer-display/TimerDisplay.module.scss b/apps/client/src/features/control/playback/timer-display/TimerDisplay.module.scss
index d9c8d4b85..ee4613a55 100644
--- a/apps/client/src/features/control/playback/timer-display/TimerDisplay.module.scss
+++ b/apps/client/src/features/control/playback/timer-display/TimerDisplay.module.scss
@@ -4,7 +4,7 @@
grid-area: clk;
white-space: nowrap;
max-width: 18.75rem;
-
+ min-width: 5em;
font-family: var(--font-family-override, $viewer-font-family);
color: var(--timer-color-override, $timer-color);
diff --git a/apps/client/src/features/control/playback/timer-display/TimerDisplay.tsx b/apps/client/src/features/control/playback/timer-display/TimerDisplay.tsx
index 066fe02c6..360b39960 100644
--- a/apps/client/src/features/control/playback/timer-display/TimerDisplay.tsx
+++ b/apps/client/src/features/control/playback/timer-display/TimerDisplay.tsx
@@ -11,7 +11,7 @@ interface TimerDisplayProps {
/**
* Displays time in ms in formatted timetag
- * Typically used in production views
+ * Used in editor
*/
export default function TimerDisplay(props: TimerDisplayProps) {
const { time } = props;
diff --git a/apps/client/src/features/editors/Editor.module.scss b/apps/client/src/features/editors/Editor.module.scss
index ebe5581b6..c39cf5e24 100644
--- a/apps/client/src/features/editors/Editor.module.scss
+++ b/apps/client/src/features/editors/Editor.module.scss
@@ -48,8 +48,7 @@ $panel-gap: 0.5rem;
}
.left {
- flex-grow: 1;
- flex-shrink: 1;
+ flex: 1 2 auto; /* flex-grow: 1, flex-shrink: 2, flex-basis: auto */
min-width: $min-playback-width;
max-width: $max-playback-width;
display: flex;
diff --git a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx
index 4b14bf64e..13a0aea5e 100644
--- a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx
+++ b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx
@@ -18,7 +18,7 @@ import OntimeModalFooter from '../OntimeModalFooter';
import style from './SettingsModal.module.scss';
-const aliasesDocsUrl = 'https://ontime.gitbook.io/v2/features/url-aliases';
+const aliasesDocsUrl = 'https://docs.getontime.no/features/url-presets/';
// we wrap the array in an object to be simplify react-hook-form
type Aliases = {
diff --git a/apps/client/src/features/modals/settings-modal/ProjectDataForm.tsx b/apps/client/src/features/modals/settings-modal/ProjectDataForm.tsx
index 28f33b4da..744af1777 100644
--- a/apps/client/src/features/modals/settings-modal/ProjectDataForm.tsx
+++ b/apps/client/src/features/modals/settings-modal/ProjectDataForm.tsx
@@ -122,7 +122,7 @@ export default function ProjectDataForm() {
{...inputProps}
variant='ontime-filled-on-light'
size='sm'
- placeholder='www.ontime.gitbook.io'
+ placeholder='https://docs.getontime.no'
isDisabled={disableInputs}
{...register('backstageUrl')}
/>
diff --git a/apps/client/src/features/overview/Overview.tsx b/apps/client/src/features/overview/Overview.tsx
index 1ce3047a8..16edfd8f3 100644
--- a/apps/client/src/features/overview/Overview.tsx
+++ b/apps/client/src/features/overview/Overview.tsx
@@ -15,7 +15,7 @@ import style from './Overview.module.scss';
* @param time
* @returns
*/
-function formattedTime(time: MaybeNumber) {
+function formatedTime(time: MaybeNumber) {
return millisToString(time, { fallback: timerPlaceholder });
}
@@ -27,13 +27,13 @@ export default function Overview() {
-
-
+
+
-
-
+
+
@@ -51,24 +51,32 @@ function TitlesOverview() {
);
}
+function getOffsetText(offset: MaybeNumber): string {
+ if (offset === null) {
+ return enDash;
+ }
+ const isAhead = offset <= 0;
+ let offsetText = millisToString(Math.abs(offset), { fallback: enDash });
+ if (offsetText !== enDash) {
+ offsetText = isAhead ? `+${offsetText}` : `${enDash}${offsetText}`;
+ }
+ return offsetText;
+}
+
function RuntimeOverview() {
const { clock, numEvents, selectedEventIndex, offset } = useRuntimePlaybackOverview();
const current = selectedEventIndex !== null ? selectedEventIndex + 1 : enDash;
const ofTotal = numEvents || enDash;
const progressText = numEvents ? `${current} of ${ofTotal}` : '-';
-
- const isAhead = offset <= 0;
- let offsetText = millisToString(Math.abs(offset), { fallback: enDash });
- if (offsetText !== enDash) {
- offsetText = isAhead ? `+${offsetText}` : `${enDash}${offsetText}`;
- }
+ const offsetText = getOffsetText(offset);
+ const offsetClasses = offset === null ? undefined : offset > 0 ? style.behind : style.ahead;
return (
<>
-
-
+
+
>
);
}
diff --git a/apps/client/src/features/rundown/Rundown.tsx b/apps/client/src/features/rundown/Rundown.tsx
index b4e376c9e..98f00c8d5 100644
--- a/apps/client/src/features/rundown/Rundown.tsx
+++ b/apps/client/src/features/rundown/Rundown.tsx
@@ -254,7 +254,7 @@ export default function Rundown({ data }: RundownProps) {
data={event}
loaded={isLoaded}
hasCursor={hasCursor}
- next={isNext}
+ isNext={isNext}
previousEnd={previousEnd}
previousEventId={previousEventId}
playback={isLoaded ? featureData.playback : undefined}
diff --git a/apps/client/src/features/rundown/RundownEmpty.tsx b/apps/client/src/features/rundown/RundownEmpty.tsx
index 6f4b20950..44fcec4c7 100644
--- a/apps/client/src/features/rundown/RundownEmpty.tsx
+++ b/apps/client/src/features/rundown/RundownEmpty.tsx
@@ -14,7 +14,7 @@ export default function RundownEmpty(props: RundownEmptyProps) {
return (
-
+
}>
Create Event
diff --git a/apps/client/src/features/rundown/RundownEntry.tsx b/apps/client/src/features/rundown/RundownEntry.tsx
index d9e802da8..e20f06875 100644
--- a/apps/client/src/features/rundown/RundownEntry.tsx
+++ b/apps/client/src/features/rundown/RundownEntry.tsx
@@ -22,7 +22,7 @@ interface RundownEntryProps {
loaded: boolean;
eventIndex: number;
hasCursor: boolean;
- next: boolean;
+ isNext: boolean;
previousEnd: MaybeNumber;
previousEventId?: string;
playback?: Playback; // we only care about this if this event is playing
@@ -30,7 +30,7 @@ interface RundownEntryProps {
}
export default function RundownEntry(props: RundownEntryProps) {
- const { isPast, data, loaded, hasCursor, next, previousEnd, previousEventId, playback, isRolling, eventIndex } =
+ const { isPast, data, loaded, hasCursor, isNext, previousEnd, previousEventId, playback, isRolling, eventIndex } =
props;
const { emitError } = useEmitLog();
const { addEvent, updateEvent, batchUpdateEvents, deleteEvent, swapEvents } = useEventAction();
@@ -138,7 +138,7 @@ export default function RundownEntry(props: RundownEntryProps) {
previousEnd={previousEnd}
colour={data.colour}
isPast={isPast}
- next={next}
+ isNext={isNext}
skip={data.skip}
loaded={loaded}
hasCursor={hasCursor}
diff --git a/apps/client/src/features/rundown/RundownExport.module.scss b/apps/client/src/features/rundown/RundownExport.module.scss
index d2f5e3964..57f5f92b8 100644
--- a/apps/client/src/features/rundown/RundownExport.module.scss
+++ b/apps/client/src/features/rundown/RundownExport.module.scss
@@ -1,8 +1,8 @@
-@use '../editors//EditorMixin' as editor;
+@use '../editors/EditorMixin' as editor;
.rundownExport {
height: 100%;
- flex: 1;
+ flex: 1 1 auto; /* flex-grow: 1, flex-shrink: 1, flex-basis: auto */
&.extracted {
.list {
@@ -34,8 +34,7 @@
padding-left: 0;
box-shadow: $box-shadow-right;
- flex-grow: 1;
- flex-shrink: 1;
+ flex: 1 2 auto; /* flex-grow: 1, flex-shrink: 2, flex-basis: auto */
min-width: 38rem;
max-width: 45rem;
}
@@ -49,8 +48,7 @@
background-color: $gray-1325;
border-radius: 0 8px 8px 0;
- flex-grow: 1;
- flex-shrink: 1;
+ flex: 1 1 auto; /* flex-grow: 1, flex-shrink: 1, flex-basis: auto */
min-width: 30rem;
max-width: 45rem;
}
diff --git a/apps/client/src/features/rundown/common/EditableBlockTitle.tsx b/apps/client/src/features/rundown/common/EditableBlockTitle.tsx
index 6a62bedd1..dbed42cdf 100644
--- a/apps/client/src/features/rundown/common/EditableBlockTitle.tsx
+++ b/apps/client/src/features/rundown/common/EditableBlockTitle.tsx
@@ -1,6 +1,7 @@
-import { useCallback, useEffect, useState } from 'react';
-import { Editable, EditableInput, EditablePreview } from '@chakra-ui/react';
+import { useCallback } from 'react';
+import { Input } from '@chakra-ui/react';
+import useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';
import { useEventAction } from '../../../common/hooks/useEventAction';
import { cx } from '../../../common/utils/styleUtils';
@@ -15,39 +16,40 @@ interface TitleEditorProps {
export default function EditableBlockTitle(props: TitleEditorProps) {
const { title, eventId, placeholder, className } = props;
- const [blockTitle, setBlockTitle] = useState(title || '');
const { updateEvent } = useEventAction();
- useEffect(() => {
- setBlockTitle(title);
- }, [title]);
-
- const handleTitle = useCallback(
+ const submitCallback = useCallback(
(text: string) => {
if (text === title) {
return;
}
const cleanVal = text.trim();
- setBlockTitle(cleanVal);
-
updateEvent({ id: eventId, title: cleanVal });
},
[title, updateEvent, eventId],
);
- const classes = cx([className, style.eventTitle, !blockTitle ? style.noTitle : null]);
+ const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(title, submitCallback, {
+ submitOnEnter: true,
+ });
+
+ const classes = cx([className, style.eventTitle, !value ? style.noTitle : null]);
+
return (
- setBlockTitle(value)}
- onSubmit={(value) => handleTitle(value)}
- >
-
-
-
+ onChange={onChange}
+ onBlur={onBlur}
+ onKeyDown={onKeyDown}
+ autoComplete='off'
+ fontWeight='600'
+ letterSpacing='0.25px'
+ paddingLeft='0'
+ />
);
}
diff --git a/apps/client/src/features/rundown/event-block/EventBlock.module.scss b/apps/client/src/features/rundown/event-block/EventBlock.module.scss
index 277aa2bf1..5acd7bfaa 100644
--- a/apps/client/src/features/rundown/event-block/EventBlock.module.scss
+++ b/apps/client/src/features/rundown/event-block/EventBlock.module.scss
@@ -10,7 +10,7 @@ $skip-opacity: 0.1;
grid-template-areas:
'binder ... ... ...'
'binder pb-actions times actions'
- 'binder pb-actions title next'
+ 'binder pb-actions title title'
'binder pb-actions estatus estatus'
'binder ... ... ...';
@@ -127,15 +127,30 @@ $skip-opacity: 0.1;
.eventTimers {
grid-area: times;
display: flex;
+ align-items: center;
gap: $block-clearance;
height: 100%;
}
-.eventTitle {
+.titleSection {
grid-area: title;
- overflow: hidden;
- max-height: calc(2.5em + 2px);
- line-height: 1.25em;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ .nextTag {
+ font-size: 1rem;
+ color: $orange-500;
+ letter-spacing: 0.03px;
+ font-weight: 600;
+ }
+
+ .eventTitle {
+ overflow: hidden;
+ max-height: calc(2.5em + 2px);
+ line-height: 1.25em;
+ flex: 1;
+ }
}
.eventActions {
@@ -146,10 +161,11 @@ $skip-opacity: 0.1;
.progressBg {
grid-area: progb;
- border-radius: 2px;
+ border-radius: 1px;
background-color: $gray-1100;
opacity: 1;
height: 100%;
+ overflow: hidden; /* clip foreground border radius*/
}
.progressBg.hidden {
@@ -184,15 +200,6 @@ $skip-opacity: 0.1;
overflow-y: hidden;
}
-.nextTag {
- grid-area: next;
- font-size: 1rem;
- color: $orange-500;
- letter-spacing: 0.03px;
- font-weight: 600;
- text-align: right;
-}
-
.eventStatus {
grid-area: status;
display: flex;
diff --git a/apps/client/src/features/rundown/event-block/EventBlock.tsx b/apps/client/src/features/rundown/event-block/EventBlock.tsx
index 2d7189e7b..7f30f6578 100644
--- a/apps/client/src/features/rundown/event-block/EventBlock.tsx
+++ b/apps/client/src/features/rundown/event-block/EventBlock.tsx
@@ -40,7 +40,7 @@ interface EventBlockProps {
previousEnd: MaybeNumber;
colour: string;
isPast: boolean;
- next: boolean;
+ isNext: boolean;
skip: boolean;
loaded: boolean;
hasCursor: boolean;
@@ -76,7 +76,7 @@ export default function EventBlock(props: EventBlockProps) {
previousEnd,
colour,
isPast,
- next,
+ isNext,
skip = false,
loaded,
hasCursor,
@@ -240,7 +240,7 @@ export default function EventBlock(props: EventBlockProps) {
className={blockClasses}
ref={setNodeRef}
style={dragStyle}
- onMouseDown={handleFocusClick}
+ onClick={handleFocusClick}
onContextMenu={onContextMenu}
id='event-block'
>
@@ -268,7 +268,7 @@ export default function EventBlock(props: EventBlockProps) {
title={title}
note={note}
delay={delay}
- next={next}
+ isNext={isNext}
skip={skip}
loaded={loaded}
playback={playback}
diff --git a/apps/client/src/features/rundown/event-block/EventBlockInner.tsx b/apps/client/src/features/rundown/event-block/EventBlockInner.tsx
index fb7f766c1..6e17f7ded 100644
--- a/apps/client/src/features/rundown/event-block/EventBlockInner.tsx
+++ b/apps/client/src/features/rundown/event-block/EventBlockInner.tsx
@@ -41,7 +41,7 @@ interface EventBlockInnerProps {
title: string;
note: string;
delay: number;
- next: boolean;
+ isNext: boolean;
skip: boolean;
loaded: boolean;
playback?: Playback;
@@ -63,7 +63,7 @@ const EventBlockInner = (props: EventBlockInnerProps) => {
title,
note,
delay,
- next,
+ isNext,
skip = false,
loaded,
playback,
@@ -100,12 +100,14 @@ const EventBlockInner = (props: EventBlockInnerProps) => {
linkStart={linkStart}
/>
-
- {next && (
-
- UP NEXT
-
- )}
+
+
+ {isNext && (
+
+ UP NEXT
+
+ )}
+
{
{note}
- {loaded && }
+ {loaded && }
diff --git a/apps/client/src/features/rundown/event-block/RundownIndicators.module.scss b/apps/client/src/features/rundown/event-block/RundownIndicators.module.scss
index 55bd51c07..f2d147f18 100644
--- a/apps/client/src/features/rundown/event-block/RundownIndicators.module.scss
+++ b/apps/client/src/features/rundown/event-block/RundownIndicators.module.scss
@@ -10,6 +10,7 @@ $gap-left: calc(2rem + 0.25rem + 3rem);
display: flex;
gap: 0.5rem;
+ font-weight: 700;
}
@mixin indicator($bg-colour) {
diff --git a/apps/client/src/features/rundown/event-block/composite/EventBlockPlayback.tsx b/apps/client/src/features/rundown/event-block/composite/EventBlockPlayback.tsx
index e713a604e..bae3fd832 100644
--- a/apps/client/src/features/rundown/event-block/composite/EventBlockPlayback.tsx
+++ b/apps/client/src/features/rundown/event-block/composite/EventBlockPlayback.tsx
@@ -1,4 +1,4 @@
-import { memo } from 'react';
+import { memo, MouseEvent } from 'react';
import { IoPause } from '@react-icons/all-files/io5/IoPause';
import { IoPlay } from '@react-icons/all-files/io5/IoPlay';
import { IoReload } from '@react-icons/all-files/io5/IoReload';
@@ -40,11 +40,13 @@ const EventBlockPlayback = (props: EventBlockPlaybackProps) => {
const { eventId, skip, isPlaying, isPaused, loaded, disablePlayback } = props;
const { updateEvent } = useEventAction();
- const toggleSkip = () => {
+ const toggleSkip = (event: MouseEvent) => {
+ event.stopPropagation();
updateEvent({ id: eventId, skip: !skip });
};
- const actionHandler = () => {
+ const actionHandler = (event: MouseEvent) => {
+ event.stopPropagation();
// is playing -> pause
// is paused -> continue
// otherwise -> start
@@ -57,6 +59,11 @@ const EventBlockPlayback = (props: EventBlockPlaybackProps) => {
}
};
+ const load = (event: MouseEvent) => {
+ event.stopPropagation();
+ setEventPlayback.loadEvent(eventId);
+ };
+
const buttonVariant: Partial = {};
if (isPaused) {
@@ -103,7 +110,7 @@ const EventBlockPlayback = (props: EventBlockPlaybackProps) => {
isDisabled={disablePlayback}
{...tooltipProps}
{...blockBtnStyle}
- clickHandler={() => setEventPlayback.loadEvent(eventId)}
+ clickHandler={load}
tabIndex={-1}
/>
;
+ return
;
}
diff --git a/apps/client/src/features/rundown/event-editor/EventEditor.module.scss b/apps/client/src/features/rundown/event-editor/EventEditor.module.scss
index f3d6a7d46..13b70b99d 100644
--- a/apps/client/src/features/rundown/event-editor/EventEditor.module.scss
+++ b/apps/client/src/features/rundown/event-editor/EventEditor.module.scss
@@ -63,6 +63,7 @@
font-size: calc(1rem - 3px);
color: $label-gray;
display: flex;
+ align-items: center;
gap: 0.5rem;
max-width: max-content;
cursor: pointer;
diff --git a/apps/client/src/features/rundown/event-editor/composite/EventEditorTimes.tsx b/apps/client/src/features/rundown/event-editor/composite/EventEditorTimes.tsx
index 0a16b4453..0d7fa853d 100644
--- a/apps/client/src/features/rundown/event-editor/composite/EventEditorTimes.tsx
+++ b/apps/client/src/features/rundown/event-editor/composite/EventEditorTimes.tsx
@@ -135,7 +135,7 @@ const EventEditorTimes = (props: EventEditorTimesProps) => {
Event Visibility
- handleSubmit('isPublic', isPublic)} variant='ontime' />
+ handleSubmit('isPublic', isPublic)} variant='ontime' />
{isPublic ? 'Public' : 'Private'}
diff --git a/apps/client/src/features/rundown/rundown-header/RundownHeader.tsx b/apps/client/src/features/rundown/rundown-header/RundownHeader.tsx
index b370e18f9..6875c1fb0 100644
--- a/apps/client/src/features/rundown/rundown-header/RundownHeader.tsx
+++ b/apps/client/src/features/rundown/rundown-header/RundownHeader.tsx
@@ -22,15 +22,16 @@ export default function RundownHeader() {
}
clickHandler={setFreezeMode}
tooltip='Freeze rundown'
aria-label='Freeze rundown'
+ isDisabled
/>
}
clickHandler={setRunMode}
@@ -38,7 +39,7 @@ export default function RundownHeader() {
aria-label='Run mode'
/>
}
clickHandler={setEditMode}
@@ -47,7 +48,7 @@ export default function RundownHeader() {
/>
- } aria-label='Rundown menu' variant='ontime-ghosted'>
+ } aria-label='Rundown menu' variant='ontime-outlined'>
Rundown
diff --git a/apps/client/src/features/rundown/time-input-flow/TimeInputFlow.module.scss b/apps/client/src/features/rundown/time-input-flow/TimeInputFlow.module.scss
index e4359d972..5d5fbb427 100644
--- a/apps/client/src/features/rundown/time-input-flow/TimeInputFlow.module.scss
+++ b/apps/client/src/features/rundown/time-input-flow/TimeInputFlow.module.scss
@@ -26,4 +26,5 @@
color: $blue-500;
margin-right: 0.5rem;
font-size: 1.5em;
+ display: grid;
}
diff --git a/apps/client/src/features/viewers/timer/Timer.scss b/apps/client/src/features/viewers/timer/Timer.scss
index 7cd00751e..7eedbe2f1 100644
--- a/apps/client/src/features/viewers/timer/Timer.scss
+++ b/apps/client/src/features/viewers/timer/Timer.scss
@@ -30,6 +30,19 @@
transition: $viewer-transition-time;
}
+ .blackout {
+ position: absolute;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
+ z-index: 2;
+ opacity: 0;
+ transition: opacity $viewer-transition-time;
+ &--active {
+ opacity: 1;
+ }
+ }
+
/* =================== CLOCK ===================*/
.clock-container {
diff --git a/apps/client/src/features/viewers/timer/Timer.tsx b/apps/client/src/features/viewers/timer/Timer.tsx
index 8c59679ab..cf7c45cbe 100644
--- a/apps/client/src/features/viewers/timer/Timer.tsx
+++ b/apps/client/src/features/viewers/timer/Timer.tsx
@@ -145,7 +145,7 @@ export default function Timer(props: TimerProps) {
}
const stageTimerCharacters = display.replace('/:/g', '').length;
- const baseClasses = `stage-timer ${isMirrored ? 'mirror' : ''} ${showBlackout ? 'blackout' : ''}`;
+ const baseClasses = `stage-timer ${isMirrored ? 'mirror' : ''}`;
let timerFontSize = 89 / (stageTimerCharacters - 1);
// we need to shrink the timer if the external is going to be there
if (showExternal) {
@@ -162,6 +162,7 @@ export default function Timer(props: TimerProps) {
+
{!userOptions.hideMessage && (
{pres.text}
diff --git a/apps/client/src/index.scss b/apps/client/src/index.scss
index 3e4ee9c74..1213ca8e1 100644
--- a/apps/client/src/index.scss
+++ b/apps/client/src/index.scss
@@ -33,8 +33,19 @@ html,
background-color: $bg-container-l1;
}
-// workaround for chakra
-// // https://github.com/chakra-ui/chakra-ui/issues/417
+/* smaller root size for MacOS laptops */
+@media (max-width: 1600px) {
+ body,
+ html,
+ .App {
+ font-size: 14px;
+ }
+}
+
+/**
+ * workaround for chakra
+ * https://github.com/chakra-ui/chakra-ui/issues/417
+ */
option {
color: initial;
}
diff --git a/apps/client/src/theme/_viewerCommon.scss b/apps/client/src/theme/_viewerCommon.scss
index d0822b85c..d14ad5915 100644
--- a/apps/client/src/theme/_viewerCommon.scss
+++ b/apps/client/src/theme/_viewerCommon.scss
@@ -1,7 +1,3 @@
.mirror {
transform: rotate(180deg);
}
-
-.blackout {
- opacity: 0;
-}
\ No newline at end of file
diff --git a/apps/client/src/theme/ontimeTextInputs.ts b/apps/client/src/theme/ontimeTextInputs.ts
index 00e000762..edfab07f5 100644
--- a/apps/client/src/theme/ontimeTextInputs.ts
+++ b/apps/client/src/theme/ontimeTextInputs.ts
@@ -3,6 +3,7 @@ const commonStyles = {
backgroundColor: '#262626', // $gray-1200
color: '#e2e2e2', // $gray-200
border: '1px solid transparent',
+ borderRadius: '3px',
_hover: {
backgroundColor: '#2d2d2d', // $gray-1100
},
@@ -25,6 +26,18 @@ export const ontimeInputFilled = {
},
};
+export const ontimeInputGhosted = {
+ field: {
+ ...commonStyles,
+ backgroundColor: 'transparent',
+ color: '#f6f6f6', // $gray-50
+ _hover: {
+ backgroundColor: 'transparent', // $gray-1100
+ border: '1px solid #2B5ABC', // $blue-500
+ },
+ },
+};
+
export const ontimeInputFilledOnLight = {
field: {
backgroundColor: 'white',
diff --git a/apps/client/src/theme/theme.ts b/apps/client/src/theme/theme.ts
index 00ddeb4e0..53dfd9a51 100644
--- a/apps/client/src/theme/theme.ts
+++ b/apps/client/src/theme/theme.ts
@@ -23,6 +23,7 @@ import { ontimeTab } from './ontimeTab';
import {
ontimeInputFilled,
ontimeInputFilledOnLight,
+ ontimeInputGhosted,
ontimeTextAreaFilled,
ontimeTextAreaFilledOnLight,
ontimeTextAreaTransparent,
@@ -71,6 +72,7 @@ const theme = extendTheme({
},
variants: {
'ontime-filled': { ...ontimeInputFilled },
+ 'ontime-ghosted': { ...ontimeInputGhosted },
'ontime-filled-on-light': { ...ontimeInputFilledOnLight },
},
},
diff --git a/apps/electron/package.json b/apps/electron/package.json
index cef856577..a2a4c57dc 100644
--- a/apps/electron/package.json
+++ b/apps/electron/package.json
@@ -1,5 +1,5 @@
{
- "name": "ontime",
+ "name": "ontime-prerelease",
"version": "3.0.0-alpha",
"author": "Carlos Valente",
"description": "Time keeping for live events",
@@ -29,8 +29,8 @@
"cleanup": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
},
"build": {
- "productName": "ontime",
- "appId": "no.lightdev.ontime",
+ "productName": "ontime-prerelease",
+ "appId": "no.lightdev.ontime.prerelease",
"asar": true,
"dmg": {
"artifactName": "ontime-macOS-${arch}.dmg",
diff --git a/apps/electron/src/menu/applicationMenu.js b/apps/electron/src/menu/applicationMenu.js
index b63fa5670..21adc1bdb 100644
--- a/apps/electron/src/menu/applicationMenu.js
+++ b/apps/electron/src/menu/applicationMenu.js
@@ -121,6 +121,12 @@ function getApplicationMenu(isMac, askToQuit) {
await shell.openExternal('http://localhost:4001/cuesheet');
},
},
+ {
+ label: 'Operator',
+ click: async () => {
+ await shell.openExternal('http://localhost:4001/operator');
+ },
+ },
],
},
{ type: 'separator' },
@@ -153,7 +159,7 @@ function getApplicationMenu(isMac, askToQuit) {
{
label: 'Online documentation',
click: async () => {
- await shell.openExternal('https://ontime.gitbook.io/');
+ await shell.openExternal('https://docs.getontime.no/');
},
},
],
diff --git a/apps/server/src/api-integration/integration.controller.ts b/apps/server/src/api-integration/integration.controller.ts
index c23adc0c7..5577db1cd 100644
--- a/apps/server/src/api-integration/integration.controller.ts
+++ b/apps/server/src/api-integration/integration.controller.ts
@@ -85,13 +85,13 @@ const actionHandlers: Record
= {
return { payload: 'success' };
}
if ('id' in payload) {
- assert.isString(payload);
- runtimeService.startById(payload);
+ assert.isString(payload.id);
+ runtimeService.startById(payload.id);
return { payload: 'success' };
}
if ('cue' in payload) {
- assert.isString(payload);
- runtimeService.startByCue(payload);
+ assert.isString(payload.cue);
+ runtimeService.startByCue(payload.cue);
return { payload: 'success' };
}
}
diff --git a/apps/server/src/external/demo/app.js b/apps/server/src/external/demo/app.js
index 0af53bb92..64858ba4f 100644
--- a/apps/server/src/external/demo/app.js
+++ b/apps/server/src/external/demo/app.js
@@ -48,7 +48,7 @@ const connectSocket = () => {
// we only need to read message type of ontime
if (type === 'ontime') {
// destructure known data from ontime
- // see https://cpvalente.gitbook.io/ontime/control-and-feedback/websocket-api
+ // see https://docs.getontime.no/api/osc-and-ws/
const { timer, playback } = payload;
const timerElement = document.getElementById('timer');
if (playback == 'stop') {
diff --git a/apps/server/src/external/demo/index.html b/apps/server/src/external/demo/index.html
index 28b06716f..a469f4db5 100644
--- a/apps/server/src/external/demo/index.html
+++ b/apps/server/src/external/demo/index.html
@@ -10,5 +10,5 @@
-
-
\ No newline at end of file
+
+