import { clsx, type ClassValue } from 'clsx'; import { twMerge } from 'tailwind-merge'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } /** * Fecha de HOY en horario local (YYYY-MM-DD). * No usar `new Date().toISOString().split('T')[0]`: convierte a UTC y, en la * zona de la clínica (Tijuana, UTC-7/-8), a partir de las 16/17 h devuelve el * día siguiente, con lo que los módulos mostraban "sin datos del día". */ export function todayLocal(d: Date = new Date()): string { const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); return `${y}-${m}-${day}`; } type CsvCell = string | number | boolean | null | undefined; /** * Descarga un CSV (UTF-8 con BOM para que Excel respete acentos). * Cada fila es un arreglo de celdas; se escapan comillas automáticamente. */ export function downloadCsv(filename: string, rows: CsvCell[][]) { const csv = rows .map((row) => row.map((cell) => `"${String(cell ?? '').replace(/"/g, '""')}"`).join(',')) .join('\r\n'); const blob = new Blob(['\uFEFF' + csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }