Tarjetas y layout
Tarjetas, cabeceras de sección y bloques de contenido que dan a tu app la estructura visual de Play.
Casi toda pantalla de Dinaup es lo mismo: una RadzenCard, una cabecera arriba y un cuerpo debajo. La cabecera la pones con DnzCardTitle y el cuerpo con el contenido que toque. Con estas piezas montas vistas con la estructura visual de Play.
RadzenCard envuelve, DnzCardTitle titula, y dentro va tu grid, tu formulario o tu lista. El resto de la familia son atajos para casos concretos (KPIs, fichas clicables, avatares, bloques con zoom).
El patrón base
Toda subpage parte del mismo esqueleto. Cabecera con icono y título, acciones a la derecha, cuerpo debajo.
Envuelve en RadzenCard
La tarjeta da el fondo, la sombra y el padding. Nunca pintes contenido suelto sin contenedor.
Pon la cabecera con DnzCardTitle
Icon + Title y listo. Si necesitas botones (agregar, refrescar), van en el slot <Actions>.
Mete el cuerpo
Tu RadzenDataGrid, tu formulario o una lista. Si quieres que el bloque se pegue a los bordes de la tarjeta, usa DnzCardBody.
<RadzenCard>
<DnzCardTitle Icon="inventory_2" Title="Productos">
<Actions>
<RadzenButton Text="Agregar" Icon="add" ButtonStyle="ButtonStyle.Primary" Size="ButtonSize.Small" Click=@OnAdd />
<RadzenButton Icon="refresh" Click=@RefreshDataAsync IsBusy=@cargando Variant="Variant.Text" Size="ButtonSize.Small" />
</Actions>
</DnzCardTitle>
@if (productos.IsEmpty())
{
<EmptyListAddButtomCardU Title="Sin productos" Description="Agrega tu primer producto." ButtonText="Agregar producto" AddClick=@OnAdd />
}
else
{
<RadzenDataGrid Data=@productos TItem="ProductoDTO">...</RadzenDataGrid>
}
</RadzenCard>DnzCardTitle
Cabecera de tarjeta con icono, título, subtítulo opcional, botones de acción y panel de ayuda desplegable.
<DnzCardTitle Icon="receipt_long" Title="Facturas emitidas" Subtitle="Ejercicio 2026">
<Actions>
<RadzenButton Text="Nueva factura" Icon="add" ButtonStyle="ButtonStyle.Primary" Size="ButtonSize.Small" Click=@CrearFactura />
<RadzenButton Icon="refresh" Click=@RecargarAsync IsBusy=@cargando Variant="Variant.Text" Size="ButtonSize.Small" />
</Actions>
</DnzCardTitle>| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Title | string | "" | Texto principal de la cabecera. |
Subtitle | string | "" | Segunda línea bajo el título. Si va vacío, no se pinta. |
Icon | string | "" | Icono Material a la izquierda. Si es una ruta (/..., http...) lo pinta como imagen. |
BadgeType | DnzSpecialBadges.BadgeType? | Badge especial junto al título (Beta, New...). | |
Compact | bool | false | Versión reducida con borde inferior, para cabeceras secundarias. |
HelpLink | string | "" | URL de documentación. Activa el botón de ayuda con enlace externo. |
HelpContent | RenderFragment | Contenido de ayuda inline (texto rico) en el panel desplegable. | |
Actions | RenderFragment | Slot de botones a la derecha de la cabecera. |
Los botones del slot Actions que disparan operaciones async deben llevar IsBusy=@variable para que el usuario vea el spinner. Es UX, no opcional.
El botón de ayuda (icono de interrogación a la derecha) solo aparece si pones HelpContent o HelpLink. Con HelpContent escribes el panel a mano; con HelpLink el componente pinta un enlace "Ver documentación" que abre en pestaña nueva. Si pones los dos, manda HelpContent.
<DnzCardTitle Icon="percent" Title="Tipos de IVA">
<HelpContent>
Configura los tipos impositivos que se ofrecen al crear lineas de factura. El marcado como predeterminado se aplica a productos nuevos.
</HelpContent>
</DnzCardTitle><DnzCardTitle Icon="settings" Title="Configuracion" HelpLink="https://doc.dinaup.com/configuracion" />Además de los parámetros de arriba, DnzCardTitle acepta atributos extra que pasan al elemento raíz ([Parameter(CaptureUnmatchedValues = true)]): útil para colar un id, un data-* o una clase suelta sin tocar el componente.
DnzCardBody
Bloque que escapa del padding de la RadzenCard padre con margen negativo, para que un grid o una tabla llegue a ras de borde dentro de la tarjeta.
<RadzenCard>
<DnzCardTitle Icon="list" Title="Lineas del pedido" />
<DnzCardBody>
<RadzenDataGrid Data=@lineas TItem="LineaPedidoDTO">...</RadzenDataGrid>
</DnzCardBody>
</RadzenCard>| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
ChildContent | RenderFragment | Contenido del bloque a ancho completo. | |
Class | string | "" | Clases CSS extra sobre el contenedor. |
Style | string | "" | Estilos inline extra (se suman al margen negativo). |
DnzCardKV
Tarjeta clave-valor para KPIs: icono coloreado a la izquierda, etiqueta arriba y valor grande debajo. Pensada para filas de metricas (uptime, total facturado, stock).
<div class="d-flex gap-2">
<DnzCardKV Icon="payments" IconColor=@Colors.Success Title="Facturado mes" Value=@($"{totalMes.RoundMoney(2)} €") Variant="Variant.Outlined" />
<DnzCardKV Icon="inventory" IconColor=@Colors.Warning Title="Stock bajo" Value=@productosBajoStock.STR() Variant="Variant.Outlined" />
<DnzCardKV Icon="people" IconColor=@Colors.Info Title="Clientes activos" Value=@clientesActivos.STR() Variant="Variant.Outlined" />
</div>| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Title | string | "" | Etiqueta superior (preferido sobre Tile). |
Value | string | "" | Valor principal grande. |
Icon | string | "" | Icono Material a la izquierda. |
IconColor | string | Colors.Primary | Color del icono (Colors.Success, Colors.Warning...). |
Variant | Variant | Variant.Flat | Variante visual de la tarjeta (Flat, Outlined...). |
Tile | string | "" | Etiqueta legacy. Solo si Title va vacío; usa Title en código nuevo. |
Style | string | "" | Estilo inline sobre la tarjeta (ej. flex:1 para repartir ancho). |
Tile existe por compatibilidad con consumidores antiguos. En código nuevo usa siempre Title.
DnzCardList
Renderiza el resultado de un informe Flex como lista de fichas clicables, con imagen, título y hasta 4 campos. Se alimenta del ReportContext cascada, no le pasas los datos a mano. Al pulsar una ficha abre el registro o dispara tu callback.
<DnzReportView Client=@Client ReportId=@reportId>
<DnzCardList MaxFields="3" OnItemSelect=@AbrirFicha />
</DnzReportView>| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
MaxFields | int | 4 | Número máximo de campos a mostrar por ficha. |
OnItemSelect | EventCallback<DinaupDynamicRowDTO> | Se dispara al pulsar una ficha. Si no lo enganchas, abre el registro por defecto. |
DnzCardList vive dentro del sistema de informes Flex y consume el ReportContext por cascada. Para entender de donde sale ese contexto, mira Informes Flex.
DnzContainer
Contenedor de formularios virtuales (Flex). Posiciona una RadzenCard con coordenadas absolutas y dentro pinta una lista de informe, una lista primaria o botones, según la definición del Container. Es infraestructura del motor de formularios: rara vez lo instancias a mano, lo coloca el renderizador de formularios.
<DnzContainer Client=@Client Container=@container OnTabChanged=@HandleTabChanged />| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Client | DinaupClientC | (Requerido) Cliente Dinaup con la sesión. | |
Container | Dinaup.VirtualFormDTO.Container | (Requerido) Definición del contenedor: posición, lista, botones. | |
OnButtonClick | EventCallback<string> | Se dispara al pulsar un botón del contenedor. | |
OnTabChanged | EventCallback<Tab> | Se dispara al cambiar de pestaña en una lista primaria. | |
OnAddItem | EventCallback | Se dispara al añadir un item a la lista primaria. | |
OnOpenListItem | EventCallback<FormDetail> | Se dispara al abrir un item de la lista. | |
OnDeleteItemPrimaryList | EventCallback<string> | Se dispara al eliminar un item de la lista primaria. |
DnzControl
El campo individual de un formulario virtual (Flex): elige el input correcto (texto, número, fecha, checkbox, selector, editor HTML) según el FieldFormatE del DataControl. Como DnzContainer, es motor de formularios; lo pinta el renderizador, no tu código de pantalla.
<DnzControl Client=@Client DataControl=@control OnDataControlChanged=@HandleControlChanged />| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Client | DinaupClientC | (Requerido) Cliente Dinaup con la sesión. | |
DataControl | Dinaup.VirtualFormDTO.Control | (Requerido) Definición del campo: formato, valor, label, estado. | |
OnDataControlChanged | EventCallback<Control> | Se dispara cuando el usuario cambia el valor del campo. | |
ModoCelda | bool | false | Modo compacto sin label, para edición en celda de tabla. |
OnFormatearCodigo | Func<string, Task<string>> | Hook para reformatear un código de subcuenta al pulsar Enter. |
DnzScalableBlock
Envuelve cualquier contenido con dos botones de zoom (más/menos) y recuerda la escala en localStorage. Útil para tablas anchas o vistas densas que el usuario quiere agrandar. Cada bloque necesita un Key único para no pisar la escala de otro.
<DnzScalableBlock Key="grid-facturas-2026">
<RadzenDataGrid Data=@facturas TItem="FacturaDTO">...</RadzenDataGrid>
</DnzScalableBlock>| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Key | string | (Requerido) Identificador unico. Con el se guarda la escala en localStorage. | |
ChildContent | RenderFragment | Contenido que se escala con el zoom. |
El Key debe ser unico por bloque escalable. Si dos bloques comparten Key, comparten la escala guardada y se pisan.
DnzAvatarInitial
Avatar circular con la inicial del nombre y un color de fondo derivado de esa letra (siempre el mismo color para la misma inicial). Para listas de usuarios, clientes o empleados sin foto.
<div class="d-flex align-items-center gap-2">
<DnzAvatarInitial Data=@cliente.Nombre Size="32px" />
<span>@cliente.Nombre</span>
</div>| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Data | string | "" | Texto fuente. Se toma su primera letra para la inicial y el color. |
Size | string | "2.5rem" | Diámetro del avatar (ej. "32px", "28px"). |
OnClick | EventCallback | Se dispara al pulsar el avatar. Si lo enganchas, el avatar se vuelve clicable. | |
Style | string | "" | Estilos inline extra sobre el contenedor. |
DnzBanner
Banner destacado de ancho completo con icono, título, contenido libre y botón opcional. Como pieza de layout va arriba de una pantalla, para avisos de versión, ofertas, mantenimiento o errores a página completa.
<DnzBanner Style="DnzBanner.DnzBannerStyle.Success" Icon="check_circle" Title="Operacion completada" ButtonText="Ver detalles" DnzButtonrl="/facturas/123">
<p>La factura se ha emitido y enviado al cliente <strong>correctamente</strong>.</p>
</DnzBanner>| Parámetro | Tipo | Default | Para qué |
|---|---|---|---|
Style | DnzBannerStyle | Primary | Tema visual: Primary, Gold, Love, Danger, Success, Warning, Pro, Beta, New, Premium, IA. |
Title | string | "" | Titulo principal. Si va vacío, no se pinta. |
Icon | string | "" | Icono Material Symbols ("check_circle", "update", "bolt"). Si va vacío, no hay icono. |
ChildContent | RenderFragment | Cuerpo del banner: párrafos, <strong>, lo que necesites. | |
ButtonText | string | "" | Texto del botón. Solo aparece junto con DnzButtonrl. |
DnzButtonrl | string | "" | URL de destino del botón. |
OpenInNewTab | bool | true | Abre el enlace del botón en pestaña nueva. |
AdditionalClass | string | "" | Clases CSS extra sobre el contenedor. |
DnzBanner también aparece en Badges y estados por su faceta de señalizador: es el mismo componente, úsalo donde te encaje en la pantalla.
Relacionado: Intro a DinaZen · Índice de componentes · Badges y estados · Datos tipados (Spans) · Informes Flex · Guías de estilo C#/Blazor