diff --git a/apps/client/src/common/components/view-params-editor/InlineColourPicker.module.scss b/apps/client/src/common/components/view-params-editor/InlineColourPicker.module.scss
new file mode 100644
index 000000000..51bba65ee
--- /dev/null
+++ b/apps/client/src/common/components/view-params-editor/InlineColourPicker.module.scss
@@ -0,0 +1,27 @@
+.inline {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+// attempt to match with ontimeTextInputs
+.input {
+ color: $gray-200;
+ border: 1px solid transparent;
+ border-radius: 3px;
+ background-color: $gray-1200;
+ padding: 0 1rem;
+ font-size: 1rem;
+ height: 2.5rem;
+ outline: none;
+
+ &:hover {
+ background-color: $gray-1100;
+ }
+
+ &:focus {
+ background-color: $gray-1000;
+ color: $gray-50;
+ border: 1px solid $blue-500;
+ }
+}
diff --git a/apps/client/src/common/components/view-params-editor/InlineColourPicker.tsx b/apps/client/src/common/components/view-params-editor/InlineColourPicker.tsx
new file mode 100644
index 000000000..b3bb7e19d
--- /dev/null
+++ b/apps/client/src/common/components/view-params-editor/InlineColourPicker.tsx
@@ -0,0 +1,33 @@
+import { useState } from 'react';
+
+import PopoverPicker from '../input/popover-picker/PopoverPicker';
+
+import style from './InlineColourPicker.module.scss';
+
+interface InlineColourPickerProps {
+ name: string;
+ value: string;
+}
+
+const ensureHex = (value: string) => {
+ if (!value.startsWith('#')) {
+ return `#${value}`;
+ }
+ return value;
+};
+
+export default function InlineColourPicker(props: InlineColourPickerProps) {
+ const { name, value } = props;
+ const [colour, setColour] = useState(() => ensureHex(value));
+
+ const debouncedChange = (value: string) => {
+ setColour(value);
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/client/src/common/components/view-params-editor/ParamInput.tsx b/apps/client/src/common/components/view-params-editor/ParamInput.tsx
index 72a36749b..9bb45b346 100644
--- a/apps/client/src/common/components/view-params-editor/ParamInput.tsx
+++ b/apps/client/src/common/components/view-params-editor/ParamInput.tsx
@@ -16,6 +16,7 @@ import {
import { isStringBoolean } from '../../../features/viewers/common/viewUtils';
+import InlineColourPicker from './InlineColourPicker';
import { ParamField } from './types';
interface EditFormInputProps {
@@ -23,8 +24,8 @@ interface EditFormInputProps {
}
export default function ParamInput(props: EditFormInputProps) {
- const [searchParams] = useSearchParams();
const { paramField } = props;
+ const [searchParams] = useSearchParams();
const { id, type, defaultValue } = paramField;
if (type === 'persist') {
@@ -84,12 +85,7 @@ export default function ParamInput(props: EditFormInputProps) {
if (type === 'colour') {
const currentvalue = `#${searchParams.get(id) ?? defaultValue}`;
- return (
-
-
- {`Current colour: ${currentvalue.toUpperCase()}`}
-
- );
+ return ;
}
const defaultStringValue = searchParams.get(id) ?? defaultValue;
diff --git a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx
index 4021eb3d9..292c201a6 100644
--- a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx
+++ b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx
@@ -50,10 +50,13 @@ const getURLSearchParamsFromObj = (paramsObj: ViewParamsObj, paramFields: ViewOp
// compare which values are different from the default values
Object.entries(paramsObj).forEach(([id, value]) => {
- if (typeof value === 'string' && value.length && defaultValues[id] !== value) {
+ if (typeof value === 'string' && value.length) {
// we dont know which values contain colours
// unfortunately this means we run all the strings through the sanitation
- newSearchParams.set(id, sanitiseColour(value));
+ const valueWithoutHash = sanitiseColour(value);
+ if (defaultValues[id] !== valueWithoutHash) {
+ newSearchParams.set(id, valueWithoutHash);
+ }
}
});
return newSearchParams;