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
11 changes: 9 additions & 2 deletions src/app/chat/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
import Chat from "@/sections/chat/Chat";
import type { Metadata } from 'next';
import Chat from '@/sections/chat/Chat';

export const metadata: Metadata = {
title: 'Asistente AI',
description:
'Interactúa con nuestra inteligencia artificial para resolver dudas sobre SCADA, BMS y AIIoT.',
};

export default async function Index() {
return <Chat />;
return <Chat />;
}
33 changes: 20 additions & 13 deletions src/app/industrias/page.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
import { Box } from "@mui/material";
import { IndustrySlider } from "@/sections/industries/IndustrySlider";
import { IndustryCards } from "@/sections/industries/IndustryCards";
import { IndustryTitle } from "@/sections/industries/IndustryTitle";
import { IndustryFooter } from "@/sections/industries/IndustryFooter";
import type { Metadata } from 'next';
import { Box } from '@mui/material';
import { IndustrySlider } from '@/sections/industries/IndustrySlider';
import { IndustryCards } from '@/sections/industries/IndustryCards';
import { IndustryTitle } from '@/sections/industries/IndustryTitle';
import { IndustryFooter } from '@/sections/industries/IndustryFooter';

export const metadata: Metadata = {
title: 'Soluciones por Industria',
description:
'Descubre cómo LogOS optimiza operaciones en Smart Cities, gestión de edificios y entornos industriales.',
};

export default function Industrias() {
return (
<Box component="main">
<IndustryTitle />
<IndustrySlider />
<IndustryCards />
<IndustryFooter />
</Box>
);
return (
<Box component='main'>
<IndustryTitle />
<IndustrySlider />
<IndustryCards />
<IndustryFooter />
</Box>
);
}
137 changes: 60 additions & 77 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,91 +1,74 @@
import { MuiRootProvider } from "@/providers/MuiRootProvider";
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import InitColorSchemeScript from "@mui/material/InitColorSchemeScript";
import { MuiRootProvider } from '@/providers/MuiRootProvider';
import type { Metadata } from 'next';
import { Geist, Geist_Mono } from 'next/font/google';
import InitColorSchemeScript from '@mui/material/InitColorSchemeScript';
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
variable: '--font-geist-sans',
subsets: ['latin'],
});

const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
variable: '--font-geist-mono',
subsets: ['latin'],
});

export const metadata: Metadata = {
title: "LogOS",
description:
"Mejora tu eficiencia usando nuestro sistema de gestión inteligente. SCADA, BMS, AIIoT",
applicationName: "LogOS",
keywords: [
"SCADA",
"industrial",
"AIIoT",
"AI",
"IIoT",
"BMS",
"HMI",
"SEEED",
"KUNBUS",
"Smart Cities",
"Smart City",
"Building Management System",
"Building",
"Management",
"System",
"events",
"alarms",
"bylogosio",
"logosia",
"bylogosia",
"bylogosiot",
"logosio",
"logosiot",
"IoT",
"automatización",
"LogOS",
"ByLogos",
"IA",
"Logos",
"monitorización",
"solución",
"local-first",
"software",
"hardware",
],
robots: {
googleBot: {
index: true,
follow: true,
},
},
authors: [
{ name: "LogOS", url: "https://www.linkedin.com/company/bylogos/" },
],
creator: "Javier Vargas",
metadataBase: new URL("https://bylogos.io"),
title: {
default: 'Inteligencia Industrial SCADA, BMS, AIIoT | LogOS',
template: '%s | LogOS',
},
description:
'LogOS: Sistema de gestión inteligente para SCADA, BMS y AIIoT. Mejora la eficiencia operacional en Smart Cities e industria.',
applicationName: 'LogOS',
keywords: [
'LogOS',
'SCADA',
'BMS',
'AIIoT',
'IIoT',
'Industrial AI',
'Smart Cities',
'Automatización Industrial',
'Monitorización en Tiempo Real',
'Gestión de Edificios',
'HMI',
'ByLogos',
],
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
},
},
authors: [
{ name: 'LogOS', url: 'https://www.linkedin.com/company/bylogos/' },
],
creator: 'Javier Vargas',
metadataBase: new URL('https://bylogos.io'),
};

import { ConditionalHeader } from "@/sections/layout/ConditionalHeader";
import { ConditionalFooter } from "@/sections/layout/ConditionalFooter";
import { ConditionalHeader } from '@/sections/layout/ConditionalHeader';
import { ConditionalFooter } from '@/sections/layout/ConditionalFooter';

export default function RootLayout({
children,
children,
}: Readonly<{
children: React.ReactNode;
children: React.ReactNode;
}>) {
return (
<html lang="en" suppressHydrationWarning>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
<InitColorSchemeScript attribute="class" defaultMode="dark" />
<MuiRootProvider>
<ConditionalHeader />
{children}
<ConditionalFooter />
</MuiRootProvider>
</body>
</html>
);
return (
<html lang='en' suppressHydrationWarning>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
<InitColorSchemeScript attribute='class' defaultMode='dark' />
<MuiRootProvider>
<ConditionalHeader />
{children}
<ConditionalFooter />
</MuiRootProvider>
</body>
</html>
);
}
56 changes: 29 additions & 27 deletions src/app/news/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,42 +1,44 @@
import { news } from "@/velite";
import { notFound } from "next/navigation";
import { Metadata } from "next";
import { NewsPost } from "@/sections/news/NewsPost";
import { news } from '@/velite';
import { notFound } from 'next/navigation';
import { Metadata } from 'next';
import { NewsPost } from '@/sections/news/NewsPost';

