Tarjetas y maquetación
Tarjetas anidables, cabeceras de sección, bloques de contenido y avisos a ancho completo que dan a una app la estructura visual de Play.
Casi toda pantalla de Dinaup tiene la misma estructura: una tarjeta, una cabecera y un cuerpo debajo. La tarjeta la pone DnzCard, la cabecera DnzCardTitle y el cuerpo es tu rejilla, tu formulario o tu lista. El resto de la familia cubre casos concretos: tarjeta clave-valor, avatares, bloques con zoom y avisos a ancho completo.
Qué componente uso
| Necesitas | Componente |
|---|---|
| Una tarjeta que detecta si va dentro de otra y ajusta su relieve | DnzCard |
| La cabecera de la tarjeta con icono, título, acciones y ayuda | DnzCardTitle |
| Que una rejilla llegue a ras de borde dentro de la tarjeta | DnzCardBody |
| Una tarjeta pequeña con icono, etiqueta y valor | DnzCardKV |
| Un bloque con botones de zoom que recuerda la escala | DnzScalableBlock |
| Un avatar circular con la inicial del nombre | DnzAvatarInitial |
| Un aviso a ancho completo con icono, texto y botón | DnzBanner |
Mostrar un bloque solo si una comprobación de estado devuelve Healthy | DnzHealthSection |
| El pie "Powered by Dinaup" | DnzFooterPoweredBy |
Los contenedores y controles del motor de formularios de Flex (DnzContainer, DnzControl) los monta DnzFormView. Van al final de la página como referencia.
El patrón base
Toda subpágina parte del mismo esqueleto. Cabecera con icono y título, acciones a la derecha, cuerpo debajo.
Envuelve en DnzCard
La tarjeta da el fondo, la sombra y el relleno. No muestres contenido suelto sin contenedor.
Pon la cabecera con DnzCardTitle
Icon y Title. Los botones (agregar, refrescar) van en el hueco <Actions>.
Añade el cuerpo
Tu RadzenDataGrid, tu formulario o una lista. Para que el bloque se pegue a los bordes de la tarjeta, envuélvelo en DnzCardBody.
<DnzCard>
<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())
{
<p class="text-muted p-3">Sin productos. Pulsa <strong>Agregar</strong> para crear el primero.</p>
}
else
{
<DnzCardBody>
<RadzenDataGrid Data=@productos TItem="ProductoDTO" />
</DnzCardBody>
}
</DnzCard>DnzCard
Tarjeta que conoce su nivel de anidamiento. RadzenCard muestra siempre la misma superficie elevada, así que una tarjeta dentro de otra acumula sombra sobre sombra. DnzCard pasa su profundidad a las hijas en cascada y alterna el aspecto: nivel 0 elevado, niveles impares con un velo neutro sin borde, niveles pares de vuelta al fondo de tarjeta separados por una línea fina.
<DnzCard>
<DnzCardTitle Icon="receipt_long" Title="Factura 2026-0042" />
<DnzCard>
<DnzCardTitle Title="Líneas" Compact=true />
<RadzenDataGrid Data=@lineas TItem="LineaDTO" />
</DnzCard>
</DnzCard>| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Variant | Radzen.Variant? | sin fijar | Fuerza un aspecto concreto. Sin valor, lo elige el nivel: Filled en el nivel 0 y Flat en los anidados. |
Style | string | "" | Estilos en línea, pasados a la RadzenCard. |
ChildContent | RenderFragment | Contenido de la tarjeta. |
Depth es un [CascadingParameter] con nombre DnzCardDepth que aporta la tarjeta padre; no lo pasas tú. Cualquier otro atributo (class, title, data-*) va directo a la RadzenCard.
Usa DnzCard en lugar de RadzenCard en todo lo nuevo: se ve igual suelto y solo cambia al anidarse.
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 | Por defecto | Para qué |
|---|---|---|---|
Title | string | "" | Texto principal de la cabecera. |
Subtitle | string | "" | Segunda línea bajo el título. Vacío no se muestra. |
Icon | string | "" | Icono Material a la izquierda. Si es una ruta (/, http) se muestra como imagen. |
BadgeType | DnzSpecialBadges.BadgeType? | Etiqueta especial junto al título (Pro, Beta, New, IA, Premium). | |
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 en el panel desplegable. | |
Actions | RenderFragment | Hueco de botones a la derecha de la cabecera. |
Los atributos extra se pasan al elemento raíz (el parámetro se llama Attributes).
Los botones del hueco Actions que disparan operaciones asíncronas llevan IsBusy=@variable para que el usuario vea el indicador de carga.
El botón de ayuda (icono de interrogación a la derecha) solo aparece con HelpContent o HelpLink. Con HelpContent escribes el panel; con HelpLink el componente muestra el enlace Ver documentacion, que se abre en una pestaña nueva. Con los dos, prevalece HelpContent.
<DnzCardTitle Icon="percent" Title="Tipos de IVA">
<HelpContent>
Configura los tipos impositivos que se ofrecen al crear líneas de factura. El marcado como predeterminado se aplica a productos nuevos.
</HelpContent>
</DnzCardTitle><DnzCardTitle Icon="settings" Title="Configuración" HelpLink="https://doc.dinaup.com/docs/cuenta/usuarios" />DnzCardBody
Bloque que escapa del relleno de la tarjeta padre con margen negativo, para que una rejilla o una tabla llegue a ras de borde.
<DnzCard>
<DnzCardTitle Icon="list" Title="Líneas del pedido" />
<DnzCardBody>
<RadzenDataGrid Data=@lineas TItem="LineaPedidoDTO" />
</DnzCardBody>
</DnzCard>| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
ChildContent | RenderFragment | Contenido del bloque a ancho completo. | |
Class | string | "" | Clases CSS extra sobre el contenedor. |
Style | string | "" | Estilos en línea adicionales (se suman al margen negativo). |
DnzCardKV
Tarjeta clave-valor: icono coloreado a la izquierda, etiqueta encima y valor grande debajo. Para filas de métricas (disponibilidad, 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 | Por defecto | Para qué |
|---|---|---|---|
Title | string | "" | Etiqueta superior. |
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? | sin fijar | Variante visual de la tarjeta (Flat, Outlined). |
Style | string | "" | Estilo en línea sobre la tarjeta (flex:1 para repartir ancho). |
Acepta atributos extra que se pasan al elemento raíz.
DnzScalableBlock
Envuelve cualquier contenido con dos botones de zoom (más y menos) y recuerda la escala en localStorage. Para tablas anchas o vistas densas. Cada bloque necesita un Key único para no sobrescribir la escala de otro.
<DnzScalableBlock Key="grid-facturas-2026">
<RadzenDataGrid Data=@facturas TItem="FacturaDTO" />
</DnzScalableBlock>| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Key | string | Obligatorio. Identificador único con el que se guarda la escala en localStorage. | |
ChildContent | RenderFragment | Contenido que se escala con el zoom. |
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 | Por defecto | Para qué |
|---|---|---|---|
Data | string | "" | Texto fuente. Su primera letra da la inicial y el color. Vacío muestra ?. |
Size | string | "2.5rem" | Diámetro del avatar ("32px", "28px"). |
OnClick | EventCallback | Se dispara al pulsar el avatar. | |
Style | string | "" | Estilos en línea adicionales sobre el contenedor. |
DnzBanner
Aviso a ancho completo con icono, título, contenido libre y botón opcional. Va en la parte superior 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="Operación completada" ButtonText="Ver detalles" DnzButtonrl="/facturas/123">
<p>La factura se ha emitido y enviado al cliente.</p>
</DnzBanner>| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Style | DnzBannerStyle | Primary | Tema visual: Primary, Gold, Love, Danger, Success, Warning, Pro, Beta, New, Premium, IA. |
Title | string | "" | Título principal. Vacío no se muestra. |
Icon | string | "" | Icono Material Symbols ("check_circle", "update", "bolt"). Vacío, sin icono. |
ChildContent | RenderFragment | Cuerpo del aviso: párrafos, <strong> o cualquier otro marcado. | |
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. |
En DnzBanner, Style es el enum del tema, no CSS en línea. Para clases usa AdditionalClass.
DnzHealthSection
Muestra su contenido solo si la comprobación de estado llamada CheckName devuelve Healthy en HealthCheckService.CheckHealthAsync(). Si no, muestra el texto (Servicio no disponible en este momento.)
<DnzHealthSection CheckName="redis">
<ColaDeTrabajosU />
</DnzHealthSection>| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
CheckName | string | "" | Nombre de la comprobación de estado registrada en la app (sin distinguir mayúsculas). |
ChildContent | RenderFragment | Contenido que se muestra cuando la comprobación devuelve Healthy. |
DnzFooterPoweredBy
Pie con el texto Powered by y el enlace a dinaup.com, en dos estilos.
<DnzFooterPoweredBy Style="DnzFooterPoweredBy.FooterStyleType.Compact" />| Parámetro | Tipo | Por defecto | Para qué |
|---|---|---|---|
Style | FooterStyleType | Modern | Compact o Modern. |
Motor de formularios de Flex
DnzFormView monta estos dos por cada pestaña de la ficha. Rara vez los instancias a mano; están aquí para reconocerlos al depurar un formulario. Detalle de DnzFormView en Entrada de datos y formularios.
DnzContainer
Posiciona una tarjeta con coordenadas absolutas y dentro muestra una lista de informe, una lista primaria o botones, según la definición del Container.
| Parámetro | Tipo | Para qué |
|---|---|---|
Client | DinaupClientC | Obligatorio. Cliente con la sesión. |
Container | Dinaup.VirtualFormDTO.Container | Obligatorio. Definición del contenedor: posición, lista, botones. |
OnButtonClick | EventCallback<string> | Al pulsar un botón del contenedor. |
OnTabChanged | EventCallback<Dinaup.VirtualFormDTO.Tab> | Al cambiar de pestaña en una lista primaria. |
OnAddItem | EventCallback | Al añadir un elemento a la lista primaria. |
OnOpenListItem | EventCallback<Dinaup.VirtualFormDTO.FormDetail> | Al abrir un elemento de la lista. |
OnDeleteItemPrimaryList | EventCallback<string> | Al eliminar un elemento de la lista primaria. |
OnMostrarDialogRequiereGuardar | EventCallback<string> | Cuando una acción exige guardar antes. |
Movil | bool | Maqueta móvil. No es un parámetro: llega en cascada (DnzFormMovil) desde DnzFormView. |
DnzControl
El campo individual de la ficha: elige el control correcto (texto, número, fecha, casilla, selector, editor HTML) según el Format del DataControl.
Un campo confidencial (DataControl.IsSensitive) o de contraseña (InputType password) lo muestra DnzControlSensible: el valor aparece como puntos, con un botón para verlo y otro para copiarlo sin mostrarlo.
Las fechas con hora se eligen en la hora de la empresa (ICultureService) y se guardan convertidas a UTC. Los botones Ahora, Hoy y Mañana toman esa misma hora, no el reloj del servidor.
| Parámetro | Tipo | Para qué |
|---|---|---|
Client | DinaupClientC | Obligatorio. Cliente con la sesión. |
DataControl | Dinaup.VirtualFormDTO.Control | Obligatorio. Definición del campo: formato, valor, etiqueta, estado. |
OnDataControlChanged | EventCallback<Dinaup.VirtualFormDTO.Control> | Cuando el usuario cambia el valor del campo. |
ModoCelda | bool | Modo compacto sin etiqueta, para edición en celda de tabla. |
OnFormatearCodigo | Func<string, Task<string>> | Gancho para reformatear un código de subcuenta al pulsar Enter. |
Movil | bool | Maqueta móvil. No es un parámetro: llega en cascada (DnzFormMovil) desde DnzFormView. |