Org card + org switcher
Elegir organización (picker) y cambiar desde la barra superior.
OrgSwitcher es el selector de la barra superior del dashboard: logo de 24 px, nombre y menú radio con Crear organización. OrgCard viene de la galería y hoy no se usa en la app (el selector de organizaciones tiene su propia tarjeta con sparkline). El logo usa imagen cuando existe e iniciales como fallback. Son identidades de organizaciones, no de participantes del pulso.
Instalación
shadcn
npx shadcn@latest add https://design.moodinary.com/r/org-card.jsonimport
import { OrgCard, OrgLogo, OrgSwitcher, type OrgOption } from "@moodinary/ui/components/org-card";Ejemplos
Tarjetas de organización (galería)
Variante de la galería, sin uso en la app por ahora. El logo de la primera tarjeta es un asset de ejemplo, no un cliente.
Código
cards.tsx
import { OrgCard } from "@moodinary/ui/components/org-card";
import { useState } from "react";
// Nombres y datos de ejemplo. En la app el logo viene de Clerk.
const orgs = [
{
id: "colegio",
logo: "/favicon.svg",
meta: "La Plata · 12 equipos · Core",
name: "Colegio Ejemplo",
},
{ id: "empresa", meta: "6 equipos · Gratis", name: "Estudio Norte" },
];
export default function OrgCards() {
const [chosen, setChosen] = useState<string | null>(null);
return (
<div className="grid gap-3">
{orgs.map((org) => (
<OrgCard
aria-pressed={chosen === org.id}
key={org.id}
logo={org.logo}
meta={org.meta}
name={org.name}
onClick={() => setChosen(org.id)}
/>
))}
<OrgCard
disabled
meta="Invitación pendiente"
name="Instituto Nuevo Día"
/>
</div>
);
}Cambiar organización
Igual que en la barra del dashboard: botón sin borde, chevron arriba y abajo, menú de 288 px. Sin logo muestra iniciales sobre navy Moodinary, nunca el color de la org.
Código
switcher.tsx
import { OrgSwitcher } from "@moodinary/ui/components/org-card";
import { useState } from "react";
/* Como OrgSwitch en apps/pulses/src/components/v8/shell.tsx: sin logo, iniciales sobre navy. Sin red. */
const orgs = [
{ id: "colegio", logo: "/favicon.svg", name: "Colegio Ejemplo" },
{ id: "estudio", name: "Estudio Bermúdez" },
{ id: "muni", name: "Dirección de Personal" },
];
export default function OrgSwitcherExample() {
const [org, setOrg] = useState("colegio");
return (
<OrgSwitcher
onCreate={() => undefined}
onValueChange={setOrg}
orgs={orgs}
value={org}
/>
);
}Props
OrgCard
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| name | string | - | Nombre obligatorio de la organización. |
| meta | ReactNode | - | Contexto breve bajo el nombre. |
| logo | string | - | URL de imagen; sin ella aparecen iniciales. |
| color | string | - | Color del fondo del fallback. |
| disabled | boolean | - | Prop nativa del botón; bloquea selección. |
| onClick | MouseEventHandler<HTMLButtonElement> | - | Acción de elegir la organización. |
| className | string | - | Clases del botón. |
OrgLogo
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| name | string | - | Nombre del que se obtienen iniciales. |
| src | string | - | URL opcional del logo. |
| color | string | - | Color del fallback. |
| size | number | 40 | Tamaño en píxeles. Radio de 8 px desde 32; 5 px por debajo. |
| className | string | - | Clases de imagen o iniciales. |
OrgSwitcher
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| orgs | readonly OrgOption[] | - | Opciones con id, name y logo opcional. color se ignora: el fallback es navy. |
| value | string | - | ID seleccionado. Si no coincide, el botón muestra la primera organización. |
| onValueChange | (id: string) => void | - | Actualizá value al cambiar la selección. |
| onCreate | () => void | - | Habilita la acción Crear organización. |
| createLabel | ReactNode | "Crear organización" | Texto de la acción de crear. |
| emptyLabel | ReactNode | "Sin organizaciones" | Texto del disparador deshabilitado con lista vacía. |
| className | string | - | Clases del disparador. |
Cuándo sí y cuándo no
Hacé
- Mostrá siempre el nombre junto al logo.
- Mantené value sincronizado con una opción válida.
- Usá nombres y datos ficticios identificados como ejemplos.
Evitá
- No uses logos como identidad de participantes.
- No confundas el cambio de organización con un permiso de acceso.
- No agregues una acción Crear que no haga nada.
Accesibilidad
- OrgCard es un botón nativo: Tab para enfocar, Enter o Espacio para elegir.
- El menú permite flechas para recorrer, Enter para elegir y Escape para cerrar y recuperar foco.
- Los logos son decorativos porque el nombre está escrito al lado.