Saltar al contenido
El Muestrario
08

Utilidades

utils · Utilidades

75 exports

Formateo, fechas, moneda y helpers de clases. Aburrido y crítico: la mitad de los bugs de presentación son una fecha o un número formateado de dos maneras distintas.

entrada: '2026-08-22' (sáb 22 de agosto, sin hora)

funciónfirma usadasalida
formatDate(fecha, 'es-AR')22 de ago de 2026
formatDateShort(fecha, 'es-AR')22-ago
formatShortDate(fecha)22 ago 26
formatDateCompact(fecha, 'es-AR')22/08/26
formatDateTime(fecha, 'es-AR')22/8/2026, 12:00:00
formatDateTimeShort(fecha, 'es-AR')22/08/2026 00:00
toDateInputValue(fecha)2026-08-22

en rojo: le restan un día a la entrada, o convierten la ausencia de hora en "09:00:00".

funciónentradasalida
formatDate'2026-08-22' (string)22 de ago de 2026
formatDatenew Date(2026, 7, 22)22 de ago de 2026
formatDateShort'2026-08-22' (string)22-ago
formatDateShortnew Date(2026, 7, 22)22-ago
funciónentradasalida
formatCurrency1.500 (ARS, es-AR, 0 dec)$ 1.500
formatCurrency1.500 (default: sin pasar nada)1500,00 €
formatCurrency0 (ARS)$ 0
formatCurrency-85.000, reembolso (ARS)-$ 85.000
formatCurrencynull (ARS)
formatCurrencyundefined (default)
formatCurrency128.450.000, franquicia (ARS)$ 128.450.000
formatCurrencyCompact1.500 (ARS)1,5 mil ARS
formatCurrencyCompact12.500.000 (ARS)12,5 M ARS

en rojo: al default (EUR, símbolo €) se le cae el separador de miles en montos de 4 cifras, y la versión compacta no conoce el símbolo $ aunque se le pase ARS.

funciónentradasalida
formatDuration135 min2h15m
formatDurationMinutes135 min2h 15min
formatDurationMs135 min → 8.100.000 ms2.25 h
formatDuration0 min<1m
formatDurationMinutes0 min0min
formatDurationMs0 ms-
formatDurationMinutes-30 min (dato corrupto)-1h -30min
formatDuration-30 min (mismo dato corrupto)<1m

los mismos 135 minutos: "2h15m", "2h 15min" y "2.25 h" — tres formas sin relación visual entre sí.

funciónentrada fijasalida
formatRelativeTime2026-08-18ayer
formatTimeAgo2026-08-18Ayer
timeAgo2026-08-181d ago
formatRelativeTime2026-07-01hace 1mes
formatTimeAgo2026-07-011 meses
timeAgo2026-07-011mo ago

timeAgo responde en inglés en un archivo por lo demás en español; formatTimeAgo pluraliza "1 meses". El texto exacto se corre con el calendario real — es el comportamiento esperado de una función relativa, no un mismatch de hidratación.

entrada (110 caracteres): Salón de eventos Los Álamos — locación completa con terraza, cocina industrial y estacionamiento para 40 autos

maxLenentradatruncate(str, maxLen)
20descripción de arribaSalón de eventos Lo…
40descripción de arribaSalón de eventos Los Álamos — locación …
80descripción de arribaSalón de eventos Los Álamos — locación completa con terraza, cocina industrial …
200más corta que el límiteSalón de eventos Los Álamos — locación completa con terraza, cocina industrial y estacionamiento para 40 autos
40null(cadena vacía)
40undefined(cadena vacía)
40'' (string vacío)(cadena vacía)
funciónentradasalida
formatTokens0 tokens0
formatTokens1.234 tokens (msj. de Lucy)1.2K
formatTokens3.400.000 tokens (consumo del mes)3.4M
formatTokensNaN (dato corrupto)NaN
formatTokens-500 (dato corrupto)-500
formatDayCount0.5 días<1d
formatDayCount14 días (próximo pedido de insumos)14d
formatDayCount45 días2mo
formatDayCount400 días1y
formatDayCountNaN (dato corrupto)NaNy
entradaformatPhoneDisplaynormalizePhoneisValidPhoneextractCountryCode
+5493511234567+549 3511234567+5493511234567true549
351123456735112345673511234567truenull
(vacío)(cadena vacía)nullfalsenull
null(cadena vacía)nullfalsenull
reservas@losalamosreservas@losalamosnullfalsenull

