From 6f5c41a4cfcfdfcddd4c8713291e023614e02887 Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Fri, 6 Feb 2026 12:24:15 +0000 Subject: [PATCH] =?UTF-8?q?perf:=20otimizar=20dashboard=20com=20indexes,?= =?UTF-8?q?=20cache=20e=20consolida=C3=A7=C3=A3o=20de=20queries=20(v1.3.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adicionar indexes compostos em lancamentos para queries frequentes - Eliminar ~20 JOINs com pagadores via helper cacheado getAdminPagadorId() - Consolidar queries: income-expense-balance (12→1), payment-status (2→1), categories (4→2) - Adicionar cache cross-request via unstable_cache com tag-based invalidation - Limitar scan de métricas a 24 meses - Deduplicar auth session por request via React.cache() Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 20 + app/(dashboard)/lancamentos/actions.ts | 5 +- components/contas/transfer-dialog.tsx | 4 +- .../purchases-by-category-widget.tsx | 5 +- .../dashboard/recent-transactions-widget.tsx | 5 +- components/dashboard/section-cards.tsx | 5 +- components/dashboard/top-expenses-widget.tsx | 5 +- .../lancamentos/table/lancamentos-table.tsx | 3 +- components/month-picker/month-navigation.tsx | 2 +- .../cartoes/card-category-breakdown.tsx | 9 +- .../cartoes/card-invoice-status.tsx | 5 +- .../relatorios/cartoes/card-top-expenses.tsx | 9 +- .../relatorios/cartoes/card-usage-chart.tsx | 5 +- .../relatorios/category-report-table.tsx | 5 +- components/sidebar/app-sidebar.tsx | 5 +- .../establishments-list.tsx | 9 +- .../top-estabelecimentos/top-categories.tsx | 9 +- components/widget-card.tsx | 5 +- db/schema.ts | 11 + drizzle/0015_concerned_kat_farrell.sql | 2 + drizzle/meta/0015_snapshot.json | 2303 +++++++++++++++++ drizzle/meta/_journal.json | 227 +- lib/actions/helpers.ts | 20 +- lib/auth/server.ts | 17 +- lib/dashboard/boletos.ts | 11 +- .../categories/expenses-by-category.ts | 204 +- .../categories/income-by-category.ts | 215 +- .../expenses/installment-expenses.ts | 12 +- lib/dashboard/expenses/recurring-expenses.ts | 12 +- lib/dashboard/expenses/top-expenses.ts | 12 +- lib/dashboard/fetch-dashboard-data.ts | 19 +- lib/dashboard/income-expense-balance.ts | 135 +- lib/dashboard/metrics.ts | 29 +- lib/dashboard/notifications.ts | 27 +- lib/dashboard/payments/payment-conditions.ts | 12 +- lib/dashboard/payments/payment-methods.ts | 12 +- lib/dashboard/payments/payment-status.ts | 132 +- lib/dashboard/purchases-by-category.ts | 18 +- lib/dashboard/recent-transactions.ts | 12 +- lib/dashboard/top-establishments.ts | 12 +- lib/pagadores/get-admin-id.ts | 25 + package.json | 18 +- pnpm-lock.yaml | 1188 ++++----- public/fonts/anthropicSans.woff2 | Bin 0 -> 117352 bytes public/fonts/font_index.ts | 8 +- 45 files changed, 3589 insertions(+), 1219 deletions(-) create mode 100644 drizzle/0015_concerned_kat_farrell.sql create mode 100644 drizzle/meta/0015_snapshot.json create mode 100644 lib/pagadores/get-admin-id.ts create mode 100644 public/fonts/anthropicSans.woff2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fe22c1..26fb4da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,26 @@ Todas as mudanças notáveis deste projeto serão documentadas neste arquivo. O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/), e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR/). +## [1.3.0] - 2026-02-06 + +### Adicionado + +- Indexes compostos em `lancamentos`: `(userId, period, transactionType)` e `(pagadorId, period)` +- Cache cross-request no dashboard via `unstable_cache` com tag `"dashboard"` e TTL de 120s +- Invalidação automática do cache do dashboard via `revalidateTag("dashboard")` em mutations financeiras +- Helper `getAdminPagadorId()` com `React.cache()` para lookup cacheado do admin pagador + +### Alterado + +- Eliminados ~20 JOINs com tabela `pagadores` nos fetchers do dashboard (substituídos por filtro direto com `pagadorId`) +- Consolidadas queries de income-expense-balance: 12 queries → 1 (GROUP BY period + transactionType) +- Consolidadas queries de payment-status: 2 queries → 1 (GROUP BY transactionType) +- Consolidadas queries de expenses/income-by-category: 4 queries → 2 (GROUP BY categoriaId + period) +- Scan de métricas limitado a 24 meses ao invés de histórico completo +- Auth session deduplicada por request via `React.cache()` +- Widgets de dashboard ajustados para aceitar `Date | string` (compatibilidade com serialização do `unstable_cache`) +- `CLAUDE.md` otimizado de ~1339 linhas para ~140 linhas + ## [1.2.6] - 2025-02-04 ### Alterado diff --git a/app/(dashboard)/lancamentos/actions.ts b/app/(dashboard)/lancamentos/actions.ts index 4ad9829..be0e658 100644 --- a/app/(dashboard)/lancamentos/actions.ts +++ b/app/(dashboard)/lancamentos/actions.ts @@ -395,7 +395,10 @@ const buildShares = ({ ) { return [ { pagadorId, amountCents: primarySplitAmountCents }, - { pagadorId: secondaryPagadorId, amountCents: secondarySplitAmountCents }, + { + pagadorId: secondaryPagadorId, + amountCents: secondarySplitAmountCents, + }, ]; } diff --git a/components/contas/transfer-dialog.tsx b/components/contas/transfer-dialog.tsx index 94319af..09ecdd0 100644 --- a/components/contas/transfer-dialog.tsx +++ b/components/contas/transfer-dialog.tsx @@ -67,9 +67,7 @@ export function TransferDialog({ ); // Source account info - const fromAccount = accounts.find( - (account) => account.id === fromAccountId, - ); + const fromAccount = accounts.find((account) => account.id === fromAccountId); const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); diff --git a/components/dashboard/purchases-by-category-widget.tsx b/components/dashboard/purchases-by-category-widget.tsx index 91f6c9d..d5eed7f 100644 --- a/components/dashboard/purchases-by-category-widget.tsx +++ b/components/dashboard/purchases-by-category-widget.tsx @@ -19,7 +19,8 @@ type PurchasesByCategoryWidgetProps = { data: PurchasesByCategoryData; }; -const formatTransactionDate = (date: Date) => { +const formatTransactionDate = (date: Date | string) => { + const d = date instanceof Date ? date : new Date(date); const formatter = new Intl.DateTimeFormat("pt-BR", { weekday: "short", day: "2-digit", @@ -27,7 +28,7 @@ const formatTransactionDate = (date: Date) => { timeZone: "UTC", }); - const formatted = formatter.format(date); + const formatted = formatter.format(d); // Capitaliza a primeira letra do dia da semana return formatted.charAt(0).toUpperCase() + formatted.slice(1); }; diff --git a/components/dashboard/recent-transactions-widget.tsx b/components/dashboard/recent-transactions-widget.tsx index c72b771..083e256 100644 --- a/components/dashboard/recent-transactions-widget.tsx +++ b/components/dashboard/recent-transactions-widget.tsx @@ -8,7 +8,8 @@ type RecentTransactionsWidgetProps = { data: RecentTransactionsData; }; -const formatTransactionDate = (date: Date) => { +const formatTransactionDate = (date: Date | string) => { + const d = date instanceof Date ? date : new Date(date); const formatter = new Intl.DateTimeFormat("pt-BR", { weekday: "short", day: "2-digit", @@ -16,7 +17,7 @@ const formatTransactionDate = (date: Date) => { timeZone: "UTC", }); - const formatted = formatter.format(date); + const formatted = formatter.format(d); // Capitaliza a primeira letra do dia da semana return formatted.charAt(0).toUpperCase() + formatted.slice(1); }; diff --git a/components/dashboard/section-cards.tsx b/components/dashboard/section-cards.tsx index 192c3ee..1b42ebc 100644 --- a/components/dashboard/section-cards.tsx +++ b/components/dashboard/section-cards.tsx @@ -14,7 +14,6 @@ import { CardTitle, } from "@/components/ui/card"; import type { DashboardCardMetrics } from "@/lib/dashboard/metrics"; -import { title_font } from "@/public/fonts/font_index"; import MoneyValues from "../money-values"; type SectionCardsProps = { @@ -61,9 +60,7 @@ const getPercentChange = (current: number, previous: number): string => { export function SectionCards({ metrics }: SectionCardsProps) { return ( -
+
{CARDS.map(({ label, key, icon: Icon }) => { const metric = metrics[key]; const trend = getTrend(metric.current, metric.previous); diff --git a/components/dashboard/top-expenses-widget.tsx b/components/dashboard/top-expenses-widget.tsx index 926c0cd..85078de 100644 --- a/components/dashboard/top-expenses-widget.tsx +++ b/components/dashboard/top-expenses-widget.tsx @@ -16,7 +16,8 @@ type TopExpensesWidgetProps = { cardOnlyExpenses: TopExpensesData; }; -const formatTransactionDate = (date: Date) => { +const formatTransactionDate = (date: Date | string) => { + const d = date instanceof Date ? date : new Date(date); const formatter = new Intl.DateTimeFormat("pt-BR", { weekday: "short", day: "2-digit", @@ -24,7 +25,7 @@ const formatTransactionDate = (date: Date) => { timeZone: "UTC", }); - const formatted = formatter.format(date); + const formatted = formatter.format(d); // Capitaliza a primeira letra do dia da semana return formatted.charAt(0).toUpperCase() + formatted.slice(1); }; diff --git a/components/lancamentos/table/lancamentos-table.tsx b/components/lancamentos/table/lancamentos-table.tsx index 9a310e4..314b0d9 100644 --- a/components/lancamentos/table/lancamentos-table.tsx +++ b/components/lancamentos/table/lancamentos-table.tsx @@ -72,7 +72,6 @@ import { getAvatarSrc } from "@/lib/pagadores/utils"; import { formatDate } from "@/lib/utils/date"; import { getConditionIcon, getPaymentMethodIcon } from "@/lib/utils/icons"; import { cn } from "@/lib/utils/ui"; -import { title_font } from "@/public/fonts/font_index"; import { LancamentosExport } from "../lancamentos-export"; import { EstabelecimentoLogo } from "../shared/estabelecimento-logo"; import type { @@ -928,7 +927,7 @@ export function LancamentosTable({ <>
- + {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( diff --git a/components/month-picker/month-navigation.tsx b/components/month-picker/month-navigation.tsx index f918c11..792621d 100644 --- a/components/month-picker/month-navigation.tsx +++ b/components/month-picker/month-navigation.tsx @@ -89,7 +89,7 @@ export default function MonthNavigation() {
diff --git a/components/relatorios/cartoes/card-category-breakdown.tsx b/components/relatorios/cartoes/card-category-breakdown.tsx index d863a36..818d7a4 100644 --- a/components/relatorios/cartoes/card-category-breakdown.tsx +++ b/components/relatorios/cartoes/card-category-breakdown.tsx @@ -7,7 +7,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { WidgetEmptyState } from "@/components/widget-empty-state"; import type { CardDetailData } from "@/lib/relatorios/cartoes-report"; -import { title_font } from "@/public/fonts/font_index"; type CardCategoryBreakdownProps = { data: CardDetailData["categoryBreakdown"]; @@ -18,9 +17,7 @@ export function CardCategoryBreakdown({ data }: CardCategoryBreakdownProps) { return ( - + Gastos por Categoria @@ -41,9 +38,7 @@ export function CardCategoryBreakdown({ data }: CardCategoryBreakdownProps) { return ( - + Gastos por Categoria diff --git a/components/relatorios/cartoes/card-invoice-status.tsx b/components/relatorios/cartoes/card-invoice-status.tsx index ff31357..e00d1bc 100644 --- a/components/relatorios/cartoes/card-invoice-status.tsx +++ b/components/relatorios/cartoes/card-invoice-status.tsx @@ -10,7 +10,6 @@ import { } from "@/components/ui/tooltip"; import type { CardDetailData } from "@/lib/relatorios/cartoes-report"; import { cn } from "@/lib/utils"; -import { title_font } from "@/public/fonts/font_index"; type CardInvoiceStatusProps = { data: CardDetailData["invoiceStatus"]; @@ -75,9 +74,7 @@ export function CardInvoiceStatus({ data }: CardInvoiceStatusProps) { return ( - + Faturas diff --git a/components/relatorios/cartoes/card-top-expenses.tsx b/components/relatorios/cartoes/card-top-expenses.tsx index 7536b42..67b28c8 100644 --- a/components/relatorios/cartoes/card-top-expenses.tsx +++ b/components/relatorios/cartoes/card-top-expenses.tsx @@ -7,7 +7,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { WidgetEmptyState } from "@/components/widget-empty-state"; import type { CardDetailData } from "@/lib/relatorios/cartoes-report"; -import { title_font } from "@/public/fonts/font_index"; type CardTopExpensesProps = { data: CardDetailData["topExpenses"]; @@ -18,9 +17,7 @@ export function CardTopExpenses({ data }: CardTopExpensesProps) { return ( - + Top 10 Gastos do Mês @@ -43,9 +40,7 @@ export function CardTopExpenses({ data }: CardTopExpensesProps) { return ( - + Top 10 Gastos do Mês diff --git a/components/relatorios/cartoes/card-usage-chart.tsx b/components/relatorios/cartoes/card-usage-chart.tsx index a162fc3..0a3f629 100644 --- a/components/relatorios/cartoes/card-usage-chart.tsx +++ b/components/relatorios/cartoes/card-usage-chart.tsx @@ -17,7 +17,6 @@ import { ChartTooltip, } from "@/components/ui/chart"; import type { CardDetailData } from "@/lib/relatorios/cartoes-report"; -import { title_font } from "@/public/fonts/font_index"; type CardUsageChartProps = { data: CardDetailData["monthlyUsage"]; @@ -82,9 +81,7 @@ export function CardUsageChart({ data, limit, card }: CardUsageChartProps) {
- + Histórico de Uso diff --git a/components/relatorios/category-report-table.tsx b/components/relatorios/category-report-table.tsx index 6fae5d8..807b0fe 100644 --- a/components/relatorios/category-report-table.tsx +++ b/components/relatorios/category-report-table.tsx @@ -1,7 +1,10 @@ "use client"; import { useMemo } from "react"; -import type { CategoryReportData, CategoryReportItem } from "@/lib/relatorios/types"; +import type { + CategoryReportData, + CategoryReportItem, +} from "@/lib/relatorios/types"; import { CategoryTable } from "./category-table"; interface CategoryReportTableProps { diff --git a/components/sidebar/app-sidebar.tsx b/components/sidebar/app-sidebar.tsx index a43fa95..55169b7 100644 --- a/components/sidebar/app-sidebar.tsx +++ b/components/sidebar/app-sidebar.tsx @@ -78,9 +78,6 @@ function LogoContent() { const isCollapsed = state === "collapsed"; return ( - + ); } diff --git a/components/top-estabelecimentos/establishments-list.tsx b/components/top-estabelecimentos/establishments-list.tsx index f6cf585..cc9eb29 100644 --- a/components/top-estabelecimentos/establishments-list.tsx +++ b/components/top-estabelecimentos/establishments-list.tsx @@ -6,7 +6,6 @@ import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { WidgetEmptyState } from "@/components/widget-empty-state"; import type { TopEstabelecimentosData } from "@/lib/top-estabelecimentos/fetch-data"; -import { title_font } from "@/public/fonts/font_index"; import { Progress } from "../ui/progress"; type EstablishmentsListProps = { @@ -32,9 +31,7 @@ export function EstablishmentsList({ return ( - + Top Estabelecimentos @@ -55,9 +52,7 @@ export function EstablishmentsList({ return ( - + Top Estabelecimentos por Frequência diff --git a/components/top-estabelecimentos/top-categories.tsx b/components/top-estabelecimentos/top-categories.tsx index aae24dc..8648fa7 100644 --- a/components/top-estabelecimentos/top-categories.tsx +++ b/components/top-estabelecimentos/top-categories.tsx @@ -6,7 +6,6 @@ import MoneyValues from "@/components/money-values"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { WidgetEmptyState } from "@/components/widget-empty-state"; import type { TopEstabelecimentosData } from "@/lib/top-estabelecimentos/fetch-data"; -import { title_font } from "@/public/fonts/font_index"; import { Progress } from "../ui/progress"; type TopCategoriesProps = { @@ -18,9 +17,7 @@ export function TopCategories({ categories }: TopCategoriesProps) { return ( - + Principais Categorias @@ -41,9 +38,7 @@ export function TopCategories({ categories }: TopCategoriesProps) { return ( - + Principais Categorias diff --git a/components/widget-card.tsx b/components/widget-card.tsx index b548d2e..a164b49 100644 --- a/components/widget-card.tsx +++ b/components/widget-card.tsx @@ -14,7 +14,6 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/dialog"; -import { title_font } from "@/public/fonts/font_index"; import { Button } from "./ui/button"; const OVERFLOW_THRESHOLD_PX = 16; @@ -79,9 +78,7 @@ export default function WidgetCard({
- + {icon} {title} diff --git a/db/schema.ts b/db/schema.ts index bfa0d29..c1ce02f 100644 --- a/db/schema.ts +++ b/db/schema.ts @@ -591,6 +591,17 @@ export const lancamentos = pgTable( table.userId, table.period, ), + // Índice composto userId + period + transactionType (cobre maioria das queries do dashboard) + userIdPeriodTypeIdx: index("lancamentos_user_id_period_type_idx").on( + table.userId, + table.period, + table.transactionType, + ), + // Índice para queries por pagador + period (invoice/breakdown queries) + pagadorIdPeriodIdx: index("lancamentos_pagador_id_period_idx").on( + table.pagadorId, + table.period, + ), // Índice para queries ordenadas por data de compra userIdPurchaseDateIdx: index("lancamentos_user_id_purchase_date_idx").on( table.userId, diff --git a/drizzle/0015_concerned_kat_farrell.sql b/drizzle/0015_concerned_kat_farrell.sql new file mode 100644 index 0000000..3bc6560 --- /dev/null +++ b/drizzle/0015_concerned_kat_farrell.sql @@ -0,0 +1,2 @@ +CREATE INDEX "lancamentos_user_id_period_type_idx" ON "lancamentos" USING btree ("user_id","periodo","tipo_transacao");--> statement-breakpoint +CREATE INDEX "lancamentos_pagador_id_period_idx" ON "lancamentos" USING btree ("pagador_id","periodo"); \ No newline at end of file diff --git a/drizzle/meta/0015_snapshot.json b/drizzle/meta/0015_snapshot.json new file mode 100644 index 0000000..1b966ae --- /dev/null +++ b/drizzle/meta/0015_snapshot.json @@ -0,0 +1,2303 @@ +{ + "id": "af9b35da-2ada-4fbf-bcce-b371ce7117bf", + "prevId": "4ae67d34-81ae-418b-ac5b-e53b57753da1", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "accountId": { + "name": "accountId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessToken": { + "name": "accessToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idToken": { + "name": "idToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessTokenExpiresAt": { + "name": "accessTokenExpiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "refreshTokenExpiresAt": { + "name": "refreshTokenExpiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.anotacoes": { + "name": "anotacoes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "titulo": { + "name": "titulo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "descricao": { + "name": "descricao", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tipo": { + "name": "tipo", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'nota'" + }, + "tasks": { + "name": "tasks", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "arquivada": { + "name": "arquivada", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "anotacoes_user_id_user_id_fk": { + "name": "anotacoes_user_id_user_id_fk", + "tableFrom": "anotacoes", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.antecipacoes_parcelas": { + "name": "antecipacoes_parcelas", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "series_id": { + "name": "series_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "periodo_antecipacao": { + "name": "periodo_antecipacao", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "data_antecipacao": { + "name": "data_antecipacao", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "parcelas_antecipadas": { + "name": "parcelas_antecipadas", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "valor_total": { + "name": "valor_total", + "type": "numeric(12, 2)", + "primaryKey": false, + "notNull": true + }, + "qtde_parcelas": { + "name": "qtde_parcelas", + "type": "smallint", + "primaryKey": false, + "notNull": true + }, + "desconto": { + "name": "desconto", + "type": "numeric(12, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "lancamento_id": { + "name": "lancamento_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "pagador_id": { + "name": "pagador_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "categoria_id": { + "name": "categoria_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "anotacao": { + "name": "anotacao", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "antecipacoes_parcelas_series_id_idx": { + "name": "antecipacoes_parcelas_series_id_idx", + "columns": [ + { + "expression": "series_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "antecipacoes_parcelas_user_id_idx": { + "name": "antecipacoes_parcelas_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "antecipacoes_parcelas_lancamento_id_lancamentos_id_fk": { + "name": "antecipacoes_parcelas_lancamento_id_lancamentos_id_fk", + "tableFrom": "antecipacoes_parcelas", + "tableTo": "lancamentos", + "columnsFrom": [ + "lancamento_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "antecipacoes_parcelas_pagador_id_pagadores_id_fk": { + "name": "antecipacoes_parcelas_pagador_id_pagadores_id_fk", + "tableFrom": "antecipacoes_parcelas", + "tableTo": "pagadores", + "columnsFrom": [ + "pagador_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "antecipacoes_parcelas_categoria_id_categorias_id_fk": { + "name": "antecipacoes_parcelas_categoria_id_categorias_id_fk", + "tableFrom": "antecipacoes_parcelas", + "tableTo": "categorias", + "columnsFrom": [ + "categoria_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "antecipacoes_parcelas_user_id_user_id_fk": { + "name": "antecipacoes_parcelas_user_id_user_id_fk", + "tableFrom": "antecipacoes_parcelas", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.cartoes": { + "name": "cartoes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "nome": { + "name": "nome", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dt_fechamento": { + "name": "dt_fechamento", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dt_vencimento": { + "name": "dt_vencimento", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "anotacao": { + "name": "anotacao", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "limite": { + "name": "limite", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "bandeira": { + "name": "bandeira", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "conta_id": { + "name": "conta_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "cartoes_user_id_status_idx": { + "name": "cartoes_user_id_status_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cartoes_user_id_user_id_fk": { + "name": "cartoes_user_id_user_id_fk", + "tableFrom": "cartoes", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cartoes_conta_id_contas_id_fk": { + "name": "cartoes_conta_id_contas_id_fk", + "tableFrom": "cartoes", + "tableTo": "contas", + "columnsFrom": [ + "conta_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.categorias": { + "name": "categorias", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "nome": { + "name": "nome", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tipo": { + "name": "tipo", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "icone": { + "name": "icone", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "categorias_user_id_type_idx": { + "name": "categorias_user_id_type_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tipo", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "categorias_user_id_user_id_fk": { + "name": "categorias_user_id_user_id_fk", + "tableFrom": "categorias", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compartilhamentos_pagador": { + "name": "compartilhamentos_pagador", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "pagador_id": { + "name": "pagador_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "shared_with_user_id": { + "name": "shared_with_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'read'" + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "compartilhamentos_pagador_unique": { + "name": "compartilhamentos_pagador_unique", + "columns": [ + { + "expression": "pagador_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "shared_with_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "compartilhamentos_pagador_pagador_id_pagadores_id_fk": { + "name": "compartilhamentos_pagador_pagador_id_pagadores_id_fk", + "tableFrom": "compartilhamentos_pagador", + "tableTo": "pagadores", + "columnsFrom": [ + "pagador_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compartilhamentos_pagador_shared_with_user_id_user_id_fk": { + "name": "compartilhamentos_pagador_shared_with_user_id_user_id_fk", + "tableFrom": "compartilhamentos_pagador", + "tableTo": "user", + "columnsFrom": [ + "shared_with_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compartilhamentos_pagador_created_by_user_id_user_id_fk": { + "name": "compartilhamentos_pagador_created_by_user_id_user_id_fk", + "tableFrom": "compartilhamentos_pagador", + "tableTo": "user", + "columnsFrom": [ + "created_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.contas": { + "name": "contas", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "nome": { + "name": "nome", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tipo_conta": { + "name": "tipo_conta", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "anotacao": { + "name": "anotacao", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "saldo_inicial": { + "name": "saldo_inicial", + "type": "numeric(12, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "excluir_do_saldo": { + "name": "excluir_do_saldo", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "excluir_saldo_inicial_receitas": { + "name": "excluir_saldo_inicial_receitas", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "contas_user_id_status_idx": { + "name": "contas_user_id_status_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "contas_user_id_user_id_fk": { + "name": "contas_user_id_user_id_fk", + "tableFrom": "contas", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.faturas": { + "name": "faturas", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "status_pagamento": { + "name": "status_pagamento", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "periodo": { + "name": "periodo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "cartao_id": { + "name": "cartao_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "faturas_user_id_period_idx": { + "name": "faturas_user_id_period_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "periodo", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "faturas_cartao_id_period_idx": { + "name": "faturas_cartao_id_period_idx", + "columns": [ + { + "expression": "cartao_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "periodo", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "faturas_user_id_user_id_fk": { + "name": "faturas_user_id_user_id_fk", + "tableFrom": "faturas", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "faturas_cartao_id_cartoes_id_fk": { + "name": "faturas_cartao_id_cartoes_id_fk", + "tableFrom": "faturas", + "tableTo": "cartoes", + "columnsFrom": [ + "cartao_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.insights_salvos": { + "name": "insights_salvos", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "period": { + "name": "period", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "model_id": { + "name": "model_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "data": { + "name": "data", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "insights_salvos_user_period_idx": { + "name": "insights_salvos_user_period_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "period", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "insights_salvos_user_id_user_id_fk": { + "name": "insights_salvos_user_id_user_id_fk", + "tableFrom": "insights_salvos", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.lancamentos": { + "name": "lancamentos", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "condicao": { + "name": "condicao", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "nome": { + "name": "nome", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "forma_pagamento": { + "name": "forma_pagamento", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "anotacao": { + "name": "anotacao", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "valor": { + "name": "valor", + "type": "numeric(12, 2)", + "primaryKey": false, + "notNull": true + }, + "data_compra": { + "name": "data_compra", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "tipo_transacao": { + "name": "tipo_transacao", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "qtde_parcela": { + "name": "qtde_parcela", + "type": "smallint", + "primaryKey": false, + "notNull": false + }, + "periodo": { + "name": "periodo", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "parcela_atual": { + "name": "parcela_atual", + "type": "smallint", + "primaryKey": false, + "notNull": false + }, + "qtde_recorrencia": { + "name": "qtde_recorrencia", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "data_vencimento": { + "name": "data_vencimento", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "dt_pagamento_boleto": { + "name": "dt_pagamento_boleto", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "realizado": { + "name": "realizado", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "dividido": { + "name": "dividido", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "antecipado": { + "name": "antecipado", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "antecipacao_id": { + "name": "antecipacao_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "cartao_id": { + "name": "cartao_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "conta_id": { + "name": "conta_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "categoria_id": { + "name": "categoria_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "pagador_id": { + "name": "pagador_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "series_id": { + "name": "series_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "transfer_id": { + "name": "transfer_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "lancamentos_user_id_period_idx": { + "name": "lancamentos_user_id_period_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "periodo", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lancamentos_user_id_period_type_idx": { + "name": "lancamentos_user_id_period_type_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "periodo", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tipo_transacao", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lancamentos_pagador_id_period_idx": { + "name": "lancamentos_pagador_id_period_idx", + "columns": [ + { + "expression": "pagador_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "periodo", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lancamentos_user_id_purchase_date_idx": { + "name": "lancamentos_user_id_purchase_date_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "data_compra", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lancamentos_series_id_idx": { + "name": "lancamentos_series_id_idx", + "columns": [ + { + "expression": "series_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lancamentos_transfer_id_idx": { + "name": "lancamentos_transfer_id_idx", + "columns": [ + { + "expression": "transfer_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lancamentos_user_id_condition_idx": { + "name": "lancamentos_user_id_condition_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "condicao", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lancamentos_cartao_id_period_idx": { + "name": "lancamentos_cartao_id_period_idx", + "columns": [ + { + "expression": "cartao_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "periodo", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "lancamentos_antecipacao_id_antecipacoes_parcelas_id_fk": { + "name": "lancamentos_antecipacao_id_antecipacoes_parcelas_id_fk", + "tableFrom": "lancamentos", + "tableTo": "antecipacoes_parcelas", + "columnsFrom": [ + "antecipacao_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "lancamentos_user_id_user_id_fk": { + "name": "lancamentos_user_id_user_id_fk", + "tableFrom": "lancamentos", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "lancamentos_cartao_id_cartoes_id_fk": { + "name": "lancamentos_cartao_id_cartoes_id_fk", + "tableFrom": "lancamentos", + "tableTo": "cartoes", + "columnsFrom": [ + "cartao_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "lancamentos_conta_id_contas_id_fk": { + "name": "lancamentos_conta_id_contas_id_fk", + "tableFrom": "lancamentos", + "tableTo": "contas", + "columnsFrom": [ + "conta_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "lancamentos_categoria_id_categorias_id_fk": { + "name": "lancamentos_categoria_id_categorias_id_fk", + "tableFrom": "lancamentos", + "tableTo": "categorias", + "columnsFrom": [ + "categoria_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "lancamentos_pagador_id_pagadores_id_fk": { + "name": "lancamentos_pagador_id_pagadores_id_fk", + "tableFrom": "lancamentos", + "tableTo": "pagadores", + "columnsFrom": [ + "pagador_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.orcamentos": { + "name": "orcamentos", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "valor": { + "name": "valor", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "periodo": { + "name": "periodo", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "categoria_id": { + "name": "categoria_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "orcamentos_user_id_period_idx": { + "name": "orcamentos_user_id_period_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "periodo", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "orcamentos_user_id_user_id_fk": { + "name": "orcamentos_user_id_user_id_fk", + "tableFrom": "orcamentos", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "orcamentos_categoria_id_categorias_id_fk": { + "name": "orcamentos_categoria_id_categorias_id_fk", + "tableFrom": "orcamentos", + "tableTo": "categorias", + "columnsFrom": [ + "categoria_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.pagadores": { + "name": "pagadores", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "nome": { + "name": "nome", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "anotacao": { + "name": "anotacao", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_auto_send": { + "name": "is_auto_send", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "share_code": { + "name": "share_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "substr(encode(gen_random_bytes(24), 'base64'), 1, 24)" + }, + "last_mail": { + "name": "last_mail", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "pagadores_share_code_key": { + "name": "pagadores_share_code_key", + "columns": [ + { + "expression": "share_code", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pagadores_user_id_status_idx": { + "name": "pagadores_user_id_status_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pagadores_user_id_role_idx": { + "name": "pagadores_user_id_role_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "pagadores_user_id_user_id_fk": { + "name": "pagadores_user_id_user_id_fk", + "tableFrom": "pagadores", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.pre_lancamentos": { + "name": "pre_lancamentos", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_app": { + "name": "source_app", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_app_name": { + "name": "source_app_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "original_title": { + "name": "original_title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "original_text": { + "name": "original_text", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "notification_timestamp": { + "name": "notification_timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "parsed_name": { + "name": "parsed_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "parsed_amount": { + "name": "parsed_amount", + "type": "numeric(12, 2)", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "lancamento_id": { + "name": "lancamento_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "processed_at": { + "name": "processed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "discarded_at": { + "name": "discarded_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "pre_lancamentos_user_id_status_idx": { + "name": "pre_lancamentos_user_id_status_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pre_lancamentos_user_id_created_at_idx": { + "name": "pre_lancamentos_user_id_created_at_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "pre_lancamentos_user_id_user_id_fk": { + "name": "pre_lancamentos_user_id_user_id_fk", + "tableFrom": "pre_lancamentos", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "pre_lancamentos_lancamento_id_lancamentos_id_fk": { + "name": "pre_lancamentos_lancamento_id_lancamentos_id_fk", + "tableFrom": "pre_lancamentos", + "tableTo": "lancamentos", + "columnsFrom": [ + "lancamento_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preferencias_usuario": { + "name": "preferencias_usuario", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "disable_magnetlines": { + "name": "disable_magnetlines", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dashboard_widgets": { + "name": "dashboard_widgets", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "preferencias_usuario_user_id_user_id_fk": { + "name": "preferencias_usuario_user_id_user_id_fk", + "tableFrom": "preferencias_usuario", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preferencias_usuario_user_id_unique": { + "name": "preferencias_usuario_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userAgent": { + "name": "userAgent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tokens_api": { + "name": "tokens_api", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token_hash": { + "name": "token_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token_prefix": { + "name": "token_prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "last_used_at": { + "name": "last_used_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_used_ip": { + "name": "last_used_ip", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "revoked_at": { + "name": "revoked_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "tokens_api_user_id_idx": { + "name": "tokens_api_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tokens_api_token_hash_idx": { + "name": "tokens_api_token_hash_idx", + "columns": [ + { + "expression": "token_hash", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tokens_api_user_id_user_id_fk": { + "name": "tokens_api_user_id_user_id_fk", + "tableFrom": "tokens_api", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "emailVerified": { + "name": "emailVerified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 55ce2ac..614d6e7 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -1,111 +1,118 @@ { - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1762993507299, - "tag": "0000_flashy_manta", - "breakpoints": true - }, - { - "idx": 1, - "version": "7", - "when": 1765199006435, - "tag": "0001_young_mister_fear", - "breakpoints": true - }, - { - "idx": 2, - "version": "7", - "when": 1765200545692, - "tag": "0002_slimy_flatman", - "breakpoints": true - }, - { - "idx": 3, - "version": "7", - "when": 1767102605526, - "tag": "0003_green_korg", - "breakpoints": true - }, - { - "idx": 4, - "version": "7", - "when": 1767104066872, - "tag": "0004_acoustic_mach_iv", - "breakpoints": true - }, - { - "idx": 5, - "version": "7", - "when": 1767106121811, - "tag": "0005_adorable_bruce_banner", - "breakpoints": true - }, - { - "idx": 6, - "version": "7", - "when": 1767107487318, - "tag": "0006_youthful_mister_fear", - "breakpoints": true - }, - { - "idx": 7, - "version": "7", - "when": 1767118780033, - "tag": "0007_sturdy_kate_bishop", - "breakpoints": true - }, - { - "idx": 8, - "version": "7", - "when": 1767125796314, - "tag": "0008_fat_stick", - "breakpoints": true - }, - { - "idx": 9, - "version": "7", - "when": 1768925100873, - "tag": "0009_add_dashboard_widgets", - "breakpoints": true - }, - { - "idx": 10, - "version": "7", - "when": 1769369834242, - "tag": "0010_lame_psynapse", - "breakpoints": true - }, - { - "idx": 11, - "version": "7", - "when": 1769447087678, - "tag": "0011_remove_unused_inbox_columns", - "breakpoints": true - }, - { - "idx": 12, - "version": "7", - "when": 1769533200000, - "tag": "0012_rename_tables_to_portuguese", - "breakpoints": true - }, - { - "idx": 13, - "version": "7", - "when": 1769523352777, - "tag": "0013_fancy_rick_jones", - "breakpoints": true - }, - { - "idx": 14, - "version": "7", - "when": 1769619226903, - "tag": "0014_yielding_jack_flag", - "breakpoints": true - } - ] -} + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1762993507299, + "tag": "0000_flashy_manta", + "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1765199006435, + "tag": "0001_young_mister_fear", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1765200545692, + "tag": "0002_slimy_flatman", + "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1767102605526, + "tag": "0003_green_korg", + "breakpoints": true + }, + { + "idx": 4, + "version": "7", + "when": 1767104066872, + "tag": "0004_acoustic_mach_iv", + "breakpoints": true + }, + { + "idx": 5, + "version": "7", + "when": 1767106121811, + "tag": "0005_adorable_bruce_banner", + "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1767107487318, + "tag": "0006_youthful_mister_fear", + "breakpoints": true + }, + { + "idx": 7, + "version": "7", + "when": 1767118780033, + "tag": "0007_sturdy_kate_bishop", + "breakpoints": true + }, + { + "idx": 8, + "version": "7", + "when": 1767125796314, + "tag": "0008_fat_stick", + "breakpoints": true + }, + { + "idx": 9, + "version": "7", + "when": 1768925100873, + "tag": "0009_add_dashboard_widgets", + "breakpoints": true + }, + { + "idx": 10, + "version": "7", + "when": 1769369834242, + "tag": "0010_lame_psynapse", + "breakpoints": true + }, + { + "idx": 11, + "version": "7", + "when": 1769447087678, + "tag": "0011_remove_unused_inbox_columns", + "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1769533200000, + "tag": "0012_rename_tables_to_portuguese", + "breakpoints": true + }, + { + "idx": 13, + "version": "7", + "when": 1769523352777, + "tag": "0013_fancy_rick_jones", + "breakpoints": true + }, + { + "idx": 14, + "version": "7", + "when": 1769619226903, + "tag": "0014_yielding_jack_flag", + "breakpoints": true + }, + { + "idx": 15, + "version": "7", + "when": 1770332054481, + "tag": "0015_concerned_kat_farrell", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/lib/actions/helpers.ts b/lib/actions/helpers.ts index 681da2b..69e2f0d 100644 --- a/lib/actions/helpers.ts +++ b/lib/actions/helpers.ts @@ -1,4 +1,4 @@ -import { revalidatePath } from "next/cache"; +import { revalidatePath, revalidateTag } from "next/cache"; import { z } from "zod"; import { getUser } from "@/lib/auth/server"; import type { ActionResult } from "./types"; @@ -35,14 +35,30 @@ export const revalidateConfig = { inbox: ["/pre-lancamentos", "/lancamentos", "/dashboard"], } as const; +/** Entities whose mutations should invalidate the dashboard cache */ +const DASHBOARD_ENTITIES: ReadonlySet = new Set([ + "lancamentos", + "contas", + "cartoes", + "orcamentos", + "pagadores", + "inbox", +]); + /** - * Revalidates paths for a specific entity + * Revalidates paths for a specific entity. + * Also invalidates the dashboard "use cache" tag for financial entities. * @param entity - The entity type */ export function revalidateForEntity( entity: keyof typeof revalidateConfig, ): void { revalidateConfig[entity].forEach((path) => revalidatePath(path)); + + // Invalidate dashboard cache for financial mutations + if (DASHBOARD_ENTITIES.has(entity)) { + revalidateTag("dashboard"); + } } /** diff --git a/lib/auth/server.ts b/lib/auth/server.ts index 947a8b9..567c70c 100644 --- a/lib/auth/server.ts +++ b/lib/auth/server.ts @@ -1,14 +1,23 @@ import { headers } from "next/headers"; import { redirect } from "next/navigation"; +import { cache } from "react"; import { auth } from "@/lib/auth/config"; +/** + * Cached session fetch - deduplicates auth calls within a single request. + * Layout + page calling getUser() will only hit auth once. + */ +const getSessionCached = cache(async () => { + return auth.api.getSession({ headers: await headers() }); +}); + /** * Gets the current authenticated user * @returns User object * @throws Redirects to /login if user is not authenticated */ export async function getUser() { - const session = await auth.api.getSession({ headers: await headers() }); + const session = await getSessionCached(); if (!session?.user) { redirect("/login"); @@ -23,7 +32,7 @@ export async function getUser() { * @throws Redirects to /login if user is not authenticated */ export async function getUserId() { - const session = await auth.api.getSession({ headers: await headers() }); + const session = await getSessionCached(); if (!session?.user) { redirect("/login"); @@ -38,7 +47,7 @@ export async function getUserId() { * @throws Redirects to /login if user is not authenticated */ export async function getUserSession() { - const session = await auth.api.getSession({ headers: await headers() }); + const session = await getSessionCached(); if (!session?.user) { redirect("/login"); @@ -53,5 +62,5 @@ export async function getUserSession() { * @note This function does not redirect if user is not authenticated */ export async function getOptionalUserSession() { - return auth.api.getSession({ headers: await headers() }); + return getSessionCached(); } diff --git a/lib/dashboard/boletos.ts b/lib/dashboard/boletos.ts index 0fe418d..1d28c97 100644 --- a/lib/dashboard/boletos.ts +++ b/lib/dashboard/boletos.ts @@ -1,9 +1,10 @@ "use server"; import { and, asc, eq } from "drizzle-orm"; -import { lancamentos, pagadores } from "@/db/schema"; +import { lancamentos } from "@/db/schema"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; const PAYMENT_METHOD_BOLETO = "Boleto"; @@ -51,6 +52,11 @@ export async function fetchDashboardBoletos( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { boletos: [], totalPendingAmount: 0, pendingCount: 0 }; + } + const rows = await db .select({ id: lancamentos.id, @@ -61,13 +67,12 @@ export async function fetchDashboardBoletos( isSettled: lancamentos.isSettled, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .where( and( eq(lancamentos.userId, userId), eq(lancamentos.period, period), eq(lancamentos.paymentMethod, PAYMENT_METHOD_BOLETO), - eq(pagadores.role, "admin"), + eq(lancamentos.pagadorId, adminPagadorId), ), ) .orderBy( diff --git a/lib/dashboard/categories/expenses-by-category.ts b/lib/dashboard/categories/expenses-by-category.ts index 87130ae..70c5de0 100644 --- a/lib/dashboard/categories/expenses-by-category.ts +++ b/lib/dashboard/categories/expenses-by-category.ts @@ -1,9 +1,10 @@ -import { and, eq, isNull, or, sql } from "drizzle-orm"; -import { categorias, lancamentos, orcamentos, pagadores } from "@/db/schema"; +import { and, eq, inArray, isNull, or, sql } from "drizzle-orm"; +import { categorias, lancamentos, orcamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; +import { calculatePercentageChange } from "@/lib/utils/math"; import { getPreviousPeriod } from "@/lib/utils/period"; export type CategoryExpenseItem = { @@ -24,138 +25,129 @@ export type ExpensesByCategoryData = { previousTotal: number; }; -const calculatePercentageChange = ( - current: number, - previous: number, -): number | null => { - const EPSILON = 0.01; // Considera valores menores que 1 centavo como zero - - if (Math.abs(previous) < EPSILON) { - if (Math.abs(current) < EPSILON) return null; - return current > 0 ? 100 : -100; - } - - const change = ((current - previous) / Math.abs(previous)) * 100; - - // Protege contra valores absurdos (retorna null se > 1 milhão %) - return Number.isFinite(change) && Math.abs(change) < 1000000 ? change : null; -}; - export async function fetchExpensesByCategory( userId: string, period: string, ): Promise { const previousPeriod = getPreviousPeriod(period); - // Busca despesas do período atual agrupadas por categoria - const currentPeriodRows = await db - .select({ - categoryId: categorias.id, - categoryName: categorias.name, - categoryIcon: categorias.icon, - total: sql`coalesce(sum(${lancamentos.amount}), 0)`, - budgetAmount: orcamentos.amount, - }) - .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .innerJoin(categorias, eq(lancamentos.categoriaId, categorias.id)) - .leftJoin( - orcamentos, - and( - eq(orcamentos.categoriaId, categorias.id), - eq(orcamentos.period, period), - eq(orcamentos.userId, userId), - ), - ) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.period, period), - eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), - eq(categorias.type, "despesa"), - or( - isNull(lancamentos.note), - sql`${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`}`, + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { categories: [], currentTotal: 0, previousTotal: 0 }; + } + + // Single query: GROUP BY categoriaId + period for both current and previous periods + const [rows, budgetRows] = await Promise.all([ + db + .select({ + categoryId: categorias.id, + categoryName: categorias.name, + categoryIcon: categorias.icon, + period: lancamentos.period, + total: sql`coalesce(sum(${lancamentos.amount}), 0)`, + }) + .from(lancamentos) + .innerJoin(categorias, eq(lancamentos.categoriaId, categorias.id)) + .where( + and( + eq(lancamentos.userId, userId), + eq(lancamentos.pagadorId, adminPagadorId), + inArray(lancamentos.period, [period, previousPeriod]), + eq(lancamentos.transactionType, "Despesa"), + eq(categorias.type, "despesa"), + or( + isNull(lancamentos.note), + sql`${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`}`, + ), ), + ) + .groupBy( + categorias.id, + categorias.name, + categorias.icon, + lancamentos.period, ), - ) - .groupBy( - categorias.id, - categorias.name, - categorias.icon, - orcamentos.amount, - ); + db + .select({ + categoriaId: orcamentos.categoriaId, + amount: orcamentos.amount, + }) + .from(orcamentos) + .where(and(eq(orcamentos.userId, userId), eq(orcamentos.period, period))), + ]); - // Busca despesas do período anterior agrupadas por categoria - const previousPeriodRows = await db - .select({ - categoryId: categorias.id, - total: sql`coalesce(sum(${lancamentos.amount}), 0)`, - }) - .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .innerJoin(categorias, eq(lancamentos.categoriaId, categorias.id)) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.period, previousPeriod), - eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), - eq(categorias.type, "despesa"), - or( - isNull(lancamentos.note), - sql`${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`}`, - ), - ), - ) - .groupBy(categorias.id); + // Build budget lookup + const budgetMap = new Map(); + for (const row of budgetRows) { + if (row.categoriaId) { + budgetMap.set(row.categoriaId, toNumber(row.amount)); + } + } - // Cria um mapa do período anterior para busca rápida - const previousMap = new Map(); - let previousTotal = 0; + // Build category data from grouped results + const categoryMap = new Map< + string, + { + name: string; + icon: string | null; + current: number; + previous: number; + } + >(); + + for (const row of rows) { + const entry = categoryMap.get(row.categoryId) ?? { + name: row.categoryName, + icon: row.categoryIcon, + current: 0, + previous: 0, + }; - for (const row of previousPeriodRows) { const amount = Math.abs(toNumber(row.total)); - previousMap.set(row.categoryId, amount); - previousTotal += amount; + if (row.period === period) { + entry.current = amount; + } else { + entry.previous = amount; + } + categoryMap.set(row.categoryId, entry); } - // Calcula o total do período atual + // Calculate totals let currentTotal = 0; - for (const row of currentPeriodRows) { - currentTotal += Math.abs(toNumber(row.total)); + let previousTotal = 0; + for (const entry of categoryMap.values()) { + currentTotal += entry.current; + previousTotal += entry.previous; } - // Monta os dados de cada categoria - const categories: CategoryExpenseItem[] = currentPeriodRows.map((row) => { - const currentAmount = Math.abs(toNumber(row.total)); - const previousAmount = previousMap.get(row.categoryId) ?? 0; + // Build result + const categories: CategoryExpenseItem[] = []; + for (const [categoryId, entry] of categoryMap) { const percentageChange = calculatePercentageChange( - currentAmount, - previousAmount, + entry.current, + entry.previous, ); const percentageOfTotal = - currentTotal > 0 ? (currentAmount / currentTotal) * 100 : 0; + currentTotal > 0 ? (entry.current / currentTotal) * 100 : 0; - const budgetAmount = row.budgetAmount ? toNumber(row.budgetAmount) : null; + const budgetAmount = budgetMap.get(categoryId) ?? null; const budgetUsedPercentage = budgetAmount && budgetAmount > 0 - ? (currentAmount / budgetAmount) * 100 + ? (entry.current / budgetAmount) * 100 : null; - return { - categoryId: row.categoryId, - categoryName: row.categoryName, - categoryIcon: row.categoryIcon, - currentAmount, - previousAmount, + categories.push({ + categoryId, + categoryName: entry.name, + categoryIcon: entry.icon, + currentAmount: entry.current, + previousAmount: entry.previous, percentageChange, percentageOfTotal, budgetAmount, budgetUsedPercentage, - }; - }); + }); + } // Ordena por valor atual (maior para menor) categories.sort((a, b) => b.currentAmount - a.currentAmount); diff --git a/lib/dashboard/categories/income-by-category.ts b/lib/dashboard/categories/income-by-category.ts index 0d34b73..d544d1f 100644 --- a/lib/dashboard/categories/income-by-category.ts +++ b/lib/dashboard/categories/income-by-category.ts @@ -1,17 +1,11 @@ -import { and, eq, isNull, ne, or, sql } from "drizzle-orm"; -import { - categorias, - contas, - lancamentos, - orcamentos, - pagadores, -} from "@/db/schema"; +import { and, eq, inArray, isNull, ne, or, sql } from "drizzle-orm"; +import { categorias, contas, lancamentos, orcamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; import { calculatePercentageChange } from "@/lib/utils/math"; import { safeToNumber } from "@/lib/utils/number"; import { getPreviousPeriod } from "@/lib/utils/period"; @@ -40,131 +34,130 @@ export async function fetchIncomeByCategory( ): Promise { const previousPeriod = getPreviousPeriod(period); - // Busca receitas do período atual agrupadas por categoria - const currentPeriodRows = await db - .select({ - categoryId: categorias.id, - categoryName: categorias.name, - categoryIcon: categorias.icon, - total: sql`coalesce(sum(${lancamentos.amount}), 0)`, - budgetAmount: orcamentos.amount, - }) - .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .innerJoin(categorias, eq(lancamentos.categoriaId, categorias.id)) - .leftJoin(contas, eq(lancamentos.contaId, contas.id)) - .leftJoin( - orcamentos, - and( - eq(orcamentos.categoriaId, categorias.id), - eq(orcamentos.period, period), - eq(orcamentos.userId, userId), - ), - ) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.period, period), - eq(lancamentos.transactionType, "Receita"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), - eq(categorias.type, "receita"), - or( - isNull(lancamentos.note), - sql`${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`}`, - ), - // Excluir saldos iniciais se a conta tiver o flag ativo - or( - ne(lancamentos.note, INITIAL_BALANCE_NOTE), - isNull(contas.excludeInitialBalanceFromIncome), - eq(contas.excludeInitialBalanceFromIncome, false), - ), - ), - ) - .groupBy( - categorias.id, - categorias.name, - categorias.icon, - orcamentos.amount, - ); + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { categories: [], currentTotal: 0, previousTotal: 0 }; + } - // Busca receitas do período anterior agrupadas por categoria - const previousPeriodRows = await db - .select({ - categoryId: categorias.id, - total: sql`coalesce(sum(${lancamentos.amount}), 0)`, - }) - .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .innerJoin(categorias, eq(lancamentos.categoriaId, categorias.id)) - .leftJoin(contas, eq(lancamentos.contaId, contas.id)) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.period, previousPeriod), - eq(lancamentos.transactionType, "Receita"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), - eq(categorias.type, "receita"), - or( - isNull(lancamentos.note), - sql`${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`}`, - ), - // Excluir saldos iniciais se a conta tiver o flag ativo - or( - ne(lancamentos.note, INITIAL_BALANCE_NOTE), - isNull(contas.excludeInitialBalanceFromIncome), - eq(contas.excludeInitialBalanceFromIncome, false), + // Single query: GROUP BY categoriaId + period for both current and previous periods + const [rows, budgetRows] = await Promise.all([ + db + .select({ + categoryId: categorias.id, + categoryName: categorias.name, + categoryIcon: categorias.icon, + period: lancamentos.period, + total: sql`coalesce(sum(${lancamentos.amount}), 0)`, + }) + .from(lancamentos) + .innerJoin(categorias, eq(lancamentos.categoriaId, categorias.id)) + .leftJoin(contas, eq(lancamentos.contaId, contas.id)) + .where( + and( + eq(lancamentos.userId, userId), + eq(lancamentos.pagadorId, adminPagadorId), + inArray(lancamentos.period, [period, previousPeriod]), + eq(lancamentos.transactionType, "Receita"), + eq(categorias.type, "receita"), + or( + isNull(lancamentos.note), + sql`${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`}`, + ), + // Excluir saldos iniciais se a conta tiver o flag ativo + or( + ne(lancamentos.note, INITIAL_BALANCE_NOTE), + isNull(contas.excludeInitialBalanceFromIncome), + eq(contas.excludeInitialBalanceFromIncome, false), + ), ), + ) + .groupBy( + categorias.id, + categorias.name, + categorias.icon, + lancamentos.period, ), - ) - .groupBy(categorias.id); + db + .select({ + categoriaId: orcamentos.categoriaId, + amount: orcamentos.amount, + }) + .from(orcamentos) + .where(and(eq(orcamentos.userId, userId), eq(orcamentos.period, period))), + ]); - // Cria um mapa do período anterior para busca rápida - const previousMap = new Map(); - let previousTotal = 0; + // Build budget lookup + const budgetMap = new Map(); + for (const row of budgetRows) { + if (row.categoriaId) { + budgetMap.set(row.categoriaId, safeToNumber(row.amount)); + } + } + + // Build category data from grouped results + const categoryMap = new Map< + string, + { + name: string; + icon: string | null; + current: number; + previous: number; + } + >(); + + for (const row of rows) { + const entry = categoryMap.get(row.categoryId) ?? { + name: row.categoryName, + icon: row.categoryIcon, + current: 0, + previous: 0, + }; - for (const row of previousPeriodRows) { const amount = Math.abs(safeToNumber(row.total)); - previousMap.set(row.categoryId, amount); - previousTotal += amount; + if (row.period === period) { + entry.current = amount; + } else { + entry.previous = amount; + } + categoryMap.set(row.categoryId, entry); } - // Calcula o total do período atual + // Calculate totals let currentTotal = 0; - for (const row of currentPeriodRows) { - currentTotal += Math.abs(safeToNumber(row.total)); + let previousTotal = 0; + for (const entry of categoryMap.values()) { + currentTotal += entry.current; + previousTotal += entry.previous; } - // Monta os dados de cada categoria - const categories: CategoryIncomeItem[] = currentPeriodRows.map((row) => { - const currentAmount = Math.abs(safeToNumber(row.total)); - const previousAmount = previousMap.get(row.categoryId) ?? 0; + // Build result + const categories: CategoryIncomeItem[] = []; + for (const [categoryId, entry] of categoryMap) { const percentageChange = calculatePercentageChange( - currentAmount, - previousAmount, + entry.current, + entry.previous, ); const percentageOfTotal = - currentTotal > 0 ? (currentAmount / currentTotal) * 100 : 0; + currentTotal > 0 ? (entry.current / currentTotal) * 100 : 0; - const budgetAmount = row.budgetAmount - ? safeToNumber(row.budgetAmount) - : null; + const budgetAmount = budgetMap.get(categoryId) ?? null; const budgetUsedPercentage = budgetAmount && budgetAmount > 0 - ? (currentAmount / budgetAmount) * 100 + ? (entry.current / budgetAmount) * 100 : null; - return { - categoryId: row.categoryId, - categoryName: row.categoryName, - categoryIcon: row.categoryIcon, - currentAmount, - previousAmount, + categories.push({ + categoryId, + categoryName: entry.name, + categoryIcon: entry.icon, + currentAmount: entry.current, + previousAmount: entry.previous, percentageChange, percentageOfTotal, budgetAmount, budgetUsedPercentage, - }; - }); + }); + } // Ordena por valor atual (maior para menor) categories.sort((a, b) => b.currentAmount - a.currentAmount); diff --git a/lib/dashboard/expenses/installment-expenses.ts b/lib/dashboard/expenses/installment-expenses.ts index 849933d..aef40a1 100644 --- a/lib/dashboard/expenses/installment-expenses.ts +++ b/lib/dashboard/expenses/installment-expenses.ts @@ -1,12 +1,12 @@ import { and, desc, eq, isNull, or, sql } from "drizzle-orm"; -import { lancamentos, pagadores } from "@/db/schema"; +import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type InstallmentExpense = { id: string; @@ -28,6 +28,11 @@ export async function fetchInstallmentExpenses( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { expenses: [] }; + } + const rows = await db .select({ id: lancamentos.id, @@ -41,7 +46,6 @@ export async function fetchInstallmentExpenses( period: lancamentos.period, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .where( and( eq(lancamentos.userId, userId), @@ -49,7 +53,7 @@ export async function fetchInstallmentExpenses( eq(lancamentos.transactionType, "Despesa"), eq(lancamentos.condition, "Parcelado"), eq(lancamentos.isAnticipated, false), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), or( isNull(lancamentos.note), and( diff --git a/lib/dashboard/expenses/recurring-expenses.ts b/lib/dashboard/expenses/recurring-expenses.ts index 63486a1..2a4c6b9 100644 --- a/lib/dashboard/expenses/recurring-expenses.ts +++ b/lib/dashboard/expenses/recurring-expenses.ts @@ -1,12 +1,12 @@ import { and, desc, eq, isNull, or, sql } from "drizzle-orm"; -import { lancamentos, pagadores } from "@/db/schema"; +import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type RecurringExpense = { id: string; @@ -24,6 +24,11 @@ export async function fetchRecurringExpenses( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { expenses: [] }; + } + const results = await db .select({ id: lancamentos.id, @@ -33,14 +38,13 @@ export async function fetchRecurringExpenses( recurrenceCount: lancamentos.recurrenceCount, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .where( and( eq(lancamentos.userId, userId), eq(lancamentos.period, period), eq(lancamentos.transactionType, "Despesa"), eq(lancamentos.condition, "Recorrente"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), or( isNull(lancamentos.note), and( diff --git a/lib/dashboard/expenses/top-expenses.ts b/lib/dashboard/expenses/top-expenses.ts index d722b78..9176861 100644 --- a/lib/dashboard/expenses/top-expenses.ts +++ b/lib/dashboard/expenses/top-expenses.ts @@ -1,12 +1,12 @@ import { and, asc, eq, isNull, or, sql } from "drizzle-orm"; -import { cartoes, contas, lancamentos, pagadores } from "@/db/schema"; +import { cartoes, contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type TopExpense = { id: string; @@ -26,11 +26,16 @@ export async function fetchTopExpenses( period: string, cardOnly: boolean = false, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { expenses: [] }; + } + const conditions = [ eq(lancamentos.userId, userId), eq(lancamentos.period, period), eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), or( isNull(lancamentos.note), and( @@ -60,7 +65,6 @@ export async function fetchTopExpenses( accountLogo: contas.logo, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id)) .leftJoin(contas, eq(lancamentos.contaId, contas.id)) .where(and(...conditions)) diff --git a/lib/dashboard/fetch-dashboard-data.ts b/lib/dashboard/fetch-dashboard-data.ts index 27664b7..c66fbb0 100644 --- a/lib/dashboard/fetch-dashboard-data.ts +++ b/lib/dashboard/fetch-dashboard-data.ts @@ -1,3 +1,4 @@ +import { unstable_cache } from "next/cache"; import { fetchDashboardAccounts } from "./accounts"; import { fetchDashboardBoletos } from "./boletos"; import { fetchExpensesByCategory } from "./categories/expenses-by-category"; @@ -17,7 +18,7 @@ import { fetchPurchasesByCategory } from "./purchases-by-category"; import { fetchRecentTransactions } from "./recent-transactions"; import { fetchTopEstablishments } from "./top-establishments"; -export async function fetchDashboardData(userId: string, period: string) { +async function fetchDashboardDataInternal(userId: string, period: string) { const [ metrics, accountsSnapshot, @@ -83,4 +84,20 @@ export async function fetchDashboardData(userId: string, period: string) { }; } +/** + * Cached dashboard data fetcher. + * Uses unstable_cache with tags for revalidation on mutations. + * Cache is keyed by userId + period, and invalidated via "dashboard" tag. + */ +export function fetchDashboardData(userId: string, period: string) { + return unstable_cache( + () => fetchDashboardDataInternal(userId, period), + [`dashboard-${userId}-${period}`], + { + tags: ["dashboard", `dashboard-${userId}`], + revalidate: 120, + }, + )(); +} + export type DashboardData = Awaited>; diff --git a/lib/dashboard/income-expense-balance.ts b/lib/dashboard/income-expense-balance.ts index 0de36e6..8c4fd29 100644 --- a/lib/dashboard/income-expense-balance.ts +++ b/lib/dashboard/income-expense-balance.ts @@ -1,11 +1,12 @@ -import { and, eq, isNull, ne, or, sql } from "drizzle-orm"; -import { contas, lancamentos, pagadores } from "@/db/schema"; +import { and, eq, inArray, isNull, ne, or, sql } from "drizzle-orm"; +import { contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type MonthData = { month: string; @@ -66,83 +67,67 @@ export async function fetchIncomeExpenseBalance( userId: string, currentPeriod: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { months: [] }; + } + const periods = generateLast6Months(currentPeriod); - const results = await Promise.all( - periods.map(async (period) => { - // Busca receitas do período - const [incomeRow] = await db - .select({ - total: sql` - coalesce( - sum(${lancamentos.amount}), - 0 - ) - `, - }) - .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .leftJoin(contas, eq(lancamentos.contaId, contas.id)) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.period, period), - eq(lancamentos.transactionType, "Receita"), - eq(pagadores.role, "admin"), - sql`(${lancamentos.note} IS NULL OR ${ - lancamentos.note - } NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`})`, - // Excluir saldos iniciais se a conta tiver o flag ativo - or( - ne(lancamentos.note, INITIAL_BALANCE_NOTE), - isNull(contas.excludeInitialBalanceFromIncome), - eq(contas.excludeInitialBalanceFromIncome, false), - ), - ), - ); + // Single query: GROUP BY period + transactionType instead of 12 separate queries + const rows = await db + .select({ + period: lancamentos.period, + transactionType: lancamentos.transactionType, + total: sql`coalesce(sum(${lancamentos.amount}), 0)`, + }) + .from(lancamentos) + .leftJoin(contas, eq(lancamentos.contaId, contas.id)) + .where( + and( + eq(lancamentos.userId, userId), + eq(lancamentos.pagadorId, adminPagadorId), + inArray(lancamentos.period, periods), + inArray(lancamentos.transactionType, ["Receita", "Despesa"]), + sql`(${lancamentos.note} IS NULL OR ${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`})`, + // Excluir saldos iniciais se a conta tiver o flag ativo + or( + ne(lancamentos.note, INITIAL_BALANCE_NOTE), + isNull(contas.excludeInitialBalanceFromIncome), + eq(contas.excludeInitialBalanceFromIncome, false), + ), + ), + ) + .groupBy(lancamentos.period, lancamentos.transactionType); - // Busca despesas do período - const [expenseRow] = await db - .select({ - total: sql` - coalesce( - sum(${lancamentos.amount}), - 0 - ) - `, - }) - .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.period, period), - eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, "admin"), - sql`(${lancamentos.note} IS NULL OR ${ - lancamentos.note - } NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`})`, - ), - ); + // Build lookup from query results + const dataMap = new Map(); + for (const row of rows) { + if (!row.period) continue; + const entry = dataMap.get(row.period) ?? { income: 0, expense: 0 }; + const total = Math.abs(toNumber(row.total)); + if (row.transactionType === "Receita") { + entry.income = total; + } else if (row.transactionType === "Despesa") { + entry.expense = total; + } + dataMap.set(row.period, entry); + } - const income = Math.abs(toNumber(incomeRow?.total)); - const expense = Math.abs(toNumber(expenseRow?.total)); - const balance = income - expense; + // Build result array preserving period order + const months = periods.map((period) => { + const entry = dataMap.get(period) ?? { income: 0, expense: 0 }; + const [, monthPart] = period.split("-"); + const monthLabel = MONTH_LABELS[monthPart ?? "01"] ?? monthPart; - const [, monthPart] = period.split("-"); - const monthLabel = MONTH_LABELS[monthPart ?? "01"] ?? monthPart; + return { + month: period, + monthLabel: monthLabel ?? "", + income: entry.income, + expense: entry.expense, + balance: entry.income - entry.expense, + }; + }); - return { - month: period, - monthLabel: monthLabel ?? "", - income, - expense, - balance, - }; - }), - ); - - return { - months: results, - }; + return { months }; } diff --git a/lib/dashboard/metrics.ts b/lib/dashboard/metrics.ts index 77afe6e..28e1ec9 100644 --- a/lib/dashboard/metrics.ts +++ b/lib/dashboard/metrics.ts @@ -2,6 +2,7 @@ import { and, asc, eq, + gte, ilike, isNull, lte, @@ -10,15 +11,16 @@ import { or, sum, } from "drizzle-orm"; -import { contas, lancamentos, pagadores } from "@/db/schema"; +import { contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; import { safeToNumber } from "@/lib/utils/number"; import { + addMonthsToPeriod, buildPeriodRange, comparePeriods, getPreviousPeriod, @@ -80,6 +82,21 @@ export async function fetchDashboardCardMetrics( ): Promise { const previousPeriod = getPreviousPeriod(period); + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { + period, + previousPeriod, + receitas: { current: 0, previous: 0 }, + despesas: { current: 0, previous: 0 }, + balanco: { current: 0, previous: 0 }, + previsto: { current: 0, previous: 0 }, + }; + } + + // Limitar scan histórico a 24 meses para evitar scans progressivamente mais lentos + const startPeriod = addMonthsToPeriod(period, -24); + const rows = await db .select({ period: lancamentos.period, @@ -87,13 +104,13 @@ export async function fetchDashboardCardMetrics( totalAmount: sum(lancamentos.amount).as("total"), }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .leftJoin(contas, eq(lancamentos.contaId, contas.id)) .where( and( eq(lancamentos.userId, userId), + eq(lancamentos.pagadorId, adminPagadorId), + gte(lancamentos.period, startPeriod), lte(lancamentos.period, period), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), ne(lancamentos.transactionType, TRANSFERENCIA), or( isNull(lancamentos.note), @@ -129,12 +146,12 @@ export async function fetchDashboardCardMetrics( const earliestPeriod = periodTotals.size > 0 ? Array.from(periodTotals.keys()).sort()[0] : period; - const startPeriod = + const startRangePeriod = comparePeriods(earliestPeriod, previousPeriod) <= 0 ? earliestPeriod : previousPeriod; - const periodRange = buildPeriodRange(startPeriod, period); + const periodRange = buildPeriodRange(startRangePeriod, period); const forecastByPeriod = new Map(); let runningForecast = 0; diff --git a/lib/dashboard/notifications.ts b/lib/dashboard/notifications.ts index be7af51..02c1eef 100644 --- a/lib/dashboard/notifications.ts +++ b/lib/dashboard/notifications.ts @@ -1,9 +1,10 @@ "use server"; import { and, eq, lt, sql } from "drizzle-orm"; -import { cartoes, faturas, lancamentos, pagadores } from "@/db/schema"; +import { cartoes, faturas, lancamentos } from "@/db/schema"; import { db } from "@/lib/db"; import { INVOICE_PAYMENT_STATUS } from "@/lib/faturas"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type NotificationType = "overdue" | "due_soon"; @@ -138,6 +139,8 @@ export async function fetchDashboardNotifications( const today = normalizeDate(new Date()); const DAYS_THRESHOLD = 5; + const adminPagadorId = await getAdminPagadorId(userId); + // Buscar faturas pendentes de períodos anteriores // Apenas faturas com registro na tabela (períodos antigos devem ter sido finalizados) const overdueInvoices = await db @@ -210,7 +213,17 @@ export async function fetchDashboardNotifications( faturas.paymentStatus, ); - // Buscar boletos não pagos + // Buscar boletos não pagos (usando pagadorId direto ao invés de JOIN) + const boletosConditions = [ + eq(lancamentos.userId, userId), + eq(lancamentos.paymentMethod, PAYMENT_METHOD_BOLETO), + eq(lancamentos.isSettled, false), + ]; + + if (adminPagadorId) { + boletosConditions.push(eq(lancamentos.pagadorId, adminPagadorId)); + } + const boletosRows = await db .select({ id: lancamentos.id, @@ -220,15 +233,7 @@ export async function fetchDashboardNotifications( period: lancamentos.period, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.paymentMethod, PAYMENT_METHOD_BOLETO), - eq(lancamentos.isSettled, false), - eq(pagadores.role, "admin"), - ), - ); + .where(and(...boletosConditions)); const notifications: DashboardNotification[] = []; diff --git a/lib/dashboard/payments/payment-conditions.ts b/lib/dashboard/payments/payment-conditions.ts index b6926b0..6d0e784 100644 --- a/lib/dashboard/payments/payment-conditions.ts +++ b/lib/dashboard/payments/payment-conditions.ts @@ -1,12 +1,12 @@ import { and, eq, isNull, or, sql } from "drizzle-orm"; -import { lancamentos, pagadores } from "@/db/schema"; +import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type PaymentConditionSummary = { condition: string; @@ -23,6 +23,11 @@ export async function fetchPaymentConditions( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { conditions: [] }; + } + const rows = await db .select({ condition: lancamentos.condition, @@ -30,13 +35,12 @@ export async function fetchPaymentConditions( transactions: sql`count(${lancamentos.id})`, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .where( and( eq(lancamentos.userId, userId), eq(lancamentos.period, period), eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), or( isNull(lancamentos.note), and( diff --git a/lib/dashboard/payments/payment-methods.ts b/lib/dashboard/payments/payment-methods.ts index f000c7a..4ebcf4c 100644 --- a/lib/dashboard/payments/payment-methods.ts +++ b/lib/dashboard/payments/payment-methods.ts @@ -1,12 +1,12 @@ import { and, eq, isNull, or, sql } from "drizzle-orm"; -import { lancamentos, pagadores } from "@/db/schema"; +import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type PaymentMethodSummary = { paymentMethod: string; @@ -23,6 +23,11 @@ export async function fetchPaymentMethods( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { methods: [] }; + } + const rows = await db .select({ paymentMethod: lancamentos.paymentMethod, @@ -30,13 +35,12 @@ export async function fetchPaymentMethods( transactions: sql`count(${lancamentos.id})`, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .where( and( eq(lancamentos.userId, userId), eq(lancamentos.period, period), eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), or( isNull(lancamentos.note), and( diff --git a/lib/dashboard/payments/payment-status.ts b/lib/dashboard/payments/payment-status.ts index 8b079cc..32542d3 100644 --- a/lib/dashboard/payments/payment-status.ts +++ b/lib/dashboard/payments/payment-status.ts @@ -1,8 +1,9 @@ -import { and, eq, sql } from "drizzle-orm"; -import { lancamentos, pagadores } from "@/db/schema"; +import { and, eq, inArray, sql } from "drizzle-orm"; +import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type PaymentStatusCategory = { total: number; @@ -15,106 +16,67 @@ export type PaymentStatusData = { expenses: PaymentStatusCategory; }; +const emptyCategory = (): PaymentStatusCategory => ({ + total: 0, + confirmed: 0, + pending: 0, +}); + export async function fetchPaymentStatus( userId: string, period: string, ): Promise { - // Busca receitas confirmadas e pendentes para o período do pagador admin - // Exclui lançamentos de pagamento de fatura (para evitar contagem duplicada) - const incomeResult = await db + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { income: emptyCategory(), expenses: emptyCategory() }; + } + + // Single query: GROUP BY transactionType instead of 2 separate queries + const rows = await db .select({ + transactionType: lancamentos.transactionType, confirmed: sql` - coalesce( - sum( - case - when ${lancamentos.isSettled} = true then ${lancamentos.amount} - else 0 - end - ), - 0 - ) - `, + coalesce( + sum(case when ${lancamentos.isSettled} = true then ${lancamentos.amount} else 0 end), + 0 + ) + `, pending: sql` - coalesce( - sum( - case - when ${lancamentos.isSettled} = false or ${lancamentos.isSettled} is null then ${lancamentos.amount} - else 0 - end - ), - 0 - ) - `, + coalesce( + sum(case when ${lancamentos.isSettled} = false or ${lancamentos.isSettled} is null then ${lancamentos.amount} else 0 end), + 0 + ) + `, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .where( and( eq(lancamentos.userId, userId), eq(lancamentos.period, period), - eq(lancamentos.transactionType, "Receita"), - eq(pagadores.role, "admin"), + eq(lancamentos.pagadorId, adminPagadorId), + inArray(lancamentos.transactionType, ["Receita", "Despesa"]), sql`(${lancamentos.note} IS NULL OR ${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`})`, ), - ); + ) + .groupBy(lancamentos.transactionType); - // Busca despesas confirmadas e pendentes para o período do pagador admin - // Exclui lançamentos de pagamento de fatura (para evitar contagem duplicada) - const expensesResult = await db - .select({ - confirmed: sql` - coalesce( - sum( - case - when ${lancamentos.isSettled} = true then ${lancamentos.amount} - else 0 - end - ), - 0 - ) - `, - pending: sql` - coalesce( - sum( - case - when ${lancamentos.isSettled} = false or ${lancamentos.isSettled} is null then ${lancamentos.amount} - else 0 - end - ), - 0 - ) - `, - }) - .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) - .where( - and( - eq(lancamentos.userId, userId), - eq(lancamentos.period, period), - eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, "admin"), - sql`(${lancamentos.note} IS NULL OR ${lancamentos.note} NOT LIKE ${`${ACCOUNT_AUTO_INVOICE_NOTE_PREFIX}%`})`, - ), - ); + const result = { income: emptyCategory(), expenses: emptyCategory() }; - const incomeData = incomeResult[0] ?? { confirmed: 0, pending: 0 }; - const confirmedIncome = toNumber(incomeData.confirmed); - const pendingIncome = toNumber(incomeData.pending); + for (const row of rows) { + const confirmed = toNumber(row.confirmed); + const pending = toNumber(row.pending); + const category = { + total: confirmed + pending, + confirmed, + pending, + }; - const expensesData = expensesResult[0] ?? { confirmed: 0, pending: 0 }; - const confirmedExpenses = toNumber(expensesData.confirmed); - const pendingExpenses = toNumber(expensesData.pending); + if (row.transactionType === "Receita") { + result.income = category; + } else if (row.transactionType === "Despesa") { + result.expenses = category; + } + } - return { - income: { - total: confirmedIncome + pendingIncome, - confirmed: confirmedIncome, - pending: pendingIncome, - }, - expenses: { - total: confirmedExpenses + pendingExpenses, - confirmed: confirmedExpenses, - pending: pendingExpenses, - }, - }; + return result; } diff --git a/lib/dashboard/purchases-by-category.ts b/lib/dashboard/purchases-by-category.ts index 9f6cb31..5892b7d 100644 --- a/lib/dashboard/purchases-by-category.ts +++ b/lib/dashboard/purchases-by-category.ts @@ -1,18 +1,12 @@ import { and, desc, eq, inArray, isNull, or, sql } from "drizzle-orm"; -import { - cartoes, - categorias, - contas, - lancamentos, - pagadores, -} from "@/db/schema"; +import { cartoes, categorias, contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type CategoryOption = { id: string; @@ -51,6 +45,11 @@ export async function fetchPurchasesByCategory( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { categories: [], transactionsByCategory: {} }; + } + const transactionsRows = await db .select({ id: lancamentos.id, @@ -64,7 +63,6 @@ export async function fetchPurchasesByCategory( accountLogo: contas.logo, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .innerJoin(categorias, eq(lancamentos.categoriaId, categorias.id)) .leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id)) .leftJoin(contas, eq(lancamentos.contaId, contas.id)) @@ -72,7 +70,7 @@ export async function fetchPurchasesByCategory( and( eq(lancamentos.userId, userId), eq(lancamentos.period, period), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), inArray(categorias.type, ["despesa", "receita"]), or( isNull(lancamentos.note), diff --git a/lib/dashboard/recent-transactions.ts b/lib/dashboard/recent-transactions.ts index 11165aa..29bb8df 100644 --- a/lib/dashboard/recent-transactions.ts +++ b/lib/dashboard/recent-transactions.ts @@ -1,12 +1,12 @@ import { and, desc, eq, isNull, or, sql } from "drizzle-orm"; -import { cartoes, contas, lancamentos, pagadores } from "@/db/schema"; +import { cartoes, contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type RecentTransaction = { id: string; @@ -25,6 +25,11 @@ export async function fetchRecentTransactions( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { transactions: [] }; + } + const results = await db .select({ id: lancamentos.id, @@ -36,7 +41,6 @@ export async function fetchRecentTransactions( note: lancamentos.note, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id)) .leftJoin(contas, eq(lancamentos.contaId, contas.id)) .where( @@ -44,7 +48,7 @@ export async function fetchRecentTransactions( eq(lancamentos.userId, userId), eq(lancamentos.period, period), eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), or( isNull(lancamentos.note), and( diff --git a/lib/dashboard/top-establishments.ts b/lib/dashboard/top-establishments.ts index c87957e..69fd1ac 100644 --- a/lib/dashboard/top-establishments.ts +++ b/lib/dashboard/top-establishments.ts @@ -1,12 +1,12 @@ import { and, eq, isNull, or, sql } from "drizzle-orm"; -import { cartoes, contas, lancamentos, pagadores } from "@/db/schema"; +import { cartoes, contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, } from "@/lib/accounts/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; -import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; +import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; export type TopEstablishment = { id: string; @@ -38,6 +38,11 @@ export async function fetchTopEstablishments( userId: string, period: string, ): Promise { + const adminPagadorId = await getAdminPagadorId(userId); + if (!adminPagadorId) { + return { establishments: [] }; + } + const rows = await db .select({ name: lancamentos.name, @@ -46,7 +51,6 @@ export async function fetchTopEstablishments( logo: sql`max(coalesce(${cartoes.logo}, ${contas.logo}))`, }) .from(lancamentos) - .innerJoin(pagadores, eq(lancamentos.pagadorId, pagadores.id)) .leftJoin(cartoes, eq(lancamentos.cartaoId, cartoes.id)) .leftJoin(contas, eq(lancamentos.contaId, contas.id)) .where( @@ -54,7 +58,7 @@ export async function fetchTopEstablishments( eq(lancamentos.userId, userId), eq(lancamentos.period, period), eq(lancamentos.transactionType, "Despesa"), - eq(pagadores.role, PAGADOR_ROLE_ADMIN), + eq(lancamentos.pagadorId, adminPagadorId), or( isNull(lancamentos.note), and( diff --git a/lib/pagadores/get-admin-id.ts b/lib/pagadores/get-admin-id.ts new file mode 100644 index 0000000..f858dcb --- /dev/null +++ b/lib/pagadores/get-admin-id.ts @@ -0,0 +1,25 @@ +import { and, eq } from "drizzle-orm"; +import { cache } from "react"; +import { pagadores } from "@/db/schema"; +import { db } from "@/lib/db"; +import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; + +/** + * Returns the admin pagador ID for a user (cached per request via React.cache). + * Eliminates the need for JOIN with pagadores in ~20 dashboard queries. + */ +export const getAdminPagadorId = cache( + async (userId: string): Promise => { + const [row] = await db + .select({ id: pagadores.id }) + .from(pagadores) + .where( + and( + eq(pagadores.userId, userId), + eq(pagadores.role, PAGADOR_ROLE_ADMIN), + ), + ) + .limit(1); + return row?.id ?? null; + }, +); diff --git a/package.json b/package.json index 755061c..545ea62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opensheets", - "version": "1.2.6", + "version": "1.3.0", "private": true, "scripts": { "dev": "next dev --turbopack", @@ -27,8 +27,8 @@ "docker:rebuild": "docker compose up --build --force-recreate" }, "dependencies": { - "@ai-sdk/anthropic": "^3.0.35", - "@ai-sdk/google": "^3.0.20", + "@ai-sdk/anthropic": "^3.0.37", + "@ai-sdk/google": "^3.0.21", "@ai-sdk/openai": "^3.0.25", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", @@ -59,7 +59,7 @@ "@tanstack/react-table": "8.21.3", "@vercel/analytics": "^1.6.1", "@vercel/speed-insights": "^1.3.1", - "ai": "^6.0.67", + "ai": "^6.0.73", "babel-plugin-react-compiler": "^1.0.0", "better-auth": "1.4.18", "class-variance-authority": "0.7.1", @@ -67,7 +67,7 @@ "cmdk": "^1.1.1", "date-fns": "^4.1.0", "drizzle-orm": "0.45.1", - "jspdf": "^4.0.0", + "jspdf": "^4.1.0", "jspdf-autotable": "^5.0.7", "next": "16.1.6", "next-themes": "0.4.6", @@ -84,13 +84,13 @@ "zod": "4.3.6" }, "devDependencies": { - "@biomejs/biome": "2.3.13", + "@biomejs/biome": "2.3.14", "@tailwindcss/postcss": "4.1.18", - "@types/node": "25.1.0", + "@types/node": "25.2.1", "@types/pg": "^8.16.0", - "@types/react": "19.2.10", + "@types/react": "19.2.13", "@types/react-dom": "19.2.3", - "dotenv": "^17.2.3", + "dotenv": "^17.2.4", "drizzle-kit": "0.31.8", "tailwindcss": "4.1.18", "tsx": "4.21.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d92c763..6c73898 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@ai-sdk/anthropic': - specifier: ^3.0.35 - version: 3.0.35(zod@4.3.6) + specifier: ^3.0.37 + version: 3.0.37(zod@4.3.6) '@ai-sdk/google': - specifier: ^3.0.20 - version: 3.0.20(zod@4.3.6) + specifier: ^3.0.21 + version: 3.0.21(zod@4.3.6) '@ai-sdk/openai': specifier: ^3.0.25 version: 3.0.25(zod@4.3.6) @@ -28,70 +28,70 @@ importers: version: 3.2.2(react@19.2.4) '@openrouter/ai-sdk-provider': specifier: ^2.1.1 - version: 2.1.1(ai@6.0.67(zod@4.3.6))(zod@4.3.6) + version: 2.1.1(ai@6.0.73(zod@4.3.6))(zod@4.3.6) '@radix-ui/react-accordion': specifier: ^1.2.12 - version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-alert-dialog': specifier: 1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-avatar': specifier: 1.1.11 - version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-checkbox': specifier: 1.3.3 - version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-collapsible': specifier: 1.1.12 - version: 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-dialog': specifier: 1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-dropdown-menu': specifier: 2.1.16 - version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-hover-card': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-label': specifier: 2.1.8 - version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-popover': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-progress': specifier: 1.1.8 - version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-radio-group': specifier: ^1.3.8 - version: 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-scroll-area': specifier: ^1.2.10 - version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-select': specifier: 2.2.6 - version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-separator': specifier: 1.1.8 - version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-slot': specifier: 1.2.4 - version: 1.2.4(@types/react@19.2.10)(react@19.2.4) + version: 1.2.4(@types/react@19.2.13)(react@19.2.4) '@radix-ui/react-switch': specifier: 1.2.6 - version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-tabs': specifier: 1.1.13 - version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-toggle': specifier: 1.1.10 - version: 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-toggle-group': specifier: 1.1.11 - version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-tooltip': specifier: 1.2.8 - version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@remixicon/react': specifier: 4.9.0 version: 4.9.0(react@19.2.4) @@ -105,8 +105,8 @@ importers: specifier: ^1.3.1 version: 1.3.1(next@16.1.6(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) ai: - specifier: ^6.0.67 - version: 6.0.67(zod@4.3.6) + specifier: ^6.0.73 + version: 6.0.73(zod@4.3.6) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -121,7 +121,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -129,11 +129,11 @@ importers: specifier: 0.45.1 version: 0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.16.0)(kysely@0.28.11)(pg@8.18.0) jspdf: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^4.1.0 + version: 4.1.0 jspdf-autotable: specifier: ^5.0.7 - version: 5.0.7(jspdf@4.0.0) + version: 5.0.7(jspdf@4.1.0) next: specifier: 16.1.6 version: 16.1.6(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -154,7 +154,7 @@ importers: version: 19.2.4(react@19.2.4) recharts: specifier: 3.7.0 - version: 3.7.0(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4)(redux@5.0.1) + version: 3.7.0(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4)(redux@5.0.1) resend: specifier: ^6.9.1 version: 6.9.1 @@ -166,7 +166,7 @@ importers: version: 3.4.0 vaul: specifier: 1.1.2 - version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) xlsx: specifier: ^0.18.5 version: 0.18.5 @@ -175,26 +175,26 @@ importers: version: 4.3.6 devDependencies: '@biomejs/biome': - specifier: 2.3.13 - version: 2.3.13 + specifier: 2.3.14 + version: 2.3.14 '@tailwindcss/postcss': specifier: 4.1.18 version: 4.1.18 '@types/node': - specifier: 25.1.0 - version: 25.1.0 + specifier: 25.2.1 + version: 25.2.1 '@types/pg': specifier: ^8.16.0 version: 8.16.0 '@types/react': - specifier: 19.2.10 - version: 19.2.10 + specifier: 19.2.13 + version: 19.2.13 '@types/react-dom': specifier: 19.2.3 - version: 19.2.3(@types/react@19.2.10) + version: 19.2.3(@types/react@19.2.13) dotenv: - specifier: ^17.2.3 - version: 17.2.3 + specifier: ^17.2.4 + version: 17.2.4 drizzle-kit: specifier: 0.31.8 version: 0.31.8 @@ -210,20 +210,20 @@ importers: packages: - '@ai-sdk/anthropic@3.0.35': - resolution: {integrity: sha512-Y3g/5uVj621XSB9lGF7WrD7qR+orhV5xpaYkRF8kfj2j4W7e7BBGIvxcdsCf85FjJbc6tKQdNTZ84ZEqT3Y5TQ==} + '@ai-sdk/anthropic@3.0.37': + resolution: {integrity: sha512-tEgcJPw+a6obbF+SHrEiZsx3DNxOHqeY8bK4IpiNsZ8YPZD141R34g3lEAaQnmNN5mGsEJ8SXoEDabuzi8wFJQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.32': - resolution: {integrity: sha512-7clZRr07P9rpur39t1RrbIe7x8jmwnwUWI8tZs+BvAfX3NFgdSVGGIaT7bTz2pb08jmLXzTSDbrOTqAQ7uBkBQ==} + '@ai-sdk/gateway@3.0.36': + resolution: {integrity: sha512-2r1Q6azvqMYxQ1hqfWZmWg4+8MajoldD/ty65XdhCaCoBfvDu7trcvxXDfTSU+3/wZ1JIDky46SWYFOHnTbsBw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@3.0.20': - resolution: {integrity: sha512-bVGsulEr6JiipAFlclo9bjL5WaUV0iCSiiekLt+PY6pwmtJeuU2GaD9DoE3OqR8LN2W779mU13IhVEzlTupf8g==} + '@ai-sdk/google@3.0.21': + resolution: {integrity: sha512-qQuvcbDqDPZojtoT45UFCQVH2w3m6KJKKjqJduUsvhN5ZqOXste0h4HgHK8hwGuDfv96Jr9QQEpspbgp6iu5Uw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -285,59 +285,59 @@ packages: '@better-fetch/fetch@1.1.21': resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==} - '@biomejs/biome@2.3.13': - resolution: {integrity: sha512-Fw7UsV0UAtWIBIm0M7g5CRerpu1eKyKAXIazzxhbXYUyMkwNrkX/KLkGI7b+uVDQ5cLUMfOC9vR60q9IDYDstA==} + '@biomejs/biome@2.3.14': + resolution: {integrity: sha512-QMT6QviX0WqXJCaiqVMiBUCr5WRQ1iFSjvOLoTk6auKukJMvnMzWucXpwZB0e8F00/1/BsS9DzcKgWH+CLqVuA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.13': - resolution: {integrity: sha512-0OCwP0/BoKzyJHnFdaTk/i7hIP9JHH9oJJq6hrSCPmJPo8JWcJhprK4gQlhFzrwdTBAW4Bjt/RmCf3ZZe59gwQ==} + '@biomejs/cli-darwin-arm64@2.3.14': + resolution: {integrity: sha512-UJGPpvWJMkLxSRtpCAKfKh41Q4JJXisvxZL8ChN1eNW3m/WlPFJ6EFDCE7YfUb4XS8ZFi3C1dFpxUJ0Ety5n+A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.13': - resolution: {integrity: sha512-AGr8OoemT/ejynbIu56qeil2+F2WLkIjn2d8jGK1JkchxnMUhYOfnqc9sVzcRxpG9Ycvw4weQ5sprRvtb7Yhcw==} + '@biomejs/cli-darwin-x64@2.3.14': + resolution: {integrity: sha512-PNkLNQG6RLo8lG7QoWe/hhnMxJIt1tEimoXpGQjwS/dkdNiKBLPv4RpeQl8o3s1OKI3ZOR5XPiYtmbGGHAOnLA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.13': - resolution: {integrity: sha512-TUdDCSY+Eo/EHjhJz7P2GnWwfqet+lFxBZzGHldrvULr59AgahamLs/N85SC4+bdF86EhqDuuw9rYLvLFWWlXA==} + '@biomejs/cli-linux-arm64-musl@2.3.14': + resolution: {integrity: sha512-LInRbXhYujtL3sH2TMCH/UBwJZsoGwfQjBrMfl84CD4hL/41C/EU5mldqf1yoFpsI0iPWuU83U+nB2TUUypWeg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.3.13': - resolution: {integrity: sha512-xvOiFkrDNu607MPMBUQ6huHmBG1PZLOrqhtK6pXJW3GjfVqJg0Z/qpTdhXfcqWdSZHcT+Nct2fOgewZvytESkw==} + '@biomejs/cli-linux-arm64@2.3.14': + resolution: {integrity: sha512-KT67FKfzIw6DNnUNdYlBg+eU24Go3n75GWK6NwU4+yJmDYFe9i/MjiI+U/iEzKvo0g7G7MZqoyrhIYuND2w8QQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.3.13': - resolution: {integrity: sha512-0bdwFVSbbM//Sds6OjtnmQGp4eUjOTt6kHvR/1P0ieR9GcTUAlPNvPC3DiavTqq302W34Ae2T6u5VVNGuQtGlQ==} + '@biomejs/cli-linux-x64-musl@2.3.14': + resolution: {integrity: sha512-KQU7EkbBBuHPW3/rAcoiVmhlPtDSGOGRPv9js7qJVpYTzjQmVR+C9Rfcz+ti8YCH+zT1J52tuBybtP4IodjxZQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.3.13': - resolution: {integrity: sha512-s+YsZlgiXNq8XkgHs6xdvKDFOj/bwTEevqEY6rC2I3cBHbxXYU1LOZstH3Ffw9hE5tE1sqT7U23C00MzkXztMw==} + '@biomejs/cli-linux-x64@2.3.14': + resolution: {integrity: sha512-ZsZzQsl9U+wxFrGGS4f6UxREUlgHwmEfu1IrXlgNFrNnd5Th6lIJr8KmSzu/+meSa9f4rzFrbEW9LBBA6ScoMA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.3.13': - resolution: {integrity: sha512-QweDxY89fq0VvrxME+wS/BXKmqMrOTZlN9SqQ79kQSIc3FrEwvW/PvUegQF6XIVaekncDykB5dzPqjbwSKs9DA==} + '@biomejs/cli-win32-arm64@2.3.14': + resolution: {integrity: sha512-+IKYkj/pUBbnRf1G1+RlyA3LWiDgra1xpS7H2g4BuOzzRbRB+hmlw0yFsLprHhbbt7jUzbzAbAjK/Pn0FDnh1A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.13': - resolution: {integrity: sha512-trDw2ogdM2lyav9WFQsdsfdVy1dvZALymRpgmWsvSez0BJzBjulhOT/t+wyKeh3pZWvwP3VMs1SoOKwO3wecMQ==} + '@biomejs/cli-win32-x64@2.3.14': + resolution: {integrity: sha512-oizCjdyQ3WJEswpb3Chdngeat56rIdSYK12JI3iI11Mt5T5EXcZ7WLuowzEaFPNJ3zmOQFliMN8QY1Pi+qsfdQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -387,8 +387,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -405,8 +405,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -423,8 +423,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -441,8 +441,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -459,8 +459,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -477,8 +477,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -495,8 +495,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -513,8 +513,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -531,8 +531,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -549,8 +549,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -567,8 +567,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -585,8 +585,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -603,8 +603,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -621,8 +621,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -639,8 +639,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -657,8 +657,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -675,8 +675,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -687,8 +687,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -705,8 +705,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -717,8 +717,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -735,8 +735,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -747,8 +747,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -765,8 +765,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -783,8 +783,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -801,8 +801,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -819,8 +819,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1822,8 +1822,8 @@ packages: '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - '@types/node@25.1.0': - resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} + '@types/node@25.2.1': + resolution: {integrity: sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==} '@types/pako@2.0.4': resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} @@ -1839,8 +1839,8 @@ packages: peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.10': - resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + '@types/react@19.2.13': + resolution: {integrity: sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1908,8 +1908,8 @@ packages: resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} engines: {node: '>=0.8'} - ai@6.0.67: - resolution: {integrity: sha512-xBnTcByHCj3OcG6V8G1s6zvSEqK0Bdiu+IEXYcpGrve1iGFFRgcrKeZtr/WAW/7gupnSvBbDF24BEv1OOfqi1g==} + ai@6.0.73: + resolution: {integrity: sha512-p2/ICXIjAM4+bIFHEkAB+l58zq+aTmxAkotsb6doNt/CEms72zt6gxv2ky1fQDwU4ecMOcmMh78VJUSEKECzlg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2002,8 +2002,8 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - caniuse-lite@1.0.30001766: - resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} + caniuse-lite@1.0.30001769: + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} canvg@3.0.11: resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} @@ -2139,8 +2139,8 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + dotenv@17.2.4: + resolution: {integrity: sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==} engines: {node: '>=12'} drizzle-kit@0.31.8: @@ -2243,8 +2243,8 @@ packages: resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} engines: {node: '>=8.10.0'} - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -2269,8 +2269,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true @@ -2303,8 +2303,8 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-tsconfig@4.13.1: - resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} + get-tsconfig@4.13.5: + resolution: {integrity: sha512-v4/4xAEpBRp6SvCkWhnGCaLkJf9IwWzrsygJPxD/+p2/xPE3C5m2fA9FD0Ry9tG+Rqqq3gBzHSl6y1/T9V/tMQ==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2360,8 +2360,8 @@ packages: peerDependencies: jspdf: ^2 || ^3 || ^4 - jspdf@4.0.0: - resolution: {integrity: sha512-w12U97Z6edKd2tXDn3LzTLg7C7QLJlx0BPfM3ecjK2BckUl9/81vZ+r5gK4/3KQdhAcEZhENUxRhtgYBj75MqQ==} + jspdf@4.1.0: + resolution: {integrity: sha512-xd1d/XRkwqnsq6FP3zH1Q+Ejqn2ULIJeDZ+FTKpaabVpZREjsJKRJwuokTNgdqOU+fl55KgbvgZ1pRTSWCP2kQ==} kysely@0.28.11: resolution: {integrity: sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg==} @@ -2695,8 +2695,8 @@ packages: selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true @@ -2861,20 +2861,20 @@ packages: snapshots: - '@ai-sdk/anthropic@3.0.35(zod@4.3.6)': + '@ai-sdk/anthropic@3.0.37(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/gateway@3.0.32(zod@4.3.6)': + '@ai-sdk/gateway@3.0.36(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.3.6) '@vercel/oidc': 3.1.0 zod: 4.3.6 - '@ai-sdk/google@3.0.20(zod@4.3.6)': + '@ai-sdk/google@3.0.21(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.3.6) @@ -2931,39 +2931,39 @@ snapshots: '@better-fetch/fetch@1.1.21': {} - '@biomejs/biome@2.3.13': + '@biomejs/biome@2.3.14': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.13 - '@biomejs/cli-darwin-x64': 2.3.13 - '@biomejs/cli-linux-arm64': 2.3.13 - '@biomejs/cli-linux-arm64-musl': 2.3.13 - '@biomejs/cli-linux-x64': 2.3.13 - '@biomejs/cli-linux-x64-musl': 2.3.13 - '@biomejs/cli-win32-arm64': 2.3.13 - '@biomejs/cli-win32-x64': 2.3.13 + '@biomejs/cli-darwin-arm64': 2.3.14 + '@biomejs/cli-darwin-x64': 2.3.14 + '@biomejs/cli-linux-arm64': 2.3.14 + '@biomejs/cli-linux-arm64-musl': 2.3.14 + '@biomejs/cli-linux-x64': 2.3.14 + '@biomejs/cli-linux-x64-musl': 2.3.14 + '@biomejs/cli-win32-arm64': 2.3.14 + '@biomejs/cli-win32-x64': 2.3.14 - '@biomejs/cli-darwin-arm64@2.3.13': + '@biomejs/cli-darwin-arm64@2.3.14': optional: true - '@biomejs/cli-darwin-x64@2.3.13': + '@biomejs/cli-darwin-x64@2.3.14': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.13': + '@biomejs/cli-linux-arm64-musl@2.3.14': optional: true - '@biomejs/cli-linux-arm64@2.3.13': + '@biomejs/cli-linux-arm64@2.3.14': optional: true - '@biomejs/cli-linux-x64-musl@2.3.13': + '@biomejs/cli-linux-x64-musl@2.3.14': optional: true - '@biomejs/cli-linux-x64@2.3.13': + '@biomejs/cli-linux-x64@2.3.14': optional: true - '@biomejs/cli-win32-arm64@2.3.13': + '@biomejs/cli-win32-arm64@2.3.14': optional: true - '@biomejs/cli-win32-x64@2.3.13': + '@biomejs/cli-win32-x64@2.3.14': optional: true '@date-fns/tz@1.4.1': {} @@ -3008,12 +3008,12 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.13.1 + get-tsconfig: 4.13.5 '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/aix-ppc64@0.27.2': + '@esbuild/aix-ppc64@0.27.3': optional: true '@esbuild/android-arm64@0.18.20': @@ -3022,7 +3022,7 @@ snapshots: '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm64@0.27.2': + '@esbuild/android-arm64@0.27.3': optional: true '@esbuild/android-arm@0.18.20': @@ -3031,7 +3031,7 @@ snapshots: '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.27.2': + '@esbuild/android-arm@0.27.3': optional: true '@esbuild/android-x64@0.18.20': @@ -3040,7 +3040,7 @@ snapshots: '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.27.2': + '@esbuild/android-x64@0.27.3': optional: true '@esbuild/darwin-arm64@0.18.20': @@ -3049,7 +3049,7 @@ snapshots: '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.27.2': + '@esbuild/darwin-arm64@0.27.3': optional: true '@esbuild/darwin-x64@0.18.20': @@ -3058,7 +3058,7 @@ snapshots: '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.27.2': + '@esbuild/darwin-x64@0.27.3': optional: true '@esbuild/freebsd-arm64@0.18.20': @@ -3067,7 +3067,7 @@ snapshots: '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.27.2': + '@esbuild/freebsd-arm64@0.27.3': optional: true '@esbuild/freebsd-x64@0.18.20': @@ -3076,7 +3076,7 @@ snapshots: '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.27.2': + '@esbuild/freebsd-x64@0.27.3': optional: true '@esbuild/linux-arm64@0.18.20': @@ -3085,7 +3085,7 @@ snapshots: '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.27.2': + '@esbuild/linux-arm64@0.27.3': optional: true '@esbuild/linux-arm@0.18.20': @@ -3094,7 +3094,7 @@ snapshots: '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.27.2': + '@esbuild/linux-arm@0.27.3': optional: true '@esbuild/linux-ia32@0.18.20': @@ -3103,7 +3103,7 @@ snapshots: '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.27.2': + '@esbuild/linux-ia32@0.27.3': optional: true '@esbuild/linux-loong64@0.18.20': @@ -3112,7 +3112,7 @@ snapshots: '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.27.2': + '@esbuild/linux-loong64@0.27.3': optional: true '@esbuild/linux-mips64el@0.18.20': @@ -3121,7 +3121,7 @@ snapshots: '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.27.2': + '@esbuild/linux-mips64el@0.27.3': optional: true '@esbuild/linux-ppc64@0.18.20': @@ -3130,7 +3130,7 @@ snapshots: '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.27.2': + '@esbuild/linux-ppc64@0.27.3': optional: true '@esbuild/linux-riscv64@0.18.20': @@ -3139,7 +3139,7 @@ snapshots: '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.27.2': + '@esbuild/linux-riscv64@0.27.3': optional: true '@esbuild/linux-s390x@0.18.20': @@ -3148,7 +3148,7 @@ snapshots: '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.27.2': + '@esbuild/linux-s390x@0.27.3': optional: true '@esbuild/linux-x64@0.18.20': @@ -3157,13 +3157,13 @@ snapshots: '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.27.2': + '@esbuild/linux-x64@0.27.3': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.27.2': + '@esbuild/netbsd-arm64@0.27.3': optional: true '@esbuild/netbsd-x64@0.18.20': @@ -3172,13 +3172,13 @@ snapshots: '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.27.2': + '@esbuild/netbsd-x64@0.27.3': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.27.2': + '@esbuild/openbsd-arm64@0.27.3': optional: true '@esbuild/openbsd-x64@0.18.20': @@ -3187,13 +3187,13 @@ snapshots: '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.27.2': + '@esbuild/openbsd-x64@0.27.3': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.27.2': + '@esbuild/openharmony-arm64@0.27.3': optional: true '@esbuild/sunos-x64@0.18.20': @@ -3202,7 +3202,7 @@ snapshots: '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.27.2': + '@esbuild/sunos-x64@0.27.3': optional: true '@esbuild/win32-arm64@0.18.20': @@ -3211,7 +3211,7 @@ snapshots: '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.27.2': + '@esbuild/win32-arm64@0.27.3': optional: true '@esbuild/win32-ia32@0.18.20': @@ -3220,7 +3220,7 @@ snapshots: '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-ia32@0.27.2': + '@esbuild/win32-ia32@0.27.3': optional: true '@esbuild/win32-x64@0.18.20': @@ -3229,7 +3229,7 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.27.2': + '@esbuild/win32-x64@0.27.3': optional: true '@floating-ui/core@1.7.4': @@ -3395,9 +3395,9 @@ snapshots: '@noble/hashes@2.0.1': {} - '@openrouter/ai-sdk-provider@2.1.1(ai@6.0.67(zod@4.3.6))(zod@4.3.6)': + '@openrouter/ai-sdk-provider@2.1.1(ai@6.0.73(zod@4.3.6))(zod@4.3.6)': dependencies: - ai: 6.0.67(zod@4.3.6) + ai: 6.0.73(zod@4.3.6) zod: 4.3.6 '@opentelemetry/api@1.9.0': {} @@ -3406,596 +3406,596 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-avatar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-avatar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-context@1.1.3(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-context@1.1.3(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) aria-hidden: 1.2.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) aria-hidden: 1.2.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) aria-hidden: 1.2.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.2.4) '@radix-ui/rect': 1.1.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-context': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) aria-hidden: 1.2.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@19.2.4)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) '@radix-ui/rect@1.1.1': {} - '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.10)(react@19.2.4)(redux@5.0.1))(react@19.2.4)': + '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.13)(react@19.2.4)(redux@5.0.1))(react@19.2.4)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 @@ -4005,7 +4005,7 @@ snapshots: reselect: 5.1.1 optionalDependencies: react: 19.2.4 - react-redux: 9.2.0(@types/react@19.2.10)(react@19.2.4)(redux@5.0.1) + react-redux: 9.2.0(@types/react@19.2.13)(react@19.2.4)(redux@5.0.1) '@remixicon/react@4.9.0(react@19.2.4)': dependencies: @@ -4029,7 +4029,7 @@ snapshots: '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 jiti: 2.6.1 lightningcss: 1.30.2 magic-string: 0.30.21 @@ -4127,7 +4127,7 @@ snapshots: '@types/d3-timer@3.0.2': {} - '@types/node@25.1.0': + '@types/node@25.2.1': dependencies: undici-types: 7.16.0 @@ -4135,18 +4135,18 @@ snapshots: '@types/pg@8.16.0': dependencies: - '@types/node': 25.1.0 + '@types/node': 25.2.1 pg-protocol: 1.11.0 pg-types: 2.2.0 '@types/raf@3.4.3': optional: true - '@types/react-dom@19.2.3(@types/react@19.2.10)': + '@types/react-dom@19.2.3(@types/react@19.2.13)': dependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - '@types/react@19.2.10': + '@types/react@19.2.13': dependencies: csstype: 3.2.3 @@ -4175,9 +4175,9 @@ snapshots: adler-32@1.3.1: {} - ai@6.0.67(zod@4.3.6): + ai@6.0.73(zod@4.3.6): dependencies: - '@ai-sdk/gateway': 3.0.32(zod@4.3.6) + '@ai-sdk/gateway': 3.0.36(zod@4.3.6) '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.3.6) '@opentelemetry/api': 1.9.0 @@ -4229,7 +4229,7 @@ snapshots: buffer-from@1.1.2: {} - caniuse-lite@1.0.30001766: {} + caniuse-lite@1.0.30001769: {} canvg@3.0.11: dependencies: @@ -4256,12 +4256,12 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: @@ -4361,7 +4361,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv@17.2.3: {} + dotenv@17.2.4: {} drizzle-kit@0.31.8: dependencies: @@ -4381,7 +4381,7 @@ snapshots: encoding-japanese@2.2.0: {} - enhanced-resolve@5.18.4: + enhanced-resolve@5.19.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -4451,34 +4451,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - esbuild@0.27.2: + esbuild@0.27.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 eventemitter3@5.0.4: {} @@ -4501,7 +4501,7 @@ snapshots: get-nonce@1.0.1: {} - get-tsconfig@4.13.1: + get-tsconfig@4.13.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -4552,11 +4552,11 @@ snapshots: json-schema@0.4.0: {} - jspdf-autotable@5.0.7(jspdf@4.0.0): + jspdf-autotable@5.0.7(jspdf@4.1.0): dependencies: - jspdf: 4.0.0 + jspdf: 4.1.0 - jspdf@4.0.0: + jspdf@4.1.0: dependencies: '@babel/runtime': 7.28.6 fast-png: 6.4.0 @@ -4668,7 +4668,7 @@ snapshots: '@next/env': 16.1.6 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001766 + caniuse-lite: 1.0.30001769 postcss: 8.4.31 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -4783,47 +4783,47 @@ snapshots: react-is@16.13.1: {} - react-redux@9.2.0(@types/react@19.2.10)(react@19.2.4)(redux@5.0.1): + react-redux@9.2.0(@types/react@19.2.13)(react@19.2.4)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 redux: 5.0.1 - react-remove-scroll-bar@2.3.8(@types/react@19.2.10)(react@19.2.4): + react-remove-scroll-bar@2.3.8(@types/react@19.2.13)(react@19.2.4): dependencies: react: 19.2.4 - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.13)(react@19.2.4) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - react-remove-scroll@2.7.2(@types/react@19.2.10)(react@19.2.4): + react-remove-scroll@2.7.2(@types/react@19.2.13)(react@19.2.4): dependencies: react: 19.2.4 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.10)(react@19.2.4) - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.13)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.13)(react@19.2.4) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.4) - use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.4) + use-callback-ref: 1.3.3(@types/react@19.2.13)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - react-style-singleton@2.2.3(@types/react@19.2.10)(react@19.2.4): + react-style-singleton@2.2.3(@types/react@19.2.13)(react@19.2.4): dependencies: get-nonce: 1.0.1 react: 19.2.4 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 react@19.2.4: {} - recharts@3.7.0(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4)(redux@5.0.1): + recharts@3.7.0(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4)(redux@5.0.1): dependencies: - '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@19.2.10)(react@19.2.4)(redux@5.0.1))(react@19.2.4) + '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@19.2.13)(react@19.2.4)(redux@5.0.1))(react@19.2.4) clsx: 2.1.1 decimal.js-light: 2.5.1 es-toolkit: 1.44.0 @@ -4832,7 +4832,7 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) react-is: 16.13.1 - react-redux: 9.2.0(@types/react@19.2.10)(react@19.2.4)(redux@5.0.1) + react-redux: 9.2.0(@types/react@19.2.13)(react@19.2.4)(redux@5.0.1) reselect: 5.1.1 tiny-invariant: 1.3.3 use-sync-external-store: 1.6.0(react@19.2.4) @@ -4872,7 +4872,7 @@ snapshots: dependencies: parseley: 0.12.1 - semver@7.7.3: + semver@7.7.4: optional: true set-cookie-parser@2.7.2: {} @@ -4881,7 +4881,7 @@ snapshots: dependencies: '@img/colour': 1.0.0 detect-libc: 2.1.2 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -4969,8 +4969,8 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.2 - get-tsconfig: 4.13.1 + esbuild: 0.27.3 + get-tsconfig: 4.13.5 optionalDependencies: fsevents: 2.3.3 @@ -4980,20 +4980,20 @@ snapshots: undici-types@7.16.0: {} - use-callback-ref@1.3.3(@types/react@19.2.10)(react@19.2.4): + use-callback-ref@1.3.3(@types/react@19.2.13)(react@19.2.4): dependencies: react: 19.2.4 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 - use-sidecar@1.1.3(@types/react@19.2.10)(react@19.2.4): + use-sidecar@1.1.3(@types/react@19.2.13)(react@19.2.4): dependencies: detect-node-es: 1.1.0 react: 19.2.4 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 19.2.13 use-sync-external-store@1.6.0(react@19.2.4): dependencies: @@ -5006,9 +5006,9 @@ snapshots: uuid@10.0.0: {} - vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: diff --git a/public/fonts/anthropicSans.woff2 b/public/fonts/anthropicSans.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eddbf30ee7924f24a3fb61b3dea6d04343965ab6 GIT binary patch literal 117352 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 literal 0 HcmV?d00001 diff --git a/public/fonts/font_index.ts b/public/fonts/font_index.ts index 42df970..4f3e7ce 100644 --- a/public/fonts/font_index.ts +++ b/public/fonts/font_index.ts @@ -16,8 +16,12 @@ const ai_sans = localFont({ display: "swap", }); +const anthropic_sans = localFont({ + src: "./anthropicSans.woff2", + display: "swap", +}); + const main_font = ai_sans; const money_font = ai_sans; -const title_font = ai_sans; -export { main_font, money_font, title_font }; +export { main_font, money_font };