Skip to content
Merged
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
14 changes: 7 additions & 7 deletions src/components/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,14 @@ const Header = () => {
</NavLink>
))}
</nav>
<LanguageSwitcher />

{/* User Actions */}
<div className="hidden md:flex items-center space-x-4">
<LanguageSwitcher />
{user ? (
Comment on lines 65 to 68

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep language switcher visible on mobile

Moving LanguageSwitcher inside the hidden md:flex user‑actions container means it no longer renders for viewports smaller than the md breakpoint. The mobile navigation drawer still lacks a language switcher, so users on phones lose any way to change locales. Previously the switcher sat outside the hidden container and remained visible across breakpoints. Unless another mobile control exists, this regression prevents mobile users from switching languages.

Useful? React with 👍 / 👎.

<div className="flex items-center space-x-3">
<span className="text-sm text-neutral-600">
Olá, {user.email}
{t('navigation.hello')}, {user.email}
</span>
<Button
variant="outline"
Expand All @@ -77,7 +77,7 @@ const Header = () => {
className="flex items-center space-x-2"
>
<LogOut className="h-4 w-4" />
<span>Sair</span>
<span>{t('navigation.signOut')}</span>
</Button>
</div>
) : (
Expand All @@ -89,7 +89,7 @@ const Header = () => {
className="flex items-center space-x-2"
>
<User className="h-4 w-4" />
<span>Login</span>
<span>{t('navigation.login')}</span>
</Button>
</NavLink>
<NavLink to="/contact">
Expand Down Expand Up @@ -136,15 +136,15 @@ const Header = () => {
{user ? (
<div className="pt-4 flex flex-col space-y-2">
<span className="text-sm text-neutral-600 px-2">
Olá, {user.email}
{t('navigation.hello')}, {user.email}
</span>
<Button
variant="outline"
onClick={signOut}
className="w-full flex items-center justify-center space-x-2"
>
<LogOut className="h-4 w-4" />
<span>Sair</span>
<span>{t('navigation.signOut')}</span>
</Button>
</div>
) : (
Expand All @@ -155,7 +155,7 @@ const Header = () => {
className="w-full flex items-center justify-center space-x-2"
>
<User className="h-4 w-4" />
<span>Login</span>
<span>{t('navigation.login')}</span>
</Button>
</NavLink>
<NavLink to="/contact">
Expand Down
15 changes: 12 additions & 3 deletions src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
"contact": "Contact",
"startProject": "Start Your Project",
"toggleNavigation": "Toggle navigation",
"backToTop": "Back to top"
"backToTop": "Back to top",
"hello": "Hello",
"signOut": "Sign Out",
"login": "Login"
},
"footer": {
"quickLinks": "Quick Links",
Expand Down Expand Up @@ -97,7 +100,7 @@
"mission": "To democratize artificial intelligence by creating accessible, powerful software solutions that help businesses of all sizes harness the power of AI to streamline operations, enhance customer experiences, and drive sustainable growth.",
"storyTitle": "Our Story",
"story": {
"p1": "Monynha Softwareswas founded with a simple yet ambitious vision: to make artificial intelligence accessible and practical for businesses everywhere.",
"p1": "Monynha Softwares was founded with a simple yet ambitious vision: to make artificial intelligence accessible and practical for businesses everywhere.",
"p2": "Starting as a small team of passionate developers and AI enthusiasts, we recognized the gap between complex AI technologies and real-world business applications. Our mission became clear: bridge this gap with intuitive, powerful solutions.",
"p3": "Today, we've grown into a trusted partner for businesses across industries, delivering custom software solutions that not only meet current needs but anticipate future challenges."
},
Expand Down Expand Up @@ -265,7 +268,13 @@
"liveDemo": "Live Demo",
"like": "Like our projects?",
"likeDescription": "Get in touch to craft a custom solution for your business.",
"contactUs": "Contact Us"
"contactUs": "Contact Us",
"loading": "Loading...",
"loadingSolutions": "Loading solutions...",
"errorLoadingProjects": "Error loading projects",
"errorLoadingGitHub": "Error loading GitHub projects",
"errorLoadingSolutions": "Error loading solutions",
"errorLoadingAdditional": "Error loading additional projects"
},
"notFound": {
"oops": "Oops! Page not found",
Expand Down
13 changes: 11 additions & 2 deletions src/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
"contact": "Contacto",
"startProject": "Comenzar Proyecto",
"toggleNavigation": "Alternar navegación",
"backToTop": "Volver arriba"
"backToTop": "Volver arriba",
"hello": "Hola",
"signOut": "Cerrar sesión",
"login": "Iniciar sesión"
},
"footer": {
"quickLinks": "Enlaces Rápidos",
Expand Down Expand Up @@ -265,7 +268,13 @@
"liveDemo": "Demo en Vivo",
"like": "¿Te gustan nuestros proyectos?",
"likeDescription": "Ponte en contacto para crear una solución personalizada para tu negocio.",
"contactUs": "Contáctanos"
"contactUs": "Contáctanos",
"loading": "Cargando...",
"loadingSolutions": "Cargando soluciones...",
"errorLoadingProjects": "Error al cargar proyectos",
"errorLoadingGitHub": "Error al cargar proyectos de GitHub",
"errorLoadingSolutions": "Error al cargar soluciones",
"errorLoadingAdditional": "Error al cargar proyectos adicionales"
},
"notFound": {
"oops": "¡Vaya! Página no encontrada",
Expand Down
13 changes: 11 additions & 2 deletions src/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
"contact": "Contact",
"startProject": "Démarrer le projet",
"toggleNavigation": "Basculer la navigation",
"backToTop": "Haut de page"
"backToTop": "Haut de page",
"hello": "Bonjour",
"signOut": "Se déconnecter",
"login": "Se connecter"
},
"footer": {
"quickLinks": "Liens rapides",
Expand Down Expand Up @@ -265,7 +268,13 @@
"liveDemo": "Démo en ligne",
"like": "Vous aimez nos projets ?",
"likeDescription": "Contactez-nous pour créer une solution personnalisée pour votre entreprise.",
"contactUs": "Nous contacter"
"contactUs": "Nous contacter",
"loading": "Chargement...",
"loadingSolutions": "Chargement des solutions...",
"errorLoadingProjects": "Erreur lors du chargement des projets",
"errorLoadingGitHub": "Erreur lors du chargement des projets GitHub",
"errorLoadingSolutions": "Erreur lors du chargement des solutions",
"errorLoadingAdditional": "Erreur lors du chargement de projets supplémentaires"
},
"notFound": {
"oops": "Oups ! Page introuvable",
Expand Down
13 changes: 11 additions & 2 deletions src/locales/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
"contact": "Contato",
"startProject": "Iniciar Projeto",
"toggleNavigation": "Alternar navegação",
"backToTop": "Voltar ao topo"
"backToTop": "Voltar ao topo",
"hello": "Olá",
"signOut": "Sair",
"login": "Entrar"
},
"footer": {
"quickLinks": "Links Rápidos",
Expand Down Expand Up @@ -263,7 +266,13 @@
"liveDemo": "Demo ao Vivo",
"like": "Gostou dos projetos?",
"likeDescription": "Entre em contato para criar uma solução personalizada para seu negócio.",
"contactUs": "Fale Conosco"
"contactUs": "Fale Conosco",
"loading": "Carregando...",
"loadingSolutions": "Carregando soluções...",
"errorLoadingProjects": "Erro ao carregar projetos",
"errorLoadingGitHub": "Erro ao carregar projetos do GitHub",
"errorLoadingSolutions": "Erro ao carregar soluções",
"errorLoadingAdditional": "Erro ao carregar projetos adicionais"
},
"notFound": {
"oops": "Ops! Página não encontrada",
Expand Down
118 changes: 4 additions & 114 deletions src/pages/Projects.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import {
Github,
ExternalLink,
Calendar,
ArrowRight,
CheckCircle,
} from 'lucide-react';
import Layout from '../components/Layout';
import Meta from '@/components/Meta';
Expand Down Expand Up @@ -150,10 +148,6 @@ const Projects = () => {
return merged;
}, [supabaseSolutions, githubSolutions]);

const displayGitHubSolutions = Array.isArray(githubSolutions)
? githubSolutions
: [];

if (repositoriesLoading) {

return (
Expand Down Expand Up @@ -259,7 +253,7 @@ const Projects = () => {

{supabaseSolutionsLoading ? (
<div className="text-center text-neutral-500">
Loading solutions...
{t('projects.loadingSolutions')}
</div>
) : (
<div className="grid gap-8 md:grid-cols-2 xl:grid-cols-3">
Expand All @@ -278,7 +272,7 @@ const Projects = () => {

{supabaseSolutionsError && (
<p className="text-sm text-red-500 text-center mt-6">
Error loading solutions
{t('projects.errorLoadingSolutions')}
</p>
)}
</div>
Expand All @@ -288,7 +282,7 @@ const Projects = () => {
<section>
{repositoriesError && repositories.length === 0 ? (
<div className="text-center text-red-500">
Error loading projects
{t('projects.errorLoadingProjects')}
</div>
) : (
<div className="grid md:grid-cols-2 lg:grid-cols-2 gap-8 max-w-6xl mx-auto">
Expand Down Expand Up @@ -369,7 +363,7 @@ const Projects = () => {

{repositoriesError && repositories.length > 0 && (
<p className="text-sm text-red-500 text-center mt-6">
Error loading additional projects
{t('projects.errorLoadingAdditional')}
</p>
)}
</section>
Expand All @@ -392,110 +386,6 @@ const Projects = () => {
</div>
</div>

<section className="py-24 bg-white">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16">
<h2 className="text-3xl lg:text-4xl font-bold text-neutral-900 mb-6">
{t('solutionsPage.title')}
</h2>
<p className="text-lg text-neutral-600 max-w-3xl mx-auto">
{t('solutionsPage.description')}
</p>
</div>

{isGitHubLoading ? (
<div className="text-center text-neutral-500">Loading...</div>
) : isGitHubError ? (
<div className="text-center text-red-500">
Error loading GitHub projects
</div>
) : (
<div className="grid gap-8 md:grid-cols-2 xl:grid-cols-3">
{displayGitHubSolutions.map((solution) => (
<Card
key={solution.id ?? solution.slug}
className="border-0 shadow-soft-lg flex flex-col overflow-hidden"
>
{solution.imageUrl && (
<div className="relative h-48 w-full overflow-hidden">
<img
src={solution.imageUrl}
alt={solution.title}
loading="lazy"
className="h-full w-full object-cover"
/>
<div
className={`absolute inset-x-0 bottom-0 h-1 bg-gradient-to-r ${solution.gradient}`}
/>
</div>
)}
<CardContent className="p-8 flex flex-col flex-1">
<div
className={`h-1 w-16 bg-gradient-to-r ${solution.gradient} rounded-full mb-6`}
/>
<Link to={`/solutions/${solution.slug}`} className="group">
<h3 className="text-2xl font-semibold text-neutral-900 group-hover:text-brand-blue transition-colors">
{solution.title}
</h3>
</Link>
<p className="text-neutral-600 mt-4 leading-relaxed flex-1">
{solution.description}
</p>

{solution.features.length > 0 && (
<ul className="mt-8 space-y-3">
{solution.features.map((feature, featureIndex) => (
<li
key={`${solution.slug}-feature-${featureIndex}`}
className="flex items-start gap-3"
>
<span
className={`mt-1 inline-flex h-7 w-7 items-center justify-center rounded-full bg-gradient-to-r ${solution.gradient}`}
>
<CheckCircle className="h-4 w-4 text-white" />
</span>
<span className="text-sm text-neutral-600 leading-relaxed">
{feature}
</span>
</li>
))}
</ul>
)}

<div className="mt-10 flex flex-col sm:flex-row gap-3">
<Button
asChild
variant="outline"
className="flex-1 border-neutral-200 hover:border-brand-blue hover:text-brand-blue transition-colors"
>
<Link
to={`/solutions/${solution.slug}`}
className="flex items-center justify-center"
>
{t('index.learnMore')}
</Link>
</Button>
<Button
asChild
className="flex-1 bg-gradient-to-r from-brand-purple to-brand-blue hover:shadow-soft-lg transition-all"
>
<Link
to="/contact"
className="flex items-center justify-center gap-2"
>
{t('solutionsPage.requestDemo')}
<ArrowRight className="h-4 w-4" />
</Link>
</Button>
</div>
</CardContent>
</Card>
))}
</div>
)}
</div>
</section>

</Layout>
);
}
Expand Down
Loading