{"version":3,"file":"static/chunks/app/blog/page-314f7530733c5a46.js","mappings":"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","sources":["webpack://_N_E/?d058","webpack://_N_E/../../../src/icons/tag.ts","webpack://_N_E/../../../src/icons/calendar.ts","webpack://_N_E/./components/blog/BlogCard.tsx","webpack://_N_E/../../../src/icons/chevron-left.ts","webpack://_N_E/../../../src/icons/chevron-right.ts","webpack://_N_E/./components/blog/blogCardsAll.tsx","webpack://_N_E/./data/posts.ts","webpack://_N_E/./lib/utils.ts"],"sourcesContent":["import(/* webpackMode: \"eager\", webpackExports: [\"default\"] */ \"/codebuild/output/src1460634154/src/minisite_cyde/components/blog/blogCardsAll.tsx\");\n;\nimport(/* webpackMode: \"eager\" */ \"/codebuild/output/src1460634154/src/minisite_cyde/node_modules/next/dist/client/image-component.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/codebuild/output/src1460634154/src/minisite_cyde/node_modules/next/dist/client/link.js\");\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Tag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuNTg2IDIuNTg2QTIgMiAwIDAgMCAxMS4xNzIgMkg0YTIgMiAwIDAgMC0yIDJ2Ny4xNzJhMiAyIDAgMCAwIC41ODYgMS40MTRsOC43MDQgOC43MDRhMi40MjYgMi40MjYgMCAwIDAgMy40MiAwbDYuNTgtNi41OGEyLjQyNiAyLjQyNiAwIDAgMCAwLTMuNDJ6IiAvPgogIDxjaXJjbGUgY3g9IjcuNSIgY3k9IjcuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/tag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Tag = createLucideIcon('Tag', [\n [\n 'path',\n {\n d: 'M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z',\n key: 'vktsd0',\n },\n ],\n ['circle', { cx: '7.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'kqv944' }],\n]);\n\nexport default Tag;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Calendar\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOCAydjQiIC8+CiAgPHBhdGggZD0iTTE2IDJ2NCIgLz4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjQiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik0zIDEwaDE4IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/calendar\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Calendar = createLucideIcon('Calendar', [\n ['path', { d: 'M8 2v4', key: '1cmpym' }],\n ['path', { d: 'M16 2v4', key: '4m81vk' }],\n ['rect', { width: '18', height: '18', x: '3', y: '4', rx: '2', key: '1hopcy' }],\n ['path', { d: 'M3 10h18', key: '8toen8' }],\n]);\n\nexport default Calendar;\n","import Image from \"next/image\";\nimport { Calendar, Tag } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { formatPostDate } from \"@/lib/utils\";\n\ninterface BlogCardProps {\n post: BlogPost;\n featured?: boolean;\n}\n\ninterface BlogPost {\n id: string;\n title: string;\n excerpt: string;\n category: string;\n date: string;\n coverImage: string;\n linkToPage: string;\n tags: string[];\n author: string;\n file: string;\n}\n\nexport default function BlogCard({ post, featured = false }: BlogCardProps) {\n return (\n \n
\n \n
\n
\n\n
\n
\n \n \n {post.category} \n \n
\n \n {formatPostDate(post.date)}\n
\n
\n\n \n {post.title}\n \n\n

{post.excerpt}

\n
\n \n );\n}\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronLeft = createLucideIcon('ChevronLeft', [\n ['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }],\n]);\n\nexport default ChevronLeft;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronRight = createLucideIcon('ChevronRight', [\n ['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }],\n]);\n\nexport default ChevronRight;\n","\"use client\";\n\nimport { useState } from \"react\";\nimport BlogCard from \"./BlogCard\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\ninterface BlogGridProps {\n posts: BlogPost[];\n postsPerPage?: number;\n withPagination?: boolean;\n}\n\ninterface BlogPost {\n id: string;\n title: string;\n excerpt: string;\n category: string;\n date: string;\n coverImage: string;\n linkToPage: string;\n tags: string[];\n author: string;\n file: string;\n}\n\nexport default function BlogCardsAll({\n posts,\n postsPerPage = 6,\n withPagination = false,\n}: BlogGridProps) {\n const [currentPage, setCurrentPage] = useState(1);\n\n const totalPages = Math.ceil(posts.length / postsPerPage);\n const startIndex = (currentPage - 1) * postsPerPage;\n const endIndex = startIndex + postsPerPage;\n const currentPosts = posts.slice(startIndex, endIndex);\n\n const handlePageChange = (page: number) => {\n setCurrentPage(page);\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n };\n\n return (\n
\n
\n {currentPosts.map((post) => (\n \n ))}\n
\n\n {withPagination && totalPages > 1 && (\n \n handlePageChange(currentPage - 1)}\n disabled={currentPage === 1}\n className=\"inline-flex items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n >\n \n Previous\n \n\n
\n {[...Array(totalPages)].map((_, index) => (\n handlePageChange(index + 1)}\n className={`inline-flex h-8 w-8 items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground ${\n currentPage === index + 1\n ? \"bg-primary text-primary-foreground\"\n : \"bg-background\"\n }`}\n >\n {index + 1}\n \n ))}\n
\n\n handlePageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n className=\"inline-flex items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n >\n Next\n \n \n \n )}\n
\n );\n}\n","interface BlogPost {\n id: string;\n title: string;\n excerpt: string;\n category: string;\n date: string;\n coverImage: string; // Image de la preview du post dans les pages blog et archive\n linkToPage: string;\n tags: string[];\n author: string;\n file: string;\n}\n\n// L'id doit être le même que l'URL\n// id = Test3 ; linkToPage = blog/Test3\n\nexport const posts: BlogPost[] = [\n // {\n // id: \"Building-Scalable\",\n // title: \"Building Scalable Applications with Next.js\",\n // excerpt:\n // \"Learn the best practices for building large-scale applications using Next.js and React.\",\n // category: \"Web Development\",\n // date: \"08-03-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/Building-Scalable\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"scalable\",\n // },\n {\n id: \"Retour-experience-Hackathon-IA\",\n title: \"Retour d’expérience : Hackathon IA\",\n excerpt:\n \"Plongez dans le coeur de notre hackathon sur l’IA générative et sur le machine learning.\",\n category: \"IA\",\n date: \"13-01-2025\",\n coverImage: \"/article/Retour-experience-Hackathon-IA/hackathon.webp\",\n linkToPage: \"/blog/Retour-experience-Hackathon-IA\",\n tags: [\"Hackathon\", \"IA\", \"Python\", \"Machine Learning\", \"IA générative\"],\n author: \"NZ\",\n file: \"Retour-experience-Hackathon-IA\",\n },\n {\n id: \"Bilan-du-premier-PI\",\n title: \"Bilan du premier PI : Notre plan à 9 mois en action\",\n excerpt:\n \"Bilan stratégique et technologique de notre premier trimestre avec des avancées significatives.\",\n category: \"Innovation\",\n date: \"11-03-2025\",\n coverImage: \"/article/Bilan-du-premier-PI/pi.webp\",\n linkToPage: \"/blog/Bilan-du-premier-PI\",\n tags: [\n \"PI\",\n \"PI Ambition\",\n \"Innovation\",\n \"Agilité\",\n \"Hackaton\",\n \"IA\",\n \"IOVIA\",\n \"Flash Report\",\n ],\n author: \"ALM\",\n file: \"Bilan-du-premier-PI\",\n },\n // {\n // id: \"6\",\n // title: \"Getting Started with TailwindCSS\",\n // excerpt:\n // \"A comprehensive guide to building beautiful interfaces with TailwindCSS.\",\n // category: \"CSS\",\n // date: \"02-03-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/F\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"7\",\n // title: \"The Art of Clean Code\",\n // excerpt:\n // \"Best practices for writing maintainable and scalable code in any language.\",\n // category: \"Programming\",\n // date: \"28-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/G\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"8\",\n // title: \"Securing Your Web Applications\",\n // excerpt: \"Essential security practices for modern web development.\",\n // category: \"Security\",\n // date: \"26-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/H\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"1\",\n // title: \"The Future of Web Development: What's Next in 2025\",\n // excerpt:\n // \"Explore the cutting-edge trends shaping the future of web development, from AI-powered tools to revolutionary frameworks.\",\n // category: \"Technology\",\n // date: \"24-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/I\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"2\",\n // title: \"Mastering TypeScript: Advanced Patterns and Best Practices\",\n // excerpt:\n // \"Deep dive into TypeScript's advanced features and learn how to write more maintainable code.\",\n // category: \"Programming\",\n // date: \"22-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/J\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"3\",\n // title: \"Building Scalable Applications with Next.js\",\n // excerpt:\n // \"Learn the best practices for building large-scale applications using Next.js and React.\",\n // category: \"Web Development\",\n // date: \"20-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/K\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"4\",\n // title: \"The Complete Guide to Modern CSS\",\n // excerpt:\n // \"Discover the latest CSS features and techniques for creating stunning web designs.\",\n // category: \"Design\",\n // date: \"18-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/L\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"5\",\n // title: \"Optimizing React Performance\",\n // excerpt:\n // \"Learn advanced techniques for improving your React application's performance.\",\n // category: \"Performance\",\n // date: \"16-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/M\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"6\",\n // title: \"Getting Started with TailwindCSS\",\n // excerpt:\n // \"A comprehensive guide to building beautiful interfaces with TailwindCSS.\",\n // category: \"CSS\",\n // date: \"14-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/N\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"7\",\n // title: \"The Art of Clean Code\",\n // excerpt:\n // \"Best practices for writing maintainable and scalable code in any language.\",\n // category: \"Programming\",\n // date: \"12-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/O\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n // {\n // id: \"8\",\n // title: \"Securing Your Web Applications\",\n // excerpt: \"Essential security practices for modern web development.\",\n // category: \"Security\",\n // date: \"10-02-2025\",\n // coverImage: \"/hero_5.webp\",\n // linkToPage: \"/blog/P\",\n // tags: [\"MDX\", \"IA\", \"Innovation\", \"Next.js\"],\n // author: \"ALM\",\n // file: \"test\",\n // },\n];\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { posts } from \"@/data/posts\";\nimport { Resources } from \"@/data/resources\";\n\ninterface BlogPost {\n id: string;\n title: string;\n excerpt: string;\n category: string;\n date: string;\n coverImage: string;\n linkToPage: string;\n tags: string[];\n author: string;\n file: string;\n}\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport async function findPost(articleId: string): Promise {\n return posts.find((element: { id: string }) => element.id === articleId);\n}\n\nexport function getAllPosts() {\n return posts;\n}\n\nexport async function sortPostsByDate(posts: BlogPost[]): Promise {\n return posts.sort((a, b) => {\n const dateA = new Date(a.date.split(\"-\").reverse().join(\"-\")).getTime();\n const dateB = new Date(b.date.split(\"-\").reverse().join(\"-\")).getTime();\n return dateB - dateA;\n });\n}\n\nexport function formatPostDate(dateString: string): string {\n const [day, month, year] = dateString.split(\"-\").map(Number);\n const date = new Date(year, month - 1, day); // Les mois commencent à 0 en JS\n\n return date.toLocaleDateString(\"fr-FR\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n"],"names":["Promise","resolve","then","__webpack_require__","bind","t","Tag","createLucideIcon","d","key","cx","cy","r","fill","Calendar","width","height","x","y","rx","BlogCard","param","post","featured","jsx_runtime","jsxs","Link","href","linkToPage","className","concat","aria-label","title","div","jsx","Image","src","coverImage","alt","sizes","span","category","aria-hidden","formatPostDate","date","h2","p","excerpt","ChevronLeft","ChevronRight","BlogCardsAll","posts","postsPerPage","withPagination","currentPage","setCurrentPage","useState","totalPages","Math","ceil","length","startIndex","currentPosts","slice","handlePageChange","page","window","scrollTo","top","behavior","article","map","id","nav","button","onClick","disabled","Array","_","index","cn","_len","arguments","inputs","_key","twMerge","clsx","dateString","day","month","year","split","Number","Date","toLocaleDateString"],"sourceRoot":""}