change the Output settings to be hocr XML or Sandwich, fix dark mode / light mode theme issue for languages

This commit is contained in:
EthanHealy01 2025-07-30 14:51:02 +01:00
parent f72bf3b86c
commit be2b971de6
2 changed files with 62 additions and 83 deletions

View File

@ -6,7 +6,7 @@
align-items: center; /* Center align items vertically */ align-items: center; /* Center align items vertically */
height: 32px; height: 32px;
border: 1px solid var(--border-default); border: 1px solid var(--border-default);
background-color: white; /* Default white background for light mode */ background-color: var(--mantine-color-white); /* Use Mantine color variable */
color: var(--text-secondary); color: var(--text-secondary);
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
padding: 4px 8px; padding: 4px 8px;
@ -17,7 +17,7 @@
/* Dark mode background */ /* Dark mode background */
[data-mantine-color-scheme="dark"] .languagePicker { [data-mantine-color-scheme="dark"] .languagePicker {
background-color: #2A2F36; /* Specific dark background color */ background-color: var(--mantine-color-dark-6); /* Use Mantine dark color instead of hardcoded */
} }
.languagePicker:hover { .languagePicker:hover {
@ -27,7 +27,7 @@
/* Dark mode hover */ /* Dark mode hover */
[data-mantine-color-scheme="dark"] .languagePicker:hover { [data-mantine-color-scheme="dark"] .languagePicker:hover {
background-color: #3A3F46; /* Slightly lighter hover color */ background-color: var(--mantine-color-dark-5); /* Use Mantine color variable */
} }
.languagePicker:disabled { .languagePicker:disabled {
@ -44,7 +44,7 @@
} }
.languagePickerDropdown { .languagePickerDropdown {
background-color: white; /* Default white background for light mode */ background-color: var(--mantine-color-white); /* Use Mantine color variable */
border: 1px solid var(--border-default); border: 1px solid var(--border-default);
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
padding: 4px; padding: 4px;
@ -52,7 +52,7 @@
/* Dark mode dropdown background */ /* Dark mode dropdown background */
[data-mantine-color-scheme="dark"] .languagePickerDropdown { [data-mantine-color-scheme="dark"] .languagePickerDropdown {
background-color: #2A2F36; background-color: var(--mantine-color-dark-6);
} }
.languagePickerOption { .languagePickerOption {
@ -70,7 +70,7 @@
/* Dark mode option hover */ /* Dark mode option hover */
[data-mantine-color-scheme="dark"] .languagePickerOption:hover { [data-mantine-color-scheme="dark"] .languagePickerOption:hover {
background-color: #3A3F46; background-color: var(--mantine-color-dark-5);
} }
.languagePickerOption.selected { .languagePickerOption.selected {
@ -81,7 +81,7 @@
/* Dark mode selected option */ /* Dark mode selected option */
[data-mantine-color-scheme="dark"] .languagePickerOption.selected { [data-mantine-color-scheme="dark"] .languagePickerOption.selected {
background-color: var(--mantine-color-blue-8); /* Darker blue for better contrast */ background-color: var(--mantine-color-blue-8); /* Darker blue for better contrast */
color: white; /* White text for dark mode selected items */ color: var(--mantine-color-white); /* White text for dark mode selected items */
} }
.languagePickerOption.selected:hover { .languagePickerOption.selected:hover {
@ -91,4 +91,44 @@
/* Dark mode selected option hover */ /* Dark mode selected option hover */
[data-mantine-color-scheme="dark"] .languagePickerOption.selected:hover { [data-mantine-color-scheme="dark"] .languagePickerOption.selected:hover {
background-color: var(--mantine-color-blue-7); /* Slightly lighter on hover */ background-color: var(--mantine-color-blue-7); /* Slightly lighter on hover */
}
/* Additional helper classes for the component */
.languagePickerTarget {
width: 100%;
}
.languagePickerContent {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.languagePickerText {
flex: 1;
text-align: left;
}
.languagePickerScrollArea {
max-height: 180px;
border-bottom: 1px solid var(--border-default);
padding-bottom: 8px;
}
.languagePickerFooter {
padding: 8px;
text-align: center;
font-size: 12px;
}
.languagePickerLink {
color: var(--mantine-color-blue-6);
text-decoration: underline;
cursor: pointer;
}
/* Dark mode link */
[data-mantine-color-scheme="dark"] .languagePickerLink {
color: var(--mantine-color-blue-4);
} }

View File

@ -1,8 +1,9 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Stack, Text, Loader, Popover, useMantineTheme, useMantineColorScheme, Box } from '@mantine/core'; import { Stack, Text, Loader, Popover, Box } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { tempOcrLanguages } from '../../../utils/tempOcrLanguages'; import { tempOcrLanguages } from '../../../utils/tempOcrLanguages';
import UnfoldMoreIcon from '@mui/icons-material/UnfoldMore'; import UnfoldMoreIcon from '@mui/icons-material/UnfoldMore';
import styles from './LanguagePicker.module.css';
export interface LanguageOption { export interface LanguageOption {
value: string; value: string;
@ -27,8 +28,6 @@ const LanguagePicker: React.FC<LanguagePickerProps> = ({
languagesEndpoint = '/api/v1/ui-data/ocr-pdf' languagesEndpoint = '/api/v1/ui-data/ocr-pdf'
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const theme = useMantineTheme();
const { colorScheme } = useMantineColorScheme();
const [availableLanguages, setAvailableLanguages] = useState<LanguageOption[]>([]); const [availableLanguages, setAvailableLanguages] = useState<LanguageOption[]>([]);
const [isLoadingLanguages, setIsLoadingLanguages] = useState(true); const [isLoadingLanguages, setIsLoadingLanguages] = useState(true);
@ -102,28 +101,6 @@ const LanguagePicker: React.FC<LanguagePickerProps> = ({
const selectedLanguage = availableLanguages.find(lang => lang.value === value); const selectedLanguage = availableLanguages.find(lang => lang.value === value);
// Get appropriate background colors based on color scheme
const getBackgroundColor = () => {
if (colorScheme === 'dark') {
return '#2A2F36'; // Specific dark background color
}
return 'white'; // White background for light mode
};
const getSelectedItemBackgroundColor = () => {
if (colorScheme === 'dark') {
return 'var(--mantine-color-blue-8)'; // Darker blue for better contrast
}
return 'var(--mantine-color-blue-1)'; // Light blue for light mode
};
const getSelectedItemTextColor = () => {
if (colorScheme === 'dark') {
return 'white'; // White text for dark mode selected items
}
return 'var(--mantine-color-blue-9)'; // Dark blue text for light mode
};
return ( return (
<Box> <Box>
{label && ( {label && (
@ -134,78 +111,40 @@ const LanguagePicker: React.FC<LanguagePickerProps> = ({
<Popover width="target" position="bottom" withArrow={false} shadow="md"> <Popover width="target" position="bottom" withArrow={false} shadow="md">
<Popover.Target> <Popover.Target>
<Box <Box
className={`${styles.languagePicker} ${disabled ? '' : ''}`}
style={{ style={{
width: '100%',
display: 'flex',
flexDirection: 'row',
alignItems: 'center', // Center align items vertically
height: '32px',
border: `1px solid var(--border-default)`,
backgroundColor: getBackgroundColor(),
color: 'var(--text-secondary)',
borderRadius: 'var(--radius-sm)',
padding: '4px 8px',
fontSize: '13px',
cursor: disabled ? 'not-allowed' : 'pointer',
opacity: disabled ? 0.6 : 1, opacity: disabled ? 0.6 : 1,
transition: 'all 0.2s ease' cursor: disabled ? 'not-allowed' : 'pointer'
}} }}
> >
<Text size="sm" style={{ flex: 1 }}> <div className={styles.languagePickerContent}>
{selectedLanguage?.label || placeholder} <Text size="sm" className={styles.languagePickerText}>
</Text> {selectedLanguage?.label || placeholder}
<UnfoldMoreIcon style={{ </Text>
fontSize: '16px', <UnfoldMoreIcon className={styles.languagePickerIcon} />
color: 'var(--text-muted)', </div>
marginLeft: 'auto',
display: 'flex',
alignItems: 'center'
}} />
</Box> </Box>
</Popover.Target> </Popover.Target>
<Popover.Dropdown style={{ <Popover.Dropdown className={styles.languagePickerDropdown}>
backgroundColor: getBackgroundColor(),
border: '1px solid var(--border-default)',
borderRadius: 'var(--radius-sm)',
padding: '4px'
}}>
<Stack gap="xs"> <Stack gap="xs">
<Box style={{ <Box className={styles.languagePickerScrollArea}>
maxHeight: '180px',
overflowY: 'auto',
borderBottom: '1px solid var(--border-default)',
paddingBottom: '8px'
}}>
{availableLanguages.map((lang) => ( {availableLanguages.map((lang) => (
<Box <Box
key={lang.value} key={lang.value}
style={{ className={`${styles.languagePickerOption} ${value === lang.value ? styles.selected : ''}`}
padding: '6px 10px',
cursor: 'pointer',
borderRadius: 'var(--radius-xs)',
fontSize: '13px',
color: value === lang.value ? getSelectedItemTextColor() : 'var(--text-primary)',
backgroundColor: value === lang.value ? getSelectedItemBackgroundColor() : 'transparent',
transition: 'background-color 0.2s ease'
}}
onClick={() => onChange(lang.value)} onClick={() => onChange(lang.value)}
> >
<Text size="sm">{lang.label}</Text> <Text size="sm">{lang.label}</Text>
</Box> </Box>
))} ))}
</Box> </Box>
<Box style={{ <Box className={styles.languagePickerFooter}>
padding: '8px',
textAlign: 'center',
fontSize: '12px'
}}>
<Text size="xs" c="dimmed" mb={4}> <Text size="xs" c="dimmed" mb={4}>
{t('ocr.languagePicker.additionalLanguages', 'Looking for additional languages?')} {t('ocr.languagePicker.additionalLanguages', 'Looking for additional languages?')}
</Text> </Text>
<Text <Text
size="xs" size="xs"
c="blue" className={styles.languagePickerLink}
style={{ textDecoration: 'underline', cursor: 'pointer' }}
onClick={() => window.open('https://docs.stirlingpdf.com/Advanced%20Configuration/OCR', '_blank')} onClick={() => window.open('https://docs.stirlingpdf.com/Advanced%20Configuration/OCR', '_blank')}
> >
{t('ocr.languagePicker.viewSetupGuide', 'View setup guide →')} {t('ocr.languagePicker.viewSetupGuide', 'View setup guide →')}