Ux cleanup

This commit is contained in:
Reece 2025-11-03 18:20:27 +00:00
parent a86ece0473
commit 75ff6ed441
2 changed files with 45 additions and 15 deletions

View File

@ -34,12 +34,18 @@ export const TextInputWithFont: React.FC<TextInputWithFontProps> = ({
const [fontSizeInput, setFontSizeInput] = useState(fontSize.toString());
const fontSizeCombobox = useCombobox();
const [isColorPickerOpen, setIsColorPickerOpen] = useState(false);
const [colorInput, setColorInput] = useState(textColor);
// Sync font size input with prop changes
useEffect(() => {
setFontSizeInput(fontSize.toString());
}, [fontSize]);
// Sync color input with prop changes
useEffect(() => {
setColorInput(textColor);
}, [textColor]);
const fontOptions = [
{ value: 'Helvetica', label: 'Helvetica' },
{ value: 'Times-Roman', label: 'Times' },
@ -50,6 +56,11 @@ export const TextInputWithFont: React.FC<TextInputWithFontProps> = ({
const fontSizeOptions = ['8', '12', '16', '20', '24', '28', '32', '36', '40', '48', '56', '64', '72', '80', '96', '112', '128', '144', '160', '176', '192', '200'];
// Validate hex color
const isValidHexColor = (color: string): boolean => {
return /^#[0-9A-Fa-f]{6}$/.test(color);
};
return (
<Stack gap="sm">
<TextInput
@ -136,13 +147,28 @@ export const TextInputWithFont: React.FC<TextInputWithFontProps> = ({
<Box>
<TextInput
label={t('sign.text.colorLabel', 'Text colour')}
value={textColor}
readOnly
value={colorInput}
placeholder="#000000"
disabled={disabled}
onClick={() => !disabled && setIsColorPickerOpen(true)}
style={{ cursor: disabled ? 'default' : 'pointer', width: '100%' }}
onChange={(e) => {
const value = e.currentTarget.value;
setColorInput(value);
// Update color if valid hex
if (isValidHexColor(value)) {
onTextColorChange(value);
}
}}
onBlur={() => {
// Revert to valid color on blur if invalid
if (!isValidHexColor(colorInput)) {
setColorInput(textColor);
}
}}
style={{ width: '100%' }}
rightSection={
<Box
onClick={() => !disabled && setIsColorPickerOpen(true)}
style={{
width: 24,
height: 24,

View File

@ -1,6 +1,6 @@
import { useState, useEffect, useMemo, useRef } from 'react';
import { useTranslation } from "react-i18next";
import { Stack, Button, Text, Alert, SegmentedControl, Divider, ActionIcon, Tooltip } from '@mantine/core';
import { Stack, Button, Text, Alert, SegmentedControl, Divider, ActionIcon, Tooltip, Group, Box } from '@mantine/core';
import { SignParameters } from "@app/hooks/tools/sign/useSignParameters";
import { SuggestedToolsSection } from "@app/components/tools/shared/SuggestedToolsSection";
import { useSignature } from "@app/contexts/SignatureContext";
@ -582,16 +582,20 @@ const SignSettings = ({
{t('sign.step.placeDesc', 'Position the signature on your PDF')}
</Text>
<DrawingControls
onUndo={onUndo}
onRedo={onRedo}
canUndo={historyAvailability.canUndo}
canRedo={historyAvailability.canRedo}
hasSignatureData={hasAnySignature}
disabled={disabled}
showPlaceButton={false}
additionalControls={placementToggleControl}
/>
<Group gap="xs" wrap="nowrap" align="center">
<DrawingControls
onUndo={onUndo}
onRedo={onRedo}
canUndo={historyAvailability.canUndo}
canRedo={historyAvailability.canRedo}
hasSignatureData={hasAnySignature}
disabled={disabled}
showPlaceButton={false}
/>
<Box style={{ marginLeft: 'auto' }}>
{placementToggleControl}
</Box>
</Group>
<Alert color={placementAlert.color} title={placementAlert.title}>
<Text size="sm">