diff --git a/src/components/admin/products/bulk-import/StepPreview.tsx b/src/components/admin/products/bulk-import/StepPreview.tsx index 7e198b38b..491a38700 100644 --- a/src/components/admin/products/bulk-import/StepPreview.tsx +++ b/src/components/admin/products/bulk-import/StepPreview.tsx @@ -80,7 +80,7 @@ export function StepPreview({ @@ -89,7 +89,7 @@ export function StepPreview({ @@ -125,17 +125,17 @@ export function StepPreview({ (rawData[r.row - 1]?.[ Object.entries(mapping).find(([, v]) => v === 'sku')?.[0] || '' ] as string) || - '—'} + '—'} {r.data?.name || (rawData[r.row - 1]?.[ Object.entries(mapping).find(([, v]) => v === 'name')?.[0] || '' ] as string) || - '—'} + '—'} - {r.data?.sale_price ? `R$ ${Number(r.data.sale_price).toFixed(2)}` : '—'} + {r.data?.sale_price ? `R$ ${Number(r.data.sale_price).toFixed(2)}` : '—'} {r.existsInDb ? ( diff --git a/src/components/admin/products/kit-components/PrintAreaForm.tsx b/src/components/admin/products/kit-components/PrintAreaForm.tsx index f82222772..03e9bf6db 100644 --- a/src/components/admin/products/kit-components/PrintAreaForm.tsx +++ b/src/components/admin/products/kit-components/PrintAreaForm.tsx @@ -27,7 +27,7 @@ export function PrintAreaForm({ initial, onSave, onCancel, isSaving }: Props) { onSave(form); }; - const areaNamePreview = [form.location_name, form.technique_name].filter(Boolean).join(' — '); + const areaNamePreview = [form.location_name, form.technique_name].filter(Boolean).join(' — '); return (
diff --git a/src/components/admin/products/kit-components/VolumeValidation.tsx b/src/components/admin/products/kit-components/VolumeValidation.tsx index 1cd767063..7f7766184 100644 --- a/src/components/admin/products/kit-components/VolumeValidation.tsx +++ b/src/components/admin/products/kit-components/VolumeValidation.tsx @@ -87,7 +87,7 @@ export function VolumeValidation({ variant="outline" className="gap-1 border-destructive/50 bg-destructive/10 px-1.5 py-0 text-[10px] text-destructive" > - NÃO CABE + NÃO CABE )}
@@ -114,9 +114,9 @@ export function VolumeValidation({
- Caixa interna: {boxW?.toFixed(0)}×{boxL?.toFixed(0)}×{boxH?.toFixed(0)} mm + Caixa interna: {boxW?.toFixed(0)}×{boxL?.toFixed(0)}×{boxH?.toFixed(0)} mm - {totalWeight > 0 && • Peso total: {(totalWeight / 1000).toFixed(2)} kg} + {totalWeight > 0 && • Peso total: {(totalWeight / 1000).toFixed(2)} kg}
{componentVolumes.length > 0 && ( @@ -128,12 +128,12 @@ export function VolumeValidation({ return (
- {c.component_name || 'Sem nome'} {(c.quantity ?? 1) > 1 ? `×${c.quantity}` : ''} + {c.component_name || 'Sem nome'} {(c.quantity ?? 1) > 1 ? `×${c.quantity}` : ''} {c.hasDimensions ? (
- {c.width_mm}×{c.length_mm}×{c.height_mm} mm + {c.width_mm}×{c.length_mm}×{c.height_mm} mm {itemFits ? ( @@ -153,7 +153,7 @@ export function VolumeValidation({ {missingDimensions.length > 0 && (
- {missingDimensions.length} componente(s) sem dimensões — o cálculo pode ser impreciso. + {missingDimensions.length} componente(s) sem dimensões — o cálculo pode ser impreciso.
)}
diff --git a/src/components/admin/products/kit-components/api.ts b/src/components/admin/products/kit-components/api.ts index b956bb154..8f4605799 100644 --- a/src/components/admin/products/kit-components/api.ts +++ b/src/components/admin/products/kit-components/api.ts @@ -82,7 +82,7 @@ export async function deletePrintArea(id: string): Promise { if (!data?.success) throw new Error(data?.error || 'Erro ao excluir área'); } -// ── Kit Component Media (external DB) ── +// ── Kit Component Media (external DB) ── export interface ComponentMedia { id: string; diff --git a/src/components/admin/suppliers-manager/SupplierTable.tsx b/src/components/admin/suppliers-manager/SupplierTable.tsx index cde9482ce..8e180c238 100644 --- a/src/components/admin/suppliers-manager/SupplierTable.tsx +++ b/src/components/admin/suppliers-manager/SupplierTable.tsx @@ -103,7 +103,7 @@ export function SupplierTable({ {supplier.email &&

{supplier.email}

} {supplier.phone &&

{supplier.phone}

} {!supplier.email && !supplier.phone && ( -

—

+

)}
@@ -111,7 +111,7 @@ export function SupplierTable({ {supplier.default_markup_percent !== null ? ( {supplier.default_markup_percent}% ) : ( - '—' + '—' )} @@ -129,7 +129,7 @@ export function SupplierTable({ - {supplier.priority ?? '—'} + {supplier.priority ?? '—'}
diff --git a/src/components/filters/filter-panel/useFilterPanelState.ts b/src/components/filters/filter-panel/useFilterPanelState.ts index bab9a4ea4..c1914d01f 100644 --- a/src/components/filters/filter-panel/useFilterPanelState.ts +++ b/src/components/filters/filter-panel/useFilterPanelState.ts @@ -233,10 +233,10 @@ export function useFilterPanelState( const sectionSummaries = useMemo(() => { const summaries: Record = {}; if (filters.priceRange[0] > 0 || filters.priceRange[1] < 9999) { - summaries.preco = `R$${filters.priceRange[0]}–${filters.priceRange[1] >= 9999 ? '∞' : filters.priceRange[1]}`; + summaries.preco = `R$${filters.priceRange[0]}–${filters.priceRange[1] >= 9999 ? '∞' : filters.priceRange[1]}`; } if (filters.minStock > 0) { - summaries.estoque = `≥${filters.minStock} un.`; + summaries.estoque = `≥${filters.minStock} un.`; } if (filters.sortBy !== 'name') { const opt = SORT_OPTIONS.find((o) => o.value === filters.sortBy); diff --git a/src/components/pricing/QuantityPriceCalculator.tsx b/src/components/pricing/QuantityPriceCalculator.tsx index dfc141f3f..eca3b79ff 100644 --- a/src/components/pricing/QuantityPriceCalculator.tsx +++ b/src/components/pricing/QuantityPriceCalculator.tsx @@ -1,5 +1,5 @@ /** - * QuantityPriceCalculator — Main orchestrator. + * QuantityPriceCalculator — Main orchestrator. * Sub-components extracted to calculator/ folder. */ import { useState, useCallback } from 'react'; diff --git a/src/components/pricing/calculator/TechniqueMultiSelector.tsx b/src/components/pricing/calculator/TechniqueMultiSelector.tsx index d45bb58d9..8d7a9eb0d 100644 --- a/src/components/pricing/calculator/TechniqueMultiSelector.tsx +++ b/src/components/pricing/calculator/TechniqueMultiSelector.tsx @@ -1,5 +1,5 @@ /** - * TechniqueMultiSelector — Grid of available techniques to toggle. + * TechniqueMultiSelector — Grid of available techniques to toggle. */ import { useQuery } from '@tanstack/react-query'; import { invokeExternalRpc } from '@/lib/external-rpc'; diff --git a/src/components/pricing/simulator/EngravingList.tsx b/src/components/pricing/simulator/EngravingList.tsx index d93e4c142..3f76e5985 100644 --- a/src/components/pricing/simulator/EngravingList.tsx +++ b/src/components/pricing/simulator/EngravingList.tsx @@ -83,7 +83,7 @@ export function EngravingList({ {engraving.sizeOption && ( - {engraving.sizeOption.replace('x', ' × ')} cm + {engraving.sizeOption.replace('x', ' × ')} cm )}
diff --git a/src/components/pricing/simulator/MultiEngravingResult.tsx b/src/components/pricing/simulator/MultiEngravingResult.tsx index c76f92bf1..4d8e18384 100644 --- a/src/components/pricing/simulator/MultiEngravingResult.tsx +++ b/src/components/pricing/simulator/MultiEngravingResult.tsx @@ -233,7 +233,7 @@ export function MultiEngravingResult({
- {formatNumber(quantity)} × {formatCurrency(product.price)} + {formatNumber(quantity)} × {formatCurrency(product.price)} {formatCurrency(productTotal)}
@@ -294,7 +294,7 @@ export function MultiEngravingResult({
- {formatNumber(quantity)} × {formatCurrency(calc.priceData.unit_price)}{' '} + {formatNumber(quantity)} × {formatCurrency(calc.priceData.unit_price)}{' '} (Faixa {calc.priceData.tier_used}) {formatCurrency(calc.priceData.subtotal_pecas)} diff --git a/src/components/pricing/simulator/ProductSearch.tsx b/src/components/pricing/simulator/ProductSearch.tsx index 87ecca95b..5ccfab394 100644 --- a/src/components/pricing/simulator/ProductSearch.tsx +++ b/src/components/pricing/simulator/ProductSearch.tsx @@ -60,7 +60,7 @@ export function ProductSearch({ onSelect, selectedProduct }: ProductSearchProps)

{selectedProduct.name}

SKU: {selectedProduct.sku} - • + {formatCurrency(selectedProduct.price)} @@ -132,7 +132,7 @@ export function ProductSearch({ onSelect, selectedProduct }: ProductSearchProps)

{product.name}

- {product.sku} • {formatCurrency(product.price)} + {product.sku} • {formatCurrency(product.price)}

diff --git a/src/components/pricing/simulator/QuantityAndResult.tsx b/src/components/pricing/simulator/QuantityAndResult.tsx index b127bff24..670b8935d 100644 --- a/src/components/pricing/simulator/QuantityAndResult.tsx +++ b/src/components/pricing/simulator/QuantityAndResult.tsx @@ -186,7 +186,7 @@ export function QuantityAndResult({ {/* Produto */}
- Produtos ({formatNumber(quantity)} × {formatCurrency(product.price)}) + Produtos ({formatNumber(quantity)} × {formatCurrency(product.price)}) {formatCurrency(productTotal)}
@@ -203,7 +203,7 @@ export function QuantityAndResult({
- {formatNumber(quantity)} × {formatCurrency(priceData.unit_price)} + {formatNumber(quantity)} × {formatCurrency(priceData.unit_price)} (Faixa {priceData.tier_used}) {formatCurrency(priceData.subtotal_pecas)} @@ -283,7 +283,7 @@ export function QuantityAndResult({ {/* Info box sobre a lógica v5.1 */} {priceData && (
-

📊 Sistema de Preços v5.1

+

📊 Sistema de Preços v5.1

O setup é aplicado como faturamento mínimo, não é somado ao total. Se o subtotal das peças for menor que o mínimo, o total será igual ao faturamento diff --git a/src/components/pricing/simulator/TechniqueSelector.tsx b/src/components/pricing/simulator/TechniqueSelector.tsx index 9980b25c9..113f99f84 100644 --- a/src/components/pricing/simulator/TechniqueSelector.tsx +++ b/src/components/pricing/simulator/TechniqueSelector.tsx @@ -222,7 +222,7 @@ export function TechniqueSelector({

{loc.name}

{maxWidth && maxHeight ? `${maxWidth}x${maxHeight}mm` : 'Área variável'} - {' • '} + {' • '} {loc.techniques.length}{' '} {loc.techniques.length === 1 ? 'técnica' : 'técnicas'}

@@ -260,8 +260,8 @@ export function TechniqueSelector({

{tech.areaName || tech.techniqueCode}

{tech.techniqueCode && `Código: ${tech.techniqueCode}`} - {tech.maxColors && ` • Até ${tech.maxColors} cores`} - {tech.areaCm2 && ` • ${tech.areaCm2}cm²`} + {tech.maxColors && ` • Até ${tech.maxColors} cores`} + {tech.areaCm2 && ` • ${tech.areaCm2}cm²`}

diff --git a/src/hooks/voice/logVoiceCommand.ts b/src/hooks/voice/logVoiceCommand.ts index 8554cc850..12cdf0d0c 100644 --- a/src/hooks/voice/logVoiceCommand.ts +++ b/src/hooks/voice/logVoiceCommand.ts @@ -1,6 +1,6 @@ /** - * logVoiceCommand — Logs a voice command to the database for analytics. - * Fire-and-forget — does not throw or block the UI. + * logVoiceCommand — Logs a voice command to the database for analytics. + * Fire-and-forget — does not throw or block the UI. */ import { supabase } from '@/integrations/supabase/client'; import type { VoiceAgentAction } from './types'; @@ -9,7 +9,7 @@ export function logVoiceCommand( action: VoiceAgentAction, meta: { transcript: string; durationMs?: number; success?: boolean }, ) { - // Fire and forget — don't await, don't block + // Fire and forget — don't await, don't block (async () => { try { const { @@ -27,7 +27,7 @@ export function logVoiceCommand( success: meta.success ?? true, }); } catch { - // Silent — analytics should never break UX + // Silent — analytics should never break UX } })(); } diff --git a/src/hooks/voice/processTranscript.ts b/src/hooks/voice/processTranscript.ts index bd353eaa9..3646e48f0 100644 --- a/src/hooks/voice/processTranscript.ts +++ b/src/hooks/voice/processTranscript.ts @@ -2,7 +2,7 @@ import type { VoiceAgentAction } from './types'; /** - * processVoiceTranscript — Sends transcript to AI and returns structured action. + * processVoiceTranscript — Sends transcript to AI and returns structured action. * Uses fetch with AbortController for proper timeout support (15s). */ export async function processVoiceTranscript(transcript: string): Promise { diff --git a/src/lib/kit-builder/price-calculator.ts b/src/lib/kit-builder/price-calculator.ts index cd2eae2c5..b51e7902a 100644 --- a/src/lib/kit-builder/price-calculator.ts +++ b/src/lib/kit-builder/price-calculator.ts @@ -6,7 +6,7 @@ import type { KitItem, KitBox, KitPersonalization } from './types'; // ============================================ -// CÁLCULOS DE PREÇO +// CÁLCULOS DE PREÇO // ============================================ /** @@ -107,7 +107,7 @@ export function calculateSavings( } // ============================================ -// FORMATAÇÃO +// FORMATAÇÃO // ============================================ // Import + re-export from centralized format module @@ -123,7 +123,7 @@ export function formatUnitPrice(total: number, quantity: number): string { } // ============================================ -// BREAKDOWN DO PREÇO +// BREAKDOWN DO PREÇO // ============================================ export interface PriceBreakdownItem { @@ -157,7 +157,7 @@ export function generatePriceBreakdown( // Personalização da caixa if (personalization.box.enabled && personalization.box.estimatedPrice) { breakdown.push({ - label: `↳ Gravação: ${personalization.box.techniqueName || 'Personalização'}`, + label: `↳ Gravação: ${personalization.box.techniqueName || 'Personalização'}`, quantity: kitQuantity, unitPrice: personalization.box.estimatedPrice, totalPrice: personalization.box.estimatedPrice * kitQuantity, @@ -180,7 +180,7 @@ export function generatePriceBreakdown( const itemPersonalization = personalization.items[item.id]; if (itemPersonalization?.enabled && itemPersonalization.estimatedPrice) { breakdown.push({ - label: `↳ Gravação: ${itemPersonalization.techniqueName || 'Personalização'}`, + label: `↳ Gravação: ${itemPersonalization.techniqueName || 'Personalização'}`, quantity: totalQty, unitPrice: itemPersonalization.estimatedPrice, totalPrice: itemPersonalization.estimatedPrice * totalQty, diff --git a/src/lib/kit-builder/volume-calculator.ts b/src/lib/kit-builder/volume-calculator.ts index 7baf411d6..341c8a650 100644 --- a/src/lib/kit-builder/volume-calculator.ts +++ b/src/lib/kit-builder/volume-calculator.ts @@ -50,7 +50,7 @@ export function calculateVolumeUsagePercent(itemsVolume: number, boxVolume: numb } // ============================================ -// VALIDAÇÕES +// VALIDAÇÕES // ============================================ /** @@ -116,7 +116,7 @@ export function isAtCapacity(usagePercent: number): boolean { } // ============================================ -// FORMATAÇÃO +// FORMATAÇÃO // ============================================ /** @@ -157,12 +157,12 @@ export function getVolumeStatusLabel(percent: number): string { } // ============================================ -// PARSING DE DIMENSÕES +// PARSING DE DIMENSÕES // ============================================ /** * Tenta extrair dimensões de uma string de dimensões - * Formatos suportados: "10x20x5", "10 x 20 x 5", "10×20×5" + * Formatos suportados: "10x20x5", "10 x 20 x 5", "10×20×5" */ export function parseDimensionsString( dimensionsStr: string | null | undefined, @@ -174,7 +174,7 @@ export function parseDimensionsString( .toLowerCase() .replace(/\s+/g, '') .replace(/\u00d7/g, 'x') - .replace(/×/g, 'x') + .replace(/×/g, 'x') .replace(/cm/g, ''); // Tenta match com padrão NxNxN diff --git a/src/lib/personalization/transformers.ts b/src/lib/personalization/transformers.ts index d4d2b9ae5..8f1b8b6e1 100644 --- a/src/lib/personalization/transformers.ts +++ b/src/lib/personalization/transformers.ts @@ -19,7 +19,7 @@ import type { } from '@/types/tecnica-unificada'; // ============================================ -// RAW DB → PORTUGUESE DOMAIN TYPES (para hooks) +// RAW DB → PORTUGUESE DOMAIN TYPES (para hooks) // ============================================ /** diff --git a/src/pages/auth/Auth.tsx b/src/pages/auth/Auth.tsx index 199fbd111..69b8c32bf 100644 --- a/src/pages/auth/Auth.tsx +++ b/src/pages/auth/Auth.tsx @@ -87,7 +87,7 @@ export default function Auth() { const [blockedIP, setBlockedIP] = useState(null); const [currentIP, setCurrentIP] = useState(null); const [geoLocation, setGeoLocation] = useState(null); - // Fallback social → email/senha: mensagem amigável quando OAuth falha. + // Fallback social → email/senha: mensagem amigável quando OAuth falha. const [socialError, setSocialError] = useState(null); // External Database Check State @@ -138,7 +138,7 @@ export default function Auth() { const copy = resolveOAuthError(message); setSocialError(copy); // Fallback automático em falhas recuperáveis (timeout/silencioso): - // o usuário não precisa clicar — o foco vai direto pro e-mail. + // o usuário não precisa clicar — o foco vai direto pro e-mail. if (opts?.autoFallback && !copy.isConfig) { toast({ title: 'Login com Google indisponível', @@ -336,14 +336,14 @@ export default function Auth() {

{description}

- DIAGNÓSTICO: {diagnosis} + DIAGNÓSTICO: {diagnosis}
), @@ -746,7 +746,7 @@ export default function Auth() { id="login-password" data-testid="login-password-input" type={showPassword ? 'text' : 'password'} - placeholder="••••••••" + placeholder="••••••••" autoComplete="current-password" className="border-white/10 bg-white/5 pl-10 pr-10 transition-all duration-300 placeholder:text-white/20 focus:border-primary/50 focus:ring-primary/20" {...loginForm.register('password')} @@ -849,7 +849,7 @@ export default function Auth() {
)} - {/* Backend Status Widget — apenas visível para devs (gate via useDevGate) */} + {/* Backend Status Widget — apenas visível para devs (gate via useDevGate) */} {isDevAllowed && (