feat: Expand OCR with fuel receipt scanning and maintenance extraction (#129) #147

Merged
egullickson merged 26 commits from issue-129-expand-ocr-fuel-receipt-maintenance into main 2026-02-13 02:25:55 +00:00
Showing only changes of commit 80ee2faed8 - Show all commits

View File

@@ -1,9 +1,10 @@
/**
* @ai-summary Email notification toggle component
* @ai-context Mobile-first responsive toggle switch for email notifications
* @ai-context Uses MUI Switch to match SettingsPage pill-style toggles
*/
import React from 'react';
import { Box, Switch, Typography } from '@mui/material';
interface EmailNotificationToggleProps {
enabled: boolean;
@@ -19,32 +20,16 @@ export const EmailNotificationToggle: React.FC<EmailNotificationToggleProps> = (
className = '',
}) => {
return (
<div className={`flex items-center justify-between gap-3 ${className}`}>
<label className="text-sm font-medium text-slate-700 dark:text-slate-300">
<Box className={className} sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 2 }}>
<Typography variant="body2" fontWeight={500} color="text.secondary">
{label}
</label>
<button
type="button"
role="switch"
aria-checked={enabled}
aria-label={label}
onClick={() => onChange(!enabled)}
className={`
relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full
border-2 border-transparent transition-colors duration-200 ease-in-out
focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2
${enabled ? 'bg-primary-600' : 'bg-slate-300 dark:bg-slate-600'}
`}
style={{ minWidth: '44px', minHeight: '44px', padding: '9px 0' }}
>
<span
className={`
pointer-events-none inline-block h-5 w-5 transform rounded-full
bg-white shadow ring-0 transition duration-200 ease-in-out
${enabled ? 'translate-x-5' : 'translate-x-0'}
`}
/>
</button>
</div>
</Typography>
<Switch
checked={enabled}
onChange={(e) => onChange(e.target.checked)}
color="primary"
inputProps={{ 'aria-label': label }}
/>
</Box>
);
};