Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions app/creditos/enhanced-contributor.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import React from "react";

import { Github, Linkedin } from "lucide-react";

interface ContributorProps {
firstName: string;
lastName: string;
githubUsername: string;
githubUrl: string;
linkedinUrl?: string;
avatarUrl: string;
role: string;
variant?: "osuc" | "uc";
}

function EnhancedContributor({
firstName,
lastName,
githubUsername,
githubUrl,
linkedinUrl,
avatarUrl,
role,
variant = "osuc",
}: ContributorProps) {
const variantStyles = {
osuc: {
card: "bg-gradient-to-br from-secondary to-secondary/80 border-muted/20",
accent: "text-primary",
border: "border-primary/30",
},
uc: {
card: "bg-gradient-to-br from-tertiary/90 to-tertiary/70 border-tertiary/30",
accent: "text-tertiary-foreground",
border: "border-tertiary-foreground/30",
},
};

const styles = variantStyles[variant];

return (
<div
className={`
${styles.card}
rounded-xl p-6 shadow-lg hover:shadow-xl
transition-all duration-300 hover:scale-105
border ${styles.border} backdrop-blur-sm
`}
>
<div className="flex flex-col items-center text-center space-y-4">
{/* Avatar */}
<div className="relative">
<img
src={avatarUrl}
alt={`${firstName} ${lastName}`}
className="w-20 h-20 rounded-full object-cover border-4 border-muted/30 shadow-lg"
/>
<div
className={`
absolute -bottom-1 -right-1 w-6 h-6 rounded-full
${styles.accent === "text-primary" ? "bg-primary" : "bg-tertiary-foreground"}
flex items-center justify-center
`}
>
<Github className="w-3 h-3 text-white" />
</div>
</div>

{/* Name and Role */}
<div className="space-y-2">
<h3 className="text-lg font-bold text-foreground">
{firstName} {lastName}
</h3>
<p className={`text-sm font-medium ${styles.accent}`}>{role}</p>
<p className="text-xs text-muted-foreground">@{githubUsername}</p>
</div>

{/* Social Links */}
<div className="flex space-x-3 pt-2">
<a
href={githubUrl}
target="_blank"
rel="noopener noreferrer"
className={`
p-2 rounded-lg transition-all duration-200
hover:scale-110 bg-background/50 hover:bg-background/80
border ${styles.border}
`}
title={`Ver perfil de GitHub de ${firstName}`}
>
<Github className="w-4 h-4 text-foreground" />
</a>

{linkedinUrl ? (
<a
href={linkedinUrl}
target="_blank"
rel="noopener noreferrer"
className={`
p-2 rounded-lg transition-all duration-200
hover:scale-110 bg-background/50 hover:bg-background/80
border ${styles.border}
`}
title={`Ver perfil de LinkedIn de ${firstName}`}
>
<Linkedin className="w-4 h-4 text-foreground" />
</a>
) : null}
</div>
</div>
</div>
);
}

export default EnhancedContributor;
192 changes: 143 additions & 49 deletions app/creditos/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import Image from "next/image";

import Contribuir from "@/app/creditos/contributor";
import EnhancedContributor from "@/app/creditos/enhanced-contributor";
import contributorsData from "@/data/contributors.json";
import { ContributorsData } from "@/lib/types/contributors";

