@pfm-platform/goals-ui-mui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -73,11 +73,10 @@ function GoalCreateForm({
73
73
  setError("Target value must be a positive number");
74
74
  return;
75
75
  }
76
- const formattedAmount = amount.toFixed(2);
77
76
  const data = {
78
77
  name: name.trim(),
79
78
  image_name: imageName.trim(),
80
- target_value: formattedAmount,
79
+ target_value: amount,
81
80
  target_completion_on: targetCompletionOn || void 0
82
81
  };
83
82
  if (goalType === "savings") {
@@ -293,7 +292,7 @@ function GoalEditForm({
293
292
  }) {
294
293
  const [name, setName] = react.useState(goal.name);
295
294
  const [imageName, setImageName] = react.useState(goal.image_name);
296
- const [targetValue, setTargetValue] = react.useState(goal.target_value);
295
+ const [targetValue, setTargetValue] = react.useState(String(goal.target_value));
297
296
  const [targetCompletionOn, setTargetCompletionOn] = react.useState(
298
297
  goal.target_completion_on || ""
299
298
  );
@@ -331,12 +330,11 @@ function GoalEditForm({
331
330
  setError("Target value must be a positive number");
332
331
  return;
333
332
  }
334
- const formattedAmount = amount.toFixed(2);
335
333
  const data = {
336
334
  id: goal.id,
337
335
  name: name.trim(),
338
336
  image_name: imageName.trim(),
339
- target_value: formattedAmount,
337
+ target_value: amount,
340
338
  target_completion_on: targetCompletionOn || void 0
341
339
  };
342
340
  if (goalType === "savings") {
@@ -844,8 +842,8 @@ function GoalProgressCard({
844
842
  monthsRemaining,
845
843
  monthlyContribution
846
844
  }) {
847
- const current = parseFloat(currentValue);
848
- const target = parseFloat(targetValue);
845
+ const current = currentValue;
846
+ const target = targetValue;
849
847
  const remaining = goalType === "savings" ? target - current : current;
850
848
  const progressColor = complete ? "success" : percentComplete >= 75 ? "primary" : percentComplete >= 50 ? "info" : percentComplete >= 25 ? "warning" : "error";
851
849
  const formatCurrency = (amount) => {
@@ -914,10 +912,10 @@ function GoalProgressCard({
914
912
  }
915
913
  ),
916
914
  /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { display: "flex", flexDirection: "column", gap: 1, children: [
917
- monthlyContribution && parseFloat(monthlyContribution) > 0 && /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", gap: 1, children: [
915
+ monthlyContribution != null && monthlyContribution > 0 && /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", gap: 1, children: [
918
916
  /* @__PURE__ */ jsxRuntime.jsx(iconsMaterial.TrendingUp, { fontSize: "small", color: "action" }),
919
917
  /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "caption", color: "text.secondary", children: [
920
- formatCurrency(parseFloat(monthlyContribution)),
918
+ formatCurrency(monthlyContribution),
921
919
  "/month"
922
920
  ] })
923
921
  ] }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/GoalCreateForm.tsx","../src/components/GoalDeleteButton.tsx","../src/components/GoalEditForm.tsx","../src/components/GoalsEmptyState.tsx","../src/components/GoalsCompletedState.tsx","../src/components/GoalList.tsx","../src/components/GoalSummary.tsx","../src/components/GoalProgressCard.tsx","../src/components/GoalMilestoneTracker.tsx","../src/components/GoalItemCondensed.tsx","../src/components/GoalImageDialog.tsx"],"names":["useState","useCreateSavingsGoal","useCreatePayoffGoal","Paper","jsx","Typography","jsxs","Box","FormControl","InputLabel","Select","MenuItem","TextField","Alert","Button","CircularProgress","useDeleteSavingsGoal","useDeletePayoffGoal","Fragment","Tooltip","IconButton","DeleteIcon","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","useUpdateSavingsGoal","useUpdatePayoffGoal","FlagIcon","AddIcon","EmojiEventsIcon","useGoalProgress","Card","CardContent","List","ListItem","Chip","LinearProgress","Grid","Avatar","TrendingUp","Flag","EmojiEvents","Timer","Stars","Stepper","Step","StepLabel","CheckCircle","RadioButtonUnchecked","StepContent","TrendingDown","useTheme","useMediaQuery","useSavingsGoalImages","usePayoffGoalImages","ImageList","ImageListItem","ImageListItemBar","CheckIcon"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Paper,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n type SelectChangeEvent,\n} from '@mui/material';\nimport { useCreateSavingsGoal, useCreatePayoffGoal } from '@pfm-platform/goals-data-access';\nimport type { GoalCreate } from '@pfm-platform/shared';\n\nexport interface GoalCreateFormProps {\n userId: string;\n onSuccess?: () => void;\n}\n\ntype GoalType = 'savings' | 'payoff';\n\nexport function GoalCreateForm({\n userId,\n onSuccess,\n}: GoalCreateFormProps) {\n const [goalType, setGoalType] = useState<GoalType>('savings');\n const [name, setName] = useState('');\n const [imageName, setImageName] = useState('');\n const [targetValue, setTargetValue] = useState('');\n const [targetCompletionOn, setTargetCompletionOn] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const createSavingsGoal = useCreateSavingsGoal({\n onSuccess: () => {\n resetForm();\n onSuccess?.();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to create savings goal');\n },\n });\n\n const createPayoffGoal = useCreatePayoffGoal({\n onSuccess: () => {\n resetForm();\n onSuccess?.();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to create payoff goal');\n },\n });\n\n const resetForm = () => {\n setName('');\n setImageName('');\n setTargetValue('');\n setTargetCompletionOn('');\n setError(null);\n };\n\n const handleGoalTypeChange = (event: SelectChangeEvent<GoalType>) => {\n setGoalType(event.target.value as GoalType);\n setError(null);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n /* v8 ignore next 15 - defensive validation, button disabled prevents reaching this */\n if (!name.trim()) {\n setError('Goal name is required');\n return;\n }\n\n if (!imageName.trim()) {\n setError('Image name is required');\n return;\n }\n\n const amount = parseFloat(targetValue);\n if (isNaN(amount) || amount <= 0) {\n setError('Target value must be a positive number');\n return;\n }\n\n // Format to exactly 2 decimal places for string validation\n const formattedAmount = amount.toFixed(2);\n\n const data: GoalCreate = {\n name: name.trim(),\n image_name: imageName.trim(),\n target_value: formattedAmount,\n target_completion_on: targetCompletionOn || undefined,\n };\n\n if (goalType === 'savings') {\n createSavingsGoal.mutate({ userId, data });\n } else {\n createPayoffGoal.mutate({ userId, data });\n }\n };\n\n const isPending = createSavingsGoal.isPending || createPayoffGoal.isPending;\n\n return (\n <Paper sx={{ p: 3 }}>\n <Typography variant=\"h6\" gutterBottom>\n Create Goal\n </Typography>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}\n >\n <FormControl fullWidth disabled={isPending}>\n <InputLabel id=\"goal-type-label\">Goal Type</InputLabel>\n <Select\n labelId=\"goal-type-label\"\n id=\"goal-type\"\n value={goalType}\n label=\"Goal Type\"\n onChange={handleGoalTypeChange}\n >\n <MenuItem value=\"savings\">Savings Goal (Save TO a target)</MenuItem>\n <MenuItem value=\"payoff\">Payoff Goal (Pay DOWN debt)</MenuItem>\n </Select>\n </FormControl>\n\n <TextField\n label=\"Goal Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !name.trim()}\n helperText={\n goalType === 'savings'\n ? \"Enter a name for your savings goal (e.g., 'Emergency Fund', 'Vacation')\"\n : \"Enter a name for your payoff goal (e.g., 'Credit Card Debt', 'Student Loan')\"\n }\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Image Name\"\n value={imageName}\n onChange={(e) => {\n setImageName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !imageName.trim()}\n helperText={\n goalType === 'savings'\n ? \"Enter image name (e.g., 'piggy_bank', 'vacation', 'house')\"\n : \"Enter image name (e.g., 'credit_card', 'loan', 'debt')\"\n }\n />\n\n <TextField\n label={goalType === 'savings' ? 'Target Amount' : 'Debt Amount'}\n type=\"number\"\n value={targetValue}\n onChange={(e) => {\n setTargetValue(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && (isNaN(parseFloat(targetValue)) || parseFloat(targetValue) <= 0)}\n helperText={\n goalType === 'savings'\n ? 'Enter the target amount to save (e.g., 5000.00)'\n : 'Enter the total debt amount to pay off (e.g., 3000.00)'\n }\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Target Completion Date (optional)\"\n type=\"date\"\n value={targetCompletionOn}\n onChange={(e) => {\n setTargetCompletionOn(e.target.value);\n setError(null);\n }}\n fullWidth\n disabled={isPending}\n helperText=\"Enter the date you want to complete this goal by (YYYY-MM-DD)\"\n InputLabelProps={{\n shrink: true,\n }}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={isPending || !name.trim() || !imageName.trim() || !targetValue}\n startIcon={isPending ? <CircularProgress size={20} /> : null}\n >\n {isPending\n ? 'Creating...'\n : `Create ${goalType === 'savings' ? 'Savings' : 'Payoff'} Goal`}\n </Button>\n </Box>\n </Box>\n </Paper>\n );\n}\n","import { useState } from 'react';\nimport {\n IconButton,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n Tooltip,\n} from '@mui/material';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { useDeleteSavingsGoal, useDeletePayoffGoal } from '@pfm-platform/goals-data-access';\n\nexport interface GoalDeleteButtonProps {\n userId: string;\n goalId: number;\n goalName: string;\n goalType: 'savings' | 'payoff';\n}\n\nexport function GoalDeleteButton({\n userId,\n goalId,\n goalName,\n goalType,\n}: GoalDeleteButtonProps) {\n const [open, setOpen] = useState(false);\n\n const deleteSavingsGoal = useDeleteSavingsGoal({\n onSuccess: () => {\n setOpen(false);\n },\n });\n\n const deletePayoffGoal = useDeletePayoffGoal({\n onSuccess: () => {\n setOpen(false);\n },\n });\n\n const handleDelete = () => {\n if (goalType === 'savings') {\n deleteSavingsGoal.mutate({ userId, goalId });\n } else {\n deletePayoffGoal.mutate({ userId, goalId });\n }\n };\n\n const isPending = deleteSavingsGoal.isPending || deletePayoffGoal.isPending;\n\n return (\n <>\n <Tooltip title=\"Delete goal\">\n <IconButton\n onClick={() => setOpen(true)}\n color=\"error\"\n size=\"small\"\n aria-label={`delete ${goalType} goal ${goalName}`}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onClose={() => !isPending && setOpen(false)}\n aria-labelledby=\"delete-goal-dialog-title\"\n >\n <DialogTitle id=\"delete-goal-dialog-title\">\n Delete {goalType === 'savings' ? 'Savings' : 'Payoff'} Goal?\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n Are you sure you want to delete the {goalType} goal \"{goalName}\"? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => setOpen(false)}\n disabled={isPending}\n >\n Cancel\n </Button>\n <Button\n onClick={handleDelete}\n color=\"error\"\n variant=\"contained\"\n disabled={isPending}\n autoFocus\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n} from '@mui/material';\nimport { useUpdateSavingsGoal, useUpdatePayoffGoal } from '@pfm-platform/goals-data-access';\nimport type { SavingsGoal, PayoffGoal, GoalUpdate } from '@pfm-platform/shared';\n\nexport interface GoalEditFormProps {\n userId: string;\n goal: SavingsGoal | PayoffGoal;\n goalType: 'savings' | 'payoff';\n open: boolean;\n onClose: () => void;\n}\n\nexport function GoalEditForm({\n userId,\n goal,\n goalType,\n open,\n onClose,\n}: GoalEditFormProps) {\n const [name, setName] = useState(goal.name);\n const [imageName, setImageName] = useState(goal.image_name);\n const [targetValue, setTargetValue] = useState(goal.target_value);\n const [targetCompletionOn, setTargetCompletionOn] = useState(\n goal.target_completion_on || ''\n );\n const [error, setError] = useState<string | null>(null);\n\n const updateSavingsGoal = useUpdateSavingsGoal({\n onSuccess: () => {\n setError(null);\n onClose();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update savings goal');\n },\n });\n\n const updatePayoffGoal = useUpdatePayoffGoal({\n onSuccess: () => {\n setError(null);\n onClose();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update payoff goal');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n /* v8 ignore next 15 - defensive validation, button disabled prevents reaching this */\n if (!name.trim()) {\n setError('Goal name is required');\n return;\n }\n\n if (!imageName.trim()) {\n setError('Image name is required');\n return;\n }\n\n const amount = parseFloat(targetValue);\n if (isNaN(amount) || amount <= 0) {\n setError('Target value must be a positive number');\n return;\n }\n\n // Format to exactly 2 decimal places for string validation\n const formattedAmount = amount.toFixed(2);\n\n const data: GoalUpdate = {\n id: goal.id,\n name: name.trim(),\n image_name: imageName.trim(),\n target_value: formattedAmount,\n target_completion_on: targetCompletionOn || undefined,\n };\n\n if (goalType === 'savings') {\n updateSavingsGoal.mutate({ userId, goalId: goal.id, data });\n } else {\n updatePayoffGoal.mutate({ userId, goalId: goal.id, data });\n }\n };\n\n const isPending = updateSavingsGoal.isPending || updatePayoffGoal.isPending;\n\n const handleClose = () => {\n if (!isPending) {\n onClose();\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={handleClose}\n maxWidth=\"sm\"\n fullWidth\n aria-labelledby=\"edit-goal-dialog-title\"\n >\n <form onSubmit={handleSubmit}>\n <DialogTitle id=\"edit-goal-dialog-title\">\n Edit {goalType === 'savings' ? 'Savings' : 'Payoff'} Goal\n </DialogTitle>\n <DialogContent>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n <TextField\n label=\"Goal Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your goal\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Image Name\"\n value={imageName}\n onChange={(e) => {\n setImageName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !imageName.trim()}\n helperText=\"Enter image name\"\n />\n\n <TextField\n label={goalType === 'savings' ? 'Target Amount' : 'Debt Amount'}\n type=\"number\"\n value={targetValue}\n onChange={(e) => {\n setTargetValue(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && (isNaN(parseFloat(targetValue)) || parseFloat(targetValue) <= 0)}\n helperText=\"Enter the target amount\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Target Completion Date (optional)\"\n type=\"date\"\n value={targetCompletionOn}\n onChange={(e) => {\n setTargetCompletionOn(e.target.value);\n setError(null);\n }}\n fullWidth\n disabled={isPending}\n helperText=\"Enter the target completion date (YYYY-MM-DD)\"\n InputLabelProps={{\n shrink: true,\n }}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={isPending}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={isPending || !name.trim() || !imageName.trim() || !targetValue}\n startIcon={isPending ? <CircularProgress size={20} /> : null}\n >\n {isPending ? 'Saving...' : 'Save Changes'}\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n );\n}\n","/**\n * GoalsEmptyState\n *\n * Display empty state when no goals exist.\n * Encourages users to set their first financial goal.\n */\n\nimport { Box, Button, Typography } from '@mui/material';\nimport FlagIcon from '@mui/icons-material/Flag';\nimport AddIcon from '@mui/icons-material/Add';\n\nexport interface GoalsEmptyStateProps {\n /**\n * Callback when user clicks \"Set Your First Goal\" button\n */\n onSetGoal?: () => void;\n\n /**\n * Optional custom title\n * @default \"No Goals Yet\"\n */\n title?: string;\n\n /**\n * Optional custom message\n * @default \"Set financial goals to stay motivated and track your progress.\"\n */\n message?: string;\n\n /**\n * Minimum height for the empty state container\n * @default 400\n */\n minHeight?: number;\n}\n\n/**\n * Empty state component for goals list\n *\n * Displayed when user has no goals. Provides friendly messaging\n * and clear call-to-action to create their first goal.\n *\n * @example\n * ```tsx\n * <GoalsEmptyState\n * onSetGoal={() => navigate('/goals/new')}\n * />\n * ```\n */\nexport function GoalsEmptyState({\n onSetGoal,\n title = 'No Goals Yet',\n message = 'Set financial goals to stay motivated and track your progress.',\n minHeight = 400,\n}: GoalsEmptyStateProps) {\n return (\n <Box\n data-testid=\"goals-empty-state\"\n sx={{\n minHeight,\n height: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n py: 6,\n px: 2,\n }}\n >\n {/* Icon */}\n <FlagIcon\n sx={{\n fontSize: 80,\n color: 'primary.main',\n opacity: 0.6,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Title */}\n <Typography\n variant=\"h5\"\n component=\"h2\"\n color=\"text.primary\"\n sx={{ fontWeight: 'medium' }}\n >\n {title}\n </Typography>\n\n {/* Message */}\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n align=\"center\"\n sx={{ maxWidth: 480, px: 2 }}\n >\n {message}\n </Typography>\n\n {/* Benefits List */}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n mt: 1,\n mb: 2,\n }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>✓</Box>\n Save for important purchases and milestones\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>✓</Box>\n Pay off debt faster with targeted plans\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>✓</Box>\n Track progress with visual charts and insights\n </Typography>\n </Box>\n\n {/* Call-to-Action Button */}\n {onSetGoal && (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"large\"\n startIcon={<AddIcon />}\n onClick={onSetGoal}\n aria-label=\"Set your first goal\"\n sx={{\n mt: 2,\n px: 4,\n py: 1.5,\n fontSize: '1rem',\n fontWeight: 'medium',\n textTransform: 'none',\n boxShadow: 2,\n '&:hover': {\n boxShadow: 4,\n },\n }}\n >\n Set Your First Goal\n </Button>\n )}\n </Box>\n );\n}\n","/**\n * GoalsCompletedState\n *\n * Display celebration state when all goals are completed.\n * Encourages users to set new goals and celebrates their achievement.\n */\n\nimport { Box, Button, Typography } from '@mui/material';\nimport EmojiEventsIcon from '@mui/icons-material/EmojiEvents';\nimport AddIcon from '@mui/icons-material/Add';\n\nexport interface GoalsCompletedStateProps {\n /**\n * Callback when user clicks \"Set New Goal\" button\n */\n onSetNewGoal?: () => void;\n\n /**\n * Optional custom title\n * @default \"All Goals Completed!\"\n */\n title?: string;\n\n /**\n * Optional custom message\n * @default \"Congratulations! You've achieved all your financial goals.\"\n */\n message?: string;\n\n /**\n * Minimum height for the completed state container\n * @default 400\n */\n minHeight?: number;\n}\n\n/**\n * Completed state component for goals list\n *\n * Displayed when all user's goals are completed. Provides celebration messaging\n * and encouragement to set new goals.\n *\n * @example\n * ```tsx\n * <GoalsCompletedState\n * onSetNewGoal={() => navigate('/goals/new')}\n * />\n * ```\n */\nexport function GoalsCompletedState({\n onSetNewGoal,\n title = 'All Goals Completed!',\n message = \"Congratulations! You've achieved all your financial goals.\",\n minHeight = 400,\n}: GoalsCompletedStateProps) {\n return (\n <Box\n data-testid=\"goals-completed-state\"\n sx={{\n minHeight,\n height: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n py: 6,\n px: 2,\n }}\n >\n {/* Trophy Icon */}\n <EmojiEventsIcon\n sx={{\n fontSize: 80,\n color: 'success.main',\n opacity: 0.8,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Title */}\n <Typography\n variant=\"h5\"\n component=\"h2\"\n color=\"success.main\"\n sx={{ fontWeight: 'medium' }}\n >\n {title}\n </Typography>\n\n {/* Message */}\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n align=\"center\"\n sx={{ maxWidth: 480, px: 2 }}\n >\n {message}\n </Typography>\n\n {/* Achievement Highlights */}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n mt: 1,\n mb: 2,\n }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>🎉</Box>\n Celebrate your financial discipline and achievement\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>🚀</Box>\n Ready to set even more ambitious goals\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>💪</Box>\n Keep the momentum going with new challenges\n </Typography>\n </Box>\n\n {/* Call-to-Action Button */}\n {onSetNewGoal && (\n <Button\n variant=\"contained\"\n color=\"success\"\n size=\"large\"\n startIcon={<AddIcon />}\n onClick={onSetNewGoal}\n aria-label=\"Set a new goal\"\n sx={{\n mt: 2,\n px: 4,\n py: 1.5,\n fontSize: '1rem',\n fontWeight: 'medium',\n textTransform: 'none',\n boxShadow: 2,\n '&:hover': {\n boxShadow: 4,\n },\n }}\n >\n Set New Goal\n </Button>\n )}\n </Box>\n );\n}\n","import { Box, Card, CardContent, List, ListItem, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useGoalProgress } from '@pfm-platform/goals-feature';\nimport { GoalsEmptyState } from './GoalsEmptyState';\nimport { GoalsCompletedState } from './GoalsCompletedState';\n\nexport interface GoalListProps {\n userId: string;\n /** Filter by goal type (savings/payoff) */\n type?: 'savings' | 'payoff';\n /** Custom title for the list */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Maximum number of goals to display */\n maxItems?: number;\n /** Callback when user clicks \"Set Your First Goal\" in empty state */\n onSetGoal?: () => void;\n /** Callback when user clicks \"Set New Goal\" in completed state */\n onSetNewGoal?: () => void;\n}\n\n/**\n * GoalList component displays goals with progress bars.\n * Shows goal name, type, amounts, and visual progress indicator.\n */\nexport function GoalList({\n userId,\n type,\n title = 'Goals',\n currencySymbol = '$',\n maxItems,\n onSetGoal,\n onSetNewGoal,\n}: GoalListProps) {\n const goals = useGoalProgress({ userId, type });\n\n if (!goals) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading goals...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n const displayGoals = maxItems ? goals.slice(0, maxItems) : goals;\n const allGoalsCompleted = displayGoals.length > 0 && displayGoals.every(goal => goal.percentComplete >= 100);\n\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {displayGoals.length === 0 ? (\n <GoalsEmptyState onSetGoal={onSetGoal} />\n ) : allGoalsCompleted ? (\n <GoalsCompletedState onSetNewGoal={onSetNewGoal} />\n ) : (\n <List disablePadding>\n {displayGoals.map((goal, index) => (\n <ListItem\n key={goal.id}\n divider={index < displayGoals.length - 1}\n sx={{ px: 0, display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}\n >\n <Box sx={{ width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 0.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {goal.name}\n </Typography>\n <Chip\n label={goal.type}\n size=\"small\"\n color={goal.type === 'savings' ? 'success' : 'warning'}\n variant=\"outlined\"\n />\n </Box>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {currencySymbol}{goal.currentValue.toFixed(2)} / {currencySymbol}{goal.targetValue.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(goal.percentComplete, 100)}\n color={goal.percentComplete >= 100 ? 'success' : 'primary'}\n sx={{ height: 8, borderRadius: 1 }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {goal.percentComplete.toFixed(1)}% • {currencySymbol}{goal.remaining.toFixed(2)} remaining • {currencySymbol}{goal.monthlyContribution.toFixed(2)}/month\n </Typography>\n </Box>\n </ListItem>\n ))}\n </List>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { Box, Card, CardContent, Grid, Typography, LinearProgress } from '@mui/material';\nimport { useGoalProgress } from '@pfm-platform/goals-feature';\n\nexport interface GoalSummaryProps {\n userId: string;\n /** Filter by goal type (savings/payoff) */\n type?: 'savings' | 'payoff';\n /** Custom title for the summary */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n}\n\n/**\n * GoalSummary component displays aggregate goal statistics.\n * Shows total goals, current value, target value, and overall progress.\n */\nexport function GoalSummary({\n userId,\n type,\n title = 'Goal Summary',\n currencySymbol = '$',\n}: GoalSummaryProps) {\n const goals = useGoalProgress({ userId, type });\n\n if (!goals) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading goal summary...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n if (goals.length === 0) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No goals found\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n // Calculate aggregate statistics\n const totalGoals = goals.length;\n const totalCurrent = goals.reduce((sum, goal) => sum + goal.currentValue, 0);\n const totalTarget = goals.reduce((sum, goal) => sum + goal.targetValue, 0);\n const totalRemaining = totalTarget - totalCurrent;\n const percentComplete = totalTarget > 0 ? (totalCurrent / totalTarget) * 100 : 0;\n const totalMonthlyContribution = goals.reduce((sum, goal) => sum + goal.monthlyContribution, 0);\n\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Grid container spacing={2}>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Goals\n </Typography>\n <Typography variant=\"h5\">{totalGoals}</Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Target Amount\n </Typography>\n <Typography variant=\"h5\">\n {currencySymbol}{totalTarget.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Current Amount\n </Typography>\n <Typography variant=\"h6\" color=\"primary.main\">\n {currencySymbol}{totalCurrent.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Remaining\n </Typography>\n <Typography variant=\"h6\">\n {currencySymbol}{totalRemaining.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={12}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Monthly Contribution\n </Typography>\n <Typography variant=\"h6\" color=\"success.main\">\n {currencySymbol}{totalMonthlyContribution.toFixed(2)}/month\n </Typography>\n </Box>\n </Grid>\n <Grid size={12}>\n <Box>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Overall Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {percentComplete.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentComplete, 100)}\n color={percentComplete >= 100 ? 'success' : 'primary'}\n sx={{ height: 10, borderRadius: 1 }}\n />\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n}\n","import {\n Card,\n CardContent,\n Box,\n Typography,\n LinearProgress,\n Chip,\n Avatar,\n} from '@mui/material';\nimport {\n TrendingUp,\n EmojiEvents,\n Flag,\n Timer,\n} from '@mui/icons-material';\n\nexport interface GoalProgressCardProps {\n /** Goal name */\n name: string;\n /** Current value/progress */\n currentValue: string;\n /** Target value */\n targetValue: string;\n /** Initial value (for payoff goals) */\n initialValue?: string;\n /** Percent complete (0-100) */\n percentComplete: number;\n /** Goal type */\n goalType: 'savings' | 'payoff';\n /** Optional image URL */\n imageUrl?: string;\n /** Currency symbol */\n currencySymbol?: string;\n /** Whether goal is complete */\n complete?: boolean;\n /** Estimated months remaining */\n monthsRemaining?: number;\n /** Monthly contribution amount */\n monthlyContribution?: string;\n}\n\n/**\n * GoalProgressCard component displays individual goal progress.\n * Shows visual progress indicator with key metrics and status.\n *\n * @example\n * ```tsx\n * <GoalProgressCard\n * name=\"Emergency Fund\"\n * currentValue=\"5000.00\"\n * targetValue=\"10000.00\"\n * percentComplete={50}\n * goalType=\"savings\"\n * currencySymbol=\"$\"\n * />\n * ```\n */\nexport function GoalProgressCard({\n name,\n currentValue,\n targetValue,\n initialValue: _initialValue,\n percentComplete,\n goalType,\n imageUrl,\n currencySymbol = '$',\n complete = false,\n monthsRemaining,\n monthlyContribution,\n}: GoalProgressCardProps) {\n const current = parseFloat(currentValue);\n const target = parseFloat(targetValue);\n\n const remaining = goalType === 'savings' ? target - current : current;\n const progressColor = complete\n ? 'success'\n : percentComplete >= 75\n ? 'primary'\n : percentComplete >= 50\n ? 'info'\n : percentComplete >= 25\n ? 'warning'\n : 'error';\n\n const formatCurrency = (amount: number): string => {\n return `${currencySymbol}${amount.toFixed(2)}`;\n };\n\n return (\n <Card>\n <CardContent>\n {/* Header with Image and Name */}\n <Box display=\"flex\" alignItems=\"flex-start\" gap={2} mb={2}>\n {imageUrl && (\n <Avatar\n src={imageUrl}\n alt={name}\n sx={{ width: 56, height: 56 }}\n variant=\"rounded\"\n />\n )}\n <Box flex={1}>\n <Typography variant=\"h6\" gutterBottom>\n {name}\n </Typography>\n <Chip\n label={goalType === 'savings' ? 'Savings Goal' : 'Payoff Goal'}\n size=\"small\"\n color={goalType === 'savings' ? 'success' : 'warning'}\n icon={goalType === 'savings' ? <TrendingUp /> : <Flag />}\n />\n </Box>\n {complete && (\n <EmojiEvents color=\"success\" sx={{ fontSize: 40 }} />\n )}\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 2 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" mb={1}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"bold\" color={`${progressColor}.main`}>\n {percentComplete}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentComplete, 100)}\n color={progressColor}\n sx={{ height: 8, borderRadius: 4 }}\n />\n </Box>\n\n {/* Amounts */}\n <Box\n display=\"grid\"\n gridTemplateColumns=\"1fr 1fr\"\n gap={2}\n sx={{ mb: 2 }}\n >\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {goalType === 'savings' ? 'Current' : 'Remaining'}\n </Typography>\n <Typography variant=\"h6\" color=\"text.primary\">\n {formatCurrency(goalType === 'savings' ? current : remaining)}\n </Typography>\n </Box>\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Target\n </Typography>\n <Typography variant=\"h6\" color=\"text.primary\">\n {formatCurrency(target)}\n </Typography>\n </Box>\n </Box>\n\n {/* Additional Info */}\n <Box display=\"flex\" flexDirection=\"column\" gap={1}>\n {monthlyContribution && parseFloat(monthlyContribution) > 0 && (\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n <TrendingUp fontSize=\"small\" color=\"action\" />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {formatCurrency(parseFloat(monthlyContribution))}/month\n </Typography>\n </Box>\n )}\n\n {monthsRemaining !== undefined && monthsRemaining > 0 && !complete && (\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n <Timer fontSize=\"small\" color=\"action\" />\n <Typography variant=\"caption\" color=\"text.secondary\">\n ~{monthsRemaining} {monthsRemaining === 1 ? 'month' : 'months'} remaining\n </Typography>\n </Box>\n )}\n\n {complete && (\n <Chip\n label=\"Goal Achieved!\"\n color=\"success\"\n size=\"small\"\n icon={<EmojiEvents />}\n sx={{ mt: 1 }}\n />\n )}\n\n {!complete && remaining > 0 && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {formatCurrency(remaining)} to go\n </Typography>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n}\n","import {\n Card,\n CardContent,\n Box,\n Typography,\n Stepper,\n Step,\n StepLabel,\n StepContent,\n Chip,\n LinearProgress,\n} from '@mui/material';\nimport {\n CheckCircle,\n RadioButtonUnchecked,\n Stars,\n} from '@mui/icons-material';\n\nexport interface Milestone {\n /** Milestone name */\n name: string;\n /** Target percentage (0-100) */\n targetPercent: number;\n /** Whether milestone is achieved */\n achieved: boolean;\n /** Optional description */\n description?: string;\n /** Optional reward/benefit */\n reward?: string;\n}\n\nexport interface GoalMilestoneTrackerProps {\n /** Goal name */\n goalName: string;\n /** Current progress percentage */\n currentPercent: number;\n /** Milestones to track */\n milestones?: Milestone[];\n /** Show progress bar */\n showProgressBar?: boolean;\n}\n\n/**\n * GoalMilestoneTracker component displays goal progress with milestone markers.\n * Shows achievement badges and upcoming milestones.\n *\n * @example\n * ```tsx\n * <GoalMilestoneTracker\n * goalName=\"Emergency Fund\"\n * currentPercent={65}\n * milestones={[\n * { name: \"25% Milestone\", targetPercent: 25, achieved: true },\n * { name: \"50% Milestone\", targetPercent: 50, achieved: true },\n * { name: \"75% Milestone\", targetPercent: 75, achieved: false },\n * { name: \"Goal Complete\", targetPercent: 100, achieved: false },\n * ]}\n * />\n * ```\n */\nexport function GoalMilestoneTracker({\n goalName,\n currentPercent,\n milestones,\n showProgressBar = true,\n}: GoalMilestoneTrackerProps) {\n // Default milestones if none provided\n const defaultMilestones: Milestone[] = [\n {\n name: '25% Complete',\n targetPercent: 25,\n achieved: currentPercent >= 25,\n description: 'Great start!',\n },\n {\n name: '50% Complete',\n targetPercent: 50,\n achieved: currentPercent >= 50,\n description: 'Halfway there!',\n },\n {\n name: '75% Complete',\n targetPercent: 75,\n achieved: currentPercent >= 75,\n description: 'Almost done!',\n },\n {\n name: 'Goal Achieved',\n targetPercent: 100,\n achieved: currentPercent >= 100,\n description: 'Congratulations!',\n reward: '🎉',\n },\n ];\n\n const activeMilestones = milestones || defaultMilestones;\n const achievedCount = activeMilestones.filter((m) => m.achieved).length;\n const currentMilestoneIndex = activeMilestones.findIndex((m) => !m.achieved);\n const nextMilestone =\n currentMilestoneIndex >= 0 ? activeMilestones[currentMilestoneIndex] : null;\n\n return (\n <Card>\n <CardContent>\n {/* Header */}\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" mb={2}>\n <Typography variant=\"h6\">Milestones</Typography>\n <Chip\n label={`${achievedCount}/${activeMilestones.length}`}\n color={achievedCount === activeMilestones.length ? 'success' : 'primary'}\n size=\"small\"\n />\n </Box>\n\n {/* Overall Progress */}\n {showProgressBar && (\n <Box sx={{ mb: 3 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" mb={1}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {goalName}\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"bold\">\n {currentPercent}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(currentPercent, 100)}\n color={currentPercent >= 100 ? 'success' : 'primary'}\n sx={{ height: 8, borderRadius: 4 }}\n />\n </Box>\n )}\n\n {/* Next Milestone Alert */}\n {nextMilestone && (\n <Box\n sx={{\n p: 2,\n mb: 2,\n bgcolor: 'primary.light',\n borderRadius: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <Stars color=\"primary\" />\n <Box>\n <Typography variant=\"subtitle2\" color=\"primary.dark\">\n Next Milestone: {nextMilestone.name}\n </Typography>\n <Typography variant=\"caption\" color=\"primary.dark\">\n {nextMilestone.targetPercent - currentPercent}% to go\n </Typography>\n </Box>\n </Box>\n )}\n\n {/* Milestone Stepper */}\n <Stepper orientation=\"vertical\" activeStep={currentMilestoneIndex}>\n {activeMilestones.map((milestone) => (\n <Step key={milestone.name} completed={milestone.achieved}>\n <StepLabel\n optional={\n milestone.reward && milestone.achieved ? (\n <Typography variant=\"caption\">{milestone.reward}</Typography>\n ) : null\n }\n StepIconComponent={() =>\n milestone.achieved ? (\n <CheckCircle color=\"success\" />\n ) : (\n <RadioButtonUnchecked color=\"action\" />\n )\n }\n >\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n <Typography variant=\"body2\" fontWeight={milestone.achieved ? 'bold' : 'normal'}>\n {milestone.name}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n ({milestone.targetPercent}%)\n </Typography>\n </Box>\n </StepLabel>\n <StepContent>\n {milestone.description && (\n <Typography variant=\"caption\" color=\"text.secondary\" paragraph>\n {milestone.description}\n </Typography>\n )}\n {milestone.achieved && (\n <Chip\n label=\"Achieved\"\n color=\"success\"\n size=\"small\"\n icon={<CheckCircle />}\n />\n )}\n </StepContent>\n </Step>\n ))}\n </Stepper>\n\n {/* Achievement Summary */}\n {achievedCount === activeMilestones.length && (\n <Box\n sx={{\n mt: 2,\n p: 2,\n bgcolor: 'success.light',\n borderRadius: 1,\n textAlign: 'center',\n }}\n >\n <Typography variant=\"h6\" color=\"success.dark\" gutterBottom>\n 🎉 All Milestones Achieved! 🎉\n </Typography>\n <Typography variant=\"body2\" color=\"success.dark\">\n Congratulations on reaching your goal!\n </Typography>\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * GoalItemCondensed\n *\n * Compact goal display component for dense lists and dashboards.\n * Single-line layout with essential information and progress indicator.\n */\n\nimport { Box, Typography, LinearProgress, Chip, Avatar } from '@mui/material';\nimport { TrendingUp, TrendingDown } from '@mui/icons-material';\n\nexport interface GoalItemCondensedProps {\n /** Goal name */\n name: string;\n /** Current value/progress */\n currentValue: number;\n /** Target value */\n targetValue: number;\n /** Percent complete (0-100) */\n percentComplete: number;\n /** Goal type */\n goalType: 'savings' | 'payoff';\n /** Optional image URL */\n imageUrl?: string;\n /** Currency symbol */\n currencySymbol?: string;\n /** Whether goal is complete */\n complete?: boolean;\n /** Click handler for the item */\n onClick?: () => void;\n}\n\n/**\n * Condensed goal item component for compact displays.\n *\n * Designed for use in:\n * - Dashboard summary lists\n * - Sidebar widgets\n * - Mobile compact views\n * - Quick-view panels\n *\n * @example\n * ```tsx\n * <GoalItemCondensed\n * name=\"Emergency Fund\"\n * currentValue={5000}\n * targetValue={10000}\n * percentComplete={50}\n * goalType=\"savings\"\n * currencySymbol=\"$\"\n * onClick={() => navigate('/goals/1')}\n * />\n * ```\n */\nexport function GoalItemCondensed({\n name,\n currentValue,\n targetValue,\n percentComplete,\n goalType,\n imageUrl,\n currencySymbol = '$',\n complete = false,\n onClick,\n}: GoalItemCondensedProps) {\n const formatCurrency = (amount: number): string => {\n return `${currencySymbol}${amount.toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n })}`;\n };\n\n const progressColor = complete\n ? 'success'\n : percentComplete >= 75\n ? 'primary'\n : percentComplete >= 50\n ? 'info'\n : 'warning';\n\n const Icon = goalType === 'savings' ? TrendingUp : TrendingDown;\n const iconColor = goalType === 'savings' ? 'success.main' : 'warning.main';\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (onClick && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n onClick();\n }\n };\n\n return (\n <Box\n data-testid=\"goal-item-condensed\"\n onClick={onClick}\n onKeyDown={handleKeyDown}\n tabIndex={onClick ? 0 : undefined}\n role={onClick ? 'button' : undefined}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n py: 1,\n px: 1.5,\n borderRadius: 1,\n cursor: onClick ? 'pointer' : 'default',\n transition: 'background-color 0.2s',\n '&:hover': onClick\n ? {\n backgroundColor: 'action.hover',\n }\n : undefined,\n '&:focus': onClick\n ? {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: '2px',\n }\n : undefined,\n }}\n >\n {/* Image/Icon */}\n {imageUrl ? (\n <Avatar\n src={imageUrl}\n alt={name}\n sx={{ width: 32, height: 32 }}\n variant=\"rounded\"\n />\n ) : (\n <Avatar\n sx={{\n width: 32,\n height: 32,\n bgcolor: 'transparent',\n color: iconColor,\n }}\n variant=\"rounded\"\n >\n <Icon fontSize=\"small\" />\n </Avatar>\n )}\n\n {/* Content: Name and Progress */}\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {/* Name and Type Chip */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, mb: 0.5 }}>\n <Typography\n variant=\"body2\"\n fontWeight=\"medium\"\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n }}\n >\n {name}\n </Typography>\n <Chip\n label={goalType}\n size=\"small\"\n color={goalType === 'savings' ? 'success' : 'warning'}\n sx={{\n height: 18,\n fontSize: '0.6875rem',\n '& .MuiChip-label': {\n px: 0.75,\n py: 0,\n },\n }}\n />\n </Box>\n\n {/* Progress Bar */}\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentComplete, 100)}\n color={progressColor}\n sx={{\n height: 4,\n borderRadius: 1,\n backgroundColor: 'action.hover',\n }}\n />\n </Box>\n\n {/* Amount and Percentage */}\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-end', minWidth: 80 }}>\n <Typography variant=\"caption\" fontWeight=\"medium\" color=\"text.primary\">\n {formatCurrency(currentValue)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.6875rem' }}>\n {percentComplete.toFixed(0)}% of {formatCurrency(targetValue)}\n </Typography>\n </Box>\n </Box>\n );\n}\n","/**\n * GoalImageDialog\n *\n * Dialog for selecting goal images from available catalog.\n * Provides visual selection interface for savings and payoff goal images.\n *\n * Features:\n * - Grid display of available images\n * - Visual selection feedback\n * - Separate catalogs for savings vs payoff goals\n * - Loading and error states\n * - Responsive grid layout\n *\n * Integration:\n * - Used in GoalCreateForm for initial image selection\n * - Used in GoalEditForm for image updates\n * - Consumes useSavingsGoalImages/usePayoffGoalImages hooks\n */\n\nimport { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n ImageList,\n ImageListItem,\n ImageListItemBar,\n CircularProgress,\n Alert,\n Box,\n Typography,\n useMediaQuery,\n useTheme,\n} from '@mui/material';\nimport { Check as CheckIcon } from '@mui/icons-material';\nimport { useSavingsGoalImages, usePayoffGoalImages } from '@pfm-platform/goals-data-access';\n\nexport interface GoalImageDialogProps {\n /**\n * Whether dialog is open\n */\n open: boolean;\n\n /**\n * Callback when dialog is closed\n */\n onClose: () => void;\n\n /**\n * Callback when image is selected\n * @param imageName - The name identifier of the selected image\n * @param imageUrl - The URL of the selected image\n */\n onSelectImage: (imageName: string, imageUrl: string) => void;\n\n /**\n * Currently selected image name (for highlighting)\n */\n selectedImageName?: string;\n\n /**\n * Goal type determines which image catalog to display\n */\n goalType: 'savings' | 'payoff';\n\n /**\n * Optional title override\n */\n title?: string;\n}\n\n/**\n * Goal image selection dialog component.\n *\n * Displays available goal images in a responsive grid layout.\n * Fetches images based on goal type (savings or payoff).\n *\n * @example\n * ```tsx\n * <GoalImageDialog\n * open={dialogOpen}\n * onClose={() => setDialogOpen(false)}\n * onSelectImage={(name, url) => {\n * setImageName(name);\n * setImageUrl(url);\n * setDialogOpen(false);\n * }}\n * selectedImageName={imageName}\n * goalType=\"savings\"\n * />\n * ```\n */\nexport function GoalImageDialog({\n open,\n onClose,\n onSelectImage,\n selectedImageName,\n goalType,\n title,\n}: GoalImageDialogProps) {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const isTablet = useMediaQuery(theme.breakpoints.down('md'));\n\n const [tempSelectedImage, setTempSelectedImage] = useState<{\n name: string;\n url: string;\n } | null>(null);\n\n // Fetch images based on goal type\n const savingsImages = useSavingsGoalImages({ enabled: goalType === 'savings' && open });\n const payoffImages = usePayoffGoalImages({ enabled: goalType === 'payoff' && open });\n\n const imagesQuery = goalType === 'savings' ? savingsImages : payoffImages;\n const images = imagesQuery.data?.images || [];\n\n // Determine grid columns based on screen size\n const cols = isMobile ? 2 : isTablet ? 3 : 4;\n\n const handleImageClick = (name: string, url: string) => {\n setTempSelectedImage({ name, url });\n };\n\n const handleConfirm = () => {\n if (tempSelectedImage) {\n onSelectImage(tempSelectedImage.name, tempSelectedImage.url);\n setTempSelectedImage(null);\n }\n onClose();\n };\n\n const handleCancel = () => {\n setTempSelectedImage(null);\n onClose();\n };\n\n // Determine which image should be highlighted\n const highlightedImageName = tempSelectedImage?.name || selectedImageName;\n\n const dialogTitle = title || `Select ${goalType === 'savings' ? 'Savings' : 'Payoff'} Goal Image`;\n\n return (\n <Dialog\n open={open}\n onClose={handleCancel}\n maxWidth=\"md\"\n fullWidth\n fullScreen={isMobile}\n aria-labelledby=\"goal-image-dialog-title\"\n >\n <DialogTitle id=\"goal-image-dialog-title\">{dialogTitle}</DialogTitle>\n\n <DialogContent>\n {imagesQuery.isLoading && (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 200,\n }}\n >\n <CircularProgress />\n </Box>\n )}\n\n {imagesQuery.isError && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n Failed to load goal images. Please try again.\n </Alert>\n )}\n\n {!imagesQuery.isLoading && !imagesQuery.isError && images.length === 0 && (\n <Alert severity=\"info\">No images available for {goalType} goals.</Alert>\n )}\n\n {!imagesQuery.isLoading && !imagesQuery.isError && images.length > 0 && (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Click an image to select it, then click Confirm.\n </Typography>\n\n <ImageList cols={cols} gap={16} sx={{ maxHeight: isMobile ? 'none' : 500 }}>\n {images.map((image) => {\n const isSelected = highlightedImageName === image.name;\n\n return (\n <ImageListItem\n key={image.id}\n sx={{\n cursor: 'pointer',\n border: isSelected ? `3px solid ${theme.palette.primary.main}` : '2px solid transparent',\n borderRadius: 1,\n overflow: 'hidden',\n transition: 'all 0.2s',\n position: 'relative',\n '&:hover': {\n border: `3px solid ${isSelected ? theme.palette.primary.main : theme.palette.action.hover}`,\n transform: 'scale(1.02)',\n },\n }}\n onClick={() => handleImageClick(image.name, image.url)}\n >\n <img\n src={image.url}\n alt={image.name}\n loading=\"lazy\"\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n }}\n />\n <ImageListItemBar\n title={image.name}\n sx={{\n background: isSelected\n ? 'linear-gradient(to top, rgba(25, 118, 210, 0.9) 0%, rgba(25, 118, 210, 0.7) 70%, rgba(25, 118, 210, 0) 100%)'\n : 'linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.3) 70%, rgba(0,0,0,0) 100%)',\n }}\n />\n {isSelected && (\n <Box\n sx={{\n position: 'absolute',\n top: 8,\n right: 8,\n bgcolor: 'primary.main',\n borderRadius: '50%',\n width: 32,\n height: 32,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: 2,\n }}\n >\n <CheckIcon sx={{ color: 'white', fontSize: 20 }} />\n </Box>\n )}\n </ImageListItem>\n );\n })}\n </ImageList>\n </>\n )}\n </DialogContent>\n\n <DialogActions>\n <Button onClick={handleCancel} color=\"inherit\">\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n variant=\"contained\"\n disabled={!tempSelectedImage && !selectedImageName}\n aria-label=\"Confirm image selection\"\n >\n Confirm\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/GoalCreateForm.tsx","../src/components/GoalDeleteButton.tsx","../src/components/GoalEditForm.tsx","../src/components/GoalsEmptyState.tsx","../src/components/GoalsCompletedState.tsx","../src/components/GoalList.tsx","../src/components/GoalSummary.tsx","../src/components/GoalProgressCard.tsx","../src/components/GoalMilestoneTracker.tsx","../src/components/GoalItemCondensed.tsx","../src/components/GoalImageDialog.tsx"],"names":["useState","useCreateSavingsGoal","useCreatePayoffGoal","Paper","jsx","Typography","jsxs","Box","FormControl","InputLabel","Select","MenuItem","TextField","Alert","Button","CircularProgress","useDeleteSavingsGoal","useDeletePayoffGoal","Fragment","Tooltip","IconButton","DeleteIcon","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","useUpdateSavingsGoal","useUpdatePayoffGoal","FlagIcon","AddIcon","EmojiEventsIcon","useGoalProgress","Card","CardContent","List","ListItem","Chip","LinearProgress","Grid","Avatar","TrendingUp","Flag","EmojiEvents","Timer","Stars","Stepper","Step","StepLabel","CheckCircle","RadioButtonUnchecked","StepContent","TrendingDown","useTheme","useMediaQuery","useSavingsGoalImages","usePayoffGoalImages","ImageList","ImageListItem","ImageListItemBar","CheckIcon"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Paper,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n type SelectChangeEvent,\n} from '@mui/material';\nimport { useCreateSavingsGoal, useCreatePayoffGoal } from '@pfm-platform/goals-data-access';\nimport type { GoalCreate } from '@pfm-platform/shared';\n\nexport interface GoalCreateFormProps {\n userId: string;\n onSuccess?: () => void;\n}\n\ntype GoalType = 'savings' | 'payoff';\n\nexport function GoalCreateForm({\n userId,\n onSuccess,\n}: GoalCreateFormProps) {\n const [goalType, setGoalType] = useState<GoalType>('savings');\n const [name, setName] = useState('');\n const [imageName, setImageName] = useState('');\n const [targetValue, setTargetValue] = useState('');\n const [targetCompletionOn, setTargetCompletionOn] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const createSavingsGoal = useCreateSavingsGoal({\n onSuccess: () => {\n resetForm();\n onSuccess?.();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to create savings goal');\n },\n });\n\n const createPayoffGoal = useCreatePayoffGoal({\n onSuccess: () => {\n resetForm();\n onSuccess?.();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to create payoff goal');\n },\n });\n\n const resetForm = () => {\n setName('');\n setImageName('');\n setTargetValue('');\n setTargetCompletionOn('');\n setError(null);\n };\n\n const handleGoalTypeChange = (event: SelectChangeEvent<GoalType>) => {\n setGoalType(event.target.value as GoalType);\n setError(null);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n /* v8 ignore next 15 - defensive validation, button disabled prevents reaching this */\n if (!name.trim()) {\n setError('Goal name is required');\n return;\n }\n\n if (!imageName.trim()) {\n setError('Image name is required');\n return;\n }\n\n const amount = parseFloat(targetValue);\n if (isNaN(amount) || amount <= 0) {\n setError('Target value must be a positive number');\n return;\n }\n\n const data: GoalCreate = {\n name: name.trim(),\n image_name: imageName.trim(),\n target_value: amount,\n target_completion_on: targetCompletionOn || undefined,\n };\n\n if (goalType === 'savings') {\n createSavingsGoal.mutate({ userId, data });\n } else {\n createPayoffGoal.mutate({ userId, data });\n }\n };\n\n const isPending = createSavingsGoal.isPending || createPayoffGoal.isPending;\n\n return (\n <Paper sx={{ p: 3 }}>\n <Typography variant=\"h6\" gutterBottom>\n Create Goal\n </Typography>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}\n >\n <FormControl fullWidth disabled={isPending}>\n <InputLabel id=\"goal-type-label\">Goal Type</InputLabel>\n <Select\n labelId=\"goal-type-label\"\n id=\"goal-type\"\n value={goalType}\n label=\"Goal Type\"\n onChange={handleGoalTypeChange}\n >\n <MenuItem value=\"savings\">Savings Goal (Save TO a target)</MenuItem>\n <MenuItem value=\"payoff\">Payoff Goal (Pay DOWN debt)</MenuItem>\n </Select>\n </FormControl>\n\n <TextField\n label=\"Goal Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !name.trim()}\n helperText={\n goalType === 'savings'\n ? \"Enter a name for your savings goal (e.g., 'Emergency Fund', 'Vacation')\"\n : \"Enter a name for your payoff goal (e.g., 'Credit Card Debt', 'Student Loan')\"\n }\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Image Name\"\n value={imageName}\n onChange={(e) => {\n setImageName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !imageName.trim()}\n helperText={\n goalType === 'savings'\n ? \"Enter image name (e.g., 'piggy_bank', 'vacation', 'house')\"\n : \"Enter image name (e.g., 'credit_card', 'loan', 'debt')\"\n }\n />\n\n <TextField\n label={goalType === 'savings' ? 'Target Amount' : 'Debt Amount'}\n type=\"number\"\n value={targetValue}\n onChange={(e) => {\n setTargetValue(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && (isNaN(parseFloat(targetValue)) || parseFloat(targetValue) <= 0)}\n helperText={\n goalType === 'savings'\n ? 'Enter the target amount to save (e.g., 5000.00)'\n : 'Enter the total debt amount to pay off (e.g., 3000.00)'\n }\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Target Completion Date (optional)\"\n type=\"date\"\n value={targetCompletionOn}\n onChange={(e) => {\n setTargetCompletionOn(e.target.value);\n setError(null);\n }}\n fullWidth\n disabled={isPending}\n helperText=\"Enter the date you want to complete this goal by (YYYY-MM-DD)\"\n InputLabelProps={{\n shrink: true,\n }}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={isPending || !name.trim() || !imageName.trim() || !targetValue}\n startIcon={isPending ? <CircularProgress size={20} /> : null}\n >\n {isPending\n ? 'Creating...'\n : `Create ${goalType === 'savings' ? 'Savings' : 'Payoff'} Goal`}\n </Button>\n </Box>\n </Box>\n </Paper>\n );\n}\n","import { useState } from 'react';\nimport {\n IconButton,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n Tooltip,\n} from '@mui/material';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { useDeleteSavingsGoal, useDeletePayoffGoal } from '@pfm-platform/goals-data-access';\n\nexport interface GoalDeleteButtonProps {\n userId: string;\n goalId: string;\n goalName: string;\n goalType: 'savings' | 'payoff';\n}\n\nexport function GoalDeleteButton({\n userId,\n goalId,\n goalName,\n goalType,\n}: GoalDeleteButtonProps) {\n const [open, setOpen] = useState(false);\n\n const deleteSavingsGoal = useDeleteSavingsGoal({\n onSuccess: () => {\n setOpen(false);\n },\n });\n\n const deletePayoffGoal = useDeletePayoffGoal({\n onSuccess: () => {\n setOpen(false);\n },\n });\n\n const handleDelete = () => {\n if (goalType === 'savings') {\n deleteSavingsGoal.mutate({ userId, goalId });\n } else {\n deletePayoffGoal.mutate({ userId, goalId });\n }\n };\n\n const isPending = deleteSavingsGoal.isPending || deletePayoffGoal.isPending;\n\n return (\n <>\n <Tooltip title=\"Delete goal\">\n <IconButton\n onClick={() => setOpen(true)}\n color=\"error\"\n size=\"small\"\n aria-label={`delete ${goalType} goal ${goalName}`}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onClose={() => !isPending && setOpen(false)}\n aria-labelledby=\"delete-goal-dialog-title\"\n >\n <DialogTitle id=\"delete-goal-dialog-title\">\n Delete {goalType === 'savings' ? 'Savings' : 'Payoff'} Goal?\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n Are you sure you want to delete the {goalType} goal \"{goalName}\"? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => setOpen(false)}\n disabled={isPending}\n >\n Cancel\n </Button>\n <Button\n onClick={handleDelete}\n color=\"error\"\n variant=\"contained\"\n disabled={isPending}\n autoFocus\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n} from '@mui/material';\nimport { useUpdateSavingsGoal, useUpdatePayoffGoal } from '@pfm-platform/goals-data-access';\nimport type { SavingsGoalRow, PayoffGoalRow, GoalUpdate } from '@pfm-platform/shared';\n\nexport interface GoalEditFormProps {\n userId: string;\n goal: SavingsGoalRow | PayoffGoalRow;\n goalType: 'savings' | 'payoff';\n open: boolean;\n onClose: () => void;\n}\n\nexport function GoalEditForm({\n userId,\n goal,\n goalType,\n open,\n onClose,\n}: GoalEditFormProps) {\n const [name, setName] = useState(goal.name);\n const [imageName, setImageName] = useState(goal.image_name);\n const [targetValue, setTargetValue] = useState(String(goal.target_value));\n const [targetCompletionOn, setTargetCompletionOn] = useState(\n goal.target_completion_on || ''\n );\n const [error, setError] = useState<string | null>(null);\n\n const updateSavingsGoal = useUpdateSavingsGoal({\n onSuccess: () => {\n setError(null);\n onClose();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update savings goal');\n },\n });\n\n const updatePayoffGoal = useUpdatePayoffGoal({\n onSuccess: () => {\n setError(null);\n onClose();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update payoff goal');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n /* v8 ignore next 15 - defensive validation, button disabled prevents reaching this */\n if (!name.trim()) {\n setError('Goal name is required');\n return;\n }\n\n if (!imageName.trim()) {\n setError('Image name is required');\n return;\n }\n\n const amount = parseFloat(targetValue);\n if (isNaN(amount) || amount <= 0) {\n setError('Target value must be a positive number');\n return;\n }\n\n const data: GoalUpdate = {\n id: goal.id,\n name: name.trim(),\n image_name: imageName.trim(),\n target_value: amount,\n target_completion_on: targetCompletionOn || undefined,\n };\n\n if (goalType === 'savings') {\n updateSavingsGoal.mutate({ userId, goalId: goal.id, data });\n } else {\n updatePayoffGoal.mutate({ userId, goalId: goal.id, data });\n }\n };\n\n const isPending = updateSavingsGoal.isPending || updatePayoffGoal.isPending;\n\n const handleClose = () => {\n if (!isPending) {\n onClose();\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={handleClose}\n maxWidth=\"sm\"\n fullWidth\n aria-labelledby=\"edit-goal-dialog-title\"\n >\n <form onSubmit={handleSubmit}>\n <DialogTitle id=\"edit-goal-dialog-title\">\n Edit {goalType === 'savings' ? 'Savings' : 'Payoff'} Goal\n </DialogTitle>\n <DialogContent>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n <TextField\n label=\"Goal Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your goal\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Image Name\"\n value={imageName}\n onChange={(e) => {\n setImageName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && !imageName.trim()}\n helperText=\"Enter image name\"\n />\n\n <TextField\n label={goalType === 'savings' ? 'Target Amount' : 'Debt Amount'}\n type=\"number\"\n value={targetValue}\n onChange={(e) => {\n setTargetValue(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={isPending}\n error={!!error && (isNaN(parseFloat(targetValue)) || parseFloat(targetValue) <= 0)}\n helperText=\"Enter the target amount\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Target Completion Date (optional)\"\n type=\"date\"\n value={targetCompletionOn}\n onChange={(e) => {\n setTargetCompletionOn(e.target.value);\n setError(null);\n }}\n fullWidth\n disabled={isPending}\n helperText=\"Enter the target completion date (YYYY-MM-DD)\"\n InputLabelProps={{\n shrink: true,\n }}\n />\n\n {error && (\n <Alert severity=\"error\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={isPending}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={isPending || !name.trim() || !imageName.trim() || !targetValue}\n startIcon={isPending ? <CircularProgress size={20} /> : null}\n >\n {isPending ? 'Saving...' : 'Save Changes'}\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n );\n}\n","/**\n * GoalsEmptyState\n *\n * Display empty state when no goals exist.\n * Encourages users to set their first financial goal.\n */\n\nimport { Box, Button, Typography } from '@mui/material';\nimport FlagIcon from '@mui/icons-material/Flag';\nimport AddIcon from '@mui/icons-material/Add';\n\nexport interface GoalsEmptyStateProps {\n /**\n * Callback when user clicks \"Set Your First Goal\" button\n */\n onSetGoal?: () => void;\n\n /**\n * Optional custom title\n * @default \"No Goals Yet\"\n */\n title?: string;\n\n /**\n * Optional custom message\n * @default \"Set financial goals to stay motivated and track your progress.\"\n */\n message?: string;\n\n /**\n * Minimum height for the empty state container\n * @default 400\n */\n minHeight?: number;\n}\n\n/**\n * Empty state component for goals list\n *\n * Displayed when user has no goals. Provides friendly messaging\n * and clear call-to-action to create their first goal.\n *\n * @example\n * ```tsx\n * <GoalsEmptyState\n * onSetGoal={() => navigate('/goals/new')}\n * />\n * ```\n */\nexport function GoalsEmptyState({\n onSetGoal,\n title = 'No Goals Yet',\n message = 'Set financial goals to stay motivated and track your progress.',\n minHeight = 400,\n}: GoalsEmptyStateProps) {\n return (\n <Box\n data-testid=\"goals-empty-state\"\n sx={{\n minHeight,\n height: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n py: 6,\n px: 2,\n }}\n >\n {/* Icon */}\n <FlagIcon\n sx={{\n fontSize: 80,\n color: 'primary.main',\n opacity: 0.6,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Title */}\n <Typography\n variant=\"h5\"\n component=\"h2\"\n color=\"text.primary\"\n sx={{ fontWeight: 'medium' }}\n >\n {title}\n </Typography>\n\n {/* Message */}\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n align=\"center\"\n sx={{ maxWidth: 480, px: 2 }}\n >\n {message}\n </Typography>\n\n {/* Benefits List */}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n mt: 1,\n mb: 2,\n }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>✓</Box>\n Save for important purchases and milestones\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>✓</Box>\n Pay off debt faster with targeted plans\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>✓</Box>\n Track progress with visual charts and insights\n </Typography>\n </Box>\n\n {/* Call-to-Action Button */}\n {onSetGoal && (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"large\"\n startIcon={<AddIcon />}\n onClick={onSetGoal}\n aria-label=\"Set your first goal\"\n sx={{\n mt: 2,\n px: 4,\n py: 1.5,\n fontSize: '1rem',\n fontWeight: 'medium',\n textTransform: 'none',\n boxShadow: 2,\n '&:hover': {\n boxShadow: 4,\n },\n }}\n >\n Set Your First Goal\n </Button>\n )}\n </Box>\n );\n}\n","/**\n * GoalsCompletedState\n *\n * Display celebration state when all goals are completed.\n * Encourages users to set new goals and celebrates their achievement.\n */\n\nimport { Box, Button, Typography } from '@mui/material';\nimport EmojiEventsIcon from '@mui/icons-material/EmojiEvents';\nimport AddIcon from '@mui/icons-material/Add';\n\nexport interface GoalsCompletedStateProps {\n /**\n * Callback when user clicks \"Set New Goal\" button\n */\n onSetNewGoal?: () => void;\n\n /**\n * Optional custom title\n * @default \"All Goals Completed!\"\n */\n title?: string;\n\n /**\n * Optional custom message\n * @default \"Congratulations! You've achieved all your financial goals.\"\n */\n message?: string;\n\n /**\n * Minimum height for the completed state container\n * @default 400\n */\n minHeight?: number;\n}\n\n/**\n * Completed state component for goals list\n *\n * Displayed when all user's goals are completed. Provides celebration messaging\n * and encouragement to set new goals.\n *\n * @example\n * ```tsx\n * <GoalsCompletedState\n * onSetNewGoal={() => navigate('/goals/new')}\n * />\n * ```\n */\nexport function GoalsCompletedState({\n onSetNewGoal,\n title = 'All Goals Completed!',\n message = \"Congratulations! You've achieved all your financial goals.\",\n minHeight = 400,\n}: GoalsCompletedStateProps) {\n return (\n <Box\n data-testid=\"goals-completed-state\"\n sx={{\n minHeight,\n height: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n py: 6,\n px: 2,\n }}\n >\n {/* Trophy Icon */}\n <EmojiEventsIcon\n sx={{\n fontSize: 80,\n color: 'success.main',\n opacity: 0.8,\n }}\n aria-hidden=\"true\"\n />\n\n {/* Title */}\n <Typography\n variant=\"h5\"\n component=\"h2\"\n color=\"success.main\"\n sx={{ fontWeight: 'medium' }}\n >\n {title}\n </Typography>\n\n {/* Message */}\n <Typography\n variant=\"body1\"\n color=\"text.secondary\"\n align=\"center\"\n sx={{ maxWidth: 480, px: 2 }}\n >\n {message}\n </Typography>\n\n {/* Achievement Highlights */}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n mt: 1,\n mb: 2,\n }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>🎉</Box>\n Celebrate your financial discipline and achievement\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>🚀</Box>\n Ready to set even more ambitious goals\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box component=\"span\" sx={{ color: 'success.main', fontWeight: 'bold' }}>💪</Box>\n Keep the momentum going with new challenges\n </Typography>\n </Box>\n\n {/* Call-to-Action Button */}\n {onSetNewGoal && (\n <Button\n variant=\"contained\"\n color=\"success\"\n size=\"large\"\n startIcon={<AddIcon />}\n onClick={onSetNewGoal}\n aria-label=\"Set a new goal\"\n sx={{\n mt: 2,\n px: 4,\n py: 1.5,\n fontSize: '1rem',\n fontWeight: 'medium',\n textTransform: 'none',\n boxShadow: 2,\n '&:hover': {\n boxShadow: 4,\n },\n }}\n >\n Set New Goal\n </Button>\n )}\n </Box>\n );\n}\n","import { Box, Card, CardContent, List, ListItem, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useGoalProgress } from '@pfm-platform/goals-feature';\nimport { GoalsEmptyState } from './GoalsEmptyState';\nimport { GoalsCompletedState } from './GoalsCompletedState';\n\nexport interface GoalListProps {\n userId: string;\n /** Filter by goal type (savings/payoff) */\n type?: 'savings' | 'payoff';\n /** Custom title for the list */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Maximum number of goals to display */\n maxItems?: number;\n /** Callback when user clicks \"Set Your First Goal\" in empty state */\n onSetGoal?: () => void;\n /** Callback when user clicks \"Set New Goal\" in completed state */\n onSetNewGoal?: () => void;\n}\n\n/**\n * GoalList component displays goals with progress bars.\n * Shows goal name, type, amounts, and visual progress indicator.\n */\nexport function GoalList({\n userId,\n type,\n title = 'Goals',\n currencySymbol = '$',\n maxItems,\n onSetGoal,\n onSetNewGoal,\n}: GoalListProps) {\n const goals = useGoalProgress({ userId, type });\n\n if (!goals) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading goals...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n const displayGoals = maxItems ? goals.slice(0, maxItems) : goals;\n const allGoalsCompleted = displayGoals.length > 0 && displayGoals.every(goal => goal.percentComplete >= 100);\n\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {displayGoals.length === 0 ? (\n <GoalsEmptyState onSetGoal={onSetGoal} />\n ) : allGoalsCompleted ? (\n <GoalsCompletedState onSetNewGoal={onSetNewGoal} />\n ) : (\n <List disablePadding>\n {displayGoals.map((goal, index) => (\n <ListItem\n key={goal.id}\n divider={index < displayGoals.length - 1}\n sx={{ px: 0, display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}\n >\n <Box sx={{ width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 0.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {goal.name}\n </Typography>\n <Chip\n label={goal.type}\n size=\"small\"\n color={goal.type === 'savings' ? 'success' : 'warning'}\n variant=\"outlined\"\n />\n </Box>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {currencySymbol}{goal.currentValue.toFixed(2)} / {currencySymbol}{goal.targetValue.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(goal.percentComplete, 100)}\n color={goal.percentComplete >= 100 ? 'success' : 'primary'}\n sx={{ height: 8, borderRadius: 1 }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {goal.percentComplete.toFixed(1)}% • {currencySymbol}{goal.remaining.toFixed(2)} remaining • {currencySymbol}{goal.monthlyContribution.toFixed(2)}/month\n </Typography>\n </Box>\n </ListItem>\n ))}\n </List>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { Box, Card, CardContent, Grid, Typography, LinearProgress } from '@mui/material';\nimport { useGoalProgress } from '@pfm-platform/goals-feature';\n\nexport interface GoalSummaryProps {\n userId: string;\n /** Filter by goal type (savings/payoff) */\n type?: 'savings' | 'payoff';\n /** Custom title for the summary */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n}\n\n/**\n * GoalSummary component displays aggregate goal statistics.\n * Shows total goals, current value, target value, and overall progress.\n */\nexport function GoalSummary({\n userId,\n type,\n title = 'Goal Summary',\n currencySymbol = '$',\n}: GoalSummaryProps) {\n const goals = useGoalProgress({ userId, type });\n\n if (!goals) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading goal summary...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n if (goals.length === 0) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No goals found\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n // Calculate aggregate statistics\n const totalGoals = goals.length;\n const totalCurrent = goals.reduce((sum, goal) => sum + goal.currentValue, 0);\n const totalTarget = goals.reduce((sum, goal) => sum + goal.targetValue, 0);\n const totalRemaining = totalTarget - totalCurrent;\n const percentComplete = totalTarget > 0 ? (totalCurrent / totalTarget) * 100 : 0;\n const totalMonthlyContribution = goals.reduce((sum, goal) => sum + goal.monthlyContribution, 0);\n\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Grid container spacing={2}>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Goals\n </Typography>\n <Typography variant=\"h5\">{totalGoals}</Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Target Amount\n </Typography>\n <Typography variant=\"h5\">\n {currencySymbol}{totalTarget.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Current Amount\n </Typography>\n <Typography variant=\"h6\" color=\"primary.main\">\n {currencySymbol}{totalCurrent.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Remaining\n </Typography>\n <Typography variant=\"h6\">\n {currencySymbol}{totalRemaining.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={12}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Monthly Contribution\n </Typography>\n <Typography variant=\"h6\" color=\"success.main\">\n {currencySymbol}{totalMonthlyContribution.toFixed(2)}/month\n </Typography>\n </Box>\n </Grid>\n <Grid size={12}>\n <Box>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Overall Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {percentComplete.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentComplete, 100)}\n color={percentComplete >= 100 ? 'success' : 'primary'}\n sx={{ height: 10, borderRadius: 1 }}\n />\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n}\n","import {\n Card,\n CardContent,\n Box,\n Typography,\n LinearProgress,\n Chip,\n Avatar,\n} from '@mui/material';\nimport {\n TrendingUp,\n EmojiEvents,\n Flag,\n Timer,\n} from '@mui/icons-material';\n\nexport interface GoalProgressCardProps {\n /** Goal name */\n name: string;\n /** Current value/progress */\n currentValue: number;\n /** Target value */\n targetValue: number;\n /** Initial value (for payoff goals) */\n initialValue?: number;\n /** Percent complete (0-100) */\n percentComplete: number;\n /** Goal type */\n goalType: 'savings' | 'payoff';\n /** Optional image URL */\n imageUrl?: string;\n /** Currency symbol */\n currencySymbol?: string;\n /** Whether goal is complete */\n complete?: boolean;\n /** Estimated months remaining */\n monthsRemaining?: number;\n /** Monthly contribution amount */\n monthlyContribution?: number;\n}\n\n/**\n * GoalProgressCard component displays individual goal progress.\n * Shows visual progress indicator with key metrics and status.\n *\n * @example\n * ```tsx\n * <GoalProgressCard\n * name=\"Emergency Fund\"\n * currentValue={5000}\n * targetValue={10000}\n * percentComplete={50}\n * goalType=\"savings\"\n * currencySymbol=\"$\"\n * />\n * ```\n */\nexport function GoalProgressCard({\n name,\n currentValue,\n targetValue,\n initialValue: _initialValue,\n percentComplete,\n goalType,\n imageUrl,\n currencySymbol = '$',\n complete = false,\n monthsRemaining,\n monthlyContribution,\n}: GoalProgressCardProps) {\n const current = currentValue;\n const target = targetValue;\n\n const remaining = goalType === 'savings' ? target - current : current;\n const progressColor = complete\n ? 'success'\n : percentComplete >= 75\n ? 'primary'\n : percentComplete >= 50\n ? 'info'\n : percentComplete >= 25\n ? 'warning'\n : 'error';\n\n const formatCurrency = (amount: number): string => {\n return `${currencySymbol}${amount.toFixed(2)}`;\n };\n\n return (\n <Card>\n <CardContent>\n {/* Header with Image and Name */}\n <Box display=\"flex\" alignItems=\"flex-start\" gap={2} mb={2}>\n {imageUrl && (\n <Avatar\n src={imageUrl}\n alt={name}\n sx={{ width: 56, height: 56 }}\n variant=\"rounded\"\n />\n )}\n <Box flex={1}>\n <Typography variant=\"h6\" gutterBottom>\n {name}\n </Typography>\n <Chip\n label={goalType === 'savings' ? 'Savings Goal' : 'Payoff Goal'}\n size=\"small\"\n color={goalType === 'savings' ? 'success' : 'warning'}\n icon={goalType === 'savings' ? <TrendingUp /> : <Flag />}\n />\n </Box>\n {complete && (\n <EmojiEvents color=\"success\" sx={{ fontSize: 40 }} />\n )}\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 2 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" mb={1}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Progress\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"bold\" color={`${progressColor}.main`}>\n {percentComplete}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentComplete, 100)}\n color={progressColor}\n sx={{ height: 8, borderRadius: 4 }}\n />\n </Box>\n\n {/* Amounts */}\n <Box\n display=\"grid\"\n gridTemplateColumns=\"1fr 1fr\"\n gap={2}\n sx={{ mb: 2 }}\n >\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {goalType === 'savings' ? 'Current' : 'Remaining'}\n </Typography>\n <Typography variant=\"h6\" color=\"text.primary\">\n {formatCurrency(goalType === 'savings' ? current : remaining)}\n </Typography>\n </Box>\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Target\n </Typography>\n <Typography variant=\"h6\" color=\"text.primary\">\n {formatCurrency(target)}\n </Typography>\n </Box>\n </Box>\n\n {/* Additional Info */}\n <Box display=\"flex\" flexDirection=\"column\" gap={1}>\n {monthlyContribution != null && monthlyContribution > 0 && (\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n <TrendingUp fontSize=\"small\" color=\"action\" />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {formatCurrency(monthlyContribution)}/month\n </Typography>\n </Box>\n )}\n\n {monthsRemaining !== undefined && monthsRemaining > 0 && !complete && (\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n <Timer fontSize=\"small\" color=\"action\" />\n <Typography variant=\"caption\" color=\"text.secondary\">\n ~{monthsRemaining} {monthsRemaining === 1 ? 'month' : 'months'} remaining\n </Typography>\n </Box>\n )}\n\n {complete && (\n <Chip\n label=\"Goal Achieved!\"\n color=\"success\"\n size=\"small\"\n icon={<EmojiEvents />}\n sx={{ mt: 1 }}\n />\n )}\n\n {!complete && remaining > 0 && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {formatCurrency(remaining)} to go\n </Typography>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n}\n","import {\n Card,\n CardContent,\n Box,\n Typography,\n Stepper,\n Step,\n StepLabel,\n StepContent,\n Chip,\n LinearProgress,\n} from '@mui/material';\nimport {\n CheckCircle,\n RadioButtonUnchecked,\n Stars,\n} from '@mui/icons-material';\n\nexport interface Milestone {\n /** Milestone name */\n name: string;\n /** Target percentage (0-100) */\n targetPercent: number;\n /** Whether milestone is achieved */\n achieved: boolean;\n /** Optional description */\n description?: string;\n /** Optional reward/benefit */\n reward?: string;\n}\n\nexport interface GoalMilestoneTrackerProps {\n /** Goal name */\n goalName: string;\n /** Current progress percentage */\n currentPercent: number;\n /** Milestones to track */\n milestones?: Milestone[];\n /** Show progress bar */\n showProgressBar?: boolean;\n}\n\n/**\n * GoalMilestoneTracker component displays goal progress with milestone markers.\n * Shows achievement badges and upcoming milestones.\n *\n * @example\n * ```tsx\n * <GoalMilestoneTracker\n * goalName=\"Emergency Fund\"\n * currentPercent={65}\n * milestones={[\n * { name: \"25% Milestone\", targetPercent: 25, achieved: true },\n * { name: \"50% Milestone\", targetPercent: 50, achieved: true },\n * { name: \"75% Milestone\", targetPercent: 75, achieved: false },\n * { name: \"Goal Complete\", targetPercent: 100, achieved: false },\n * ]}\n * />\n * ```\n */\nexport function GoalMilestoneTracker({\n goalName,\n currentPercent,\n milestones,\n showProgressBar = true,\n}: GoalMilestoneTrackerProps) {\n // Default milestones if none provided\n const defaultMilestones: Milestone[] = [\n {\n name: '25% Complete',\n targetPercent: 25,\n achieved: currentPercent >= 25,\n description: 'Great start!',\n },\n {\n name: '50% Complete',\n targetPercent: 50,\n achieved: currentPercent >= 50,\n description: 'Halfway there!',\n },\n {\n name: '75% Complete',\n targetPercent: 75,\n achieved: currentPercent >= 75,\n description: 'Almost done!',\n },\n {\n name: 'Goal Achieved',\n targetPercent: 100,\n achieved: currentPercent >= 100,\n description: 'Congratulations!',\n reward: '🎉',\n },\n ];\n\n const activeMilestones = milestones || defaultMilestones;\n const achievedCount = activeMilestones.filter((m) => m.achieved).length;\n const currentMilestoneIndex = activeMilestones.findIndex((m) => !m.achieved);\n const nextMilestone =\n currentMilestoneIndex >= 0 ? activeMilestones[currentMilestoneIndex] : null;\n\n return (\n <Card>\n <CardContent>\n {/* Header */}\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\" mb={2}>\n <Typography variant=\"h6\">Milestones</Typography>\n <Chip\n label={`${achievedCount}/${activeMilestones.length}`}\n color={achievedCount === activeMilestones.length ? 'success' : 'primary'}\n size=\"small\"\n />\n </Box>\n\n {/* Overall Progress */}\n {showProgressBar && (\n <Box sx={{ mb: 3 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" mb={1}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {goalName}\n </Typography>\n <Typography variant=\"body2\" fontWeight=\"bold\">\n {currentPercent}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(currentPercent, 100)}\n color={currentPercent >= 100 ? 'success' : 'primary'}\n sx={{ height: 8, borderRadius: 4 }}\n />\n </Box>\n )}\n\n {/* Next Milestone Alert */}\n {nextMilestone && (\n <Box\n sx={{\n p: 2,\n mb: 2,\n bgcolor: 'primary.light',\n borderRadius: 1,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <Stars color=\"primary\" />\n <Box>\n <Typography variant=\"subtitle2\" color=\"primary.dark\">\n Next Milestone: {nextMilestone.name}\n </Typography>\n <Typography variant=\"caption\" color=\"primary.dark\">\n {nextMilestone.targetPercent - currentPercent}% to go\n </Typography>\n </Box>\n </Box>\n )}\n\n {/* Milestone Stepper */}\n <Stepper orientation=\"vertical\" activeStep={currentMilestoneIndex}>\n {activeMilestones.map((milestone) => (\n <Step key={milestone.name} completed={milestone.achieved}>\n <StepLabel\n optional={\n milestone.reward && milestone.achieved ? (\n <Typography variant=\"caption\">{milestone.reward}</Typography>\n ) : null\n }\n StepIconComponent={() =>\n milestone.achieved ? (\n <CheckCircle color=\"success\" />\n ) : (\n <RadioButtonUnchecked color=\"action\" />\n )\n }\n >\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n <Typography variant=\"body2\" fontWeight={milestone.achieved ? 'bold' : 'normal'}>\n {milestone.name}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n ({milestone.targetPercent}%)\n </Typography>\n </Box>\n </StepLabel>\n <StepContent>\n {milestone.description && (\n <Typography variant=\"caption\" color=\"text.secondary\" paragraph>\n {milestone.description}\n </Typography>\n )}\n {milestone.achieved && (\n <Chip\n label=\"Achieved\"\n color=\"success\"\n size=\"small\"\n icon={<CheckCircle />}\n />\n )}\n </StepContent>\n </Step>\n ))}\n </Stepper>\n\n {/* Achievement Summary */}\n {achievedCount === activeMilestones.length && (\n <Box\n sx={{\n mt: 2,\n p: 2,\n bgcolor: 'success.light',\n borderRadius: 1,\n textAlign: 'center',\n }}\n >\n <Typography variant=\"h6\" color=\"success.dark\" gutterBottom>\n 🎉 All Milestones Achieved! 🎉\n </Typography>\n <Typography variant=\"body2\" color=\"success.dark\">\n Congratulations on reaching your goal!\n </Typography>\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * GoalItemCondensed\n *\n * Compact goal display component for dense lists and dashboards.\n * Single-line layout with essential information and progress indicator.\n */\n\nimport { Box, Typography, LinearProgress, Chip, Avatar } from '@mui/material';\nimport { TrendingUp, TrendingDown } from '@mui/icons-material';\n\nexport interface GoalItemCondensedProps {\n /** Goal name */\n name: string;\n /** Current value/progress */\n currentValue: number;\n /** Target value */\n targetValue: number;\n /** Percent complete (0-100) */\n percentComplete: number;\n /** Goal type */\n goalType: 'savings' | 'payoff';\n /** Optional image URL */\n imageUrl?: string;\n /** Currency symbol */\n currencySymbol?: string;\n /** Whether goal is complete */\n complete?: boolean;\n /** Click handler for the item */\n onClick?: () => void;\n}\n\n/**\n * Condensed goal item component for compact displays.\n *\n * Designed for use in:\n * - Dashboard summary lists\n * - Sidebar widgets\n * - Mobile compact views\n * - Quick-view panels\n *\n * @example\n * ```tsx\n * <GoalItemCondensed\n * name=\"Emergency Fund\"\n * currentValue={5000}\n * targetValue={10000}\n * percentComplete={50}\n * goalType=\"savings\"\n * currencySymbol=\"$\"\n * onClick={() => navigate('/goals/1')}\n * />\n * ```\n */\nexport function GoalItemCondensed({\n name,\n currentValue,\n targetValue,\n percentComplete,\n goalType,\n imageUrl,\n currencySymbol = '$',\n complete = false,\n onClick,\n}: GoalItemCondensedProps) {\n const formatCurrency = (amount: number): string => {\n return `${currencySymbol}${amount.toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n })}`;\n };\n\n const progressColor = complete\n ? 'success'\n : percentComplete >= 75\n ? 'primary'\n : percentComplete >= 50\n ? 'info'\n : 'warning';\n\n const Icon = goalType === 'savings' ? TrendingUp : TrendingDown;\n const iconColor = goalType === 'savings' ? 'success.main' : 'warning.main';\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (onClick && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n onClick();\n }\n };\n\n return (\n <Box\n data-testid=\"goal-item-condensed\"\n onClick={onClick}\n onKeyDown={handleKeyDown}\n tabIndex={onClick ? 0 : undefined}\n role={onClick ? 'button' : undefined}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n py: 1,\n px: 1.5,\n borderRadius: 1,\n cursor: onClick ? 'pointer' : 'default',\n transition: 'background-color 0.2s',\n '&:hover': onClick\n ? {\n backgroundColor: 'action.hover',\n }\n : undefined,\n '&:focus': onClick\n ? {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: '2px',\n }\n : undefined,\n }}\n >\n {/* Image/Icon */}\n {imageUrl ? (\n <Avatar\n src={imageUrl}\n alt={name}\n sx={{ width: 32, height: 32 }}\n variant=\"rounded\"\n />\n ) : (\n <Avatar\n sx={{\n width: 32,\n height: 32,\n bgcolor: 'transparent',\n color: iconColor,\n }}\n variant=\"rounded\"\n >\n <Icon fontSize=\"small\" />\n </Avatar>\n )}\n\n {/* Content: Name and Progress */}\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {/* Name and Type Chip */}\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, mb: 0.5 }}>\n <Typography\n variant=\"body2\"\n fontWeight=\"medium\"\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n }}\n >\n {name}\n </Typography>\n <Chip\n label={goalType}\n size=\"small\"\n color={goalType === 'savings' ? 'success' : 'warning'}\n sx={{\n height: 18,\n fontSize: '0.6875rem',\n '& .MuiChip-label': {\n px: 0.75,\n py: 0,\n },\n }}\n />\n </Box>\n\n {/* Progress Bar */}\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentComplete, 100)}\n color={progressColor}\n sx={{\n height: 4,\n borderRadius: 1,\n backgroundColor: 'action.hover',\n }}\n />\n </Box>\n\n {/* Amount and Percentage */}\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-end', minWidth: 80 }}>\n <Typography variant=\"caption\" fontWeight=\"medium\" color=\"text.primary\">\n {formatCurrency(currentValue)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.6875rem' }}>\n {percentComplete.toFixed(0)}% of {formatCurrency(targetValue)}\n </Typography>\n </Box>\n </Box>\n );\n}\n","/**\n * GoalImageDialog\n *\n * Dialog for selecting goal images from available catalog.\n * Provides visual selection interface for savings and payoff goal images.\n *\n * Features:\n * - Grid display of available images\n * - Visual selection feedback\n * - Separate catalogs for savings vs payoff goals\n * - Loading and error states\n * - Responsive grid layout\n *\n * Integration:\n * - Used in GoalCreateForm for initial image selection\n * - Used in GoalEditForm for image updates\n * - Consumes useSavingsGoalImages/usePayoffGoalImages hooks\n */\n\nimport { useState } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n ImageList,\n ImageListItem,\n ImageListItemBar,\n CircularProgress,\n Alert,\n Box,\n Typography,\n useMediaQuery,\n useTheme,\n} from '@mui/material';\nimport { Check as CheckIcon } from '@mui/icons-material';\nimport { useSavingsGoalImages, usePayoffGoalImages } from '@pfm-platform/goals-data-access';\n\nexport interface GoalImageDialogProps {\n /**\n * Whether dialog is open\n */\n open: boolean;\n\n /**\n * Callback when dialog is closed\n */\n onClose: () => void;\n\n /**\n * Callback when image is selected\n * @param imageName - The name identifier of the selected image\n * @param imageUrl - The URL of the selected image\n */\n onSelectImage: (imageName: string, imageUrl: string) => void;\n\n /**\n * Currently selected image name (for highlighting)\n */\n selectedImageName?: string;\n\n /**\n * Goal type determines which image catalog to display\n */\n goalType: 'savings' | 'payoff';\n\n /**\n * Optional title override\n */\n title?: string;\n}\n\n/**\n * Goal image selection dialog component.\n *\n * Displays available goal images in a responsive grid layout.\n * Fetches images based on goal type (savings or payoff).\n *\n * @example\n * ```tsx\n * <GoalImageDialog\n * open={dialogOpen}\n * onClose={() => setDialogOpen(false)}\n * onSelectImage={(name, url) => {\n * setImageName(name);\n * setImageUrl(url);\n * setDialogOpen(false);\n * }}\n * selectedImageName={imageName}\n * goalType=\"savings\"\n * />\n * ```\n */\nexport function GoalImageDialog({\n open,\n onClose,\n onSelectImage,\n selectedImageName,\n goalType,\n title,\n}: GoalImageDialogProps) {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const isTablet = useMediaQuery(theme.breakpoints.down('md'));\n\n const [tempSelectedImage, setTempSelectedImage] = useState<{\n name: string;\n url: string;\n } | null>(null);\n\n // Fetch images based on goal type\n const savingsImages = useSavingsGoalImages({ enabled: goalType === 'savings' && open });\n const payoffImages = usePayoffGoalImages({ enabled: goalType === 'payoff' && open });\n\n const imagesQuery = goalType === 'savings' ? savingsImages : payoffImages;\n const images = imagesQuery.data?.images || [];\n\n // Determine grid columns based on screen size\n const cols = isMobile ? 2 : isTablet ? 3 : 4;\n\n const handleImageClick = (name: string, url: string) => {\n setTempSelectedImage({ name, url });\n };\n\n const handleConfirm = () => {\n if (tempSelectedImage) {\n onSelectImage(tempSelectedImage.name, tempSelectedImage.url);\n setTempSelectedImage(null);\n }\n onClose();\n };\n\n const handleCancel = () => {\n setTempSelectedImage(null);\n onClose();\n };\n\n // Determine which image should be highlighted\n const highlightedImageName = tempSelectedImage?.name || selectedImageName;\n\n const dialogTitle = title || `Select ${goalType === 'savings' ? 'Savings' : 'Payoff'} Goal Image`;\n\n return (\n <Dialog\n open={open}\n onClose={handleCancel}\n maxWidth=\"md\"\n fullWidth\n fullScreen={isMobile}\n aria-labelledby=\"goal-image-dialog-title\"\n >\n <DialogTitle id=\"goal-image-dialog-title\">{dialogTitle}</DialogTitle>\n\n <DialogContent>\n {imagesQuery.isLoading && (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 200,\n }}\n >\n <CircularProgress />\n </Box>\n )}\n\n {imagesQuery.isError && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n Failed to load goal images. Please try again.\n </Alert>\n )}\n\n {!imagesQuery.isLoading && !imagesQuery.isError && images.length === 0 && (\n <Alert severity=\"info\">No images available for {goalType} goals.</Alert>\n )}\n\n {!imagesQuery.isLoading && !imagesQuery.isError && images.length > 0 && (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n Click an image to select it, then click Confirm.\n </Typography>\n\n <ImageList cols={cols} gap={16} sx={{ maxHeight: isMobile ? 'none' : 500 }}>\n {images.map((image) => {\n const isSelected = highlightedImageName === image.name;\n\n return (\n <ImageListItem\n key={image.id}\n sx={{\n cursor: 'pointer',\n border: isSelected ? `3px solid ${theme.palette.primary.main}` : '2px solid transparent',\n borderRadius: 1,\n overflow: 'hidden',\n transition: 'all 0.2s',\n position: 'relative',\n '&:hover': {\n border: `3px solid ${isSelected ? theme.palette.primary.main : theme.palette.action.hover}`,\n transform: 'scale(1.02)',\n },\n }}\n onClick={() => handleImageClick(image.name, image.url)}\n >\n <img\n src={image.url}\n alt={image.name}\n loading=\"lazy\"\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n }}\n />\n <ImageListItemBar\n title={image.name}\n sx={{\n background: isSelected\n ? 'linear-gradient(to top, rgba(25, 118, 210, 0.9) 0%, rgba(25, 118, 210, 0.7) 70%, rgba(25, 118, 210, 0) 100%)'\n : 'linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.3) 70%, rgba(0,0,0,0) 100%)',\n }}\n />\n {isSelected && (\n <Box\n sx={{\n position: 'absolute',\n top: 8,\n right: 8,\n bgcolor: 'primary.main',\n borderRadius: '50%',\n width: 32,\n height: 32,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: 2,\n }}\n >\n <CheckIcon sx={{ color: 'white', fontSize: 20 }} />\n </Box>\n )}\n </ImageListItem>\n );\n })}\n </ImageList>\n </>\n )}\n </DialogContent>\n\n <DialogActions>\n <Button onClick={handleCancel} color=\"inherit\">\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n variant=\"contained\"\n disabled={!tempSelectedImage && !selectedImageName}\n aria-label=\"Confirm image selection\"\n >\n Confirm\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"]}