Heladería Luigi

#d4e038 · claro · oscurecido #7f8622

accent
text
bgSubtle
bgMedium
border
button
buttonText

Charter del Sur

#0f4c5c · oscuro · oscurecido #092e37

accent
text
bgSubtle
bgMedium
border
button
buttonText

Salón Los Álamos

#c2410c · oscuro · oscurecido #742707

accent
text
bgSubtle
bgMedium
border
button
buttonText
cn(...)contextoclase resultante
cn('px-2 py-1', 'px-4')padding en conflictopy-1 px-4
cn('bg-container', 'bg-upper')fondo en conflictobg-upper
cn('text-content/50', 'text-primary')color de texto en conflictotext-primary
cn('border-content/10', activo && 'border-primary')activo = trueborder-primary
cn('border-content/10', activo && 'border-primary')activo = falseborder-content/10

6 piezas de Utilidades que GestorSalon usa y esta galería no mostraba

Medido, no elegido: sale de cruzar los 254 símbolos del kit que aparecen en el código de GestorSalon contra los que estos especímenes montaban. Cada ficha trae el especificador de import y las props que el producto realmente le pasa.

SEASON_COLORS

@solu30/ui-kit/utils0 usos · 3 archivos

La paleta de temporadas y la función que elige el próximo color libre. Sin ella, cada vertical inventa su propio arreglo de colores y dos temporadas terminan del mismo color.

1 en uso · el próximo libre que devuelve el kit es #10B981

Los ocho hex de la paleta son el ÚNICO lugar del kit donde el color se escribe como valor y no como token, y es a propósito: una temporada es un dato que se guarda en la base de datos y tiene que sobrevivir a un cambio de tema. Igual sale del paquete, no de cada vertical.

parseMonthDay

@solu30/ui-kit/utils2 usos · 1 archivos

Lee un «mes-día» sin año (una temporada que se repite) o con año (una fecha puntual). `isConsistentYearing` valida la regla que nadie recuerda: o los dos extremos tienen año, o ninguno.

parseMonthDay(«12-01») → mes 12, día 1, sin año

parseMonthDay(«2027-01-01») → mes 1, día 1, año 2027

isConsistentYearing(12-01, 03-15) → true · los dos sin año, la temporada se repite todos los años

isConsistentYearing(2027-01-01, 03-15) → false · uno con año y el otro sin año es la combinación inválida

`parseMonthDay` LANZA con una entrada inválida — no devuelve null. Para input de usuario va `tryParseMonthDay`, que devuelve `undefined`. GestorSalon usa la que lanza; vale la pena mirar dónde.

selectCls

@solu30/ui-kit/utils0 usos · 1 archivos

La cadena de clases del kit para un `<select>` nativo. No es un componente y por eso nunca aparece en un catálogo de componentes — que es exactamente por qué se reescribe a mano.

Un `<select>` nativo de verdad, con la cadena de clases del kit. Es la salida honesta cuando no hace falta el `Select` compuesto: teclado, accesibilidad y menú nativo del sistema gratis, y el aspecto igual al resto. Lo que no hay que hacer es un select nativo SIN esto, que es como quedan los nueve que tiene GestorSalon hoy.

Las tres que quedan

`getNextSeasonColor` e `isConsistentYearing` están corriendo en los especímenes de arriba. `ContrastColors` no es un valor: es el tipo que devuelve `getContrastColors`, el helper que elige texto claro u oscuro sobre un color de fondo arbitrario — el que evita que el nombre de una temporada quede ilegible sobre su propio color.

SímboloDe dóndeUsosProps que le pasa GestorSalon
getNextSeasonColor@solu30/ui-kit/utils2
isConsistentYearing@solu30/ui-kit/utils1
ContrastColorssólo tipo0