diff --git a/apps/client/src/common/components/title-card/TitleCard.scss b/apps/client/src/common/components/title-card/TitleCard.scss index e534aeb3a..7047ff430 100644 --- a/apps/client/src/common/components/title-card/TitleCard.scss +++ b/apps/client/src/common/components/title-card/TitleCard.scss @@ -4,40 +4,60 @@ position: relative; display: flex; flex-direction: column; -} -.title-card__title, -.title-card__placeholder { - font-weight: 600; - font-size: $title-font-size; - line-height: 1.2em; -} + background-color: var(--card-background-color-override, $viewer-card-bg-color); + padding: $view-card-padding; + border-radius: $element-border-radius; -.title-card__title { - color: var(--color-override, $viewer-color); - padding-right: 1em; - min-height: 1.2em; -} + border-left: 1vw solid; -.title-card__placeholder { - color: var(--label-color-override, $viewer-label-color); -} + .title-card__title:empty::before { + color: var(--label-color-override, $viewer-label-color); + content: attr(data-placeholder); + } -.title-card__secondary { - font-size: $base-font-size; - color: var(--secondary-color-override, $viewer-secondary-color); - line-height: 1.2em; -} + .title-card__title { + font-weight: 600; + line-height: 1.4em; + padding-right: 1em; + color: var(--color-override, $viewer-color); + } -.title-card__label { - position: absolute; - right: 1rem; - top: 0.5rem; - font-size: $timer-label-size; - color: var(--secondary-color-override, $viewer-secondary-color); - text-transform: uppercase; + .title-card__secondary { + color: var(--secondary-color-override, $viewer-secondary-color); + line-height: 1.2em; + } - &--accent { - color: var(--accent-color-override, $accent-color); + &.md { + .title-card__title { + font-size: $title-font-size; + } + .title-card__secondary { + font-size: $base-font-size; + } + } + &.lg { + .title-card__title { + font-size: $large-font-size; + } + .title-card__secondary { + font-size: $title-font-size; + } + .schedule__ { + font-size: $base-font-size; + } + } + + .title-card__label { + position: absolute; + right: 1rem; + top: 0.5rem; + font-size: $timer-label-size; + color: var(--secondary-color-override, $viewer-secondary-color); + text-transform: uppercase; + + &--accent { + color: var(--accent-color-override, $accent-color); + } } } diff --git a/apps/client/src/common/components/title-card/TitleCard.tsx b/apps/client/src/common/components/title-card/TitleCard.tsx index d2f773305..442e75150 100644 --- a/apps/client/src/common/components/title-card/TitleCard.tsx +++ b/apps/client/src/common/components/title-card/TitleCard.tsx @@ -1,33 +1,60 @@ -import { ForwardedRef, forwardRef } from 'react'; +import { OntimeEvent } from 'ontime-types'; import { useTranslation } from '../../../translation/TranslationProvider'; -import { cx } from '../../utils/styleUtils'; +import { ExtendedEntry } from '../../utils/rundownMetadata'; +import { cx, enDash } from '../../utils/styleUtils'; import './TitleCard.scss'; -interface TitleCardProps { +type TitleCardMainProps = { title?: string; label?: 'now' | 'next'; secondary?: string; className?: string; -} + colour?: string; + textAlign?: 'left' | 'right' | 'center'; + size?: 'md' | 'lg'; + placeholder?: string; +}; + +type TitleCardExpectedProps = TitleCardMainProps & { + event: ExtendedEntry; + expectedStart: number; + showExpected: boolean; +}; + +type TitleCardNoExpectedProps = TitleCardMainProps & { + event?: undefined; + expectedStart?: undefined; + showExpected?: false; +}; + +type TitleCardProps = TitleCardExpectedProps | TitleCardNoExpectedProps; + +export default function TitleCard({ + label, + title, + secondary, + className = '', + colour = 'transparent', + textAlign = 'left', + size = 'md', + placeholder = enDash, +}: TitleCardProps) { + 'use memo'; -const TitleCard = forwardRef((props: TitleCardProps, ref: ForwardedRef) => { - const { label, title, secondary, className = '' } = props; const { getLocalizedString } = useTranslation(); - const accent = label === 'now'; return ( -
- {title} +
+ + {title === '' ? null : title} + {label && getLocalizedString(`common.${label}`)}
{secondary}
); -}); - -TitleCard.displayName = 'TitleCard'; -export default TitleCard; +} diff --git a/apps/client/src/theme/_viewerDefs.scss b/apps/client/src/theme/_viewerDefs.scss index 4ac9568a1..6520a5a9f 100644 --- a/apps/client/src/theme/_viewerDefs.scss +++ b/apps/client/src/theme/_viewerDefs.scss @@ -12,6 +12,7 @@ $viewer-opacity-disabled: 0.6; $timer-label-size: clamp(12px, 1.25vw, 20px); $base-font-size: clamp(15px, 1.5vw, 28px); $title-font-size: clamp(18px, 2.25vw, 42px); +$large-font-size: clamp(40px, 4.5vw, 80px); $timer-value-size: clamp(24px, 2.5vw, 48px); $header-font-size: clamp(24px, 2.5vw, 48px); diff --git a/apps/client/src/views/backstage/Backstage.scss b/apps/client/src/views/backstage/Backstage.scss index a02226a16..d5efcdb1b 100644 --- a/apps/client/src/views/backstage/Backstage.scss +++ b/apps/client/src/views/backstage/Backstage.scss @@ -32,6 +32,11 @@ color: var(--label-color-override, $viewer-label-color); } + .title-card { + // overwrite the title-card bg color so they don't stack as it is transparent + background-color: transparent; + } + /* =================== HEADER + EXTRAS ===================*/ .project-header { diff --git a/apps/client/src/views/backstage/backstage.utils.ts b/apps/client/src/views/backstage/backstage.utils.ts index e9d272b11..b4fdc9d0b 100644 --- a/apps/client/src/views/backstage/backstage.utils.ts +++ b/apps/client/src/views/backstage/backstage.utils.ts @@ -1,6 +1,5 @@ import { MaybeNumber, OntimeEvent, Playback, TimerPhase } from 'ontime-types'; -import { enDash } from '../../common/utils/styleUtils'; import { getPropertyValue } from '../common/viewUtils'; /** @@ -46,9 +45,9 @@ export function getCardData( } // if we are loaded, we show the upcoming event as next - const nowMain = getPropertyValue(eventNow, mainSource ?? 'title') || enDash; + const nowMain = getPropertyValue(eventNow, mainSource ?? 'title'); const nowSecondary = getPropertyValue(eventNow, secondarySource); - const nextMain = getPropertyValue(eventNext, mainSource ?? 'title') || enDash; + const nextMain = getPropertyValue(eventNext, mainSource ?? 'title'); const nextSecondary = getPropertyValue(eventNext, secondarySource); return { diff --git a/apps/client/src/views/timer/Timer.scss b/apps/client/src/views/timer/Timer.scss index 5f3b9bf98..7ab83a0b3 100644 --- a/apps/client/src/views/timer/Timer.scss +++ b/apps/client/src/views/timer/Timer.scss @@ -65,10 +65,6 @@ /* =================== TITLES ===================*/ .event { - background-color: var(--card-background-color-override, $viewer-card-bg-color); - padding: $view-card-padding; - border-radius: $element-border-radius; - &.now { grid-area: now; } diff --git a/apps/client/src/views/timer/Timer.tsx b/apps/client/src/views/timer/Timer.tsx index 3ae139d26..1335f30d6 100644 --- a/apps/client/src/views/timer/Timer.tsx +++ b/apps/client/src/views/timer/Timer.tsx @@ -206,8 +206,24 @@ function Timer({ customFields, projectData, isMirrored, settings, viewSettings, {!hideCards && ( <> - {showNow && } - {showNext && } + {showNow && ( + + )} + {showNext && ( + + )} )}