async function fetchContributors() {
try {
Expand All @@ -14,69 +16,161 @@ async function fetchContributors() {
}

export default async function Page() {
const contributors: any = await fetchContributors();
const githubContributors: any = await fetchContributors();
const contributors: ContributorsData = contributorsData as ContributorsData;

return (
<main spellCheck="false" className="min-h-screen w-full pb-7">
<div className="w-full text-center px-4">
<div className="w-full text-center px-4">
<div className="py-8">
<main spellCheck="false" className="min-h-screen w-full pb-12 bg-gradient-to-b from-background to-background/95">
<div className="w-full text-center px-4 max-w-7xl mx-auto">
{/* Header Section */}
<div className="py-12">
<div className="flex justify-center mb-8">
<Image
src="/logo-osuc.svg"
alt="Open Source eUC Logo"
width={192}
height={192}
className="mx-auto drop-shadow-lg"
className="mx-auto drop-shadow-2xl"
/>
</div>

<p className="text-lg max-w-2xl mx-auto leading-relaxed">
Desarrollado por{" "}
<a
href="https://osuc.dev"
target="_blank"
rel="noopener noreferrer"
className="font-semibold transition-all underline text-muted"
>
Open Source eUC
</a>
, una comunidad dedicada a generar soluciones innovadoras que benefician a toda la universidad.
<div className="space-y-6 max-w-4xl mx-auto">
<p className="text-xl leading-relaxed">
Desarrollado por{" "}
<a
href="https://osuc.dev"
target="_blank"
rel="noopener noreferrer"
className="font-semibold transition-all underline text-primary hover:text-primary/80"
>
Open Source eUC
</a>
, una comunidad dedicada a generar soluciones innovadoras que benefician a toda la universidad.
</p>

<p className="text-lg leading-relaxed text-muted-foreground">
El código de este proyecto es{" "}
<a
href="https://github.com/open-source-uc/UbiCate-v2"
target="_blank"
rel="noopener noreferrer"
className="font-semibold transition-all underline text-primary hover:text-primary/80"
>
código abierto
</a>
, por lo que cualquier persona puede aportar.
</p>
</div>
</div>

{/* Open Source eUC Contributors Section */}
<section className="mb-16">
<div className="flex items-center justify-center mb-8 space-x-4">
<Image src="/logo-osuc.svg" alt="Open Source eUC" width={48} height={48} className="drop-shadow-lg" />
<h2 className="text-4xl font-bold text-primary">Equipo Open Source eUC</h2>
</div>

<p className="text-lg text-muted-foreground mb-8 max-w-2xl mx-auto">
Los desarrolladores principales y mantenedores del proyecto
</p>
<br />
<p className="text-lg max-w-2xl mx-auto leading-relaxed">
El código de este proyecto es{" "}
<a
href="https://github.com/open-source-uc/UbiCate-v2"
target="_blank"
rel="noopener noreferrer"
className="font-semibold transition-all underline text-muted"
>
código abierto
</a>
, por lo que cualquier persona puede aportar.

<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
{contributors.osuc_contributors.map((contributor) => (
<EnhancedContributor
key={contributor.id}
firstName={contributor.firstName}
lastName={contributor.lastName}
githubUsername={contributor.githubUsername}
githubUrl={contributor.githubUrl}
linkedinUrl={contributor.linkedinUrl}
avatarUrl={contributor.avatarUrl}
role={contributor.role}
variant="osuc"
/>
))}
</div>
</section>

{/* UC Contributors Section */}
<section className="mb-16">
<div className="flex items-center justify-center mb-8 space-x-4">
<Image src="/logo.svg" alt="UC Logo" width={48} height={48} className="drop-shadow-lg" />
<h2 className="text-4xl font-bold text-tertiary-foreground">Desarrolladores UC</h2>
</div>

<p className="text-lg text-muted-foreground mb-8 max-w-2xl mx-auto">
Estudiantes y desarrolladores de la Pontificia Universidad Católica de Chile
</p>
</div>

<h2 className="text-3xl font-bold mt-10 text-white-ubi">Contribuidores de UbiCate</h2>

<div className="mt-8">
{contributors.length > 0 ? (
<ul className="list-none p-0 grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-8">
{contributors
.filter((contributor: any) => !contributor.login.toLowerCase().includes("bot"))
.map((contributor: any) => (
<Contribuir
key={contributor.id}
login={contributor.login}
avatar_url={contributor.avatar_url}
html_url={contributor.html_url}
/>
))}
</ul>
{contributors.uc_contributors.length > 0 ? (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
{contributors.uc_contributors.map((contributor) => (
<EnhancedContributor
key={contributor.id}
firstName={contributor.firstName}
lastName={contributor.lastName}
githubUsername={contributor.githubUsername}
githubUrl={contributor.githubUrl}
linkedinUrl={contributor.linkedinUrl}
avatarUrl={contributor.avatarUrl}
role={contributor.role}
variant="uc"
/>
))}
</div>
) : (
<p className="text-lg font-medium text-white-ubi">Cargando contribuyentes...</p>
<div className="text-center py-12">
<p className="text-lg text-muted-foreground mb-4">¡Sé el primer estudiante UC en contribuir!</p>
<a
href="https://github.com/open-source-uc/UbiCate-v2/blob/main/contributing.md"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center px-6 py-3 text-base font-medium text-tertiary-foreground bg-tertiary rounded-lg hover:bg-tertiary/90 transition-colors"
>
Ver guía de contribución
</a>
</div>
)}
</div>
</section>

{/* Community Contributors */}
<section>
<h3 className="text-2xl font-bold mb-6 text-foreground">Todos los Contribuidores de la Comunidad</h3>

<p className="text-base text-muted-foreground mb-8 max-w-2xl mx-auto">
Estos son todos los colaboradores que han contribuido al repositorio según GitHub
</p>

<div className="bg-secondary/30 rounded-xl p-8 backdrop-blur-sm border border-border/20">
{githubContributors.length > 0 ? (
<div className="grid grid-cols-2 sm:grid-cols-4 md:grid-cols-6 lg:grid-cols-8 gap-4">
{githubContributors
.filter((contributor: any) => !contributor.login.toLowerCase().includes("bot"))
.map((contributor: any) => (
<a
key={contributor.id}
href={contributor.html_url}
target="_blank"
rel="noopener noreferrer"
className="flex flex-col items-center p-3 rounded-lg hover:bg-background/50 transition-colors group"
title={`@${contributor.login}`}
>
<img
src={contributor.avatar_url}
alt={contributor.login}
className="w-12 h-12 rounded-full mb-2 border-2 border-muted/30 group-hover:border-primary transition-colors"
/>
<span className="text-xs text-muted-foreground group-hover:text-foreground transition-colors truncate w-full text-center">
@{contributor.login}
</span>
</a>
))}
</div>
) : (
<p className="text-lg font-medium text-muted-foreground">Cargando contribuyentes...</p>
)}
</div>
</section>
</div>
</main>
);
Expand Down
Loading