diff --git a/app/layout.tsx b/app/layout.tsx
index e0c4231..7c60b2e 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,9 +1,6 @@
import type { Metadata } from 'next'
-import { Inter } from 'next/font/google'
import { ThemeProvider } from '@/components/theme/ThemeProvider'
-const inter = Inter({ subsets: ['latin'] })
-
export const metadata: Metadata = {
title: 'LBMM RACS',
description: 'Laboratory website of LBMM RACS',
@@ -20,8 +17,8 @@ export default function RootLayout({
children: React.ReactNode
}) {
return (
-
-
+
+
{children}
diff --git a/app/sciencecommunication/page.tsx b/app/sciencecommunication/page.tsx
new file mode 100644
index 0000000..360b28c
--- /dev/null
+++ b/app/sciencecommunication/page.tsx
@@ -0,0 +1,18 @@
+'use client'
+
+import { Box } from '@mui/material'
+import { Header } from '@/components/organisms/Header'
+import { Footer } from '@/components/organisms/Footer'
+import { ScienceCommunicationSection } from '@/components/templates/ScienceCommunicationSection'
+
+export default function ScienceCommunicationPage() {
+ return (
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/app/teaching/page.tsx b/app/teaching/page.tsx
index 577930b..6cedc0c 100644
--- a/app/teaching/page.tsx
+++ b/app/teaching/page.tsx
@@ -1,43 +1,44 @@
-'use client'
-
-import { Box, Container, Grid } from '@mui/material'
-import { Header } from '@/components/organisms/Header'
-import { Footer } from '@/components/organisms/Footer'
-import { SectionTitle } from '@/components/atoms/SectionTitle'
-import { TeachingCard } from '@/components/molecules/TeachingCard'
+import { Box, Container, Typography } from '@mui/material'
+import { TeachingSection } from '@/components/templates/TeachingSection'
import { DataController } from '@/controllers/DataController'
+import { Header } from '@/components/organisms/Header'
+import { Footer } from '@/components/organisms/Footer'
export default function TeachingPage() {
- const teaching = DataController.getTeaching()
+ const graduations = DataController.getGraduations()
+ const courses = DataController.getCourses()
return (
+
-
-
-
-
-
- {teaching.map((item) => (
-
-
-
- ))}
-
-
-
+
+
+
+
+
+
+ Teaching
+
+
+ Courses and disciplines offered by the laboratory
+
+
+
+
+
+
+
+
)
-}
-
-
+}
\ No newline at end of file
diff --git a/components/molecules/LanguageSelector.tsx b/components/molecules/LanguageSelector.tsx
new file mode 100644
index 0000000..08eadcb
--- /dev/null
+++ b/components/molecules/LanguageSelector.tsx
@@ -0,0 +1,319 @@
+'use client'
+
+import { useState, useEffect } from 'react'
+import {
+ Button,
+ Menu,
+ MenuItem,
+ ListItemIcon,
+ ListItemText,
+ GlobalStyles,
+ Box,
+ Typography,
+} from '@mui/material'
+import LanguageIcon from '@mui/icons-material/Language'
+import CheckIcon from '@mui/icons-material/Check'
+
+export interface Language {
+ code: string
+ name: string
+ flag: string
+}
+
+const LANGUAGES: Language[] = [
+ { code: 'pt', name: 'Português', flag: '🇧🇷' },
+ { code: 'en', name: 'English', flag: '🇺🇸' },
+ { code: 'es', name: 'Español', flag: '🇪🇸' },
+ { code: 'fr', name: 'Français', flag: '🇫🇷' },
+ { code: 'de', name: 'Deutsch', flag: '🇩🇪' },
+ { code: 'it', name: 'Italiano', flag: '🇮🇹' },
+ { code: 'zh-CN', name: '中文', flag: '🇨🇳' },
+ { code: 'ja', name: '日本語', flag: '🇯🇵' },
+]
+
+declare global {
+ interface Window {
+ google?: {
+ translate?: {
+ TranslateElement?: new (
+ options: {
+ pageLanguage: string
+ includedLanguages?: string
+ layout?: number
+ autoDisplay?: boolean
+ },
+ elementId: string
+ ) => void
+ }
+ }
+ googleTranslateElementInit?: () => void
+ }
+}
+
+export function LanguageSelector() {
+ const [anchorEl, setAnchorEl] = useState(null)
+ const [currentLang, setCurrentLang] = useState('en')
+
+ const open = Boolean(anchorEl)
+
+ // Read current active language from googtrans cookie on mount
+ useEffect(() => {
+ const getCookieLang = () => {
+ const match = document.cookie.match(/googtrans=\/([^/]+)\/([^;]+)/)
+ if (match && match[2]) {
+ return match[2]
+ }
+ return 'en' // Default original site language is English
+ }
+
+ setCurrentLang(getCookieLang())
+
+ // Define global callback for Google Translate API
+ window.googleTranslateElementInit = () => {
+ if (window.google?.translate?.TranslateElement) {
+ new window.google.translate.TranslateElement(
+ {
+ pageLanguage: 'en', // Site's base content is in English
+ includedLanguages: 'pt,en,es,fr,de,it,zh-CN,ja',
+ autoDisplay: false,
+ },
+ 'google_translate_element'
+ )
+ }
+ }
+
+ // Inject Google Translate script if not already present
+ if (!document.getElementById('google-translate-script')) {
+ const script = document.createElement('script')
+ script.id = 'google-translate-script'
+ script.src =
+ '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'
+ script.async = true
+ document.body.appendChild(script)
+ }
+
+ // MutationObserver to continuously strip top bar and top offsets injected by Google Translate
+ const resetBodyStyles = () => {
+ if (document.body.style.top !== '0px' && document.body.style.top !== '') {
+ document.body.style.top = '0px'
+ }
+ if (
+ document.body.style.marginTop !== '0px' &&
+ document.body.style.marginTop !== ''
+ ) {
+ document.body.style.marginTop = '0px'
+ }
+ }
+
+ resetBodyStyles()
+ const observer = new MutationObserver(resetBodyStyles)
+ observer.observe(document.body, {
+ attributes: true,
+ attributeFilter: ['style'],
+ })
+
+ return () => observer.disconnect()
+ }, [])
+
+ const handleClick = (event: React.MouseEvent) => {
+ setAnchorEl(event.currentTarget)
+ }
+
+ const handleClose = () => {
+ setAnchorEl(null)
+ }
+
+ const handleSelectLanguage = (langCode: string) => {
+ handleClose()
+ setCurrentLang(langCode)
+
+ const domain = window.location.hostname
+ const host = window.location.host
+
+ // Helper to delete googtrans cookies across paths & domains
+ const clearCookie = () => {
+ const cookieOptions = [
+ 'googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;',
+ `googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=${domain};`,
+ `googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.${domain};`,
+ `googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=${host};`,
+ `googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.${host};`,
+ ]
+ cookieOptions.forEach((opt) => {
+ document.cookie = opt
+ })
+ }
+
+ clearCookie()
+
+ if (langCode !== 'en') {
+ // Set translation cookie from English ('en') to selected lang
+ const val = `/en/${langCode}`
+ document.cookie = `googtrans=${val}; path=/;`
+ if (domain) {
+ document.cookie = `googtrans=${val}; path=/; domain=${domain};`
+ document.cookie = `googtrans=${val}; path=/; domain=.${domain};`
+ }
+ }
+
+ // Try updating hidden google translate select element if present
+ const selectElem = document.querySelector(
+ '.goog-te-combo'
+ ) as HTMLSelectElement | null
+
+ if (selectElem) {
+ selectElem.value = langCode === 'en' ? '' : langCode
+ selectElem.dispatchEvent(new Event('change'))
+ }
+
+ // Reload page to trigger clean DOM translation
+ setTimeout(() => {
+ window.location.reload()
+ }, 100)
+ }
+
+ const activeLangObj =
+ LANGUAGES.find((l) => l.code === currentLang) ||
+ LANGUAGES.find((l) => l.code === 'en') ||
+ LANGUAGES[1]
+
+ return (
+ <>
+ {/* Complete CSS overrides to hide Google Translate top bar, tooltips, and frames */}
+ .skiptranslate': {
+ display: 'none !important',
+ },
+ '.goog-te-gadget': {
+ display: 'none !important',
+ },
+ }}
+ />
+
+ {/* Hidden element required by Google Translate SDK */}
+
+
+ {/* Custom MUI Language Selector Button */}
+ }
+ sx={{
+ textTransform: 'none',
+ fontWeight: 500,
+ px: 1.5,
+ borderRadius: 2,
+ border: '1px solid',
+ borderColor: 'divider',
+ '&:hover': {
+ backgroundColor: 'action.hover',
+ },
+ }}
+ aria-controls={open ? 'language-menu' : undefined}
+ aria-haspopup="true"
+ aria-expanded={open ? 'true' : undefined}
+ >
+
+ {activeLangObj.flag}
+
+
+ {activeLangObj.code.toUpperCase()}
+
+
+
+ {/* Dropdown Menu */}
+
+ >
+ )
+}
diff --git a/components/molecules/NewsCard.tsx b/components/molecules/NewsCard.tsx
index 6cbc456..aebfd07 100644
--- a/components/molecules/NewsCard.tsx
+++ b/components/molecules/NewsCard.tsx
@@ -1,4 +1,4 @@
-import { Card, CardContent, CardMedia, Typography, Box, Link, Chip } from '@mui/material'
+import { Card, CardContent, CardMedia, Typography, Box, Button, Chip } from '@mui/material'
import { CalendarToday, Person } from '@mui/icons-material'
import { News } from '@/models/DataModels'
@@ -34,7 +34,7 @@ export function NewsCard({ news }: NewsCardProps) {
sx={{ objectFit: 'cover' }}
/>
)}
-
+
@@ -55,17 +55,23 @@ export function NewsCard({ news }: NewsCardProps) {
{news.title}
-
+
{news.description}
+
{news.link && (
-
+
)}
)
-}
-
-
+}
\ No newline at end of file
diff --git a/components/molecules/ScienceCommunicationCard.tsx b/components/molecules/ScienceCommunicationCard.tsx
new file mode 100644
index 0000000..f64db76
--- /dev/null
+++ b/components/molecules/ScienceCommunicationCard.tsx
@@ -0,0 +1,91 @@
+'use client'
+
+import { Box, Typography, Paper, Button, Chip, Stack } from '@mui/material'
+import { Article, Mic, Videocam, Campaign, OpenInNew } from '@mui/icons-material'
+import Link from 'next/link'
+
+// Tipagem baseada no que costuma compor um card de divulgação (ajuste conforme seu DataController)
+interface SciCommItemProps {
+ item: {
+ id: string | number
+ title: string
+ description: string
+ type: 'podcast' | 'article' | 'video' | 'talk'
+ date: string
+ url: string
+ platform: string
+ }
+}
+
+export function ScienceCommunicationCard({ item }: SciCommItemProps) {
+ // Função para retornar o ícone correto baseado no tipo de mídia
+ const getIcon = (type: string) => {
+ switch (type) {
+ case 'podcast':
+ return
+ case 'video':
+ return
+ case 'article':
+ return
+ case 'talk':
+ return
+ default:
+ return
+ }
+ }
+
+ return (
+
+
+ {getIcon(item.type)}
+
+
+
+
+ {item.title}
+
+
+
+ {item.date}
+
+
+
+ {item.description}
+
+
+ }
+ sx={{ width: 'fit-content', p: 0, textTransform: 'none', fontWeight: 600 }}
+ >
+ Access Content
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/molecules/TeachingCard.tsx b/components/molecules/TeachingCard.tsx
index 25d20c4..a53ac4d 100644
--- a/components/molecules/TeachingCard.tsx
+++ b/components/molecules/TeachingCard.tsx
@@ -1,22 +1,39 @@
import { Card, CardContent, Typography, Box, Link, Chip } from '@mui/material'
-import { School, CalendarToday } from '@mui/icons-material'
-import { Teaching } from '@/models/DataModels'
+import { School, CalendarToday, AccountBalance } from '@mui/icons-material'
+import { Graduation, Course } from '@/models/DataModels'
interface TeachingCardProps {
- teaching: Teaching
+ item: Graduation | Course
}
-export function TeachingCard({ teaching }: TeachingCardProps) {
- const getTypeColor = (type?: string) => {
+export function TeachingCard({ item }: TeachingCardProps) {
+ // 1. VERIFICAÇÃO DE SEGURANÇA: Se não houver item, não renderiza nada e evita o erro
+ if (!item) return null
+
+ // Identifica se é um Curso (pois Course tem 'type', Graduation não)
+ const isCourse = 'type' in item
+
+ // Define o tipo interno para buscar a cor correta
+ const itemType = isCourse ? item.type : 'graduation'
+
+ // Define o que vai estar escrito no Chip (Usa o 'level' se for graduação, ou o 'type' se for curso)
+ const chipLabel = isCourse ? item.type : (('level' in item && item.level) ? item.level : 'Graduation')
+
+ // Define o local (Instituição ou Plataforma)
+ const location = 'institution' in item ? item.institution : item.platform
+
+ const getTypeColor = (type: string) => {
switch (type) {
- case 'course':
+ case 'graduation':
return 'primary'
+ case 'course':
+ return 'info'
case 'workshop':
return 'secondary'
case 'seminar':
return 'success'
- case 'discipline':
- return 'info'
+ case 'bootcamp':
+ return 'warning'
default:
return 'default'
}
@@ -35,38 +52,55 @@ export function TeachingCard({ teaching }: TeachingCardProps) {
},
}}
>
-
-
-
+
+
+
-
- {teaching.title}
+
+ {item.title}
- {teaching.type && (
-
+
+ {/* O texto do Chip agora é o chipLabel */}
+
+
+ {location && (
+
+
+
+ {location}
+
+
)}
- {teaching.period && (
-
+
+ {item.period && (
+
- {teaching.period}
+ {item.period}
)}
-
- {teaching.description}
+
+
+ {item.description}
- {teaching.link && (
+
+ {item.link && (
-
+
Learn more
@@ -74,6 +108,4 @@ export function TeachingCard({ teaching }: TeachingCardProps) {
)
-}
-
-
+}
\ No newline at end of file
diff --git a/components/organisms/Header.tsx b/components/organisms/Header.tsx
index 21329ad..50bb17f 100644
--- a/components/organisms/Header.tsx
+++ b/components/organisms/Header.tsx
@@ -17,11 +17,14 @@ import {
IconButton,
useScrollTrigger,
Container,
+ Divider,
} from '@mui/material'
import { Menu, Close } from '@mui/icons-material'
import { useTheme, useMediaQuery } from '@mui/material'
import Image from 'next/image'
+import { LanguageSelector } from '@/components/molecules/LanguageSelector'
+// Atualizamos a label para 'Education' e o path para refletir a nova estrutura
const navItems = [
{ label: 'Home', path: '/' },
{ label: 'About', path: '/about' },
@@ -31,6 +34,7 @@ const navItems = [
{ label: 'Tools', path: '/tools' },
{ label: 'Teaching', path: '/teaching' },
{ label: 'Collaborations', path: '/collaborations' },
+ { label: 'Science', path: '/sciencecommunication' },
{ label: 'Contact', path: '/contact' },
]
@@ -49,7 +53,7 @@ export function Header() {
}
const drawer = (
-
+
Menu
@@ -58,7 +62,11 @@ export function Header() {
-
+
+
+
+
+
{navItems.map((item) => (
-
+
{isMobile ? (
-
-
-
+
+
+
+
+
+
) : (
-
+
{navItems.map((item) => (
)}
@@ -170,4 +186,4 @@ export function Header() {
>
)
-}
+}
\ No newline at end of file
diff --git a/components/templates/AboutSection.tsx b/components/templates/AboutSection.tsx
index caae902..47c1b7f 100644
--- a/components/templates/AboutSection.tsx
+++ b/components/templates/AboutSection.tsx
@@ -15,12 +15,12 @@ export function AboutSection() {
{
icon: ,
title: 'Research',
- description: 'Dedication to scientific research with emphasis on computational reproducibility.',
+ description: 'Dedication to scientific research on bioinformatics of microbiomes and microbes',
},
{
icon: ,
title: 'Collaboration',
- description: 'Networking with researchers from Brazil and Latin America.',
+ description: 'Networking with researchers from Brazil and abroad',
},
]
@@ -80,7 +80,7 @@ export function AboutSection() {
}}
>
- Biography
+ Mission and Vision
{personalInfo.bio}
diff --git a/components/templates/ContactSection.tsx b/components/templates/ContactSection.tsx
index d1f9955..07fd453 100644
--- a/components/templates/ContactSection.tsx
+++ b/components/templates/ContactSection.tsx
@@ -41,7 +41,7 @@ export function ContactSection() {
- Personal email
+ Lab email
{personalInfo.contact.email}
@@ -53,7 +53,7 @@ export function ContactSection() {
- Institutional email
+ Dr. Renato Santos (PI)
{personalInfo.contact.institutionalEmail}
diff --git a/components/templates/CurriculumSection.tsx b/components/templates/CurriculumSection.tsx
index 5fba57d..263059d 100644
--- a/components/templates/CurriculumSection.tsx
+++ b/components/templates/CurriculumSection.tsx
@@ -1,5 +1,5 @@
'use client'
-
+import CoPresentTwoToneIcon from '@mui/icons-material/CoPresentTwoTone';
import {
Box,
Container,
@@ -52,6 +52,7 @@ function TabPanel(props: TabPanelProps) {
export function CurriculumSection() {
const [value, setValue] = useState(0)
+ const presentations = DataController.getPresentations();
const publications = DataController.getPublications()
const professionalExperience = DataController.getProfessionalExperience()
const awards = DataController.getAwards()
@@ -101,14 +102,13 @@ export function CurriculumSection() {
borderColor: 'divider',
}}
>
- } iconPosition="start" label="Experience" />
} iconPosition="start" label="Publications" />
} iconPosition="start" label="Awards" />
- } iconPosition="start" label="Skills" />
- } iconPosition="start" label="Links" />
+ } iconPosition="start" label="Conference attendance" />
+
-
+
{professionalExperience.map((exp) => (
-
+
Selected Publications
@@ -159,7 +159,7 @@ export function CurriculumSection() {
-
+
{awards.map((award) => (
-
+
+
+ {presentations.map((presentation) => (
+
+
+
+
+ {/* Título e Ícone */}
+
+
+
+ {presentation.title}
+
+
+
+ {/* Autores */}
+
+ {presentation.authors.join(', ')}
+
+
+ {/* Nome do Evento */}
+
+ {presentation.conferenceName}
+
+
+ {/* Descrição Opcional */}
+ {presentation.description && (
+
+ {presentation.description}
+
+ )}
+
+ {/* Chips de Informação (Ano, Tipo e Status) */}
+
+
+
+ {presentation.status === 'upcoming' && (
+
+ )}
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+ {sciCommData.map((item) => (
+
+
+
+ ))}
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/templates/TeachingSection.tsx b/components/templates/TeachingSection.tsx
new file mode 100644
index 0000000..31f00bc
--- /dev/null
+++ b/components/templates/TeachingSection.tsx
@@ -0,0 +1,64 @@
+import { Box, Typography, Grid, Divider } from '@mui/material'
+// IMPORTANTE: Ajuste o caminho do TeachingCard conforme a sua estrutura.
+// Como este arquivo está em 'templates', talvez o card esteja em '../components/TeachingCard'
+import { TeachingCard } from '@/components/molecules/TeachingCard'
+import { Graduation, Course } from '@/models/DataModels'
+
+interface TeachingSectionProps {
+ graduations: Graduation[]
+ courses: Course[]
+}
+
+// CORREÇÃO: O nome da função agora é exatamente TeachingSection
+export function TeachingSection({ graduations, courses }: TeachingSectionProps) {
+ return (
+
+
+ {/* Seção de Graduação (Graduations & Degrees) */}
+ {graduations && graduations.length > 0 && (
+
+
+ Graduations & Degrees
+
+
+ Academic degrees and university-level education.
+
+
+
+ {graduations.map((graduation, index) => (
+
+
+
+ ))}
+
+
+ )}
+
+ {/* Divisor condicional entre seções */}
+ {graduations && courses && graduations.length > 0 && courses.length > 0 && (
+
+ )}
+
+ {/* Seção de Cursos (Courses & Workshops) */}
+ {courses && courses.length > 0 && (
+
+
+ Courses & Workshops
+
+
+ Extracurricular courses, seminars, and technical workshops.
+
+
+
+ {courses.map((course, index) => (
+
+
+
+ ))}
+
+
+ )}
+
+
+ )
+}
\ No newline at end of file
diff --git a/controllers/DataController.ts b/controllers/DataController.ts
index 07d31cb..71e4d79 100644
--- a/controllers/DataController.ts
+++ b/controllers/DataController.ts
@@ -14,17 +14,105 @@ import {
Tool,
Teaching,
TeamMember,
+ ConferencePresentation,
+ SciCommItem,
+ Course,
+ Graduation,
} from '@/models/DataModels'
export class DataController {
static getLabInfo(): LabInfo {
return {
- name: 'LBMM RACS',
+ name: '',
fullName: 'Laboratory of Bioinformatics and Microbial Multi-omics',
acronym: 'LBMM',
- description: 'Research laboratory dedicated to bioinformatics and multi-omics analysis of microorganisms. We combine computational approaches with biological research to advance our understanding of microbial systems.',
+ description: 'Our research integrates bioinformatics and multi-omics analyses to study the diversity, functions, and interactions of microorganisms in experimental systems and natural microbiomes. We use metagenomics, metatranscriptomics, and network analysis to investigate ecological processes and biotechnological potential. Additionally, we develop collaborations using artificial intelligence-based approaches and language models for literature data analysis.',
}
}
+ static getGraduations(): Graduation[] {
+ return [
+ {
+ id: 1,
+ title: 'Bioinformatics applied to distinct omics approaches',
+ institution: 'São Paulo State University (UNESP)',
+ level: 'Master/Doctorate',
+ period: '',
+ description: 'Undergraduate thesis evaluating the biotechnological potential of natural microbiomes using computational tools.',
+ link:"https://ib.rc.unesp.br/Home/Pos-Graduacao44/secaotecnicadepos46/programas/cienciasbiologicasbiologiacelularmolecularemicrobiologia/bioinformatica-aplicada-a-distintas-abordagens-omicas.pdf"
+ }
+ ]
+ }
+
+ static getCourses(): Course[] {
+ return [
+ {
+ id: 1,
+ title: 'Applied Metagenomics and Multi-omics',
+ type: 'course',
+ platform: 'Coursera',
+ period: '2023',
+ description: 'Comprehensive course on sequencing data analysis, from quality control to functional annotation of microorganisms.',
+ link: 'https://coursera.org'
+ },
+ {
+ id: 2,
+ title: 'AI and Language Models in Literature Analysis',
+ type: 'workshop',
+ platform: 'ISCB (International Society for Computational Biology)',
+ period: '2024',
+ description: 'Hands-on workshop exploring the use of Artificial Intelligence and LLMs for biological literature mining and data extraction.'
+ },
+ {
+ id: 3,
+ title: 'Microbiome Network Analysis',
+ type: 'bootcamp',
+ platform: 'EMBL-EBI',
+ period: '2022',
+ description: 'Intensive training on constructing and analyzing microbial interaction networks to investigate ecological processes.'
+ }
+ ]
+ }
+
+ static getScienceCommunication(): SciCommItem[] {
+ return [
+ {
+ id: 1,
+ title: 'A Importância da Reprodutibilidade na Bioinformática',
+ description: 'Discussão sobre como práticas computacionais reprodutíveis estão moldando o futuro da análise de dados biológicos e a ciência aberta.',
+ type: 'video',
+ date: 'Oct 15, 2023',
+ url: 'https://youtube.com',
+ platform: 'YouTube'
+ },
+ {
+ id: 2,
+ title: 'Desmistificando a Genômica e a Transcriptômica',
+ description: 'Um bate-papo acessível sobre os fundamentos do sequenciamento genético e como extraímos informações valiosas do DNA.',
+ type: 'podcast',
+ date: 'Sep 02, 2023',
+ url: 'https://spotify.com',
+ platform: 'Spotify'
+ },
+ {
+ id: 3,
+ title: 'Saúde Mental na Pós-Graduação e na Pesquisa Científica',
+ description: 'Artigo abordando os desafios de saúde mental enfrentados por pesquisadores e como podemos promover um ambiente acadêmico mais saudável.',
+ type: 'article',
+ date: 'Aug 10, 2023',
+ url: 'https://medium.com',
+ platform: 'Medium'
+ },
+ {
+ id: 4,
+ title: 'Introdução à Análise de Dados Biológicos',
+ description: 'Palestra de introdução aos conceitos fundamentais de análise de dados aplicados à biologia molecular e microbiologia.',
+ type: 'talk',
+ date: 'Jul 22, 2023',
+ url: 'https://linkedin.com',
+ platform: 'Symposium'
+ }
+ ]
+ }
static getPersonalInfo(): PersonalInfo {
return {
@@ -36,19 +124,23 @@ export class DataController {
'Bioinformatics Education',
'Mental Health',
'Microbiology and Plant Biology',
+ 'Omics',
+ 'Microbiomes',
+ 'Micro-organisms',
+ 'Bioinformatics',
'Research Ethics and Integrity',
'Computer Science, Data Science, and Data Analysis',
'Genetics and Molecular Biology',
],
contact: {
- email: 'renatoacsantos@gmail.com',
- institutionalEmail: 'renatoacsantos@usp.br',
- phone: '+55 (19) 99722-5665',
+ email: 'labbmmicro@gmail.com',
+ institutionalEmail: 'rac.santos@unesp.br',
+ phone: '',
address: 'Brazil',
socialMedia: {
- instagram: 'https://www.instagram.com/renato.correa.182/',
- facebook: 'https://www.facebook.com/renato.correa.182',
- linkedin: 'https://www.linkedin.com/in/renato-augusto-corr%C3%AAa-dos-santos-263202132/',
+ instagram: 'https://www.instagram.com/lab_lbmm/',
+ facebook: '',
+ linkedin: 'https://www.linkedin.com/company/laborat%C3%B3rio-de-bioinform%C3%A1tica-e-multi-%C3%B4micas-de-microrganismos/',
orcid: 'https://orcid.org/0000-0003-0826-5479',
},
},
@@ -68,6 +160,49 @@ export class DataController {
]
}
+ static getPresentations(): ConferencePresentation[] {
+ return [
+ {
+ id: '1',
+ title: 'Título do trabalho da Julia no CIC',
+ authors: ['julia.amaro@unesp.br', 'Outros Autores'],
+ conferenceName: 'Congresso de Iniciação Científica (CIC)',
+ year: 2026,
+ status: 'upcoming',
+ type: 'poster',
+ description: 'Apresentação dos resultados parciais da pesquisa no CIC.',
+ },
+ {
+ id: '2',
+ title: 'Título do trabalho do JFS no CIC',
+ authors: ['jfs.ferreira@unesp.br', 'Outros Autores'],
+ conferenceName: 'Congresso de Iniciação Científica (CIC)',
+ year: 2026,
+ status: 'upcoming',
+ type: 'poster',
+ },
+ {
+ id: '3',
+ title: 'Título do trabalho da Lorena no CIC',
+ authors: ['lorena.f.silva@unesp.br', 'Outros Autores'],
+ conferenceName: 'Congresso de Iniciação Científica (CIC)',
+ year: 2026,
+ status: 'upcoming',
+ type: 'poster',
+ },
+ {
+ id: '4',
+ title: 'Título do trabalho submetido ao Congresso de Genética',
+ authors: ['julia.amaro@unesp.br', 'Outra Julia', 'fabiorodrigodefreitas@gmail.com'],
+ conferenceName: 'Congresso Brasileiro de Genética',
+ year: 2026,
+ status: 'upcoming',
+ type: 'poster',
+ description: 'Trabalho desenvolvido em conjunto sobre genômica/bioinformática.',
+ }
+ ];
+ }
+
static getPublications(): Publication[] {
return [
{
@@ -326,6 +461,41 @@ export class DataController {
lab: 'CPQBA',
type: 'active',
},
+ {
+ id: 'active-12',
+ name: 'Júlia Braga Amaro',
+ institution: 'São Paulo State University (UNESP)',
+ lab: 'LBMM',
+ type: 'active',
+ },
+ {
+ id: 'active-13',
+ name: 'Lorena Ferreira da Silva',
+ institution: 'São Paulo State University (UNESP)',
+ lab: 'LBMM',
+ type: 'active',
+ },
+ {
+ id: 'active-14',
+ name: 'Julia Ferreira Santos',
+ institution: 'São Paulo State University (UNESP)',
+ lab: 'LBMM',
+ type: 'active',
+ },
+ {
+ id: 'active-15',
+ name: 'Fábio Rodrigo de Freitas ',
+ institution: 'São Paulo State University (UNESP)',
+ lab: 'LBMM',
+ type: 'active',
+ },
+ {
+ id: 'active-15',
+ name: 'Eduardo Barbosa',
+ institution: 'São Paulo State University (UNESP)',
+ lab: 'LBMM',
+ type: 'active',
+ },
{
id: 'worked-1',
name: 'Prof. Dr. Flavia Vischi Winck',
@@ -408,12 +578,14 @@ export class DataController {
description: 'Our latest research on computational reproducibility in biological sciences has been published.',
date: '2024-01-15',
author: 'Dr. Renato A. Corrêa dos Santos',
+ link: "vsvs"
},
{
id: '2',
title: 'Workshop on Python for Biological Data',
description: 'Join us for our upcoming workshop on Python programming for biological data analysis.',
date: '2024-02-20',
+ link: "vsvs"
},
]
}
diff --git a/models/DataModels.ts b/models/DataModels.ts
index ebdb46e..47a0bff 100644
--- a/models/DataModels.ts
+++ b/models/DataModels.ts
@@ -28,6 +28,49 @@ export interface Initiative {
website?: string
}
}
+export interface SciCommItem {
+ id: string | number
+ title: string
+ description: string
+ type: 'podcast' | 'article' | 'video' | 'talk'
+ date: string
+ url: string
+ platform: string
+}
+export interface Graduation {
+ id: string | number
+ title: string
+ level: 'Bachelor' | 'Master' | 'phd' | 'Doctorate'| 'Master/Doctorate'
+ institution: string
+ period: string
+ description: string
+ link?: string
+}
+export interface Course {
+ id: string | number
+ title: string
+ type: 'course' | 'workshop' | 'seminar' | 'bootcamp'
+ platform: string
+ period: string
+ description: string
+ link?: string
+}
+export interface ConferencePresentation {
+ id: string
+ title: string
+ authors: string[]
+ conferenceName: string
+ year: number
+ status: 'presented' | 'upcoming'
+ type: 'poster' | 'oral' | 'attendee'
+ description?: string
+ image?: string
+ links?: {
+ instagram?: string
+ anais?: string
+ website?: string
+ }
+}
export interface ContactInfo {
email: string
diff --git a/package-lock.json b/package-lock.json
index afab707..35df6cc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -257,7 +257,6 @@
"resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
"integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.18.3",
"@emotion/babel-plugin": "^11.13.5",
@@ -301,7 +300,6 @@
"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz",
"integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.18.3",
"@emotion/babel-plugin": "^11.13.5",
@@ -571,7 +569,6 @@
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz",
"integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.23.9",
"@mui/core-downloads-tracker": "^5.18.0",
@@ -1073,7 +1070,6 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz",
"integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.2.2"
@@ -1143,7 +1139,6 @@
"integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.52.0",
"@typescript-eslint/types": "8.52.0",
@@ -1650,7 +1645,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2544,7 +2538,6 @@
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -4643,7 +4636,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=12"
},
@@ -4752,7 +4744,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -4765,7 +4756,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.2"
@@ -5691,7 +5681,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"