@pfm-platform/budgets-ui-mui 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/BudgetList.tsx","../src/components/BudgetSummary.tsx","../src/components/BudgetCreateForm.tsx","../src/components/BudgetEditForm.tsx","../src/components/BudgetDeleteButton.tsx","../src/components/BudgetProgressCard.tsx","../src/components/BudgetProgressList.tsx","../src/components/BudgetInsightsCard.tsx","../src/components/BudgetInsightDialog.tsx"],"names":["useBudgetProgress","jsx","Card","jsxs","CardContent","Typography","List","ListItem","Box","Chip","LinearProgress","useBudgetSummary","Grid","useState","useCreateBudget","Paper","TextField","Alert","Button","CircularProgress","useUpdateBudget","Dialog","DialogTitle","DialogContent","DialogActions","useDeleteBudget","Fragment","Tooltip","IconButton","DeleteIcon","DialogContentText","Warning","TrendingUp","TrendingDown","useMemo","FormControl","InputLabel","Select","MenuItem","WarningIcon","alpha","TrendingDownIcon","CheckCircleIcon","TrendingUpIcon","useTheme","Divider","ExpandMoreIcon","defaultCurrencyFormatter","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Box, Card, CardContent, List, ListItem, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useBudgetProgress } from '@pfm-platform/budgets-feature';\n\nexport interface BudgetListProps {\n userId: string;\n /** Date range start */\n start_date?: string;\n /** Date range end */\n end_date?: string;\n /** Custom title for the list */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Maximum number of budgets to display */\n maxItems?: number;\n}\n\n/**\n * BudgetList component displays budgets with progress bars.\n * Shows budget name, amounts, and visual progress indicator.\n */\nexport function BudgetList({\n userId,\n start_date,\n end_date,\n title = 'Budgets',\n currencySymbol = '$',\n maxItems,\n}: BudgetListProps) {\n const budgets = useBudgetProgress({ userId, start_date, end_date });\n\n if (!budgets) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading budgets...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n const displayBudgets = maxItems ? budgets.slice(0, maxItems) : budgets;\n\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {displayBudgets.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No budgets found\n </Typography>\n ) : (\n <List disablePadding>\n {displayBudgets.map((budget, index) => (\n <ListItem\n key={budget.id}\n divider={index < displayBudgets.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 {budget.name}\n </Typography>\n <Chip\n label={budget.state}\n size=\"small\"\n color={budget.state === 'over' ? 'error' : budget.state === 'risk' ? 'warning' : 'success'}\n variant=\"outlined\"\n />\n </Box>\n <Typography variant=\"body2\" fontWeight=\"medium\">\n {currencySymbol}{budget.spent.toFixed(2)} / {currencySymbol}{budget.budgetAmount.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(budget.percentSpent, 100)}\n color={budget.state === 'over' ? 'error' : budget.state === 'risk' ? 'warning' : 'primary'}\n sx={{ height: 8, borderRadius: 1 }}\n />\n <Typography variant=\"caption\" color=\"text.secondary\">\n {budget.percentSpent.toFixed(1)}% • {currencySymbol}{budget.remaining.toFixed(2)} remaining\n </Typography>\n </Box>\n </ListItem>\n ))}\n </List>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { Box, Card, CardContent, Grid, Typography, LinearProgress, Chip } from '@mui/material';\nimport { useBudgetSummary } from '@pfm-platform/budgets-feature';\n\nexport interface BudgetSummaryProps {\n userId: string;\n /** Date range start */\n start_date?: string;\n /** Date range end */\n end_date?: string;\n /** Custom title for the summary */\n title?: string;\n /** Currency symbol to display */\n currencySymbol?: string;\n}\n\n/**\n * BudgetSummary component displays aggregate budget statistics.\n * Shows total budgets, budget amount, spent, remaining, and overall state.\n */\nexport function BudgetSummary({\n userId,\n start_date,\n end_date,\n title = 'Budget Summary',\n currencySymbol = '$',\n}: BudgetSummaryProps) {\n const summary = useBudgetSummary({ userId, start_date, end_date });\n\n if (!summary) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading budget summary...\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n if (!summary.hasBudgets) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No budgets found\n </Typography>\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card>\n <CardContent>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\n <Typography variant=\"h6\">\n {title}\n </Typography>\n <Chip\n label={summary.state}\n size=\"small\"\n color={summary.state === 'over' ? 'error' : summary.state === 'risk' ? 'warning' : 'success'}\n />\n </Box>\n <Grid container spacing={2}>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Budgets\n </Typography>\n <Typography variant=\"h5\">{summary.totalBudgets}</Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Budget\n </Typography>\n <Typography variant=\"h5\">\n {currencySymbol}{summary.totalBudget.toFixed(2)}\n </Typography>\n </Box>\n </Grid>\n <Grid size={6}>\n <Box>\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n Total Spent\n </Typography>\n <Typography\n variant=\"h6\"\n color={summary.state === 'over' ? 'error.main' : 'text.primary'}\n >\n {currencySymbol}{summary.totalSpent.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\n variant=\"h6\"\n color={summary.totalRemaining >= 0 ? 'success.main' : 'error.main'}\n >\n {currencySymbol}{summary.totalRemaining.toFixed(2)}\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 {summary.percentSpent.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(summary.percentSpent, 100)}\n color={summary.state === 'over' ? 'error' : summary.state === 'risk' ? 'warning' : 'primary'}\n sx={{ height: 10, borderRadius: 1 }}\n />\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n}\n","import { useState } from 'react';\nimport {\n Box,\n Button,\n TextField,\n Alert,\n CircularProgress,\n Paper,\n Typography,\n} from '@mui/material';\nimport { useCreateBudget } from '@pfm-platform/budgets-data-access';\nimport type { BudgetCreate } from '@pfm-platform/shared';\n\nexport interface BudgetCreateFormProps {\n userId: string;\n onSuccess?: () => void;\n}\n\nexport function BudgetCreateForm({\n userId,\n onSuccess,\n}: BudgetCreateFormProps) {\n const [name, setName] = useState('');\n const [budgetAmount, setBudgetAmount] = useState('');\n const [tagNames, setTagNames] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const createBudget = useCreateBudget({\n onSuccess: () => {\n setName('');\n setBudgetAmount('');\n setTagNames('');\n setError(null);\n onSuccess?.();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to create budget');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!name.trim()) {\n setError('Budget name is required');\n return;\n }\n\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n setError('Budget amount must be a positive number');\n return;\n }\n\n // Parse tag names from comma-separated string\n const tags = tagNames\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\n if (tags.length === 0) {\n setError('At least one tag is required');\n return;\n }\n\n const data: BudgetCreate = {\n name: name.trim(),\n budget_amount: amount,\n tag_names: tags,\n show_on_dashboard: true,\n };\n\n createBudget.mutate({ userId, data });\n };\n\n return (\n <Paper sx={{ p: 3 }}>\n <Typography variant=\"h6\" gutterBottom>\n Create Budget\n </Typography>\n <Box\n component=\"form\"\n onSubmit={handleSubmit}\n sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}\n >\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your budget (e.g., 'Monthly Groceries')\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && (isNaN(parseFloat(budgetAmount)) || parseFloat(budgetAmount) <= 0)}\n helperText=\"Enter the total budget amount (e.g., 500.00)\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Tags (comma-separated)\"\n value={tagNames}\n onChange={(e) => {\n setTagNames(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={createBudget.isPending}\n error={!!error && tagNames.split(',').filter((t) => t.trim()).length === 0}\n helperText=\"Enter tags separated by commas (e.g., 'groceries, food, essentials')\"\n multiline\n rows={2}\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={createBudget.isPending || !name.trim() || !budgetAmount || !tagNames.trim()}\n startIcon={createBudget.isPending ? <CircularProgress size={20} /> : null}\n >\n {createBudget.isPending ? 'Creating...' : 'Create Budget'}\n </Button>\n </Box>\n </Box>\n </Paper>\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 { useUpdateBudget } from '@pfm-platform/budgets-data-access';\nimport type { Budget, BudgetUpdate } from '@pfm-platform/shared';\n\nexport interface BudgetEditFormProps {\n userId: string;\n budget: Budget;\n open: boolean;\n onClose: () => void;\n}\n\nexport function BudgetEditForm({\n userId,\n budget,\n open,\n onClose,\n}: BudgetEditFormProps) {\n const [name, setName] = useState(budget.name);\n const [budgetAmount, setBudgetAmount] = useState(budget.budget_amount.toString());\n const [tagNames, setTagNames] = useState(budget.tag_names.join(', '));\n const [error, setError] = useState<string | null>(null);\n\n const updateBudget = useUpdateBudget({\n onSuccess: () => {\n setError(null);\n onClose();\n },\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update budget');\n },\n });\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!name.trim()) {\n setError('Budget name is required');\n return;\n }\n\n const amount = parseFloat(budgetAmount);\n if (isNaN(amount) || amount <= 0) {\n setError('Budget amount must be a positive number');\n return;\n }\n\n // Parse tag names from comma-separated string\n const tags = tagNames\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag.length > 0);\n\n if (tags.length === 0) {\n setError('At least one tag is required');\n return;\n }\n\n const data: BudgetUpdate = {\n id: budget.id,\n name: name.trim(),\n budget_amount: amount,\n tag_names: tags,\n show_on_dashboard: true,\n };\n\n updateBudget.mutate({ userId, budgetId: budget.id, data });\n };\n\n const handleClose = () => {\n if (!updateBudget.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-budget-dialog-title\"\n >\n <form onSubmit={handleSubmit}>\n <DialogTitle id=\"edit-budget-dialog-title\">Edit Budget</DialogTitle>\n <DialogContent>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}>\n <TextField\n label=\"Budget Name\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && !name.trim()}\n helperText=\"Enter a name for your budget\"\n inputProps={{\n maxLength: 255,\n }}\n />\n\n <TextField\n label=\"Budget Amount\"\n type=\"number\"\n value={budgetAmount}\n onChange={(e) => {\n setBudgetAmount(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && (isNaN(parseFloat(budgetAmount)) || parseFloat(budgetAmount) <= 0)}\n helperText=\"Enter the total budget amount\"\n inputProps={{\n min: 0.01,\n step: 0.01,\n }}\n />\n\n <TextField\n label=\"Tags (comma-separated)\"\n value={tagNames}\n onChange={(e) => {\n setTagNames(e.target.value);\n setError(null);\n }}\n required\n fullWidth\n disabled={updateBudget.isPending}\n error={!!error && tagNames.split(',').filter((t) => t.trim()).length === 0}\n helperText=\"Enter tags separated by commas\"\n multiline\n rows={2}\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={updateBudget.isPending}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={updateBudget.isPending || !name.trim() || !budgetAmount || !tagNames.trim()}\n startIcon={updateBudget.isPending ? <CircularProgress size={20} /> : null}\n >\n {updateBudget.isPending ? 'Saving...' : 'Save Changes'}\n </Button>\n </DialogActions>\n </form>\n </Dialog>\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 { useDeleteBudget } from '@pfm-platform/budgets-data-access';\n\nexport interface BudgetDeleteButtonProps {\n userId: string;\n budgetId: number;\n budgetName: string;\n}\n\nexport function BudgetDeleteButton({\n userId,\n budgetId,\n budgetName,\n}: BudgetDeleteButtonProps) {\n const [open, setOpen] = useState(false);\n\n const deleteBudget = useDeleteBudget({\n onSuccess: () => {\n setOpen(false);\n },\n });\n\n const handleDelete = () => {\n deleteBudget.mutate({ userId, budgetId });\n };\n\n return (\n <>\n <Tooltip title=\"Delete budget\">\n <IconButton\n onClick={() => setOpen(true)}\n color=\"error\"\n size=\"small\"\n aria-label={`delete budget ${budgetName}`}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onClose={() => !deleteBudget.isPending && setOpen(false)}\n aria-labelledby=\"delete-budget-dialog-title\"\n >\n <DialogTitle id=\"delete-budget-dialog-title\">Delete Budget?</DialogTitle>\n <DialogContent>\n <DialogContentText>\n Are you sure you want to delete the budget \"{budgetName}\"? This action cannot be undone.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => setOpen(false)}\n disabled={deleteBudget.isPending}\n >\n Cancel\n </Button>\n <Button\n onClick={handleDelete}\n color=\"error\"\n variant=\"contained\"\n disabled={deleteBudget.isPending}\n autoFocus\n >\n {deleteBudget.isPending ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n}\n","import {\n Card,\n CardContent,\n Typography,\n LinearProgress,\n Box,\n Chip,\n} from '@mui/material';\nimport { TrendingUp, TrendingDown, Warning } from '@mui/icons-material';\nimport type { Budget } from '@pfm-platform/shared';\n\nexport interface BudgetProgressCardProps {\n budget: Budget;\n /** Current spent amount */\n currentSpent: number;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Show trend indicator */\n showTrend?: boolean;\n /** Comparison to last period (optional) */\n lastPeriodSpent?: number;\n}\n\n/**\n * BudgetProgressCard component displays budget progress with visual indicators.\n * Shows spent/limit/remaining with color-coded zones (green/yellow/red).\n *\n * Color zones:\n * - Green: 0-70% of limit\n * - Yellow: 70-90% of limit\n * - Red: >90% of limit\n *\n * @example\n * ```tsx\n * <BudgetProgressCard\n * budget={budget}\n * currentSpent={450.75}\n * currencySymbol=\"$\"\n * showTrend\n * lastPeriodSpent={380.50}\n * />\n * ```\n */\nexport function BudgetProgressCard({\n budget,\n currentSpent,\n currencySymbol = '$',\n showTrend = false,\n lastPeriodSpent,\n}: BudgetProgressCardProps) {\n const limit = budget.budget_amount;\n const remaining = limit - currentSpent;\n const percentage = (currentSpent / limit) * 100;\n\n // Determine color zone\n const getColor = (): 'success' | 'warning' | 'error' => {\n if (percentage <= 70) return 'success';\n if (percentage <= 90) return 'warning';\n return 'error';\n };\n\n const color = getColor();\n\n // Calculate trend vs last period\n const trend = lastPeriodSpent !== undefined ? currentSpent - lastPeriodSpent : null;\n const trendPercentage = trend !== null && lastPeriodSpent !== undefined && lastPeriodSpent > 0\n ? ((trend / lastPeriodSpent) * 100)\n : null;\n\n return (\n <Card>\n <CardContent>\n {/* Budget Name and Category */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', mb: 2 }}>\n <Box>\n <Typography variant=\"h6\" gutterBottom>\n {budget.name}\n </Typography>\n {budget.tag_names.length > 0 && (\n <Chip\n label={budget.tag_names[0]}\n size=\"small\"\n variant=\"outlined\"\n sx={{ mb: 1 }}\n />\n )}\n </Box>\n {percentage > 90 && (\n <Chip\n icon={<Warning />}\n label=\"Over Budget\"\n color=\"error\"\n size=\"small\"\n />\n )}\n </Box>\n\n {/* Progress Bar */}\n <Box sx={{ mb: 2 }}>\n <Box sx={{ 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={`${color}.main`}>\n {percentage.toFixed(1)}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(percentage, 100)}\n color={color}\n sx={{ height: 8, borderRadius: 4 }}\n />\n </Box>\n\n {/* Spent / Limit / Remaining */}\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 2 }}>\n <Box>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Spent\n </Typography>\n <Typography variant=\"h6\" color={`${color}.main`}>\n {currencySymbol}{currentSpent.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ textAlign: 'center' }}>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Limit\n </Typography>\n <Typography variant=\"h6\">\n {currencySymbol}{limit.toFixed(2)}\n </Typography>\n </Box>\n <Box sx={{ textAlign: 'right' }}>\n <Typography variant=\"caption\" color=\"text.secondary\" display=\"block\">\n Remaining\n </Typography>\n <Typography\n variant=\"h6\"\n color={remaining >= 0 ? 'success.main' : 'error.main'}\n >\n {currencySymbol}{Math.abs(remaining).toFixed(2)}\n </Typography>\n </Box>\n </Box>\n\n {/* Trend Indicator */}\n {showTrend && trend !== null && trendPercentage !== null && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {trend > 0 ? (\n <Chip\n icon={<TrendingUp />}\n label={`+${currencySymbol}${Math.abs(trend).toFixed(2)} (+${trendPercentage.toFixed(1)}%)`}\n color=\"error\"\n size=\"small\"\n variant=\"outlined\"\n />\n ) : (\n <Chip\n icon={<TrendingDown />}\n label={`-${currencySymbol}${Math.abs(trend).toFixed(2)} (${trendPercentage.toFixed(1)}%)`}\n color=\"success\"\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">\n vs last period\n </Typography>\n </Box>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n Box,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n Grid,\n Alert,\n} from '@mui/material';\nimport { BudgetProgressCard } from './BudgetProgressCard';\nimport type { Budget } from '@pfm-platform/shared';\n\nexport interface BudgetProgressListProps {\n budgets: Budget[];\n /** Map of budget ID to current spent amount */\n spentByBudget: Map<number, number>;\n /** Map of budget ID to last period spent amount (optional) */\n lastPeriodSpentByBudget?: Map<number, number>;\n /** Currency symbol to display */\n currencySymbol?: string;\n /** Show trend indicators */\n showTrends?: boolean;\n /** Enable category filtering */\n enableCategoryFilter?: boolean;\n}\n\ntype FilterValue = 'all' | 'on-track' | 'warning' | 'over-budget';\n\n/**\n * BudgetProgressList component displays all budgets with progress indicators.\n * Supports filtering by status (on-track, warning, over-budget).\n *\n * @example\n * ```tsx\n * const spentMap = new Map([\n * [1, 450.75],\n * [2, 1200.50],\n * ]);\n *\n * <BudgetProgressList\n * budgets={budgets}\n * spentByBudget={spentMap}\n * currencySymbol=\"$\"\n * showTrends\n * enableCategoryFilter\n * />\n * ```\n */\nexport function BudgetProgressList({\n budgets,\n spentByBudget,\n lastPeriodSpentByBudget,\n currencySymbol = '$',\n showTrends = false,\n enableCategoryFilter = true,\n}: BudgetProgressListProps) {\n const [statusFilter, setStatusFilter] = useState<FilterValue>('all');\n const [categoryFilter, setCategory] = useState<string>('all');\n\n // Extract unique categories\n const categories = useMemo(() => {\n const uniqueCategories = new Set<string>();\n budgets.forEach((budget) => {\n budget.tag_names.forEach((tag) => {\n uniqueCategories.add(tag);\n });\n });\n return Array.from(uniqueCategories).sort();\n }, [budgets]);\n\n // Filter budgets\n const filteredBudgets = useMemo(() => {\n return budgets.filter((budget) => {\n const spent = spentByBudget.get(budget.id) || 0;\n const limit = budget.budget_amount;\n const percentage = (spent / limit) * 100;\n\n // Status filter\n if (statusFilter === 'on-track' && percentage > 70) return false;\n if (statusFilter === 'warning' && (percentage <= 70 || percentage > 90)) return false;\n if (statusFilter === 'over-budget' && percentage <= 90) return false;\n\n // Category filter\n if (categoryFilter !== 'all' && !budget.tag_names.includes(categoryFilter)) return false;\n\n return true;\n });\n }, [budgets, spentByBudget, statusFilter, categoryFilter]);\n\n // Calculate summary stats\n const stats = useMemo(() => {\n const onTrack = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage <= 70;\n }).length;\n\n const warning = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage > 70 && percentage <= 90;\n }).length;\n\n const overBudget = budgets.filter(b => {\n const spent = spentByBudget.get(b.id) || 0;\n const percentage = (spent / b.budget_amount) * 100;\n return percentage > 90;\n }).length;\n\n return { onTrack, warning, overBudget };\n }, [budgets, spentByBudget]);\n\n if (budgets.length === 0) {\n return (\n <Alert severity=\"info\">\n No budgets found. Create a budget to start tracking your spending.\n </Alert>\n );\n }\n\n return (\n <Box>\n {/* Header with Filters */}\n <Box sx={{ mb: 3 }}>\n <Typography variant=\"h5\" gutterBottom>\n Budget Progress\n </Typography>\n\n {/* Summary Stats */}\n <Box sx={{ display: 'flex', gap: 2, mb: 2, flexWrap: 'wrap' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n <strong>{stats.onTrack}</strong> on track\n </Typography>\n <Typography variant=\"body2\" color=\"warning.main\">\n <strong>{stats.warning}</strong> warning\n </Typography>\n <Typography variant=\"body2\" color=\"error.main\">\n <strong>{stats.overBudget}</strong> over budget\n </Typography>\n </Box>\n\n {/* Filters */}\n <Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap' }}>\n <FormControl size=\"small\" sx={{ minWidth: 150 }}>\n <InputLabel>Status</InputLabel>\n <Select\n value={statusFilter}\n label=\"Status\"\n onChange={(e) => setStatusFilter(e.target.value as FilterValue)}\n >\n <MenuItem value=\"all\">All Budgets</MenuItem>\n <MenuItem value=\"on-track\">On Track</MenuItem>\n <MenuItem value=\"warning\">Warning</MenuItem>\n <MenuItem value=\"over-budget\">Over Budget</MenuItem>\n </Select>\n </FormControl>\n\n {enableCategoryFilter && categories.length > 0 && (\n <FormControl size=\"small\" sx={{ minWidth: 150 }}>\n <InputLabel>Category</InputLabel>\n <Select\n value={categoryFilter}\n label=\"Category\"\n onChange={(e) => setCategory(e.target.value)}\n >\n <MenuItem value=\"all\">All Categories</MenuItem>\n {categories.map((cat) => (\n <MenuItem key={cat} value={cat}>\n {cat}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )}\n </Box>\n </Box>\n\n {/* Budget Cards Grid */}\n {filteredBudgets.length === 0 ? (\n <Alert severity=\"info\">\n No budgets match the selected filters.\n </Alert>\n ) : (\n <Grid container spacing={3}>\n {filteredBudgets.map((budget) => {\n const spent = spentByBudget.get(budget.id) || 0;\n const lastPeriodSpent = lastPeriodSpentByBudget?.get(budget.id);\n\n return (\n <Grid key={budget.id} size={{ xs: 12, sm: 6, lg: 4 }}>\n <BudgetProgressCard\n budget={budget}\n currentSpent={spent}\n currencySymbol={currencySymbol}\n showTrend={showTrends}\n lastPeriodSpent={lastPeriodSpent}\n />\n </Grid>\n );\n })}\n </Grid>\n )}\n </Box>\n );\n}\n","/**\n * BudgetInsightsCard\n *\n * Budget insights and recommendations component.\n * Migrated from legacy Budgets/Insights.js with modern React patterns.\n *\n * Features:\n * - Budget performance analysis\n * - Overspending/underspending identification\n * - Historical trend analysis\n * - Actionable recommendations\n * - Visual indicators (icons, colors)\n * - Expandable insights list\n *\n * Migration Notes:\n * - Legacy: MobX store with complex insight loading\n * - Modern: Controlled component with callback props\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, Material-UI v7\n */\n\nimport { useState } from 'react';\nimport {\n Card,\n CardContent,\n Typography,\n Box,\n Button,\n Chip,\n Divider,\n useTheme,\n alpha,\n} from '@mui/material';\nimport {\n TrendingUp as TrendingUpIcon,\n TrendingDown as TrendingDownIcon,\n Warning as WarningIcon,\n CheckCircle as CheckCircleIcon,\n ExpandMore as ExpandMoreIcon,\n} from '@mui/icons-material';\n\nexport type InsightType = 'overspending' | 'underspending' | 'on-track' | 'suggest-tag';\n\nexport interface BudgetInsight {\n /**\n * Unique insight identifier\n */\n id: string;\n\n /**\n * Type of insight\n */\n type: InsightType;\n\n /**\n * Budget identifier\n */\n budgetId: string;\n\n /**\n * Budget name\n */\n budgetName: string;\n\n /**\n * Average amount over/under budget\n */\n averageAmount: number;\n\n /**\n * Number of months analyzed\n */\n monthsAnalyzed: number;\n\n /**\n * Number of times over/under budget\n */\n occurrences: number;\n\n /**\n * Recommendation message\n */\n recommendation: string;\n\n /**\n * Optional tag name (for suggest-tag type)\n */\n tagName?: string;\n}\n\nexport interface BudgetOverallSummary {\n /**\n * Total amount over/under all budgets\n */\n totalAmount: number;\n\n /**\n * Number of months in analysis\n */\n months: number;\n\n /**\n * Budget state: 'over' | 'under' | 'on-track'\n */\n state: 'over' | 'under' | 'on-track';\n}\n\nexport interface BudgetInsightsCardProps {\n /**\n * List of budget insights\n */\n insights: BudgetInsight[];\n\n /**\n * Overall budget summary\n */\n overallSummary: BudgetOverallSummary;\n\n /**\n * Whether insights are loading\n * @default false\n */\n loading?: boolean;\n\n /**\n * Maximum insights to show initially\n * @default 2\n */\n initialVisibleCount?: number;\n\n /**\n * Callback when insight action is clicked\n */\n onInsightAction?: (insight: BudgetInsight) => void;\n\n /**\n * Callback when insight is dismissed\n */\n onInsightDismiss?: (insight: BudgetInsight) => void;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\n/**\n * Get insight icon and color based on type\n */\nfunction getInsightStyle(type: InsightType, theme: any) {\n switch (type) {\n case 'overspending':\n return {\n icon: <WarningIcon />,\n color: theme.palette.error.main,\n bgColor: alpha(theme.palette.error.main, 0.1),\n };\n case 'underspending':\n return {\n icon: <TrendingDownIcon />,\n color: theme.palette.info.main,\n bgColor: alpha(theme.palette.info.main, 0.1),\n };\n case 'on-track':\n return {\n icon: <CheckCircleIcon />,\n color: theme.palette.success.main,\n bgColor: alpha(theme.palette.success.main, 0.1),\n };\n case 'suggest-tag':\n return {\n icon: <TrendingUpIcon />,\n color: theme.palette.warning.main,\n bgColor: alpha(theme.palette.warning.main, 0.1),\n };\n default:\n return {\n icon: <CheckCircleIcon />,\n color: theme.palette.text.secondary,\n bgColor: alpha(theme.palette.text.secondary, 0.1),\n };\n }\n}\n\n/**\n * Budget insights and recommendations card\n *\n * Displays budget performance analysis with actionable insights.\n * Shows overall summary and individual budget insights with recommendations.\n *\n * @example\n * ```tsx\n * <BudgetInsightsCard\n * insights={budgetInsights}\n * overallSummary={{\n * totalAmount: -150,\n * months: 6,\n * state: 'over',\n * }}\n * onInsightAction={(insight) => handleAction(insight)}\n * onInsightDismiss={(insight) => dismissInsight(insight)}\n * />\n * ```\n */\nexport function BudgetInsightsCard({\n insights,\n overallSummary,\n initialVisibleCount = 2,\n onInsightAction,\n onInsightDismiss,\n currencyFormatter = defaultCurrencyFormatter,\n}: BudgetInsightsCardProps) {\n const theme = useTheme();\n const [showAll, setShowAll] = useState(false);\n\n const visibleInsights = showAll ? insights : insights.slice(0, initialVisibleCount);\n const hasMore = insights.length > initialVisibleCount;\n\n const overallStyle = overallSummary.state === 'over'\n ? { color: theme.palette.error.main, icon: <WarningIcon /> }\n : overallSummary.state === 'under'\n ? { color: theme.palette.success.main, icon: <CheckCircleIcon /> }\n : { color: theme.palette.info.main, icon: <CheckCircleIcon /> };\n\n return (\n <Card data-testid=\"budget-insights-card\">\n <CardContent>\n {/* Header */}\n <Typography variant=\"h6\" gutterBottom>\n Budget Insights\n </Typography>\n\n {/* Overall Summary */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n p: 2,\n mb: 2,\n bgcolor: alpha(overallStyle.color, 0.1),\n borderRadius: 1,\n }}\n >\n <Box sx={{ color: overallStyle.color }}>\n {overallStyle.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n {overallSummary.totalAmount > 0 && (\n <Typography variant=\"body2\">\n You've been <strong>under budget</strong> by{' '}\n <strong>{currencyFormatter(overallSummary.totalAmount)}</strong>{' '}\n on all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n {overallSummary.totalAmount < 0 && (\n <Typography variant=\"body2\">\n You have <strong>overspent</strong> by{' '}\n <strong>{currencyFormatter(Math.abs(overallSummary.totalAmount))}</strong>{' '}\n on all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n {overallSummary.totalAmount === 0 && (\n <Typography variant=\"body2\">\n You are <strong>on track</strong> with all budgets over the last{' '}\n <strong>{overallSummary.months} months</strong>.\n </Typography>\n )}\n </Box>\n </Box>\n\n <Divider sx={{ my: 2 }} />\n\n {/* Insights List */}\n {insights.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 2 }}>\n No insights available. Keep tracking your budgets!\n </Typography>\n ) : (\n <>\n {visibleInsights.map((insight) => {\n const style = getInsightStyle(insight.type, theme);\n return (\n <Box\n key={insight.id}\n data-testid={`budget-insight-${insight.id}`}\n sx={{\n p: 2,\n mb: 1,\n bgcolor: style.bgColor,\n borderRadius: 1,\n borderLeft: `4px solid ${style.color}`,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n <Box sx={{ color: style.color, mt: 0.5 }}>\n {style.icon}\n </Box>\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"subtitle2\" gutterBottom>\n {insight.budgetName}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n {insight.recommendation}\n </Typography>\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n <Chip\n label={`${insight.occurrences} times`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`${insight.monthsAnalyzed} months`}\n size=\"small\"\n variant=\"outlined\"\n />\n <Chip\n label={`Avg: ${currencyFormatter(Math.abs(insight.averageAmount))}`}\n size=\"small\"\n variant=\"outlined\"\n />\n </Box>\n </Box>\n </Box>\n <Box sx={{ display: 'flex', gap: 1, mt: 2, justifyContent: 'flex-end' }}>\n {onInsightDismiss && (\n <Button\n size=\"small\"\n onClick={() => onInsightDismiss(insight)}\n >\n Dismiss\n </Button>\n )}\n {onInsightAction && insight.type !== 'suggest-tag' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={() => onInsightAction(insight)}\n >\n Adjust Budget\n </Button>\n )}\n {onInsightAction && insight.type === 'suggest-tag' && (\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={() => onInsightAction(insight)}\n >\n Add Tag\n </Button>\n )}\n </Box>\n </Box>\n );\n })}\n\n {hasMore && (\n <Box sx={{ textAlign: 'center', mt: 2 }}>\n <Button\n size=\"small\"\n endIcon={\n <ExpandMoreIcon\n sx={{\n transform: showAll ? 'rotate(180deg)' : 'rotate(0)',\n transition: 'transform 0.3s',\n }}\n />\n }\n onClick={() => setShowAll(!showAll)}\n >\n {showAll ? 'Show Less' : `Show ${insights.length - initialVisibleCount} More`}\n </Button>\n </Box>\n )}\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * BudgetInsightDialog\n *\n * Dialog for adjusting budget amounts based on insights.\n * Migrated from legacy Budgets/InsightDialog.js with modern React patterns.\n *\n * Features:\n * - Display insight details\n * - Amount adjustment input\n * - Validation and error handling\n * - Save/cancel actions\n * - Material-UI v7 theming\n *\n * Migration Notes:\n * - Legacy: MobX form with observable fields\n * - Modern: Controlled component with React state\n * - Removed: MobX observables, store injection\n * - Added: TypeScript types, modern hooks, proper validation\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n DialogContentText,\n Button,\n TextField,\n} from '@mui/material';\nimport type { BudgetInsight } from './BudgetInsightsCard';\n\nexport interface BudgetInsightDialogProps {\n /**\n * Insight to display in dialog\n */\n insight: BudgetInsight | null;\n\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 save is clicked\n */\n onSave: (insight: BudgetInsight, adjustmentAmount: number) => Promise<void>;\n\n /**\n * Whether save operation is in progress\n * @default false\n */\n saving?: boolean;\n\n /**\n * Currency formatter\n */\n currencyFormatter?: (value: number) => string;\n}\n\n/**\n * Default currency formatter\n */\nconst defaultCurrencyFormatter = (value: number): string => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n};\n\n/**\n * Budget insight adjustment dialog\n *\n * Allows users to adjust budget amounts based on spending insights.\n * Provides context about overspending/underspending patterns.\n *\n * @example\n * ```tsx\n * <BudgetInsightDialog\n * insight={selectedInsight}\n * open={dialogOpen}\n * onClose={() => setDialogOpen(false)}\n * onSave={async (insight, amount) => {\n * await updateBudget(insight.budgetId, amount);\n * }}\n * />\n * ```\n */\nexport function BudgetInsightDialog({\n insight,\n open,\n onClose,\n onSave,\n saving = false,\n currencyFormatter = defaultCurrencyFormatter,\n}: BudgetInsightDialogProps) {\n const [amount, setAmount] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n // Reset amount when insight changes or dialog opens\n useEffect(() => {\n if (open && insight) {\n const suggestedAmount = Math.abs(insight.averageAmount);\n setAmount(suggestedAmount.toFixed(2));\n setError(null);\n }\n }, [open, insight]);\n\n const handleAmountChange = (value: string) => {\n setAmount(value);\n\n // Validate amount\n const numValue = parseFloat(value);\n if (isNaN(numValue)) {\n setError('Please enter a valid number');\n } else if (numValue <= 0) {\n setError('Amount must be greater than zero');\n } else if (numValue > 1000000) {\n setError('Amount is too large');\n } else {\n setError(null);\n }\n };\n\n const handleSave = async () => {\n if (!insight || error || !amount) return;\n\n const numValue = parseFloat(amount);\n if (isNaN(numValue) || numValue <= 0) return;\n\n await onSave(insight, numValue);\n onClose();\n };\n\n const handleCancel = () => {\n setAmount('');\n setError(null);\n onClose();\n };\n\n if (!insight) {\n return null;\n }\n\n const isOverspending = insight.type === 'overspending';\n const actionLabel = isOverspending ? 'Increase Budget By' : 'Decrease Budget By';\n\n return (\n <Dialog\n open={open}\n onClose={handleCancel}\n maxWidth=\"sm\"\n fullWidth\n data-testid=\"budget-insight-dialog\"\n >\n <DialogTitle>\n {insight.budgetName}\n </DialogTitle>\n\n <DialogContent>\n {/* Insight Message */}\n {isOverspending && (\n <DialogContentText sx={{ mb: 3 }}>\n You've <strong>exceeded</strong> this budget{' '}\n <strong>{insight.occurrences}</strong> times in the last{' '}\n <strong>{insight.monthsAnalyzed}</strong> months by an average of{' '}\n <strong>{currencyFormatter(Math.abs(insight.averageAmount))}</strong> a month.\n </DialogContentText>\n )}\n\n {!isOverspending && (\n <DialogContentText sx={{ mb: 3 }}>\n You've been <strong>under</strong> this budget{' '}\n <strong>{insight.occurrences}</strong> times in the last{' '}\n <strong>{insight.monthsAnalyzed}</strong> months by an average of{' '}\n <strong>{currencyFormatter(Math.abs(insight.averageAmount))}</strong> a month.\n </DialogContentText>\n )}\n\n {/* Amount Input */}\n <TextField\n autoFocus\n fullWidth\n required\n type=\"number\"\n label={actionLabel}\n value={amount}\n onChange={(e) => handleAmountChange(e.target.value)}\n error={!!error}\n helperText={error || 'Suggested amount based on your spending pattern'}\n disabled={saving}\n inputProps={{\n min: 0,\n step: 0.01,\n 'aria-label': actionLabel,\n }}\n InputLabelProps={{\n shrink: true,\n }}\n />\n </DialogContent>\n\n <DialogActions>\n <Button onClick={handleCancel} disabled={saving}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n variant=\"contained\"\n disabled={saving || !!error || !amount}\n >\n {saving ? 'Saving...' : 'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"]}
@@ -0,0 +1,303 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Budget } from '@pfm-platform/shared';
3
+
4
+ interface BudgetListProps {
5
+ userId: string;
6
+ /** Date range start */
7
+ start_date?: string;
8
+ /** Date range end */
9
+ end_date?: string;
10
+ /** Custom title for the list */
11
+ title?: string;
12
+ /** Currency symbol to display */
13
+ currencySymbol?: string;
14
+ /** Maximum number of budgets to display */
15
+ maxItems?: number;
16
+ }
17
+ /**
18
+ * BudgetList component displays budgets with progress bars.
19
+ * Shows budget name, amounts, and visual progress indicator.
20
+ */
21
+ declare function BudgetList({ userId, start_date, end_date, title, currencySymbol, maxItems, }: BudgetListProps): react_jsx_runtime.JSX.Element;
22
+
23
+ interface BudgetSummaryProps {
24
+ userId: string;
25
+ /** Date range start */
26
+ start_date?: string;
27
+ /** Date range end */
28
+ end_date?: string;
29
+ /** Custom title for the summary */
30
+ title?: string;
31
+ /** Currency symbol to display */
32
+ currencySymbol?: string;
33
+ }
34
+ /**
35
+ * BudgetSummary component displays aggregate budget statistics.
36
+ * Shows total budgets, budget amount, spent, remaining, and overall state.
37
+ */
38
+ declare function BudgetSummary({ userId, start_date, end_date, title, currencySymbol, }: BudgetSummaryProps): react_jsx_runtime.JSX.Element;
39
+
40
+ interface BudgetCreateFormProps {
41
+ userId: string;
42
+ onSuccess?: () => void;
43
+ }
44
+ declare function BudgetCreateForm({ userId, onSuccess, }: BudgetCreateFormProps): react_jsx_runtime.JSX.Element;
45
+
46
+ interface BudgetEditFormProps {
47
+ userId: string;
48
+ budget: Budget;
49
+ open: boolean;
50
+ onClose: () => void;
51
+ }
52
+ declare function BudgetEditForm({ userId, budget, open, onClose, }: BudgetEditFormProps): react_jsx_runtime.JSX.Element;
53
+
54
+ interface BudgetDeleteButtonProps {
55
+ userId: string;
56
+ budgetId: number;
57
+ budgetName: string;
58
+ }
59
+ declare function BudgetDeleteButton({ userId, budgetId, budgetName, }: BudgetDeleteButtonProps): react_jsx_runtime.JSX.Element;
60
+
61
+ interface BudgetProgressCardProps {
62
+ budget: Budget;
63
+ /** Current spent amount */
64
+ currentSpent: number;
65
+ /** Currency symbol to display */
66
+ currencySymbol?: string;
67
+ /** Show trend indicator */
68
+ showTrend?: boolean;
69
+ /** Comparison to last period (optional) */
70
+ lastPeriodSpent?: number;
71
+ }
72
+ /**
73
+ * BudgetProgressCard component displays budget progress with visual indicators.
74
+ * Shows spent/limit/remaining with color-coded zones (green/yellow/red).
75
+ *
76
+ * Color zones:
77
+ * - Green: 0-70% of limit
78
+ * - Yellow: 70-90% of limit
79
+ * - Red: >90% of limit
80
+ *
81
+ * @example
82
+ * ```tsx
83
+ * <BudgetProgressCard
84
+ * budget={budget}
85
+ * currentSpent={450.75}
86
+ * currencySymbol="$"
87
+ * showTrend
88
+ * lastPeriodSpent={380.50}
89
+ * />
90
+ * ```
91
+ */
92
+ declare function BudgetProgressCard({ budget, currentSpent, currencySymbol, showTrend, lastPeriodSpent, }: BudgetProgressCardProps): react_jsx_runtime.JSX.Element;
93
+
94
+ interface BudgetProgressListProps {
95
+ budgets: Budget[];
96
+ /** Map of budget ID to current spent amount */
97
+ spentByBudget: Map<number, number>;
98
+ /** Map of budget ID to last period spent amount (optional) */
99
+ lastPeriodSpentByBudget?: Map<number, number>;
100
+ /** Currency symbol to display */
101
+ currencySymbol?: string;
102
+ /** Show trend indicators */
103
+ showTrends?: boolean;
104
+ /** Enable category filtering */
105
+ enableCategoryFilter?: boolean;
106
+ }
107
+ /**
108
+ * BudgetProgressList component displays all budgets with progress indicators.
109
+ * Supports filtering by status (on-track, warning, over-budget).
110
+ *
111
+ * @example
112
+ * ```tsx
113
+ * const spentMap = new Map([
114
+ * [1, 450.75],
115
+ * [2, 1200.50],
116
+ * ]);
117
+ *
118
+ * <BudgetProgressList
119
+ * budgets={budgets}
120
+ * spentByBudget={spentMap}
121
+ * currencySymbol="$"
122
+ * showTrends
123
+ * enableCategoryFilter
124
+ * />
125
+ * ```
126
+ */
127
+ declare function BudgetProgressList({ budgets, spentByBudget, lastPeriodSpentByBudget, currencySymbol, showTrends, enableCategoryFilter, }: BudgetProgressListProps): react_jsx_runtime.JSX.Element;
128
+
129
+ /**
130
+ * BudgetInsightsCard
131
+ *
132
+ * Budget insights and recommendations component.
133
+ * Migrated from legacy Budgets/Insights.js with modern React patterns.
134
+ *
135
+ * Features:
136
+ * - Budget performance analysis
137
+ * - Overspending/underspending identification
138
+ * - Historical trend analysis
139
+ * - Actionable recommendations
140
+ * - Visual indicators (icons, colors)
141
+ * - Expandable insights list
142
+ *
143
+ * Migration Notes:
144
+ * - Legacy: MobX store with complex insight loading
145
+ * - Modern: Controlled component with callback props
146
+ * - Removed: MobX observables, store injection
147
+ * - Added: TypeScript types, modern hooks, Material-UI v7
148
+ */
149
+ type InsightType = 'overspending' | 'underspending' | 'on-track' | 'suggest-tag';
150
+ interface BudgetInsight {
151
+ /**
152
+ * Unique insight identifier
153
+ */
154
+ id: string;
155
+ /**
156
+ * Type of insight
157
+ */
158
+ type: InsightType;
159
+ /**
160
+ * Budget identifier
161
+ */
162
+ budgetId: string;
163
+ /**
164
+ * Budget name
165
+ */
166
+ budgetName: string;
167
+ /**
168
+ * Average amount over/under budget
169
+ */
170
+ averageAmount: number;
171
+ /**
172
+ * Number of months analyzed
173
+ */
174
+ monthsAnalyzed: number;
175
+ /**
176
+ * Number of times over/under budget
177
+ */
178
+ occurrences: number;
179
+ /**
180
+ * Recommendation message
181
+ */
182
+ recommendation: string;
183
+ /**
184
+ * Optional tag name (for suggest-tag type)
185
+ */
186
+ tagName?: string;
187
+ }
188
+ interface BudgetOverallSummary {
189
+ /**
190
+ * Total amount over/under all budgets
191
+ */
192
+ totalAmount: number;
193
+ /**
194
+ * Number of months in analysis
195
+ */
196
+ months: number;
197
+ /**
198
+ * Budget state: 'over' | 'under' | 'on-track'
199
+ */
200
+ state: 'over' | 'under' | 'on-track';
201
+ }
202
+ interface BudgetInsightsCardProps {
203
+ /**
204
+ * List of budget insights
205
+ */
206
+ insights: BudgetInsight[];
207
+ /**
208
+ * Overall budget summary
209
+ */
210
+ overallSummary: BudgetOverallSummary;
211
+ /**
212
+ * Whether insights are loading
213
+ * @default false
214
+ */
215
+ loading?: boolean;
216
+ /**
217
+ * Maximum insights to show initially
218
+ * @default 2
219
+ */
220
+ initialVisibleCount?: number;
221
+ /**
222
+ * Callback when insight action is clicked
223
+ */
224
+ onInsightAction?: (insight: BudgetInsight) => void;
225
+ /**
226
+ * Callback when insight is dismissed
227
+ */
228
+ onInsightDismiss?: (insight: BudgetInsight) => void;
229
+ /**
230
+ * Currency formatter
231
+ */
232
+ currencyFormatter?: (value: number) => string;
233
+ }
234
+ /**
235
+ * Budget insights and recommendations card
236
+ *
237
+ * Displays budget performance analysis with actionable insights.
238
+ * Shows overall summary and individual budget insights with recommendations.
239
+ *
240
+ * @example
241
+ * ```tsx
242
+ * <BudgetInsightsCard
243
+ * insights={budgetInsights}
244
+ * overallSummary={{
245
+ * totalAmount: -150,
246
+ * months: 6,
247
+ * state: 'over',
248
+ * }}
249
+ * onInsightAction={(insight) => handleAction(insight)}
250
+ * onInsightDismiss={(insight) => dismissInsight(insight)}
251
+ * />
252
+ * ```
253
+ */
254
+ declare function BudgetInsightsCard({ insights, overallSummary, initialVisibleCount, onInsightAction, onInsightDismiss, currencyFormatter, }: BudgetInsightsCardProps): react_jsx_runtime.JSX.Element;
255
+
256
+ interface BudgetInsightDialogProps {
257
+ /**
258
+ * Insight to display in dialog
259
+ */
260
+ insight: BudgetInsight | null;
261
+ /**
262
+ * Whether dialog is open
263
+ */
264
+ open: boolean;
265
+ /**
266
+ * Callback when dialog is closed
267
+ */
268
+ onClose: () => void;
269
+ /**
270
+ * Callback when save is clicked
271
+ */
272
+ onSave: (insight: BudgetInsight, adjustmentAmount: number) => Promise<void>;
273
+ /**
274
+ * Whether save operation is in progress
275
+ * @default false
276
+ */
277
+ saving?: boolean;
278
+ /**
279
+ * Currency formatter
280
+ */
281
+ currencyFormatter?: (value: number) => string;
282
+ }
283
+ /**
284
+ * Budget insight adjustment dialog
285
+ *
286
+ * Allows users to adjust budget amounts based on spending insights.
287
+ * Provides context about overspending/underspending patterns.
288
+ *
289
+ * @example
290
+ * ```tsx
291
+ * <BudgetInsightDialog
292
+ * insight={selectedInsight}
293
+ * open={dialogOpen}
294
+ * onClose={() => setDialogOpen(false)}
295
+ * onSave={async (insight, amount) => {
296
+ * await updateBudget(insight.budgetId, amount);
297
+ * }}
298
+ * />
299
+ * ```
300
+ */
301
+ declare function BudgetInsightDialog({ insight, open, onClose, onSave, saving, currencyFormatter, }: BudgetInsightDialogProps): react_jsx_runtime.JSX.Element | null;
302
+
303
+ export { BudgetCreateForm, type BudgetCreateFormProps, BudgetDeleteButton, type BudgetDeleteButtonProps, BudgetEditForm, type BudgetEditFormProps, type BudgetInsight, BudgetInsightDialog, type BudgetInsightDialogProps, BudgetInsightsCard, type BudgetInsightsCardProps, BudgetList, type BudgetListProps, type BudgetOverallSummary, BudgetProgressCard, type BudgetProgressCardProps, BudgetProgressList, type BudgetProgressListProps, BudgetSummary, type BudgetSummaryProps, type InsightType };