interface PageProps {
params: Promise<{ slug: string }>;
params: Promise<{ slug: string }>;
}

export async function generateStaticParams() {
return news.map((post) => ({
slug: post.slug.split("/").pop(), // "news/my-post" -> "my-post"
}));
return news.map((post) => ({
slug: post.slug.split('/').pop(), // "news/my-post" -> "my-post"
}));
}

export async function generateMetadata({
params,
params,
}: PageProps): Promise<Metadata> {
const resolvedParams = await params;
// Velite slug is "news/slug", params.slug is "slug"
const post = news.find((p) => p.slug === `news/${resolvedParams.slug}`);

if (!post) {
return {};
}

return {
title: `${post.title} | Logos News`,
description: post.description,
};
const resolvedParams = await params;
// Velite slug is 'news/slug', params.slug is 'slug'
const post = news.find((p) => p.slug === `news/${resolvedParams.slug}`);

if (!post) {
return {
title: 'Noticia no encontrada',
};
}

return {
title: post.title,
description: post.description,
};
}

export default async function NewsPostPage({ params }: PageProps) {
const resolvedParams = await params;
const post = news.find((p) => p.slug === `news/${resolvedParams.slug}`);
const resolvedParams = await params;
const post = news.find((p) => p.slug === `news/${resolvedParams.slug}`);

if (!post) {
notFound();
}
if (!post) {
notFound();
}

return <NewsPost post={post} />;
return <NewsPost post={post} />;
}
47 changes: 24 additions & 23 deletions src/app/news/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { news } from "@/velite"; // Using alias
import { Box } from "@mui/material";
import { NewsTitle } from "@/sections/news/NewsTitle";
import { NewsSlider } from "@/sections/news/NewsSlider";
import { NewsPosts } from "@/sections/news/NewsPosts";
import { IndustryFooter } from "@/sections/industries/IndustryFooter"; // Reusing footer as requested ('mismo footer') - actually prompt said "same header and footer as most sections" which usually means global layout, but Industry page has IndustryFooter.
import { news } from '@/velite'; // Using alias
import { Box } from '@mui/material';
import { NewsTitle } from '@/sections/news/NewsTitle';
import { NewsSlider } from '@/sections/news/NewsSlider';
import { NewsPosts } from '@/sections/news/NewsPosts';
import { IndustryFooter } from '@/sections/industries/IndustryFooter'; // Reusing footer as requested ('mismo footer') - actually prompt said "same header and footer as most sections" which usually means global layout, but Industry page has IndustryFooter.
import { Metadata } from 'next';
// User said: "usará mismo header y footer que la mayoria de las secciones del website"
// Industry page uses `IndustryFooter`. Global layout likely handles Header/Footer if not overridden.
// Industries page explicitly imports `IndustryFooter`. I will check if I should use that or default.
Expand Down Expand Up @@ -52,26 +53,26 @@ export default function Industrias() {
// Better yet, I'll just write the page without footer first, as that's safer for "most sections".
// But I need to sort the news.

export const metadata = {
title: "Noticias y Novedades | Logos",
description:
"Mantente informado con las últimas noticias sobre tecnología industrial, IA e IoT.",
export const metadata: Metadata = {
title: 'Noticias y Blog',
description:
'Mantente informado con las últimas noticias sobre tecnología industrial, IA e IoT de la mano de LogOS.',
};

export default function NewsPage() {
// Sort posts by date descending (newest first)
const sortedPosts = news.sort((a, b) => {
return new Date(b.date).getTime() - new Date(a.date).getTime();
});
// Sort posts by date descending (newest first)
const sortedPosts = news.sort((a, b) => {
return new Date(b.date).getTime() - new Date(a.date).getTime();
});

// Top 5 for slider
const sliderPosts = sortedPosts.slice(0, 5);
// Top 5 for slider
const sliderPosts = sortedPosts.slice(0, 5);

return (
<Box component="main">
<NewsTitle />
<NewsSlider posts={sliderPosts} />
<NewsPosts posts={sortedPosts} />
</Box>
);
return (
<Box component='main'>
<NewsTitle />
<NewsSlider posts={sliderPosts} />
<NewsPosts posts={sortedPosts} />
</Box>
);
}
31 changes: 19 additions & 12 deletions src/app/nosotros/page.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
import { Container, Typography } from "@mui/material";
import type { Metadata } from 'next';
import { Container, Typography } from '@mui/material';

export const metadata: Metadata = {
title: 'Sobre Nosotros',
description:
'Conoce al equipo detrás de LogOS y nuestra misión de transformar la gestión industrial mediante IA y AIIoT.',
};

export default function Nosotros() {
return (
<Container sx={{ mt: 15, mb: 10, flex: 1 }}>
<Typography variant="h2" fontWeight={800} gutterBottom>
Nosotros
</Typography>
<Typography variant="h5" color="text.secondary">
Esta página está en construcción. Pronto conocerás más sobre LogOS y
nuestro equipo.
</Typography>
</Container>
);
return (
<Container sx={{ mt: 15, mb: 10, flex: 1 }}>
<Typography variant='h2' fontWeight={800} gutterBottom>
Nosotros
</Typography>
<Typography variant='h5' color='text.secondary'>
Esta página está en construcción. Pronto conocerás más sobre LogOS y
nuestro equipo.
</Typography>
</Container>
);
}
Loading