react-resume-kit
Version:
A collection of components for building a resume or CV with React
282 lines (218 loc) • 6.93 kB
Markdown
# React Resume Kit
<br/>
<br/>
<div align="center">
<img src="https://github.com/Kiyameh/react-resume-kit/blob/main/public/logo.png" alt="React Resume Kit Logo" width="300"/>
</div>
<br/>
<br/>
Un componente React moderno y personalizable para crear currículums o resumes hermosos y profesionales para tu sitio web. Construido con TypeScript.
## Demo en Vivo
Mira la demo en vivo en [https://react-resume-kit.vercel.app/](https://react-resume-kit.vercel.app/)
## Características
- 🌐 Soporte multiidioma
- 📄 Funcionalidad de descarga PDF
- 🎨 Temas personalizables con variables CSS
- 🎯 Soporte de iconos (cualquier elemento React, recomendado Lucide Icons, Simple Icons, etc.)
- ⚡ Fácil de configurar e integrar
- 📱 Diseño responsivo
- 🎨 UI moderna y limpia
- 🔧 Creación de toolbar personalizado con hook `useToolbar`
- 🎭 Sistema de estilos completo con clases prefijadas `.rrk-`
- 🌙 Soporte para tema claro/oscuro
- 📖 Documentación completa en inglés y español
## Instalación
```bash
npm install react-resume-kit
```
## Inicio Rápido
```tsx
import { ResumeLayout, ResumeHeader } from "react-resume-kit";
import { content } from "./tu-archivo-de-contenido";
function App() {
return (
<ResumeLayout resumeContent={content}>
<ResumeHeader />
</ResumeLayout>
);
}
```
## Configuración
PASO 1: Agrega el componente ResumeLayout envolviendo uno o más de los siguientes:
```tsx
<ResumeHeader/>
<ResumeAbout/>
<ResumeWorks/>
<ResumeCourses/>
<ResumeTechnologies/>
<ResumeSoftSkills/>
<ResumeProjects/>
<ResumeContact/>
```
PASO 2: Puedes agregar las siguientes props al componente ResumeLayout:
- initialLanguage="es"
- resumeContent={content}
- enableLanguageSwitch
- enablePdfDownload
PASO 3: Copia el archivo data/exampleContent que contiene todos los datos del resume. Actualízalo. El contenido debe seguir esta estructura:
```typescript
import { ReactElement } from "react";
type ResumeContent = {
// Uno para cada idioma
en: {
// Nombres de secciones
about_title: string;
works_title: string;
courses_title: string;
techs_title: string;
soft_skills_title: string;
soft_skills_subtitle: string;
projects_title: string;
projects_subtitle: string;
connect_title: string;
// Texto del botón de descarga
download_pdf: string;
// Selector de idioma
switcher_text: string;
language_labels: Array<{ label: string; value: string }>;
// Header
name: string;
title: string;
email: string;
phone: string;
location: string;
picture?: string;
// Acerca de
about_text: string;
// Experiencia
works: Array<{
title: string;
company: string;
date: string;
location: string;
points: string[];
}>;
// Cursos
courses: Array<{
degree: string;
school: string;
date: string;
}>;
// Tecnologías
technologies: Array<{
name: string;
icon: ReactElement;
}>;
// Habilidades Blandas
soft_skills: Array<{
title: string;
description: string;
icon: ReactElement;
}>;
// Proyectos
projects: Array<{
title: string;
description: string;
features: string;
technologies: string[];
link?: string;
}>;
// Footer
author: string;
socialLinks: Array<{
name: string;
icon: ReactElement;
url: string;
}>;
};
};
```
### Ejemplo de uso para tecnologías
```tsx
import { SiReact, SiTypescript } from "@icons-pack/react-simple-icons";
const content = {
en: {
// ...
technologies: [
{ name: "React", icon: <SiReact /> },
{ name: "TypeScript", icon: <SiTypescript /> },
// ...
],
// ...
},
// ...
};
```
## Iconos
El componente soporta cualquier elemento React como icono. Puedes usar iconos de cualquier librería, como [Simple Icons](https://simpleicons.org) o [Lucide Icons](https://lucide.dev/), importando el componente del icono y pasándolo directamente:
```tsx
import { SiReact } from "@icons-pack/react-simple-icons";
// ...
technologies: [
{ name: "React", icon: <SiReact /> },
// ...
];
```
Eres responsable de importar y renderizar el icono que quieras. El componente automáticamente inyectará la clase CSS necesaria para un estilo consistente.
## Soporte de Idiomas
El componente soporta múltiples idiomas. Necesitas proporcionar el contenido para cada idioma en el objeto de contenido:
```typescript
const content = {
en: {
/* Contenido en inglés */
},
es: {
/* Contenido en español */
},
};
```
## Personalización
### Sistema de Estilos
El paquete incluye un sistema de estilos completo basado en variables CSS y clases específicas. Todos los componentes usan clases que comienzan con `.rrk-` (react-resume-kit) para fácil identificación y personalización.
#### Personalización Rápida
```css
:root {
--rrk-primary: #3b82f6; /* Tu color principal */
--rrk-surface-100: #ffffff; /* Color de fondo */
--rrk-content: #1f2937; /* Color de texto */
--rrk-radius-medium: 0.75rem; /* Radio de borde */
}
```
#### Personalización Avanzada
- **Variables CSS**: Sobrescribe cualquier variable CSS para cambiar colores, sombras, bordes, etc.
- **Clases de Componentes**: Dirige componentes específicos usando sus clases `.rrk-`
- **Herramientas de Desarrollador**: Inspecciona elementos para ver todas las clases disponibles
- **Repositorio**: Revisa los archivos CSS de los componentes para referencia completa de clases
📖 **Documentación Completa**:
- [Guía del Sistema de Estilos](./docs/styling-system.es.md)
- [Guía de Personalización del Toolbar](./docs/toolbar-customization.es.md)
- [Índice de Documentación](./docs/README.md)
🎨 **Ejemplos de Temas**: [Temas Personalizados](./examples/custom-themes.css)
### Toolbar Personalizado
Crea tu propio toolbar usando el hook `useToolbar`:
```tsx
import { useToolbar } from "react-resume-kit";
function MyCustomToolbar() {
const { handlePrint, languageLabels, handleLanguageSelect } = useToolbar();
return (
<div className="my-toolbar">
<button onClick={handlePrint}>📄 Descargar</button>
<select onChange={(e) => handleLanguageSelect(e.target.value)}>
{languageLabels.map((lang) => (
<option key={lang.value} value={lang.value}>
{lang.label}
</option>
))}
</select>
</div>
);
}
```
## Contribuir
¡Las contribuciones son bienvenidas! No dudes en enviar un Pull Request.
## Licencia
MIT
## Autor
Andoni Abarzuza (@kiyameh)