From 031b35d7ddda0e24c7c44c675f3cf9c06cc287bc Mon Sep 17 00:00:00 2001 From: Lucas Rayan Date: Tue, 25 Aug 2026 15:02:46 -0300 Subject: [PATCH] feat: improve SEO with structured data, breadcrumbs, and comprehensive favicon support while optimizing images and config performance. --- .browserslistrc | 7 ++ app/favicon.ico | Bin 0 -> 4231 bytes app/frameworks/[key]/page.jsx | 18 ++++- app/glossario/page.jsx | 9 +++ app/layout.jsx | 15 +++- app/page.jsx | 9 +-- app/sobre/page.jsx | 5 +- components/Header.jsx | 2 +- lib/seo.js | 98 ++++++++++++++++++++----- next.config.mjs | 14 +++- package.json | 1 + public/apple-touch-icon.png | Bin 0 -> 8906 bytes public/favicon-16x16.png | Bin 0 -> 686 bytes public/favicon-32x32.png | Bin 0 -> 1363 bytes public/favicon-48x48.png | Bin 0 -> 2128 bytes public/favicon.ico | Bin 0 -> 4231 bytes public/icon-192.png | Bin 0 -> 9879 bytes public/icon-512.png | Bin 0 -> 40382 bytes public/site.webmanifest | 26 +++++++ scripts/generate-favicons.mjs | 130 ++++++++++++++++++++++++++++++++++ 20 files changed, 308 insertions(+), 26 deletions(-) create mode 100644 .browserslistrc create mode 100644 app/favicon.ico create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon-48x48.png create mode 100644 public/favicon.ico create mode 100644 public/icon-192.png create mode 100644 public/icon-512.png create mode 100644 public/site.webmanifest create mode 100644 scripts/generate-favicons.mjs diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..a710dfe --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,7 @@ +chrome >= 90 +firefox >= 90 +edge >= 90 +safari >= 15 +ios_saf >= 15 +and_chr >= 90 +not dead diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ab9e2da4729e9c4be794307d258957aaa7033730 GIT binary patch literal 4231 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 literal 0 HcmV?d00001 diff --git a/app/frameworks/[key]/page.jsx b/app/frameworks/[key]/page.jsx index afb3237..0338a62 100644 --- a/app/frameworks/[key]/page.jsx +++ b/app/frameworks/[key]/page.jsx @@ -1,4 +1,4 @@ -import { paginaMeta } from "@/lib/seo"; +import { paginaMeta, jsonLd } from "@/lib/seo"; import Link from "next/link"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; @@ -33,6 +33,22 @@ export default async function FrameworkDetail({ params }) { return (
+ {/* Ficha técnica do framework e trilha de navegação para o Google */} +