Contribuciones y código abierto
Cómo contribuir con un componente a Babelize Elements, desde abrir un issue hasta enviar un pull request.
Contribuir
Babelize Elements es una biblioteca de código abierto impulsada por la comunidad. Los componentes que ves aquí los crearon colaboradores, y el siguiente podría ser el tuyo.
Antes de empezar, lee el manual del colaborador.
Cómo funciona
- Elige un issue — explora los issues de GitHub en busca de una solicitud de componente marcada como
good first issueohelp wanted. - Crea el componente — implementalo en
src/registry/components/siguiendo la plantilla de componente de abajo. - Abre un pull request — nuestros mantenedores lo revisan, piden cambios si hace falta y lo fusionan.
- Se publica — los componentes fusionados se documentan en este sitio y están disponibles para todos los usuarios de Babelize Elements.
¿Todavía no existe ningún componente? Abre un issue proponiendo uno. Buenos candidatos: selectores de idioma, selectores de configuración regional, widgets de traducción, utilidades RTL, ayudantes de pluralización y formateadores con reconocimiento de configuración regional.
Plantilla de componente
"use client";
import * as React from "react";
import { cn } from "@/lib/utils";
import { useControllableState } from "@/lib/use-controllable-state";
import type { Locale } from "./types";
export interface LanguageSelectProps extends Omit<
React.ComponentPropsWithoutRef<"select">,
"value" | "defaultValue" | "onChange"
> {
/** Available locales — only `code` is required */
locales: Locale[];
/** Selected locale code. Provide this to control the component. */
value?: string;
/** Initial locale code when uncontrolled */
defaultValue?: string;
/** Fired once per selection */
onValueChange?: (code: string) => void;
}
export const LanguageSelect = React.forwardRef<HTMLSelectElement, LanguageSelectProps>(
function LanguageSelect(
{ locales, value, defaultValue, onValueChange, className, ...rest },
ref,
) {
const [locale, setLocale] = useControllableState(
value,
defaultValue ?? locales[0]?.code ?? "",
onValueChange,
);
return (
<select
ref={ref}
value={locale}
onChange={(e) => setLocale(e.target.value)}
className={cn(
"h-10 rounded-md border border-zinc-200 bg-white px-3 text-sm outline-none transition-colors focus:border-emerald-500 dark:border-zinc-800 dark:bg-zinc-900",
className,
)}
{...rest}
>
{locales.map((l) => (
<option key={l.code} value={l.code}>
{l.label ?? l.code}
</option>
))}
</select>
);
},
);Ten en cuenta las cuatro convenciones que sigue cada componente: un trío value / defaultValue / onValueChange mediante useControllableState, una ref reenviada, ...rest propagado al elemento raíz, y el tipo compartido Locale de ./types en lugar de una copia local.
Un componente que renderiza un popup role="listbox" (un menú de idiomas, un selector de país) comparte su gestión del teclado a través de useListboxNavigation de @/lib/use-listbox-navigation, en lugar de implementar por sí mismo las teclas de flecha, Home / End, Enter y Escape. Consulta LanguageSwitcher (campo de búsqueda más aria-activedescendant) y NavBar (foco roving) para las dos estrategias de foco.
Lista de verificación para contribuir
- Prioriza TypeScript, con interfaces exportadas para todas las props
- Consciente de la localización: gestiona los códigos de configuración regional, la pluralización o RTL según corresponda
- Accesible: soporte de teclado, etiquetas ARIA, estados de foco
- Con estilos de Tailwind CSS
- Una demo breve o un ejemplo de uso para la documentación
¿Necesitas ayuda?
Abre una discusión en GitHub o únete a la comunidad de Babelize. Somos un grupo amable.
Interfaces de TypeScript
Interfaces de TypeScript principales exportadas por los componentes de Babelize Elements: props, tipos de configuración regional y opciones de formateadores para tipar tus propios componentes React de i18n.
Manual del colaborador
Antes de programar, lee las reglas. Así trabajamos juntos en Babelize Elements.