mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-05-09 19:01:47 +00:00
style(tipografia): adiciona fonte America Medium e padroniza pesos de texto
Adiciona os arquivos `america-medium.woff2` e `america-bold.woff2` e registra o weight 500 no `font_index.ts`. Padroniza o uso de `font-medium` em substituição a `font-semibold` e `font-bold` em títulos, valores monetários e rótulos de destaque em todos os componentes do app, landing page e componentes de UI base. `Card` ganha `hover:border-primary/40` e `CardTitle` recebe `text-base`. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -61,7 +61,7 @@ export function CardTopExpenses({ data }: CardTopExpensesProps) {
|
||||
<div className="flex min-w-0 flex-1 items-center gap-2">
|
||||
{/* Rank number */}
|
||||
<div className="flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted">
|
||||
<span className="text-sm font-semibold text-muted-foreground">
|
||||
<span className="text-sm font-medium text-muted-foreground">
|
||||
{index + 1}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -67,11 +67,11 @@ export function CardsOverview({ data }: CardsOverviewProps) {
|
||||
<p className="text-xs text-muted-foreground">{card.title}</p>
|
||||
{card.isMoney ? (
|
||||
<MoneyValues
|
||||
className="text-2xl font-semibold"
|
||||
className="text-2xl font-medium"
|
||||
amount={card.value}
|
||||
/>
|
||||
) : (
|
||||
<p className="text-2xl font-semibold">
|
||||
<p className="text-2xl font-medium">
|
||||
{formatPercentage(card.value, {
|
||||
maximumFractionDigits: 0,
|
||||
minimumFractionDigits: 0,
|
||||
@@ -83,7 +83,7 @@ export function CardsOverview({ data }: CardsOverviewProps) {
|
||||
))}
|
||||
</div>
|
||||
|
||||
<p className="text-base font-bold ml-2 py-2">Meus cartões</p>
|
||||
<p className="text-base font-medium ml-2 py-2">Meus cartões</p>
|
||||
|
||||
{/* Cards list */}
|
||||
<div className="grid gap-2 grid-cols-2 lg:grid-cols-4 xl:grid-cols-4">
|
||||
@@ -116,7 +116,7 @@ export function CardsOverview({ data }: CardsOverviewProps) {
|
||||
</div>
|
||||
<div className="min-w-0 flex-1 space-y-1">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-base font-bold truncate">
|
||||
<span className="text-base font-medium truncate">
|
||||
{card.name}
|
||||
</span>
|
||||
{brandAsset && (
|
||||
|
||||
@@ -63,7 +63,7 @@ export function CategoryCell({
|
||||
<div className="font-medium">{formatCurrency(value)}</div>
|
||||
{!isFirstMonth && absoluteChange !== null && (
|
||||
<>
|
||||
<div className="font-bold">
|
||||
<div className="font-medium">
|
||||
Mês anterior: {formatCurrency(previousValue)}
|
||||
</div>
|
||||
<div
|
||||
|
||||
@@ -67,11 +67,11 @@ function CategoryCard({ category, periods, periodCount }: CategoryCardProps) {
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
<div className="flex items-center justify-between font-semibold text-info">
|
||||
<div className="flex items-center justify-between font-medium text-info">
|
||||
<span>Média mensal</span>
|
||||
<span>{formatCurrency(averageMonthlyTotal)}</span>
|
||||
</div>
|
||||
<div className="flex items-center justify-between pt-2 font-semibold">
|
||||
<div className="flex items-center justify-between pt-2 font-medium">
|
||||
<span>Total</span>
|
||||
<span>{formatCurrency(category.total)}</span>
|
||||
</div>
|
||||
@@ -111,7 +111,7 @@ function Section({
|
||||
<span className="text-sm text-muted-foreground">
|
||||
{formatCurrency(total)}
|
||||
</span>
|
||||
<span className="text-xs font-semibold text-info">
|
||||
<span className="text-xs font-medium text-info">
|
||||
Média: {formatCurrency(averageMonthlyTotal)}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -55,7 +55,7 @@ function AreaTooltip({
|
||||
|
||||
return (
|
||||
<div className="min-w-[210px] rounded-lg border border-border/50 bg-background px-3 py-2.5 shadow-xl">
|
||||
<p className="mb-2.5 border-b border-border/50 pb-1.5 text-xs font-semibold text-foreground">
|
||||
<p className="mb-2.5 border-b border-border/50 pb-1.5 text-xs font-medium text-foreground">
|
||||
{label}
|
||||
</p>
|
||||
<div className="space-y-1.5">
|
||||
@@ -73,7 +73,7 @@ function AreaTooltip({
|
||||
{entry.name}
|
||||
</span>
|
||||
</div>
|
||||
<span className="shrink-0 text-xs font-semibold tabular-nums text-foreground">
|
||||
<span className="shrink-0 text-xs font-medium tabular-nums text-foreground">
|
||||
{currencyFormatter.format(Number(entry.value))}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import {
|
||||
RiDownloadLine,
|
||||
RiFileExcelLine,
|
||||
RiFilePdfLine,
|
||||
RiFilePdf2Line,
|
||||
RiFileTextLine,
|
||||
} from "@remixicon/react";
|
||||
import { useState } from "react";
|
||||
@@ -388,7 +388,7 @@ export function CategoryReportExport({
|
||||
Exportar como Excel (.xlsx)
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem onClick={exportToPDF} disabled={isExporting}>
|
||||
<RiFilePdfLine className="mr-2 h-4 w-4" aria-hidden="true" />
|
||||
<RiFilePdf2Line className="mr-2 h-4 w-4" aria-hidden="true" />
|
||||
Exportar como PDF
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
|
||||
@@ -72,18 +72,18 @@ export function CategoryTable({
|
||||
<Table>
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
<TableHead className="w-[240px] min-w-[240px] font-bold">
|
||||
<TableHead className="w-[240px] min-w-[240px] font-medium">
|
||||
Categoria
|
||||
</TableHead>
|
||||
{periods.map((period) => (
|
||||
<TableHead
|
||||
key={period}
|
||||
className="text-right min-w-[120px] font-bold"
|
||||
className="text-right min-w-[120px] font-medium"
|
||||
>
|
||||
{formatPeriodLabel(period)}
|
||||
</TableHead>
|
||||
))}
|
||||
<TableHead className="text-right min-w-[140px] font-bold">
|
||||
<TableHead className="text-right min-w-[140px] font-medium">
|
||||
<div className="flex items-center justify-end gap-1">
|
||||
Média
|
||||
<Tooltip>
|
||||
@@ -100,7 +100,7 @@ export function CategoryTable({
|
||||
</Tooltip>
|
||||
</div>
|
||||
</TableHead>
|
||||
<TableHead className="text-right min-w-[120px] font-bold">
|
||||
<TableHead className="text-right min-w-[120px] font-medium">
|
||||
Total
|
||||
</TableHead>
|
||||
</TableRow>
|
||||
@@ -149,7 +149,7 @@ export function CategoryTable({
|
||||
</TableCell>
|
||||
);
|
||||
})}
|
||||
<TableCell className="text-right font-semibold text-info">
|
||||
<TableCell className="text-right font-medium text-info">
|
||||
{(() => {
|
||||
const nonZeroCount = periods.filter(
|
||||
(p) => (category.monthlyData.get(p)?.amount ?? 0) > 0,
|
||||
@@ -159,7 +159,7 @@ export function CategoryTable({
|
||||
);
|
||||
})()}
|
||||
</TableCell>
|
||||
<TableCell className="text-right font-semibold">
|
||||
<TableCell className="text-right font-medium">
|
||||
{formatCurrency(category.total)}
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
@@ -169,19 +169,19 @@ export function CategoryTable({
|
||||
|
||||
<TableFooter>
|
||||
<TableRow>
|
||||
<TableCell className="font-bold">Total</TableCell>
|
||||
<TableCell className="font-medium">Total</TableCell>
|
||||
{periods.map((period) => {
|
||||
const periodTotal = sectionTotals.totalsMap.get(period) ?? 0;
|
||||
return (
|
||||
<TableCell key={period} className="text-right font-semibold">
|
||||
<TableCell key={period} className="text-right font-medium">
|
||||
{formatCurrency(periodTotal)}
|
||||
</TableCell>
|
||||
);
|
||||
})}
|
||||
<TableCell className="text-right font-semibold text-info">
|
||||
<TableCell className="text-right font-medium text-info">
|
||||
{formatCurrency(sectionTotals.averageMonthlyTotal)}
|
||||
</TableCell>
|
||||
<TableCell className="text-right font-semibold">
|
||||
<TableCell className="text-right font-medium">
|
||||
{formatCurrency(sectionTotals.grandTotal)}
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
|
||||
@@ -65,7 +65,7 @@ export function EstablishmentsList({
|
||||
<div className="flex min-w-0 flex-1 items-center gap-2">
|
||||
{/* Rank number - same size as icon containers */}
|
||||
<div className="flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted">
|
||||
<span className="text-sm font-semibold text-muted-foreground">
|
||||
<span className="text-sm font-medium text-muted-foreground">
|
||||
{index + 1}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -18,8 +18,8 @@ export function HighlightsCards({ summary }: HighlightsCardsProps) {
|
||||
<RiTrophyLine className="size-5" />
|
||||
</div>
|
||||
<div className="min-w-0 flex-1">
|
||||
<p className="text-xs font-bold">Mais Frequente</p>
|
||||
<p className="font-bold text-2xl truncate">
|
||||
<p className="text-xs font-medium">Mais Frequente</p>
|
||||
<p className="font-medium text-2xl truncate">
|
||||
{summary.mostFrequent || "—"}
|
||||
</p>
|
||||
</div>
|
||||
@@ -34,8 +34,8 @@ export function HighlightsCards({ summary }: HighlightsCardsProps) {
|
||||
<RiFireLine className="size-5" />
|
||||
</div>
|
||||
<div className="min-w-0 flex-1">
|
||||
<p className="text-xs font-bold">Maior Gasto Total</p>
|
||||
<p className="font-bold text-2xl truncate">
|
||||
<p className="text-xs font-medium">Maior Gasto Total</p>
|
||||
<p className="font-medium text-2xl truncate">
|
||||
{summary.highestSpending || "—"}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -58,11 +58,11 @@ export function SummaryCards({ summary }: SummaryCardsProps) {
|
||||
</p>
|
||||
{card.isMoney ? (
|
||||
<MoneyValues
|
||||
className="text-2xl font-semibold"
|
||||
className="text-2xl font-medium"
|
||||
amount={card.value}
|
||||
/>
|
||||
) : (
|
||||
<p className="text-2xl font-semibold">{card.value}</p>
|
||||
<p className="text-2xl font-medium">{card.value}</p>
|
||||
)}
|
||||
<p className="text-xs text-muted-foreground">
|
||||
{card.description}
|
||||
|
||||
Reference in New Issue
Block a user