From 3e7b26317d15fcbcdd4b5fa48e5aa2003a56da8a Mon Sep 17 00:00:00 2001 From: Creylay Date: Thu, 1 Oct 2026 14:29:36 +0200 Subject: [PATCH] Add news section and translations for multiple languages --- app/globals.css | 52 +++++++ app/i18n.ts | 10 ++ app/page.tsx | 2 + components/community/Footer.tsx | 3 + components/community/Navbar.tsx | 3 +- components/community/routes/NewsRoute.tsx | 164 ++++++++++++++++++++++ data/press.ts | 76 ++++++++++ public/locales/de/footer.json | 1 + public/locales/de/navbar.json | 1 + public/locales/de/news.json | 56 ++++++++ public/locales/en/footer.json | 1 + public/locales/en/navbar.json | 1 + public/locales/en/news.json | 56 ++++++++ public/locales/es/footer.json | 1 + public/locales/es/navbar.json | 1 + public/locales/es/news.json | 56 ++++++++ public/locales/pt/footer.json | 1 + public/locales/pt/navbar.json | 1 + public/locales/pt/news.json | 56 ++++++++ public/locales/zh/footer.json | 1 + public/locales/zh/navbar.json | 1 + public/locales/zh/news.json | 56 ++++++++ 22 files changed, 599 insertions(+), 1 deletion(-) create mode 100644 components/community/routes/NewsRoute.tsx create mode 100644 data/press.ts create mode 100644 public/locales/de/news.json create mode 100644 public/locales/en/news.json create mode 100644 public/locales/es/news.json create mode 100644 public/locales/pt/news.json create mode 100644 public/locales/zh/news.json diff --git a/app/globals.css b/app/globals.css index af069db..6d65258 100644 --- a/app/globals.css +++ b/app/globals.css @@ -727,3 +727,55 @@ h4{font-size:18px;line-height:1.3} .faq-cta{padding:24px} .vn-count{margin-left:0;width:100%} } + +/* ================================================================ + Vista Medios (press-) + ================================================================ */ +.press-feature{display:grid;grid-template-columns:1.3fr 1fr;border:1px solid var(--line);border-radius:var(--r-xl);overflow:hidden;background:var(--bg);margin-top:8px} +.press-feature-copy{padding:40px} +.press-feature-copy .ey{font-family:var(--mono);font-size:11px;letter-spacing:.07em;color:var(--brand);font-weight:500} +.press-feature-copy h3{font-size:28px;margin-top:12px;letter-spacing:-.02em;color:var(--ink)} +.press-feature-copy p{color:var(--ink-2);font-size:15.5px;line-height:1.6;margin-top:14px;max-width:52ch} +.press-feature-meta{display:flex;gap:10px;flex-wrap:wrap;margin-top:22px;align-items:center} +.press-quote{background:var(--ink-bg);color:var(--ink-text);padding:40px;display:flex;flex-direction:column;justify-content:center;gap:18px} +.press-quote blockquote{font-size:18px;line-height:1.5;letter-spacing:-.01em;color:var(--ink-text)} +.press-quote cite{font-style:normal;font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--ink-text-2);line-height:1.6;display:block} +.press-quote cite b{display:block;color:var(--ink-text);font-weight:500;font-family:var(--sans);font-size:13.5px;letter-spacing:0;margin-bottom:3px} + +.press-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:8px} +.press-card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg);padding:22px;display:flex;flex-direction:column;gap:14px;transition:border-color .15s,transform .12s,box-shadow .15s} +.press-card:hover{border-color:var(--line-2);transform:translateY(-2px);box-shadow:0 12px 28px -18px rgba(25,24,23,.2)} +.press-card.is-hidden{display:none} +.press-outlet{display:flex;align-items:center;gap:11px} +.press-mark{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;font-family:var(--mono);font-size:10.5px;font-weight:500;letter-spacing:-.03em;flex-shrink:0;overflow:hidden} +.press-outlet>span{min-width:0} +.press-outlet .press-outlet-name,.press-outlet .press-outlet-date{display:block} +.press-outlet-name{font-size:13.5px;font-weight:500;color:var(--ink);line-height:1.25} +.press-outlet-date{font-family:var(--mono);font-size:10.5px;color:var(--ink-4);margin-top:2px} +.press-card h3{font-size:16.5px;line-height:1.32;color:var(--ink);letter-spacing:-.01em} +.press-card p{font-size:13.5px;color:var(--ink-2);line-height:1.55;flex:1} +.press-card-foot{display:flex;justify-content:space-between;align-items:center;gap:10px;padding-top:13px;border-top:1px dashed var(--line)} +.press-tags{display:flex;gap:6px;flex-wrap:wrap} +.press-link{font-family:var(--mono);font-size:11.5px;color:var(--brand-on);display:inline-flex;align-items:center;gap:6px;font-weight:500} +.press-card:hover .press-link{text-decoration:underline} +.press-link svg{width:11px;height:11px} + +/* tipos de medio, reusando la paleta de la marca */ +.tag.prensa{background:var(--models-soft);color:var(--models-deep);border-color:#c6d9ff} +.tag.tv{background:var(--plugins-soft);color:var(--plugins-deep);border-color:#f2d7f4} +.tag.radio{background:var(--datasets-soft);color:var(--datasets-deep);border-color:#f6cdb2} +.tag.institucional{background:var(--generative-soft);color:var(--generative-deep);border-color:#b7e9d2} +.press-mark.prensa{background:var(--models-soft);color:var(--models-deep)} +.press-mark.tv{background:var(--plugins-soft);color:var(--plugins-deep)} +.press-mark.radio{background:var(--datasets-soft);color:var(--datasets-deep)} +.press-mark.institucional{background:var(--generative-soft);color:var(--generative-deep)} + +@media (max-width:980px){ + .press-feature{grid-template-columns:1fr} + .press-grid{grid-template-columns:repeat(2,1fr)} +} +@media (max-width:640px){ + .press-grid{grid-template-columns:1fr} + .press-feature-copy,.press-quote{padding:28px} + .press-feature-copy h3{font-size:23px} +} diff --git a/app/i18n.ts b/app/i18n.ts index 9b8b509..1813e61 100644 --- a/app/i18n.ts +++ b/app/i18n.ts @@ -56,10 +56,15 @@ import footerDE from "../public/locales/de/footer.json" import footerZH from "../public/locales/zh/footer.json" import faqEN from "../public/locales/en/faq.json" +import newsEN from "../public/locales/en/news.json" import faqES from "../public/locales/es/faq.json" +import newsES from "../public/locales/es/news.json" import faqPT from "../public/locales/pt/faq.json" +import newsPT from "../public/locales/pt/news.json" import faqDE from "../public/locales/de/faq.json" +import newsDE from "../public/locales/de/news.json" import faqZH from "../public/locales/zh/faq.json" +import newsZH from "../public/locales/zh/news.json" i18n .use(initReactI18next) @@ -77,6 +82,7 @@ i18n about: aboutES, footer: footerES, faq: faqES, + news: newsES, }, en: { navbar: navbarEN, @@ -89,6 +95,7 @@ i18n about: aboutEN, footer: footerEN, faq: faqEN, + news: newsEN, }, pt: { navbar: navbarPT, @@ -101,6 +108,7 @@ i18n about: aboutPT, footer: footerPT, faq: faqPT, + news: newsPT, }, de: { navbar: navbarDE, @@ -113,6 +121,7 @@ i18n about: aboutDE, footer: footerDE, faq: faqDE, + news: newsDE, }, zh: { navbar: navbarZH, @@ -125,6 +134,7 @@ i18n about: aboutZH, footer: footerZH, faq: faqZH, + news: newsZH, }, }, supportedLngs: ["es", "en", "pt", "de", "zh"], diff --git a/app/page.tsx b/app/page.tsx index 141902f..acedfdd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -13,6 +13,7 @@ import { PluginsRoute } from '@/components/community/routes/PluginsRoute' import { CommunityRoute } from '@/components/community/routes/CommunityRoute' import { AboutRoute } from '@/components/community/routes/AboutRoute' import { FaqRoute } from '@/components/community/routes/FaqRoute' +import { NewsRoute } from '@/components/community/routes/NewsRoute' import i18n from '@/app/i18n' function getRouteFromHash(hash: string): { route: string; isSubAnchor: boolean } { @@ -84,6 +85,7 @@ export default function Page() { {route === 'plugins' && } {route === 'community' && } {route === 'faq' && } + {route === 'news' && } {route === 'about' && }