From 64eb29d807fbb39bb2e9394f5f433a840e92845f Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Sun, 15 Mar 2026 23:23:00 +0000 Subject: [PATCH] =?UTF-8?q?style:=20refina=20base=20visual=20e=20navega?= =?UTF-8?q?=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/globals.css | 57 ++-- .../auth/components/auth-card-shell.tsx | 2 +- src/features/auth/components/auth-sidebar.tsx | 2 +- src/features/auth/components/login-form.tsx | 64 +++-- .../components/animated-theme-toggler.tsx | 2 +- .../components/expandable-widget-card.tsx | 7 +- .../month-picker/month-navigation.tsx | 2 +- .../navigation/navbar/app-navbar.tsx | 4 +- .../navigation/navbar/mobile-link.tsx | 20 +- .../navigation/navbar/nav-dropdown.tsx | 74 +++-- .../navigation/navbar/nav-items.tsx | 30 ++ .../components/navigation/navbar/nav-menu.tsx | 34 ++- .../navigation/navbar/nav-styles.ts | 8 +- .../navigation/navbar/nav-tools.tsx | 29 +- .../navigation/navbar/notification-bell.tsx | 268 +++++++++--------- src/shared/components/refresh-page-button.tsx | 2 +- src/shared/components/ui/card.tsx | 2 +- src/shared/components/ui/sonner.tsx | 1 + src/shared/components/ui/table.tsx | 2 +- src/shared/components/widget-card.tsx | 2 +- 20 files changed, 350 insertions(+), 262 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 86e0b68..6cc8389 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -3,20 +3,19 @@ @custom-variant dark (&:is(.dark *)); @theme { - --spacing-custom-height-card: 30rem; - --spacing-8xl: 88rem; - --spacing-9xl: 96rem; + --spacing-custom-height-card: 29rem; + --spacing-8xl: 90rem; } :root { - --background: oklch(97.036% 0.00276 84.303); + --background: oklch(97.412% 0.00332 67.032); --foreground: oklch(27% 0.008 45); - --card: var(--background); + --card: oklch(99% 0.002 67); --card-foreground: var(--foreground); --popover: oklch(100% 0 0); --popover-foreground: var(--foreground); - --primary: oklch(72.085% 0.16286 50.705); + --primary: oklch(72.069% 0.18335 44.069); --primary-foreground: oklch(98% 0.008 80); --secondary: oklch(96.2% 0.005 70); @@ -28,24 +27,23 @@ --accent: oklch(94.8% 0.009 65); --accent-foreground: var(--foreground); - --success: oklch(61.654% 0.14385 157.131); + --success: oklch(61.685% 0.13077 162.978); --success-foreground: oklch(98% 0.01 150); - --warning: oklch(69.913% 0.1798 49.649); + --warning: oklch(78.357% 0.15147 68.301); --warning-foreground: oklch(20% 0.04 85); --info: oklch(55% 0.17 250); --info-foreground: oklch(98% 0.01 250); - --destructive: oklch(55% 0.22 27); --destructive-foreground: oklch(98% 0.005 30); - --border: oklch(84.567% 0.00583 84.468); - --input: oklch(84.567% 0.00583 84.468); + --border: oklch(90.274% 0.01362 60.342); + --input: var(--border); --ring: var(--primary); --chart-1: var(--color-emerald-500); - --chart-2: var(--color-orange-500); - --chart-3: var(--color-indigo-500); - --chart-4: var(--color-amber-500); + --chart-2: var(--color-red-500); + --chart-3: var(--color-amber-500); + --chart-4: var(--color-blue-500); --chart-5: var(--color-pink-500); --chart-6: var(--color-stone-500); --chart-7: var(--color-teal-500); @@ -62,7 +60,7 @@ --sidebar-border: oklch(91% 0.004 70); --sidebar-ring: var(--primary); - --radius: 0.5rem; + --radius: 0.625rem; --shadow-2xs: 0 1px 2px 0px oklch(35% 0.02 45 / 0.04); --shadow-xs: 0 1px 3px 0px oklch(35% 0.02 45 / 0.06); @@ -83,37 +81,36 @@ } .dark { - --background: oklch(20.5% 0.004 55); + --background: oklch(22% 0.004 55); --foreground: oklch(93% 0.008 80); - --card: oklch(23% 0.004 55); + --card: oklch(25.5% 0.004 55); --card-foreground: var(--foreground); - --popover: oklch(25% 0.004 55); + --popover: oklch(28% 0.004 55); --popover-foreground: var(--foreground); - --primary: oklch(72.085% 0.16286 50.705); + --primary: oklch(66% 0.15 45.139); --primary-foreground: oklch(16% 0.004 60); - --secondary: oklch(26% 0.004 55); + --secondary: oklch(29% 0.004 55); --secondary-foreground: var(--foreground); - --muted: oklch(28.5% 0.0035 55); + --muted: oklch(32% 0.0035 55); --muted-foreground: oklch(73% 0.006 75); - --accent: oklch(30% 0.005 55); + --accent: oklch(33% 0.005 55); --accent-foreground: var(--foreground); - --success: oklch(65% 0.19 150); + --success: oklch(62% 0.16 150); --success-foreground: oklch(15% 0.02 150); --warning: oklch(69.913% 0.1798 49.649); --warning-foreground: oklch(15% 0.04 85); --info: oklch(65% 0.17 250); --info-foreground: oklch(15% 0.02 250); - --destructive: oklch(62% 0.2 28); --destructive-foreground: oklch(98% 0.005 30); - --border: oklch(33% 0.004 55); - --input: oklch(30% 0.004 55); + --border: oklch(35% 0.004 55); + --input: var(--border); --ring: var(--primary); --chart-1: var(--color-emerald-500); @@ -127,16 +124,16 @@ --chart-9: var(--color-cyan-500); --chart-10: var(--color-lime-500); - --sidebar: oklch(18% 0.004 55); + --sidebar: oklch(19.5% 0.004 55); --sidebar-foreground: var(--foreground); --sidebar-primary: var(--primary); --sidebar-primary-foreground: var(--primary-foreground); - --sidebar-accent: oklch(27% 0.004 55); + --sidebar-accent: oklch(30% 0.004 55); --sidebar-accent-foreground: var(--foreground); - --sidebar-border: oklch(31% 0.004 55); + --sidebar-border: oklch(34% 0.004 55); --sidebar-ring: var(--primary); - --radius: 0.5rem; + --radius: 0.625rem; --shadow-2xs: 0 1px 2px 0px oklch(0% 0 0 / 0.3); --shadow-xs: 0 1px 3px 0px oklch(0% 0 0 / 0.4); diff --git a/src/features/auth/components/auth-card-shell.tsx b/src/features/auth/components/auth-card-shell.tsx index aca8613..4c640bd 100644 --- a/src/features/auth/components/auth-card-shell.tsx +++ b/src/features/auth/components/auth-card-shell.tsx @@ -5,7 +5,7 @@ import AuthSidebar from "./auth-sidebar"; export function AuthCardShell({ children }: PropsWithChildren) { return ( - +
Controle suas finanças com clareza e foco diário. -

+

Centralize despesas, organize cartões e acompanhe metas mensais em um painel inteligente feito para o seu dia a dia.

diff --git a/src/features/auth/components/login-form.tsx b/src/features/auth/components/login-form.tsx index 0b33729..f736ae1 100644 --- a/src/features/auth/components/login-form.tsx +++ b/src/features/auth/components/login-form.tsx @@ -195,37 +195,41 @@ export function LoginForm({ className, ...props }: DivProps) { - - +
+ - {passkeySupported && ( - - - - )} + {passkeySupported && ( + + )} +
+ Não tem uma conta?{" "} diff --git a/src/shared/components/animated-theme-toggler.tsx b/src/shared/components/animated-theme-toggler.tsx index fc436a7..33eb319 100644 --- a/src/shared/components/animated-theme-toggler.tsx +++ b/src/shared/components/animated-theme-toggler.tsx @@ -87,7 +87,7 @@ export const AnimatedThemeToggler = ({ buttonVariants({ variant: "ghost", size: "icon-sm" }), "group relative text-muted-foreground transition-all duration-200", "hover:text-foreground focus-visible:ring-2 focus-visible:ring-primary/40", - "data-[state=open]:bg-accent/60 data-[state=open]:text-foreground border", + "data-[state=open]:bg-accent/60 data-[state=open]:text-foreground", className, )} {...props} diff --git a/src/shared/components/expandable-widget-card.tsx b/src/shared/components/expandable-widget-card.tsx index 5aacc60..2431bc2 100644 --- a/src/shared/components/expandable-widget-card.tsx +++ b/src/shared/components/expandable-widget-card.tsx @@ -68,12 +68,13 @@ export function ExpandableWidgetCard({ hasOverflow ? (
) : null diff --git a/src/shared/components/month-picker/month-navigation.tsx b/src/shared/components/month-picker/month-navigation.tsx index ecdeace..c901237 100644 --- a/src/shared/components/month-picker/month-navigation.tsx +++ b/src/shared/components/month-picker/month-navigation.tsx @@ -42,7 +42,7 @@ export default function MonthNavigation() { }; return ( - +
+
diff --git a/src/shared/components/navigation/navbar/mobile-link.tsx b/src/shared/components/navigation/navbar/mobile-link.tsx index 6ad5f0d..1d0f2df 100644 --- a/src/shared/components/navigation/navbar/mobile-link.tsx +++ b/src/shared/components/navigation/navbar/mobile-link.tsx @@ -12,6 +12,7 @@ type MobileLinkProps = { onClick?: () => void; badge?: number; preservePeriod?: boolean; + description?: string; }; export function MobileLink({ @@ -21,6 +22,7 @@ export function MobileLink({ onClick, badge, preservePeriod, + description, }: MobileLinkProps) { const pathname = usePathname(); @@ -40,8 +42,22 @@ export function MobileLink({ isActive && "bg-primary/10 text-primary font-medium", )} > - {icon} - {children} + + {icon} + + + {children} + {description && ( + + {description} + + )} + {badge && badge > 0 ? ( {badge} diff --git a/src/shared/components/navigation/navbar/nav-dropdown.tsx b/src/shared/components/navigation/navbar/nav-dropdown.tsx index 7974dcf..4f5c492 100644 --- a/src/shared/components/navigation/navbar/nav-dropdown.tsx +++ b/src/shared/components/navigation/navbar/nav-dropdown.tsx @@ -1,6 +1,8 @@ "use client"; +import { usePathname } from "next/navigation"; import { Badge } from "@/shared/components/ui/badge"; +import { cn } from "@/shared/utils/ui"; import type { NavItem } from "./nav-items"; import { NavLink } from "./nav-link"; @@ -9,28 +11,60 @@ type NavDropdownProps = { }; export function NavDropdown({ items }: NavDropdownProps) { + const pathname = usePathname(); + return ( -
    - {items.map((item) => ( -
  • - - {item.icon} - {item.label} - {item.badge && item.badge > 0 ? ( - + {items.map((item) => { + const isActive = + pathname === item.href || pathname.startsWith(`${item.href}/`); + + return ( +
  • + + - {item.badge} - - ) : null} - -
  • - ))} + {item.icon} + + + + {item.label} + + {item.description && ( + + {item.description} + + )} + + {item.badge && item.badge > 0 ? ( + + {item.badge} + + ) : null} + + + ); + })}
); } diff --git a/src/shared/components/navigation/navbar/nav-items.tsx b/src/shared/components/navigation/navbar/nav-items.tsx index 6115e96..c533713 100644 --- a/src/shared/components/navigation/navbar/nav-items.tsx +++ b/src/shared/components/navigation/navbar/nav-items.tsx @@ -17,7 +17,9 @@ import { export type NavItem = { href: string; label: string; + description?: string; icon: React.ReactNode; + iconClass?: string; badge?: number; preservePeriod?: boolean; hideOnMobile?: boolean; @@ -35,18 +37,24 @@ export const NAV_SECTIONS: NavSection[] = [ { href: "/transactions", label: "lançamentos", + description: "Registre e gerencie suas transações", icon: , + iconClass: "text-primary", preservePeriod: true, }, { href: "/inbox", label: "pré-lançamentos", + description: "Notificações capturadas pelo Companion", icon: , + iconClass: "text-primary", }, { href: "/calendar", label: "calendário", + description: "Visualize lançamentos por dia", icon: , + iconClass: "text-primary", hideOnMobile: true, }, ], @@ -57,17 +65,23 @@ export const NAV_SECTIONS: NavSection[] = [ { href: "/cards", label: "cartões", + description: "Faturas e limites dos seus cartões", icon: , + iconClass: "text-primary", }, { href: "/accounts", label: "contas", + description: "Saldos e extratos bancários", icon: , + iconClass: "text-primary", }, { href: "/budgets", label: "orçamentos", + description: "Defina limites de gastos por categoria", icon: , + iconClass: "text-primary", preservePeriod: true, }, ], @@ -78,17 +92,23 @@ export const NAV_SECTIONS: NavSection[] = [ { href: "/payers", label: "pagadores", + description: "Gerencie quem divide as despesas", icon: , + iconClass: "text-primary", }, { href: "/categories", label: "categorias", + description: "Agrupe seus lançamentos", icon: , + iconClass: "text-primary", }, { href: "/notes", label: "anotações", + description: "Guarde lembretes e observações", icon: , + iconClass: "text-primary", }, ], }, @@ -98,29 +118,39 @@ export const NAV_SECTIONS: NavSection[] = [ { href: "/insights", label: "insights", + description: "Análises inteligentes dos seus dados", icon: , + iconClass: "text-primary", preservePeriod: true, }, { href: "/reports/category-trends", label: "tendências", + description: "Evolução de gastos por categoria", icon: , + iconClass: "text-primary", }, { href: "/reports/card-usage", label: "uso de cartões", + description: "Resumo de gastos por cartão", icon: , + iconClass: "text-primary", preservePeriod: true, }, { href: "/reports/installment-analysis", label: "análise de parcelas", + description: "Acompanhe parcelas em aberto", icon: , + iconClass: "text-primary", }, { href: "/reports/establishments", label: "estabelecimentos", + description: "Top gastos por estabelecimento", icon: , + iconClass: "text-primary", }, ], }, diff --git a/src/shared/components/navigation/navbar/nav-menu.tsx b/src/shared/components/navigation/navbar/nav-menu.tsx index 7c9dd5a..0ccb4df 100644 --- a/src/shared/components/navigation/navbar/nav-menu.tsx +++ b/src/shared/components/navigation/navbar/nav-menu.tsx @@ -1,6 +1,7 @@ "use client"; import { RiDashboardLine, RiMenuLine } from "@remixicon/react"; +import { usePathname } from "next/navigation"; import { useState } from "react"; import { CalculatorDialogContent } from "@/shared/components/calculator/calculator-dialog"; import { Button } from "@/shared/components/ui/button"; @@ -23,10 +24,11 @@ import { MobileLink, MobileSectionLabel } from "./mobile-link"; import { NavDropdown } from "./nav-dropdown"; import { NAV_SECTIONS } from "./nav-items"; import { NavPill } from "./nav-pill"; -import { triggerClass } from "./nav-styles"; +import { triggerActiveClass, triggerClass } from "./nav-styles"; import { MobileTools, NavToolsDropdown } from "./nav-tools"; export function NavMenu() { + const pathname = usePathname(); const [sheetOpen, setSheetOpen] = useState(false); const [calculatorOpen, setCalculatorOpen] = useState(false); const close = () => setSheetOpen(false); @@ -44,16 +46,25 @@ export function NavMenu() { - {NAV_SECTIONS.map((section) => ( - - - {section.label} - - - - - - ))} + {NAV_SECTIONS.map((section) => { + const isSectionActive = section.items.some( + (item) => + pathname === item.href || + pathname.startsWith(`${item.href}/`), + ); + return ( + + + {section.label} + + + + + + ); + })} @@ -109,6 +120,7 @@ export function NavMenu() { onClick={close} badge={item.badge} preservePeriod={item.preservePeriod} + description={item.description} > {item.label} diff --git a/src/shared/components/navigation/navbar/nav-styles.ts b/src/shared/components/navigation/navbar/nav-styles.ts index d736aaa..278b879 100644 --- a/src/shared/components/navigation/navbar/nav-styles.ts +++ b/src/shared/components/navigation/navbar/nav-styles.ts @@ -1,14 +1,12 @@ -// Base para links diretos e triggers — pill arredondado export const linkBase = "inline-flex h-8 items-center justify-center rounded-md px-2 text-sm font-medium transition-all lowercase"; -// Estado inativo: muted, hover suave sem underline export const linkIdle = "text-black/75 hover:bg-black/10 hover:text-black"; -// Estado ativo: pill com cor primária -export const linkActive = "bg-black/10 text-black"; +export const linkActive = "bg-black/15 text-black"; + +export const triggerActiveClass = ["bg-black/15!", "text-black!"].join(" "); -// Trigger do NavigationMenu — espelha linkBase + linkIdle, remove estilos padrão export const triggerClass = [ "h-8!", "rounded-md!", diff --git a/src/shared/components/navigation/navbar/nav-tools.tsx b/src/shared/components/navigation/navbar/nav-tools.tsx index 7a37162..884bafb 100644 --- a/src/shared/components/navigation/navbar/nav-tools.tsx +++ b/src/shared/components/navigation/navbar/nav-tools.tsx @@ -3,7 +3,6 @@ import { RiCalculatorLine, RiEyeLine, RiEyeOffLine } from "@remixicon/react"; import { usePrivacyMode } from "@/shared/components/providers/privacy-provider"; import { Badge } from "@/shared/components/ui/badge"; -import { cn } from "@/shared/utils/ui"; const itemClass = "flex w-full items-center gap-2.5 rounded-sm px-2 py-2 text-sm text-foreground hover:bg-accent transition-colors cursor-pointer"; @@ -16,29 +15,35 @@ export function NavToolsDropdown({ onOpenCalculator }: NavToolsDropdownProps) { const { privacyMode, toggle } = usePrivacyMode(); return ( -
    +
    • -
    • -
); } +type NotificationItemProps = { + href: string; + icon: React.ReactNode; + isOverdue: boolean; + title: string; + detail: string; + onClose: () => void; +}; + +function NotificationItem({ + href, + icon, + isOverdue, + title, + detail, + onClose, +}: NotificationItemProps) { + return ( + + {icon} + + + {title} + + + {detail} + + + + + ); +} + export function NotificationBell({ notifications, totalCount, @@ -105,12 +152,13 @@ export function NotificationBell({ aria-expanded={open} className={cn( buttonVariants({ variant: "ghost", size: "icon-sm" }), - "group relative border border-black/10 text-black/75 shadow-none transition-all duration-200", + "group relative shadow-none transition-all duration-200", "hover:border-black/20 hover:bg-black/10 hover:text-black focus-visible:ring-2 focus-visible:ring-black/20", "data-[state=open]:bg-black/10 data-[state=open]:text-black", + hasNotifications ? "text-black" : "text-black/75", )} > - {displayCount} @@ -138,10 +186,10 @@ export function NotificationBell({ {/* Header */} - + Notificações {hasNotifications && ( @@ -172,19 +220,18 @@ export function NotificationBell({ icon={} title="Pré-lançamentos" /> - setOpen(false)} - className="group mx-1 mb-1 flex items-center gap-2 rounded-md px-2 py-2 transition-colors hover:bg-accent/60" - > - -

- {preLancamentosCount === 1 - ? "1 pré-lançamento aguardando revisão" - : `${preLancamentosCount} pré-lançamentos aguardando revisão`} -

- - + isOverdue={false} + icon={} + title={ + preLancamentosCount === 1 + ? "1 pré-lançamento pendente" + : `${preLancamentosCount} pré-lançamentos pendentes` + } + detail="Aguardando revisão" + onClose={() => setOpen(false)} + />
)} @@ -195,48 +242,27 @@ export function NotificationBell({ icon={} title="Orçamentos" /> -
- {budgetNotifications.map((n) => ( -
- {n.status === "exceeded" ? ( - + {budgetNotifications.map((n) => ( + ) : ( - - )} -

- {n.status === "exceeded" ? ( - <> - Orçamento de {n.categoryName}{" "} - excedido —{" "} - {formatCurrency(n.spentAmount)} de{" "} - {formatCurrency(n.budgetAmount)} ( - {formatPercentage(n.usedPercentage, { - maximumFractionDigits: 0, - minimumFractionDigits: 0, - })} - ) - - ) : ( - <> - {n.categoryName} atingiu{" "} - - {formatPercentage(n.usedPercentage, { - maximumFractionDigits: 0, - minimumFractionDigits: 0, - })} - {" "} - do orçamento —{" "} - {formatCurrency(n.spentAmount)} de{" "} - {formatCurrency(n.budgetAmount)} - - )} -

-
- ))} -
+ + ) + } + title={n.categoryName} + detail={ + n.status === "exceeded" + ? `Excedido — ${formatCurrency(n.spentAmount)} de ${formatCurrency(n.budgetAmount)} (${formatPercentage(n.usedPercentage, { maximumFractionDigits: 0, minimumFractionDigits: 0 })})` + : `${formatPercentage(n.usedPercentage, { maximumFractionDigits: 0, minimumFractionDigits: 0 })} utilizado — ${formatCurrency(n.spentAmount)} de ${formatCurrency(n.budgetAmount)}` + } + onClose={() => setOpen(false)} + /> + ))}
)} @@ -247,56 +273,38 @@ export function NotificationBell({ icon={} title="Cartão de Crédito" /> -
- {invoiceNotifications.map((n) => { - const logo = resolveLogoSrc(n.cardLogo); - return ( -
- {logo ? ( + {invoiceNotifications.map((n) => { + const logo = resolveLogoSrc(n.cardLogo); + return ( + ) : n.status === "overdue" ? ( - + ) : ( - - )} -

- {n.status === "overdue" ? ( - <> - A fatura de {n.name} venceu em{" "} - {formatDate(n.dueDate)} - {n.showAmount && n.amount > 0 && ( - <> - {" "} - — {formatCurrency(n.amount)} - - )} - - ) : ( - <> - A fatura de {n.name} vence em{" "} - {formatDate(n.dueDate)} - {n.showAmount && n.amount > 0 && ( - <> - {" "} - — {formatCurrency(n.amount)} - - )} - - )} -

-
- ); - })} -
+ + ) + } + title={n.name} + detail={ + n.status === "overdue" + ? `Venceu em ${formatDate(n.dueDate)}${n.showAmount && n.amount > 0 ? ` — ${formatCurrency(n.amount)}` : ""}` + : `Vence em ${formatDate(n.dueDate)}${n.showAmount && n.amount > 0 ? ` — ${formatCurrency(n.amount)}` : ""}` + } + onClose={() => setOpen(false)} + /> + ); + })} )} @@ -307,48 +315,30 @@ export function NotificationBell({ icon={} title="Boletos" /> -
- {boletoNotifications.map((n) => ( -
+ {boletoNotifications.map((n) => ( + -

- {n.status === "overdue" ? ( - <> - O boleto {n.name} - {n.amount > 0 && ( - <> - {" "} - — {formatCurrency(n.amount)} - - )}{" "} - venceu em {formatDate(n.dueDate)} - - ) : ( - <> - O boleto {n.name} - {n.amount > 0 && ( - <> - {" "} - — {formatCurrency(n.amount)} - - )}{" "} - vence em {formatDate(n.dueDate)} - - )} -

-
- ))} -
+ } + title={n.name} + detail={ + n.status === "overdue" + ? `Venceu em ${formatDate(n.dueDate)}${n.amount > 0 ? ` — ${formatCurrency(n.amount)}` : ""}` + : `Vence em ${formatDate(n.dueDate)}${n.amount > 0 ? ` — ${formatCurrency(n.amount)}` : ""}` + } + onClose={() => setOpen(false)} + /> + ))} )} diff --git a/src/shared/components/refresh-page-button.tsx b/src/shared/components/refresh-page-button.tsx index 3c3a221..3dcda98 100644 --- a/src/shared/components/refresh-page-button.tsx +++ b/src/shared/components/refresh-page-button.tsx @@ -38,7 +38,7 @@ export function RefreshPageButton({ className={cn( buttonVariants({ variant: "ghost", size: "icon-sm" }), "size-8 text-muted-foreground transition-all duration-200", - "hover:text-foreground focus-visible:ring-2 focus-visible:ring-primary/40 border", + "hover:text-foreground focus-visible:ring-2 focus-visible:ring-primary/40", "disabled:pointer-events-none disabled:opacity-50", className, )} diff --git a/src/shared/components/ui/card.tsx b/src/shared/components/ui/card.tsx index d814896..795bf1c 100644 --- a/src/shared/components/ui/card.tsx +++ b/src/shared/components/ui/card.tsx @@ -7,7 +7,7 @@ function Card({ className, ...props }: React.ComponentProps<"div">) {
{ , info: , diff --git a/src/shared/components/ui/table.tsx b/src/shared/components/ui/table.tsx index cef5b37..b81aa9e 100644 --- a/src/shared/components/ui/table.tsx +++ b/src/shared/components/ui/table.tsx @@ -57,7 +57,7 @@ function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
- + {icon} {title}