Saltar al contenido
El Muestrario

El registro

Todas las versiones publicadas de @solu30/ui-kit, leídas del paquete instalado en este repositorio. Está ordenado para una pregunta: tengo una versión clavada en mi package.json, quiero ir a la 7.0.0, y necesito saber qué cambió en el medio y qué de eso me rompe. Lo que rompe está acá arriba; el resto va del más nuevo al primero.

Versiones
186
Instalada acá
7.0.0
Rompen
9
Con cuerpo entero
17
01

Las 17 con cuerpo entero

Dos criterios, los dos atados a la pregunta de arriba. Va entero todo release que declara ruptura, sea de cuando sea: si tu salto cruza uno, lo tenés que leer completo antes de estimar nada. Y va entera la línea 7.x, la que se instala hoy, que es el tramo que la mayoría va a recorrer. Entero quiere decir el cuerpo del changeset como se escribió al publicar, con su racional y su verificación adentro.

17 de 186 con cuerpo entero. El corte es de largo: las 403 entradas suman 239.900 caracteres de markdown, y una lista de ese tamaño se recorre peor que un índice. Las otras 169 están abajo con su tipo de cambio y su primera línea. Cada hueco de esta lista dice cuántas versiones se salteó.

  1. 7.0.0

    Mayor1 entrada#

    Toolbar sale del barril (ADR-366). 0 archivos en 15 verticales: era la única borrable de las 26 piezas medidas, y perdió contra toolbar?: ReactNode como slot. TabbedPanel.Toolbar no es esto y se queda. No hay re-export de compatibilidad: con 0 consumidores, un alias deprecado sería superficie muerta nueva. Migración: no hay nada que migrar.

    El texto sobre bg-primary deja de ser blanco fijo y pasa a text-primary-foreground, el ink que cada tema fija junto a su fondo (ADR-367, @solu30/tailwind-preset ≥ 0.8.0). Blanco sobre el cyan por defecto daba 2.43:1 — el 100% de los nodos bajo AA que mide el Muestrario sobre 33 rutas × 2 esquemas. Son 39 call-sites: Button, Badge, IconButton, Avatar, Calendar, Checkbox, SegmentedControl, StepIndicator, Wizard, TimePicker, MobileBottomNav, LiquidTabBar y otros. Se ve distinto en las paletas cmp (claro y oscuro), luigi oscuro, raquetea oscuro, saloneventos oscuro y zentrya; en el resto el ink ya era el correcto.

    El rail plegado del ContextualSidebar no decía dónde estabas ni cómo se llamaba. En collapsedMode="sections" los ítems no se dibujan —la sección ES el destino— y ahí no se montaba el aria-current; y plegado, en las dos ramas, el botón es sólo el ícono, con el label únicamente en el tooltip. Ahora emite aria-current="page" y aria-label. Es el shell de Luigi y GestorSalon.

    Las flechas de SidebarNavGroups mueven el foco, no la página. El onKeyDown llamaba onItemClick con el ítem vecino en cada flecha: quien recorría la lista con el teclado terminaba en otra página sin haber elegido nada, y el recorrido arrancaba en el ítem activo en vez del enfocado. Enter/Space siguen navegando. Si algún consumidor dependía de que la flecha navegara, ese comportamiento ya no está.

    La familia de intents recibe el mismo par fondo/ink (ADR-368). Los tres que habían quedado afuera —blanco sobre success 2.54:1, sobre danger 3.76:1, y danger como texto— más los dos que aparecieron al medir la familia entera: blanco sobre warning da 2.15:1, el peor del sistema, y sobre info 3.68:1. 21 call-sites pasan a text-ui-<intent>-foreground y 52 de text-ui-error a text-ui-error-text, que es el rojo como TINTA (la superficie no se mueve). De paso entran dos que estaban fuera de la capa de tokens: bg-red text-white en form/inputs/button y bg-red-500 en SectionCard, este último además una violación de ADR-003. En el tema oscuro por defecto el texto sobre los cuatro intents pasa de blanco a near-black; en claro sólo cambia success.

    framer-motion sale del manifiesto. El CHANGELOG de 6.0.0 ya decía que salía de peerDependencies y de peerDependenciesMeta, y el código se hizo (ADR-341: cero imports en el dist, sólo comentarios que documentan la salida), pero el package.json no se actualizó: quedó declarada hasta la 6.3.0. Estaba marcada optional: true, así que ningún consumidor la instalaba a la fuerza ni recibía warning — era una declaración vencida, no una dependencia colgada. No hay acción para nadie: los diez repos que la tienen la declaran en sus propias dependencies y nueve la importan en su propio código. Sacar un peer opcional no cambia ninguna instalación.

    liquidTabBarVariants tiene descripción: era el único de los 531 símbolos del catálogo sin TSDoc.

  2. 6.3.0

    Menor1 entrada#

    LiquidTabBar (@solu30/ui-kit/navigation) — barra de navegación cuyo borde superior se hunde bajo la pestaña activa, que viaja como una gota. El hundimiento es un solo path SVG con el socket resuelto por tangencia, así que se inclina hacia donde viaja y se estira con la velocidad; el bead también se puede arrastrar y calza en la pestaña más cercana al soltar. Sin dependencias nuevas y sin un setState por frame.

    Es el hermano con peso de marca de MobileBottomNav, no su reemplazo (ADR-365): 2 a 6 destinos, sin badges, sin overflow y sin scroll. Para la navegación de trabajo de un admin sigue siendo MobileBottomNav.

    API: items (con href/onClick y un accent opcional por sección), activeId o currentPath, onSelect, renderLink y draggable. Todo el color sale de los tokens del preset; respeta prefers-reduced-motion.

  3. 6.2.1

    Parche1 entrada#

    fix(VideoBackground): una medición degenerada dejaba el iframe en 0px y el reproductor de YouTube mostraba su pantalla de error.

    coverSize() devolvía { width: 0, height: 0 } cuando el contenedor todavía no tenía tamaño. Ese objeto es truthy, así que el componente lo tomaba por medición válida y servía width: 0px; height: 0px: un player colapsado, que YouTube renderiza como error. Ahora devuelve null y el tipo separa "no medí" de "mide cero".

    Además el iframe deja de esconderse con opacity: 0 hasta la primera medición. Sin medición cae a 100% —encuadra mal por un frame, pero se ve—; esconderlo convertía cualquier falla de medición en una portada sin video.

  4. 6.2.0

    Menor1 entrada#

    fix(VideoBackground): el encuadre del video embebido se calcula midiendo el contenedor, no declarándolo en CSS.

    La 6.1.1 dimensionaba el iframe con unidades de container query (100cqw / 56.25cqw / 177.78cqh / 100cqh sobre un container-type: size). En producción el iframe salió de 655px de ancho dentro de un hero de 1440: banda negra a los dos lados y el reproductor de YouTube en su layout compacto de tres botones, o sea peor que el 100% x 100% que venía a arreglar. Es el segundo intento declarativo que se cae; antes fue scale-150.

    Ahora un ResizeObserver mide el contenedor y coverSize() devuelve el tamaño en píxeles que lo cubre manteniendo la relación del video. El iframe queda oculto hasta la primera medición para no mostrar un encuadre equivocado durante un frame. Los tests dejan de afirmar sobre el string del style —que es lo que dejó pasar la regresión— y afirman sobre la geometría resultante.

    API: nueva prop opcional aspectRatio (default 16/9) para videos que no son apaisados. Aditiva; ningún consumidor necesita cambiar.

  5. 6.1.1

    Parche1 entrada#

    fix(VideoBackground): el video embebido de YouTube/Vimeo cubre el contenedor sin bandas negras. El iframe se estiraba a 100% x 100%, y en un contenedor más ancho que 16:9 el reproductor encajaba el video adentro rellenando los lados con negro; el scale-150 que había encima agrandaba video y bandas por igual y servía el video ampliado un 50%. Ahora el iframe mantiene 16:9 y desborda el contenedor —que ya recorta con overflow-hidden— usando unidades de container query (container-type: size en el contenedor), así que el encuadre es correcto tanto en un hero de alto completo como en uno mediano. Sin cambios de API.

  6. 6.1.0

    Menor1 entrada#

    Intent tints ui-{success,warning,error,info}-{bg,border}: classes like bg-ui-success-bg and border-ui-error-border now resolve in cmpPreset and the TW4 @theme. They were already named in INTENT_CLASS_NAMES and compiled to no-ops. Additive; STATUS_COLORS unchanged.

  7. 6.0.1

    Parche1 entrada#

    InfoTooltip y el MicroToast de ToastProvider eran ilegibles en dark mode: texto blanco fijo (text-white) sobre un fondo (bg-content) que en ese tema invierte a un tono casi blanco, quedando blanco sobre blanco. bg-content es el token de fondo invertido, no el de texto — en light --content es casi negro y el bug no se veía. La cura es la que Tooltip ya usaba: text-bkg, que invierte junto con bg-content y mantiene contraste en ambos temas. Sin cambios de API ni de markup.

  8. 6.0.0

    Mayor2 entradas#

    El kit deja de depender de framer-motion y retira las ocho primitivas de motion que no importaba nadie (ADR-341).

    Se retiran del barrel público: BorderTrail, MorphingDialog —con sus siete partes: MorphingDialogClose, MorphingDialogContainer, MorphingDialogContent, MorphingDialogImage, MorphingDialogSubtitle, MorphingDialogTitle, MorphingDialogTrigger—, ScrollProgress, Spotlight, TextEffect, TextLoop, TextShimmer y TransitionPanel. Sobreviven SlidingNumber, ProgressiveBlur e InfiniteSlider.

    framer-motion sale de peerDependencies y de peerDependenciesMeta. Ningún archivo de src/ la importa. Lo que sí se usaba se portó a CSS con el vocabulario de movimiento que el kit ya tenía: el indicador que se desliza entre pestañas (Tabs, TabbedPanel) pasa a transform/width medidos con getBoundingClientRect(), y Collapse anima el alto desconocido con grid-template-rows: 0fr → 1fr. prefers-reduced-motion tiene su rama en cada animación portada — es piso de safety y no se simplificó.

    Los tipos Transition y Variants que tokens/animations.ts y tokens/motion-vocabulary.ts importaban de la librería ahora se declaran estructuralmente en el kit. Los objetos se siguen exportando igual: un vertical que sí use framer-motion los consume sin cambios.

    Por qué es major y no patch. Medido contra las tres poblaciones del ecosistema —los verticales, los packages @solu30/* y el kit por dentro— los ocho símbolos no tienen un solo consumidor. Igual borrar un export público es un breaking change: la versión es un contrato sobre la superficie, no sobre quién la usa hoy.

    Migración. Un consumidor de los ocho: no hay reemplazo uno a uno en el kit, el componente se reimplementa con el vocabulario CSS (CSS_TRANSITIONS, DATA_STATE_ANIMATIONS) o se queda en ^5. Un consumidor que instalaba framer-motion sólo porque el kit la declaraba: puede sacarla. El Muestrario (ui.martinpavon.com) tiene que regenerar su catálogo — los ocho tenían ficha y ejemplo, y tres de ellos siguen importados en sus especímenes.

    El kit suelta cuatro peerDependencies que ya no usa: leaflet, react-leaflet, recharts y date-fns. Cero cambio de código y cero cambio de superficie pública — son declaraciones muertas, no piezas.

    Las cuatro son residuo del split del god-package (ADR-219), que extrajo ./geo a @solu30/ui-geo y los charts a @solu30/ui-charts. El código se fue, los peers quedaron. Medido contra src/ completo, sin contar tests:

    leaflet         0 archivos
    react-leaflet   0 archivos
    date-fns        0 archivos
    recharts        1 archivo — y es un COMENTARIO de migración,
                    subpath-barrels/data-display.ts:87
    

    Ninguno rompe nada al irse: los cuatro estaban en peerDependenciesMeta como optional, así que ningún consumidor los resolvía a través del kit. Un vertical que use mapas o gráficos ya los declara por su cuenta o los toma de @solu30/ui-geo / @solu30/ui-charts.

    Lo que sí cambia es lo que el manifiesto AFIRMA. Un peer huérfano miente sobre lo que el paquete necesita, y en un kit que 13 verticales y 39 packages consumen esa mentira se lee como «el ui-kit quiere Leaflet». Los peers pasan de 12 a 8, y los únicos obligatorios quedan react y react-dom, que es lo que un ui-kit debería pedir y nada más.

    Pedido de Martín, 2026-08-26: «elimina leaflet del kit, eso no va acá».

  9. 5.15.0

    Menor1 entrada#

    Un className="truncate" ahora corta de verdad, aunque el slot traiga text-balance o text-pretty.

    No cortaba. truncate y text-balance no estaban en el mismo grupo de tailwind-merge, así que las dos clases sobrevivían al merge y cuál pintaba lo decidía el orden de la hoja compilada, no el del argumento. Y ese orden juega en contra: en Tailwind v4 .truncate sale ANTES que .text-balance, y como text-wrap es shorthand de text-wrap-mode, el slot le devolvía el wrap al white-space: nowrap. El consumidor pedía una línea y recibía un párrafo — el síntoma reportado fue un header de sheet ocupando media pantalla.

    El arreglo va en el merge, no en los componentes: cn y tv comparten una extensión de tailwind-merge que declara el grupo text-overflow en conflicto con el grupo text-wrap. Cubre de una a todos los slots del kit con esa tipografía de arranque —Sheet, Dialog, AlertDialog, Wizard, ErrorBoundary, Field, HeaderBar, Card— y a los que se agreguen después. El text-balance se conserva intacto cuando nadie lo pisa, que es para lo que está.

    Es un cambio de comportamiento del merge, no de API: nada que compilara antes deja de compilar. Lo único que cambia es que ahora gana la clase que pasaste vos. Ver ADR-341.

  10. 5.14.0

    Menor1 entrada#

    OptionCard.description y OptionCardItem.description pasan de string a ReactNode.

    El slot description es mt-0.5 text-xs text-content/60 y el className del componente rutea al slot root, no a él: con string un consumidor no tenía ninguna vía de darle forma a esa línea sin reimplementar la card por fuera del kit. Lo pidió el wizard de cobranzas de GestorSalon, donde el precio por entrada necesita dos números con jerarquía distinta.

    Ensancha el tipo, no lo rompe: string es asignable a ReactNode, así que todos los consumidores actuales siguen compilando sin cambios. ADR-338.

  11. 23 versiones entre medio, en el índice

    5.0.0

    Mayor1 entrada#

    EmptyState deja de importar lucide-react de cualquier forma — ni estática, ni dinámica (React.lazy) — así que iconName se resuelve por inyección, no por lazy-load. Mismo mecanismo que KPICardGrid desde 4.19.0, ver ADR-194 (sección "Reincidencia #3 — 2026-08-11").

    El problema que corrige: el React.lazy(() => import("./LucideDynamicLoader")) que EmptyState usaba desde 2026-06-20 (ADR-194 original) parecía gratis — no toca el First Load JS — pero un bundler de producción materializa ese chunk SIEMPRE, se use iconName o no. Medido en GestorSalon: ~620 KB en el build de producción, en un repo con 142 usos de EmptyState y cero consumidores de iconName.

    El breaking change:

    • EmptyStateProps gana resolveIcon?: (name: string) => React.ComponentType<{ className?: string }> | undefined. EmptyStateAction.iconName usa el mismo resolver inyectado en el padre.

    • Sin resolveIcon, un iconName (en EmptyState o en action(s)) no renderiza ningún ícono — no rompe el layout, pero deja de mostrarse. Antes se resolvía solo, vía el mapa completo de lucide-react cargado lazy.

    • Para la DX anterior ("cualquier ícono de Lucide por nombre"), importar resolveLucideIcon desde @solu30/ui-kit/dynamic-icon y pasarlo:

      import { resolveLucideIcon } from "@solu30/ui-kit/dynamic-icon";
      
      <EmptyState
        iconName="package"
        resolveIcon={resolveLucideIcon}
        title="Sin resultados"
      />;
      

    Migración: en cada <EmptyState iconName="..." .../> o action={{ iconName: "...", ... }}, agregar resolveIcon={resolveLucideIcon} (import de @solu30/ui-kit/dynamic-icon) al EmptyState padre.

    Relevamiento de consumidores (ver ADR-194 para el detalle completo): luigi tiene ~142 usos de iconName en 87 archivos; carlosmartinpavon tiene 1 (apps/web/src/app/lab/page.tsx). Ambos ya migrados en este mismo lote (ver commits de luigi y carlosmartinpavon). Dentro de este monorepo, packages/social (10 usos en 8 archivos) también se migró en el mismo lote.

    Aviso en desarrollo: si un iconName queda sin resolveIcon (o resolveIcon no resuelve ese nombre), EmptyState avisa por console.warn solo en NODE_ENV !== 'production' (deduplicado por nombre) — cero costo en producción, para que la regresión no sea silenciosa.

    LucideDynamicLoader.tsx fue removido (sin consumidores tras el fix).

  12. 30 versiones entre medio, en el índice

    4.0.0

    Mayor1 entrada#

    F2.5 (ADR-229): remoción física de la superficie @deprecated marcada por F2 (ADR-225/226). Se eliminan ~130 exports sin consumidores, verificados dependency-aware: 0 consumidores en los 11 verticales (consumer-imports.json) + 0 uso interno vivo (gate cross-file) + mapa de dependencias de exports vivos para no romper componentes que referencian types internamente. Wholesale: 46 archivos 100% muertos borrados (compat shims, hooks/utils/components huérfanos) + limpieza de barrels. Surgical: types/variants deprecados removidos de archivos mixtos preservando el export vivo (Toolbar, ActivityTimeline, useFloatingPosition, useModalWithBack, Z_INDEX…); los types usados internamente se des-exportan (quedan privados) en vez de borrarse. Subpath ./compat eliminado (barrel vacío, 0 consumidores). Neto ~−5.300 LOC. Breaking por contrato semver aunque el set tiene 0 consumidores conocidos; los verticales suben de 3.x a 4.x a su ritmo (F1). No toca el subsistema command/CommandPalette ni el leakage de dominio vivo (queda para F4).

  13. 2 versiones entre medio, en el índice

    3.0.0

    Mayor6 entradas#

    Split del god-package (ADR-220, F3): el subpath @solu30/ui-kit/charts (charts analytics + recharts) se extrae al package 2-domain @solu30/ui-charts. El kit deja de exportar ./charts (breaking) y suelta el peer recharts. Migración: @solu30/ui-kit/charts → @solu30/ui-charts (símbolos idénticos). Consumidor interno marketing-admin ya migrado. Mecánica member→root (ui-charts importa Card/Badge/Skeleton/Popover/Table de @solu30/ui-kit), sin ciclo. Guía: docs/migration/ui-kit-3.0.md.

    Split del god-package (ADR-221, F3): el DataTable headless + shell + hooks/filters/variants se extrae del barrel raíz @solu30/ui-kit al package 2-domain @solu30/ui-data-table. El kit deja de exportar los símbolos data-table por data-display.ts y components/index.ts (breaking); los primitivos Table/TableHeader/EmptyState de bajo nivel permanecen. member→root (importa tv/cn de @solu30/ui-kit/utils, useClickOutside de @solu30/ui-kit/hooks), sin ciclo. Migración: import { DataTable } from '@solu30/ui-kit' → from '@solu30/ui-data-table' (símbolos idénticos). Los 9 consumidores internos ya migrados; las 7 verticales van a la guía docs/migration/ui-kit-3.0.md.

    Split del god-package (ADR-219, F3): el subpath @solu30/ui-kit/geo (GeoMap + Leaflet/react-leaflet) se extrae al package 2-domain @solu30/ui-geo. El kit deja de exportar ./geo (breaking) y suelta los peers leaflet/react-leaflet. Migración de import: @solu30/ui-kit/geo → @solu30/ui-geo (símbolos idénticos, sin renames). Guía: docs/migration/ui-kit-3.0.md. Mecánica member→root (ui-geo importa cn+Skeleton de @solu30/ui-kit), sin ciclo (ADR-017).

    ActivityTimeline: las entradas con action: 'field_updated' ahora aceptan details.changes: ActivityTimelineFieldChange[] para pintar varios diffs de campo (field/oldValue/newValue) apilados dentro de la misma entrada, en vez de forzar al consumidor a emitir una entry separada por campo cambiado (motivo repetido N veces cuando un solo evento tocaba varios campos).

    Aditivo y retrocompatible: el details.field/oldValue/newValue singular existente sigue funcionando igual para todos los consumidores actuales. Precedencia: si details.changes viene no-vacío, gana sobre el singular (que queda @deprecated mas no se remueve). Nuevo tipo exportado: ActivityTimelineFieldChange.

    Nuevo export público headless SidebarNavGroups (+ tipo SidebarNavGroupsProps), extraído del renderer interno de SidebarNavigation (ADR-223). Permite a hosts con chrome propio (AdminLayout del CMP: aside + toggle + drawer) renderizar solo la lista de items — grupos, childGroups drill-in, badges, roving arrow-key nav sobre top-level — sin anidar un segundo sidebar auto-contenido. SidebarNavigation ahora lo consume internamente (desktop + drawer mobile): cero cambio de comportamiento para consumidores actuales. Prop ariaLabel? (default "Sidebar navigation") override-able para componer múltiples instancias sin violar landmark-unique (a11y). Gate /adversarial --mode redblue 2026-07-17: SHIP WITH FIXES (aria-label override + JSDoc honesto), equivalencia de branches de label verificada por absorción booleana.

    Build plumbing fix, no consumer-facing change: the build script now invokes node --max-old-space-size=8192 directly against tsup's CLI (node_modules/tsup/dist/cli-default.js) instead of the plain tsup binary. This is a workaround for a CI-only OOM (ERR_WORKER_OUT_OF_MEMORY generating .d.ts for the package's 29 entry points) — NODE_OPTIONS configures the main process's V8 isolate but doesn't populate process.execArgv, and worker_threads inherit execArgv, not NODE_OPTIONS, so the DTS worker never saw the heap flag regardless of its value. Passing it as real argv fixes that. Published output (dist/**) is unaffected.

  14. 13 versiones entre medio, en el índice

    2.0.0

    Mayor1 entrada#

    feat(ui-calendar-grid): new leaf package for the headless calendar-grid engine, extracted from @solu30/ui-kit (ADR-160, supersedes ADR-043/ADR-044)

    Amendment 2026-07-11: renamed @solu30/calendar-grid → @solu30/ui-calendar-grid and moved to packages/ui/2-domain/calendar-grid/ pre-publish (ADR-160 amendment, ui-* naming convention) — the package never shipped to the registry, so this is a plain rename, not a breaking change to a published surface.

    Rationale (see ADR-160): MonthGrid, DayCell, EventChip, CalendarLegend, useCalendarNavigation (+ types) lived in @solu30/ui-kit foundation layer per ADR-043 as a headless cross-vertical primitive. It has 2 real consumers today, found via a symbol-by-symbol cross-repo grep (not just the composite BookingCalendar name, which is how the first pass under-counted): GestorSalon's booking-calendar-view.tsx (via <BookingCalendar>, event/venue booking) and luigi/apps/admin's employee-month-view.tsx (via MonthGrid + CalendarLegend + useCalendarNavigation directly, no <BookingCalendar> — an HR attendance view, unrelated to booking domain). No other vertical imports any of these symbols (TheCharterPanel, easycharter, prepchat, dietaly, EasyYachts, pagebuilder, elliot, zentrya, carlosmartinpavon — all checked, all clean).

    A first iteration of this changeset moved everything into @solu30/booking-system (already the domain package for booking). Escalated to Martín with 3 options once the non-booking consumer was found (move to booking-system / new leaf package / partial split); Martín chose a new leaf package, @solu30/ui-calendar-grid — his choice is the explicit OK for this package's alta (non-delegable). This avoids forcing luigi/apps/admin to adopt @solu30/booking-system's full peer-dependency contract (@trpc/server, drizzle-orm, framer-motion, qrcode.react) purely to render a calendar grid it doesn't otherwise need.

    New package: @solu30/ui-calendar-grid (minor, first release)

    Contains MonthGrid, DayCell, EventChip, CalendarLegend, useCalendarNavigation, plus types (CalendarEvent, StatusConfigEntry, StatusConfigMap, CalendarLegendItem, NavigationDirection, UseCalendarNavigationReturn) and pure date utilities. peerDependencies: react, react-dom, lucide-react, and @solu30/ui-kit (only for the cn helper — no cycle). No @trpc/server/drizzle-orm/framer-motion/next. No naming collision here — CalendarEvent keeps its original name (the BookingCalendarEvent rename only applies at the @solu30/booking-system boundary, see below).

    Breaking change in @solu30/ui-kit (major)

    BookingCalendar, MonthGrid, DayCell, EventChip, CalendarLegend, useCalendarNavigation, and their associated types are removed from the @solu30/ui-kit root export. No re-export shim: @solu30/booking-system already depends on @solu30/ui-kit, so a shim would create a foundation→domain→foundation cycle. Migration:

    - import { BookingCalendar, type CalendarEvent } from "@solu30/ui-kit";
    + import { BookingCalendar } from "@solu30/booking-system";
    + import { type CalendarEvent, useCalendarNavigation, type StatusConfigMap, type CalendarLegendItem } from "@solu30/ui-calendar-grid";
    

    Additive change in @solu30/booking-system (minor)

    BookingCalendar (the composed, booking-flavored wrapper — same alwaysScroll/mobile-scroll design from ADR-043/ADR-044, same BookingCalendarProps public shape) stays here as src/components/BookingCalendar.tsx, now composing MonthGrid + CalendarLegend + date utilities from the new @solu30/ui-calendar-grid dependency instead of owning them as local files. New peerDependency: @solu30/ui-calendar-grid (optional: false, same treatment as @solu30/ui-kit). Internally aliases the leaf's CalendarEvent as BookingCalendarEvent to avoid confusion with this package's own CalendarEvent (the Google Calendar API event shape) — no actual compile collision today since the raw grid pieces are not re-exported from this package's root.

    Consumer impact

    2 real consumers today, both to be migrated as part of this release (working trees edited, uncommitted, not built/typechecked):

    • saloneventos (GestorSalon) booking-calendar-view.tsx — BookingCalendar from @solu30/booking-system; useCalendarNavigation, CalendarEvent, StatusConfigMap, CalendarLegendItem from @solu30/ui-calendar-grid. useIsMobile stays on @solu30/ui-kit (unrelated, not moved).
    • luigi/apps/admin employee-month-view.tsx — MonthGrid, CalendarLegend, useCalendarNavigation, CalendarEvent (no prefix — the BookingCalendarEvent rename does not apply outside booking-system), StatusConfigMap, all from @solu30/ui-calendar-grid directly. ChevronLeftIcon/ChevronRightIcon/EmptyState/IconButton/Spinner stay on @solu30/ui-kit.

    Gating: @solu30/ui-calendar-grid does not exist on the registry yet (new package) and the published @solu30/booking-system does not yet compose it. saloneventos and luigi will fail to build/typecheck against the current registry state — expected, and not fixed locally. Those two verticals' commits

    • lockfile bumps are gated to the coordinated publish sequence (ui-calendar-grid first release → booking-system minor → ui-kit major), which needs Martín's explicit OK — not part of this changeset.
  15. 31 versiones entre medio, en el índice

    1.0.0

    Mayor2 entradas#

    ui-kit 1.0.0 — SemVer estable (ADR-048). Salto de 0.x a 1.0.0 para cortar el peer-cascade de versionado: en 1.x los minors/patches de ui-kit dejan de arrastrar majors en los 41 packages que lo declaran como peerDependency. Esta versión no introduce breaking changes de API más allá de la estabilización; el major refleja el cruce de rango ^0.80 → ^1.0.

    Sheet: nuevo size xxl → max-w-5xl (1024px) + nueva prop keepMounted.

    • size="xxl": variante max-w-5xl en sheetVariants para editores de ancho amplio (e.g., InvoicesManager de @solu30/superadmin). ADR-045.
    • keepMounted?: boolean (default false): cuando es true, el contenido permanece montado en el DOM mientras el Sheet está cerrado. Útil para children con refs imperativos (useImperativeHandle / forwardRef) que deben mantenerse vivos antes de que el Sheet abra. Backwards-compatible: el comportamiento por defecto no cambia.

    BookingCalendar (MonthGrid + utils): la grilla renderiza solo las semanas que el mes necesita (5 o 6 filas), nunca una semana final compuesta enteramente por días del mes siguiente.

    • getDaysInMonth ahora rellena hasta completar la última semana parcial (Math.ceil(days.length / 7) * 7) en lugar de forzar siempre 42 celdas. Resultado: 35 celdas (5 semanas) en la mayoría de los meses y 42 (6 semanas) solo cuando el mes realmente se extiende a una sexta semana.
    • MonthGrid deriva gridTemplateRows de la cantidad real de filas (days.length / 7).

    DataTableShell: el slot root pasa a flex flex-col, habilitando que el slot content (flex-1 overflow-auto) llene el alto cuando el consumidor le da un alto definido (cadena flex / h-full). Retrocompatible: en usos de alto automático el stack vertical es idéntico. Habilita fill-height en ~20 listados de verticales.

  16. 12 versiones entre medio, en el índice

    0.72.0-pre.1

    Ruptura9 entradas#

    refactor(tokens): erradicación ABSOLUTA de /N opacity modifiers en todo src/ del kit (Pasada 2). Cero clases con alpha sufijo en producción — todos los tokens de opacidad migrados a sólidos semánticos o tokens horneados.

    All overlay classes (bg-black/50, bg-black/40, etc.) → bg-overlay (token --color-overlay: rgb(10 22 20 / 0.55) horneado en globals).

    All focus rings (ring-primary/50, ring-primary/20) → ring-ring (token --color-ring: var(--ui-accent) sólido).

    All error/warning rings (ring-yellow/40, border-yellow/40, border-red/50) → ring-ui-warning-border / ring-ui-error-border.

    All decorative gradients (from-primary to-primary/70) → two-stop solid (from-primary to-primary-hover).

    Editor tag polychrome colors → Tailwind scale solids (bg-amber-100 text-amber-800 ring-amber-300).

    Scroll fades via-container/80 → via-container.

    Shadow color tokens GLOW (shadow-primary/20) → shadow-lg (plain).

    Requires 3 new tokens in vertical globals: --color-overlay, --color-overlay-light, --color-ring (added in Dietaly globals.css).

  17. 0.72.0-pre.0

    Ruptura1 entrada#

    refactor(tokens): Pasada 1 — erradicación de /N en componentes principales (Card, inputs, borders). 907 → 190 ocurrencias.

58 versiones más viejas, en el índice

02

El índice: las otras 169

Del más nuevo al primero, agrupadas por línea mayor. Cada renglón trae el tipo de cambio —que es lo que separa un menor, con API nueva y migración posible, del ruido de parches— y la primera línea de la primera entrada. Ninguna de estas rompe: las que rompen están todas arriba, con cuerpo. Las 186 tienen ancla propia, esté su cuerpo desplegado o no: /kit/changelog#v7-0-0 lleva a la suya.

Línea 5.x23 versiones

  1. 5.13.2ParcheuseModalStack: el scroll lock deja de trabar la página cuando hay overlays anidados. Usaba '' como sentinela de "todavía no…
  2. 5.13.1ParcheInfoTooltip: el globo deja de salirse de la pantalla. Ahora se ancla al viewport — flip al lado opuesto cuando el pedido no…
  3. 5.13.0 — NO PUBLICADAMenorDos defectos que aparecieron escribiendo los @example de 5.12.1, uno de ellos con pérdida
  4. 5.12.1Parche152 @example escritos por USO REAL, no por cobertura: los símbolos ordenados por
  5. 5.12.0MenorLas props del kit que mentían quedan resueltas: una se implementa, cuatro se declaran muertas, una se documenta como lo que…
  6. 5.11.0MenorDos props más del kit que estaban declaradas y no hacían nada — la misma clase de defecto que TooltipProvider.delayDuration,…
  7. 5.10.5Parche133 símbolos del kit llegaban al .d.ts pelados: los 71 íconos, las 6 partes de Card, las 33 partes de los cinco overlays…
  8. 5.10.4ParcheOcho hooks tenían su documentación escrita y ningún consumidor la veía: el bloque JSDoc estaba arriba de los imports, como…
  9. 5.10.3ParcheVersión publicada en npm el 2026-08-23 desde fuera de main: no dejó entrada de changelog ni bump del package.json, así que el…
  10. 5.10.2Parche176 componentes propios del kit pasan a traer, como primera oración de su bloque JSDoc, una descripción que contesta «¿qué es…
  11. 5.10.1ParcheSwitch descartaba en silencio aria-label, aria-labelledby y aria-describedby: SwitchProps era una lista cerrada de ocho props…
  12. 5.10.0MenorSeis defectos de formato que salían a pantalla, y cinco props que la interfaz prometía y el componente ignoraba.
  13. 5.9.0Menor<GuidedTour> — nuevo primitivo de visita guiada por pasos (coachmarks), exportado desde el
  14. 5.8.1ParcheEl movimiento decorativo del hover respeta prefers-reduced-motion.
  15. 5.8.0MenorCard con variant="default" pasa a incluir shadow-sm en reposo (antes solo
  16. 5.7.0MenorSearchInput: rootClassName — el prop que le faltaba para participar del layout
  17. 5.6.0MenorTres piezas que no respetaban prefers-reduced-motion, y una barra que exigía saber cuánto falta
  18. 5.5.0MenorTabsContent (composition-mode: TabsRoot/TabsList/TabsTrigger/TabsContent) cumple lo que el header del archivo prometía desde…
  19. 5.4.0MenorNuevo subpath tokens suma el vocabulario de motion de framer-motion (ADR-314): EASE_CONTENT, EASE_QUICK, SPRING_SLIDE,…
  20. 5.3.0MenorNuevo token border-ui-field para el borde de los controles, separado del hairline decorativo.
  21. 5.2.0MenorDateRangeColumnFilter — presets de un click y labels i18n (pedido de Martín sobre Finanzas › Gastos: "el filtro de fechas de la…
  22. 5.1.1ParcheStatCard — la columna de texto encoge, así que el contenido deja de salirse de la tarjeta.
  23. 5.1.0MenorContextualSidebar — prop sectionBadgeRollup: la sección cerrada anuncia en su header lo que sus hojas esconden (ADR-027…

Línea 4.x30 versiones

  1. 4.22.1ParcheEl toast informa, no bloquea: deja de comerse los toques de lo que hay debajo.
  2. 4.22.0MenorSelect y SelectComposition: se anuncian como desplegables.
  3. 4.21.0MenoruseQrCode acepta loader — el QR vuelve a generarse en el browser
  4. 4.20.0MenorFormSheet expone size (ADR-264)
  5. 4.19.0Menorfix(ui-kit): KPICardGrid.icon string resuelve por inyección, no React.lazy — el React.lazy de 4.18.0 costaba ~665 KB…
  6. 4.18.0Menorfix(ui-kit): aísla LucideIcon (mapa completo de lucide-react) del barrel raíz y de KPICardGrid — ADR-194 reincidencia
  7. 4.17.0MenormanageHistory en TODOS los overlays que consumen useModalStack (ADR-262, alcance final)
  8. 4.16.0MenorSheet, FormSheet y SheetContent ganan manageHistory?: boolean (default true). useModalStack — usado por…
  9. 4.15.0MenorPopoverTrigger asChild compone el ref del hijo en vez de pisarlo. Hasta 4.14.0, <PopoverTrigger asChild><button ref={miRef}…
  10. 4.14.0MenorQuantityStepper: nueva prop editable que vuelve tipeable el número del medio (draft local, commit en blur/Enter clampeado a…
  11. 4.13.0MenorInlineStat / InlineStatGroup — cifra en línea: ícono + valor + etiqueta en el mismo renglón, sin card ni padding. Es la forma…
  12. 4.12.0MenorDos correcciones de ancho que impedían que el contenido se achicara en pantallas angostas.
  13. 4.11.1Parchefix(sheet): el backdrop ya no captura clicks tras cerrar ni se autocierra por el gesto de apertura.
  14. 4.11.0MenorContextualSidebar gana la prop decorativeGlow?: boolean (default true). En false quita el halo…
  15. 4.10.1ParcheContextualSidebar: movimiento — motion-safe, despliegue animado y micro-interacciones
  16. 4.10.0MenorContextualSidebar: los 4 tipos del addendum v2 salen por el barrel público
  17. 4.9.0MenorContextualSidebar: decorativeAccent acepta accent-5 y accent-6
  18. 4.8.0MenorContextualSidebar: 3er nivel (groups) + acento decorativo por sección (ADR-027 addendum v2/v3)
  19. 4.7.0MenorSeasonRangeCalendar — usability fixes for dated (punctual) dualPane ranges, confirmed against real production data where users…
  20. 4.6.1ParcheFix SeasonRangeCalendar dualPane dated (punctual) mode: navigating a pane's year past the year already stored in…
  21. 4.6.0MenorQuantityStepper: add optional size?: "sm" | "md" prop (default "md", unchanged behavior). "sm" renders compact h-6 buttons, h-3…
  22. 4.5.1ParcheFix low-contrast solid warning (amber) foreground: Badge, Button, and PercentageBadge now use…
  23. 4.5.0MenoruseCollapsibleSections gains an optional 3rd argument, options?: { persistKey?: string; forceOpenIds?: T[] } —…
  24. 4.4.0MenorSeasonRangeCalendar — two new opt-in props, both additive/backwards-compatible
  25. 4.3.0Menorfix(SeasonRangeCalendar): dated (punctual) context ranges are now year-aware
  26. 4.2.1ParcheFixed ConfirmDialog and AlertDialog stacking below Sheet/Dialog when opened on top of one.
  27. 4.2.0MenorSeasonRangeCalendar — two visual fixes reported from GestorSalon's real usage (a non-primary
  28. 4.1.0MenorSeasonRangeCalendar's value now accepts an optional year, alongside a new dual-pane layout —
  29. 4.0.2ParcheFixed an infinite re-render loop ("Maximum update depth exceeded") in useModalWithBack when
  30. 4.0.1Parchefix(ui-kit): clases de color muertas → cmpPreset válido (task 3165). 6 componentes usaban clases

Línea 3.x2 versiones

  1. 3.2.0MenorF2 tanda 2 (ADR-226): @deprecated de 48 símbolos de superficie muerta en archivos mixtos —
  2. 3.1.0MenorF2 (ADR-225): marca @deprecated la superficie muerta inequívoca del kit — 79 exports en 37 archivos 100% muertos (compat shims,…

Línea 2.x13 versiones

  1. 2.9.1ParcheSelectRoot (composition API): agregado className?: string, mergeado sobre el wrapper (cn("relative w-full", className)). Antes…
  2. 2.9.0MenorMultiSelect suma 3 props opt-in, retrocompatibles (sin usarlas, el DOM
  3. 2.8.0MenorGeoMap (@solu30/ui-kit/geo, ADR-186): nuevo soporte de estilo por punto
  4. 2.7.1ParcheFix: RadioGroupItem no pintaba el punto de selección — renderizaba
  5. 2.7.0Menorfeat(geo): new GeoMap component at isolated subpath @solu30/ui-kit/geo (ADR-182)
  6. 2.6.1ParchePulido visual de listas editables. ui-kit: ArrayItemsEditor acepta FieldDef.width: "xs" — inputs cortos (7rem) para campos…
  7. 2.6.0MenorTabs / DetailSheetTabs: new optional divider?: boolean prop (default true). divider={false} removes the full-width baseline…
  8. 2.5.0MenorTabs — safety-floor a11y fix (found by adversarial review of the elevated-variant change above, same release): the component…
  9. 2.4.0MenorNew SectionEyebrow component (@solu30/ui-kit root, display subpath). Small uppercase label rendered above a section heading —…
  10. 2.3.0MenorSeasonRangeCalendar — two changes:
  11. 2.2.0MenorBatch of 6 new/extended primitives from the RRHH review — ADR-165, gate redblue 2026-07-12 (GO WITH CHANGES).
  12. 2.1.0MenorAdd SeasonRangeCalendar — a monthly calendar-grid primitive for yearless, recurring "MM-DD" date ranges tinted by color…
  13. 2.0.1ParcheFix SelectValue (composition-mode Select) showing the raw controlled value instead of the matching SelectItem label while the…

Línea 1.x31 versiones

  1. 1.16.0MenorAdd <Markdown> component under its own subpath @solu30/ui-kit/markdown — promotes luigi's audited RRHH markdown renderer…
  2. 1.15.0MenorNew Combobox export: a creatable searchable dropdown that replaces the "plain Select + separate create button" pattern.…
  3. 1.14.0MenorDataTable: nuevo prop rowClassName?: (item, index) => string | undefined para estilar la fila completa (<tr>) según los datos…
  4. 1.13.3ParcheFix: <Tabs> (config-driven) and <TabsTrigger> (composition-mode) rendered
  5. 1.13.2ParcheSheet: side sheets ahora ocupan ancho completo en móvil (<640px); los caps max-w aplican desde sm:
  6. 1.13.1ParcheConfirmDialog: el dialog ahora lleva border border-content/10 para separarlo del backdrop en fondos oscuros. Cambio puramente…
  7. 1.13.0MenorContextualSidebar: dos props aditivos para estandarizar el shell en consumidores.
  8. 1.12.0MenorDataTable: paginación client-side vía nuevo prop pageSize. Cuando se pasa (y no hay pagination controlado ni serverFilter), el…
  9. 1.11.1ParcheFix: componentes que leían rgb(var(--color-primary)) / --color-content / --color-container / --color-bkg directamente (no vía…
  10. 1.11.0MenorCapacityBar gana direction?: "fill-is-bad" | "fill-is-good" (default "fill-is-bad", cero cambio de comportamiento para…
  11. 1.10.2ParcheSidebarUserMenu: corrige alineación de slots (quita doble-padding en las filas de theme/language toggle, que quedaban…
  12. 1.10.1Parchefix(SidebarUserMenu): ancho legible del panel en rail colapsado. El popover heredaba el ancho del trigger (~40px en sidebar…
  13. 1.10.0MenorSidebarUserMenu trigger gains an affordance chevron and a more perceptible hover state (ADR-087 follow-up, additive).
  14. 1.9.2ParcheCollapsibleSection: fix WCAG 2.4.3 focus-order violation — collapsed content was hidden only via CSS (grid-template-rows: 0fr +…
  15. 1.9.1ParcheLanguageSwitcher: add compact?: boolean prop for icon-only trigger in collapsed sidebars. When true, the trigger renders only…
  16. 1.9.0MenorAdd optional disabled?: boolean prop to TagInput and ArrayItemsEditor.
  17. 1.8.1ParcheSidebarNavigation: fix hydration id drift on the footer slot's Radix components (e.g. a DropdownMenu). The component renders a…
  18. 1.8.0MenorAdd EmojiPicker — a WhatsApp-style emoji picker (search + virtualized categories) for chat/wall composers. Built on the…
  19. 1.7.2ParcheCellPrice: add format="money" prop (focus-swap es-AR formatting, select-all on focus) + onChange callback for live preview.…
  20. 1.7.1ParcheChipPill: convert to forwardRef + spread extra props for Radix asChild trigger support.
  21. 1.7.0Menorfeat(ui-kit): add DropdownMenuCheckboxItem — switch-style, multi-select friendly
  22. 1.6.1Parchefix(Modal): guarantee unmount when isOpen transitions to false regardless of onAnimationEnd
  23. 1.6.0Menorfeat(charts): ChartInfoPopover + BarChartItem.href navegable (PROP-07 Gate A)
  24. 1.5.0Menorfeat(inline-fields): add plain prop to CellPrice, InlineTextField, InlineNumberField, InlineMarkupField
  25. 1.4.1Parchefix(SegmentedControl): sube contraste del segmento inactivo de text-content/60 a text-content/80
  26. 1.4.0Menorfix(overlays): portal + viewport-clamp para Select, MultiSelect, SelectComposition, LanguageSwitcher, FilterableHeader,…
  27. 1.3.1ParcheFix "Can't resolve 'lucide-react/dynamic'" under Next 16 / Turbopack
  28. 1.3.0Menorfeat(SidebarNavigation): add labelClassName to SidebarNavGroup
  29. 1.2.0Menorfeat(navigation): AppLayout — shell de aplicación estándar del ecosistema CMP (ADR-070)
  30. 1.1.0MenorAñade aislamiento lazy de lucide-react/dynamic para eliminar over-bundling en Turbopack (ADR-194).
  31. 1.0.1ParcheAdd tone?: 'default' | 'comingSoon' prop to ContextualSidebarItem and ContextualSidebarSection.

Línea 0.x70 versiones

  1. 0.79.1Parchefix(inline-fields): hardening round 2 — controlled draft pattern extended to InlineNumberField; CellPrice draft now seeds on…
  2. 0.79.0Menorfeat(BookingCalendar): alwaysScroll prop + scroll-to-anchor on mount (ADR-044)
  3. 0.78.0MenorSparkline: add 6 optional props (backward-compatible, ADR-035)
  4. 0.77.2Parchefix(tokens): replace residual no-op shadcn color tokens with cmpPreset equivalents (token-migration v2)
  5. 0.77.1Parchefix: migrate undefined token family to cmpPreset canonical tokens
  6. 0.77.0MenorAdd ContextualSidebar — domain-agnostic collapsible sidebar primitive (ADR-027). Supports L1 accordion sections, L2 contextual…
  7. 0.76.0MenorAdd AnalyticsTreemap to @solu30/ui-kit/charts subpath.
  8. 0.75.0Menorfeat(charts): add recharts-backed ChartLine, ChartArea, ChartBar, ChartPie, ChartCombo components
  9. 0.74.0MenorCommandInput / Command — controlled mode (MINOR, additive, 100% retrocompat).
  10. 0.73.0Menorfeat(inline-edit): InlineEditText + InlineEditTextarea — hover-to-reveal pencil edit pattern.
  11. 0.72.1ParcheFix token muerto en STATUS_COLORS.neutral + inicio del doc-set (task 3159, B0+B1).
  12. 0.72.0ParcheADR-003: reemplaza tokens shadcn muertos por tokens canónicos del cmpPreset (Tailwind v4)
  13. 0.71.13Parchefix(Modal): publish the stacked-modal scroll fix (0.71.12 was published from a stale build without the touchmove change).…
  14. 0.71.12Parchefix(Modal): fix stacked-modal scroll on iOS. The touchmove handler that blocks background scroll now uses…
  15. 0.71.10ParcheAdd useServerSyncedState hook (from @solu30/ui-kit/hooks): encapsulates the dirty-flag + sync-in-render + in-flight-mutation…
  16. 0.71.9Parchefix(CurrencyInput): wire the previously-ignored locale prop into formatting and add a symbol prop (default '$') so non-ARS…
  17. 0.71.8ParcheAdd SegmentedControl: generic segmented control with unified bordered container, icon + optional text labels, sizes (xs/sm/md)…
  18. 0.71.5Parchefix(z-index): z-layer-\ tokens → arbitrary z-[N] values — modales/overlays ahora self-contained, ya no dependen del preset del…
  19. 0.71.4Parchefix(Popover): anchor within Sheet animating at 0,0 — two-part fix:
  20. 0.71.1ParcheMinor: add optional label and icon props to InlineSelect for labeled inline dropdowns. Backward compatible — without label,…
  21. 0.71.0MenorInlineSelect: add optional label and icon props for labeled inline dropdowns. Restores the InlineEditableDropdown ergonomics…
  22. 0.70.0MenorRestore ColorPicker: color swatch radiogroup with sm/md sizes
  23. 0.66.4MenorFix CurrencyInput losing focus and caret position on rapid typing under React 19. The previous implementation used an inline…
  24. 0.64.0MenorAdd successMessage/errorMessage toast props to useSheetForm hook
  25. 0.63.0MenorAdd canonical status/intent token helpers and Tailwind v4 ui- intent color aliases for package-first visual migrations.
  26. 0.62.0MenorAdd SM2_RATING_META and MicroToast barrel exports.
  27. 0.55.0MenorAdd preference-form section icons (IconDietary, IconAllergies, IconActivities, IconOccasion, IconFlight, IconEmergencyContact,…
  28. 0.52.0Menorfeat(ui-kit): add FilterableSection component — extracted from TheCharterPanel PreferencesTab
  29. 0.50.1MenorFix PageShell rendering when used without header content and allow content overflow.
  30. 0.49.0MenorAdd ImageUpload, ImagePickerDialog, and ImageUrlInput components under src/components/image-upload/.
  31. 0.48.0MenorAdd AddressAutocomplete component — debounced address input backed by Nominatim (OpenStreetMap, no API key). Returns…
  32. 0.47.0MenorAdd FloatingPanel component — desktop floating card (glass, fixed position) with full-screen mobile fallback
  33. 0.46.0MenorCheckbox: add async/optimistic onChange, icon slot, isLoading, and description props
  34. 0.45.0 (2026-05-17)Menorframer-motion removed from 12 components (only Tabs, TabbedPanel, MotionSection retain it)
  35. 0.44.0MenorAdd inline-fields and variant management components (v0.43.0)
  36. 0.42.0Menorfeat(icons): add IconRss to social icons — extracted from ecosystem BlogListPage
  37. 0.41.3 - 2026-05-16ParcheuseModalWithBack(isOpen, onClose, options?) hook for stacked modal back-button support on mobile.
  38. 0.41.0MenorExport snapToCorner, getCornerStyle, Corner, CornerOffsets from main barrel.
  39. 0.39.0MenorAdd onSliceClick, onBarClick, onPointClick click handler props to AnalyticsPieChart, AnalyticsBarChart, and AnalyticsLineChart…
  40. 0.38.0MenorAdd KPICardGrid component with responsive grid (2–6 columns), Lucide icons, semantic color tokens, skeleton loading state, and…
  41. 0.37.2ParcheFix hydration mismatch in DataTable skeleton rows — replace Math.random() with deterministic seeded widths.
  42. 0.37.0MenorAnalyticsLineChart: add multi-series mode (series prop) with zoom/pan and multi-tooltip. Backwards compatible — data prop still…
  43. 0.36.0MenorAdd AnalyticsPieChart, PeriodSelector to ui-kit; add BalanceProjectionCards to billing/cashflow.
  44. 0.35.1Parchefix: wrap all inline style var(--color-_) with rgb() for proper CSS color resolution. Consumers that define --color-_ as raw…
  45. 0.35.0MenorAdd ColorPicker component — color swatch grid with radiogroup accessibility, sm/md sizes.
  46. 0.34.0MenorAdd DropZone, MasonryGrid, and FilePreviewModal components for media/file management UIs.
  47. 0.33.0MenorAdd runConcurrentQueue utility to hooks — generic bounded concurrent queue runner.
  48. 0.32.0MenorAdd runConcurrentQueue utility to hooks — generic bounded concurrent queue runner.
  49. 0.31.0MenorAdd ./editor subpath: generic rich template editor with variable chip support.
  50. 0.30.1MenorAdd translationFn prop to ActivityTimeline for i18n support on action labels and status change badges.
  51. 0.29.7ParcheFix TabbedPanel scroll arrows z-index from z-10 to z-20 so they render above tab text content.
  52. 0.29.5ParcheFix ESM import error: next/link → next/link.js in LinkPendingIndicator
  53. 0.29.0MenorAdd TagListInput and ArrayItemsEditor components — extracted from dietaly enrichment forms.
  54. 0.19.0MenorAdd TabbedPanel (Composition API) and Toolbar components.
  55. 0.18.0MenorAdd GradientText component — generic gradient text wrapper accepting from/to Tailwind color class props and optional as…
  56. 0.17.3ParcheAgrega DataTableShell: contenedor estandarizado para tablas con overflow horizontal, toolbar y footer slots. Agrega StatRow:…
  57. 0.17.2ParcheAgrega FormSheet y FormSection: panel lateral para formularios con header de gradiente, footer con acciones, y sección…
  58. 0.17.1ParcheRouteTabs: agrega flechas de scroll horizontal con ResizeObserver. Acepta icon como ComponentType o ReactNode.
  59. 0.17.0MenorAgrega ScrollableTabsBar: barra de tabs con scroll horizontal y flechas de navegación dinámicas via ResizeObserver. Actualiza…
  60. 0.15.9ParcheFix DataTable borders: use --ui-border token (defined in every project's globals.css) instead of --color-upper/--color-content…
  61. 0.15.8ParcheFix DataTable borders: use --color-upper token instead of --color-content for all border colors. Gives subtle borders in dark…
  62. 0.15.7ParcheFix remaining DataTable border colors: pagination divider, RangeFilter clear button divider, and TextFilter clear button…
  63. 0.15.6ParcheFix all DataTable border colors: use color-mix 15% opacity instead of solid --color-content for subtle borders across table…
  64. 0.15.5ParcheFix DataTable row borders using color-mix for subtle appearance instead of solid --color-content.
  65. 0.15.1ParcheFix FormProvider barrel optimization: use local assignment instead of
  66. 0.15.0Menorfeat: add InlineNumber, InlineColor, InlineTime, StaticSection, SectionTileGrid components
  67. 0.14.0Menor058cc38 Thanks @EasycharterDev! - Extract 4 Tier-3 presentational components from GestorSalon.
  68. 0.13.0MenorAdd LucideIcon and ThemeToggle components extracted from GestorSalon.
  69. 0.12.0MenorMerge hooks-common, cloudflare-images, and analytics-charts into ui-kit.
  70. 0.11.0InicialCentralize date formatting utilities into @solu30/ui-kit.

Leído del CHANGELOG.md que viaja adentro de @solu30/ui-kit 7.0.0, el paquete instalado en este repositorio · lo escribe changesets al publicar · esta página no guarda copia. El paquete trae además un BREAKING-CHANGES.md que acá no se usa: su última entrada es la 0.45.0 y no documenta ninguno de los cinco saltos de mayor posteriores.