refactor: param type colour

This commit is contained in:
Carlos Valente
2024-10-11 13:24:44 +02:00
committed by Carlos Valente
parent 24b0cfd24e
commit 089eba3877
7 changed files with 99 additions and 86 deletions
@@ -81,6 +81,17 @@ export default function ParamInput(props: EditFormInputProps) {
); );
} }
if (type === 'colour') {
const currentvalue = `#${searchParams.get(id) ?? defaultValue}`;
return (
<div style={{ display: 'flex', gap: '1rem', alignItems: 'center' }}>
<Input type='color' variant='ontime-filled' name={id} defaultValue={currentvalue} />
<span>{`Current colour: ${currentvalue.toUpperCase()}`}</span>
</div>
);
}
const defaultStringValue = searchParams.get(id) ?? defaultValue; const defaultStringValue = searchParams.get(id) ?? defaultValue;
const { prefix, placeholder } = paramField; const { prefix, placeholder } = paramField;
@@ -19,6 +19,16 @@ import style from './ViewParamsEditor.module.scss';
type ViewParamsObj = { [key: string]: string | FormDataEntryValue }; type ViewParamsObj = { [key: string]: string | FormDataEntryValue };
/**
* Utility remove the # character from a hex string
*/
function sanitiseColour(colour: string) {
if (colour.startsWith('#')) {
return colour.substring(1);
}
return colour;
}
/** /**
* Makes a new URLSearchParams object from the given params object * Makes a new URLSearchParams object from the given params object
*/ */
@@ -41,7 +51,9 @@ const getURLSearchParamsFromObj = (paramsObj: ViewParamsObj, paramFields: ViewOp
// compare which values are different from the default values // compare which values are different from the default values
Object.entries(paramsObj).forEach(([id, value]) => { Object.entries(paramsObj).forEach(([id, value]) => {
if (typeof value === 'string' && value.length && defaultValues[id] !== value) { if (typeof value === 'string' && value.length && defaultValues[id] !== value) {
newSearchParams.set(id, value); // we dont know which values contain colours
// unfortunately this means we run all the strings through the sanitation
newSearchParams.set(id, sanitiseColour(value));
} }
}); });
return newSearchParams; return newSearchParams;
@@ -23,10 +23,11 @@ type MultiOptionsField = {
type StringField = { type: 'string'; defaultValue?: string; prefix?: string; placeholder?: string }; type StringField = { type: 'string'; defaultValue?: string; prefix?: string; placeholder?: string };
type NumberField = { type: 'number'; defaultValue?: number; prefix?: string; placeholder?: string }; type NumberField = { type: 'number'; defaultValue?: number; prefix?: string; placeholder?: string };
type BooleanField = { type: 'boolean'; defaultValue: boolean }; type BooleanField = { type: 'boolean'; defaultValue: boolean };
type ColourField = { type: 'colour'; defaultValue: string; placeholder?: string };
type PersistedField = { type: 'persist'; defaultValue?: string; value: string }; type PersistedField = { type: 'persist'; defaultValue?: string; value: string };
export type ParamField = BaseField & export type ParamField = BaseField &
(StringField | BooleanField | NumberField | OptionsField | MultiOptionsField | PersistedField); (OptionsField | MultiOptionsField | StringField | NumberField | BooleanField | ColourField | PersistedField);
export type ViewOption = ParamSection | ParamField; export type ViewOption = ParamSection | ParamField;
/** /**
@@ -8,26 +8,23 @@ export const getClockOptions = (timeFormat: string): ViewOption[] => [
{ {
id: 'key', id: 'key',
title: 'Key Colour', title: 'Key Colour',
description: 'Background colour in hexadecimal', description: 'Background or key colour for entire view. Default: #000000',
prefix: '#', type: 'colour',
type: 'string', defaultValue: '000000',
placeholder: '00000000 (default)',
}, },
{ {
id: 'text', id: 'text',
title: 'Text Colour', title: 'Text Colour',
description: 'Text colour in hexadecimal', description: 'Text colour. Default: #FFFFFF',
prefix: '#', type: 'colour',
type: 'string', defaultValue: 'FFFFFF',
placeholder: 'fffff (default)',
}, },
{ {
id: 'textbg', id: 'textbg',
title: 'Text Background', title: 'Text Background',
description: 'Colour of text background in hexadecimal', description: 'Background colour for timer text. Default: #FFF0 (transparent)',
prefix: '#', type: 'colour',
type: 'string', defaultValue: 'FFF0',
placeholder: '00000000 (default)',
}, },
{ {
id: 'font', id: 'font',
@@ -39,16 +39,16 @@ const defaultOptions: Readonly<LowerOptions> = {
width: 45, width: 45,
topSrc: 'title', topSrc: 'title',
bottomSrc: 'lowerMsg', bottomSrc: 'lowerMsg',
topColour: '000000ff', topColour: '000000',
bottomColour: '000000ff', bottomColour: '000000',
topBg: '00000000', topBg: 'FFF0',
bottomBg: '00000000', bottomBg: 'FFF0',
topSize: '65px', topSize: '65px',
bottomSize: '40px', bottomSize: '40px',
transition: 3, transition: 3,
delay: 3, delay: 3,
key: 'ffffffff', key: 'FFF0',
lineColour: 'ff0000ff', lineColour: 'FF0000',
lineHeight: '0.4em', lineHeight: '0.4em',
}; };
@@ -31,39 +31,22 @@ export const getLowerThirdOptions = (customFields: CustomFields): ViewOption[] =
values: bottomSourceOptions, values: bottomSourceOptions,
defaultValue: 'none', defaultValue: 'none',
}, },
{ section: 'View animation' },
{
id: 'transition',
title: 'Transition',
description: 'Transition in time in seconds (default 3)',
type: 'number',
placeholder: '3 (default)',
},
{
id: 'delay',
title: 'Delay',
description: 'Delay between transition in and out in seconds (default 3)',
type: 'number',
placeholder: '3 (default)',
},
{ section: 'View style override' }, { section: 'View style override' },
{
id: 'top-colour',
title: 'Top Text Colour',
description: 'Top text colour in hexadecimal',
prefix: '#',
type: 'string',
placeholder: '0000ff (default)',
},
{
id: 'bottom-colour',
title: 'Bottom Text Colour',
description: 'Bottom text colour in hexadecimal',
prefix: '#',
type: 'string',
placeholder: '0000ff (default)',
},
{
id: 'top-bg',
title: 'Top Background Colour',
description: 'Top text background colour in hexadecimal',
prefix: '#',
type: 'string',
placeholder: '00000000 (default)',
},
{
id: 'bottom-bg',
title: 'Bottom Background Colour',
description: 'Bottom text background colour in hexadecimal',
prefix: '#',
type: 'string',
placeholder: '00000000 (default)',
},
{ {
id: 'top-size', id: 'top-size',
title: 'Top Text Size', title: 'Top Text Size',
@@ -86,35 +69,47 @@ export const getLowerThirdOptions = (customFields: CustomFields): ViewOption[] =
prefix: '%', prefix: '%',
placeholder: '45 (default)', placeholder: '45 (default)',
}, },
{
id: 'transition',
title: 'Transition',
description: 'Transition in time in seconds (default 3)',
type: 'number',
placeholder: '3 (default)',
},
{
id: 'delay',
title: 'Delay',
description: 'Delay between transition in and out in seconds (default 3)',
type: 'number',
placeholder: '3 (default)',
},
{ {
id: 'key', id: 'key',
title: 'Key Colour', title: 'Key Colour',
description: 'Colour of the background', description: 'Colour of the background. Default: #FFF0 (transparent)',
prefix: '#', type: 'colour',
type: 'string', defaultValue: 'FFF0',
placeholder: 'ffffffff (default)', },
{
id: 'top-colour',
title: 'Top Text Colour',
description: 'Top text colour. Default: #000000',
type: 'colour',
defaultValue: '000000',
},
{
id: 'bottom-colour',
title: 'Bottom Text Colour',
description: 'Bottom text colour. Default: #000000',
type: 'colour',
defaultValue: '000000',
},
{
id: 'top-bg',
title: 'Top Background Colour',
description: 'Top text background colour. Default: #FFF0 (transparent)',
type: 'colour',
defaultValue: 'FFF0',
},
{
id: 'bottom-bg',
title: 'Bottom Background Colour',
description: 'Bottom text background colour. Default: #FFF0 (transparent)',
type: 'colour',
defaultValue: 'FFF0',
}, },
{ {
id: 'line-colour', id: 'line-colour',
title: 'Line Colour', title: 'Line Colour',
description: 'Colour of the line', description: 'Colour of the line. Default: #FF0000',
prefix: '#', type: 'colour',
type: 'string', defaultValue: 'FF0000',
placeholder: 'ff0000ff (default)',
}, },
]; ];
}; };
@@ -23,26 +23,23 @@ export const MINIMAL_TIMER_OPTIONS: ViewOption[] = [
{ {
id: 'key', id: 'key',
title: 'Key Colour', title: 'Key Colour',
description: 'Background colour in hexadecimal', description: 'Background or key colour for entire view. Default: #000000',
prefix: '#', type: 'colour',
type: 'string', defaultValue: '000000',
placeholder: '00000000 (default)',
}, },
{ {
id: 'text', id: 'text',
title: 'Text Colour', title: 'Text Colour',
description: 'Text colour in hexadecimal', description: 'Text colour. Default: #FFFFFF',
prefix: '#', type: 'colour',
type: 'string', defaultValue: 'FFFFFF',
placeholder: 'fffff (default)',
}, },
{ {
id: 'textbg', id: 'textbg',
title: 'Text Background', title: 'Text Background',
description: 'Colour of text background in hexadecimal', description: 'Background colour for timer text. Default: #FFF0 (transparent)',
prefix: '#', type: 'colour',
type: 'string', defaultValue: 'FFF0',
placeholder: '00000000 (default)',
}, },
{ {
id: 'font', id: 'font',