diff --git a/front_end/messages/cs.json b/front_end/messages/cs.json index cbfd82f607..e34f69c58f 100644 --- a/front_end/messages/cs.json +++ b/front_end/messages/cs.json @@ -2503,5 +2503,90 @@ "loadFullComment": "Komentář zkrácen — načíst zbytek", "onlyBots": "Pouze boti", "humansOnly": "Pouze lidé", - "humansAndBots": "Lidé a boti" + "humansAndBots": "Lidé a boti", + "initiativesMetaTitle": "Iniciativy | Metaculus", + "initiativesMetaDescription": "Produkty, přehledy, zprávy, indexy a výzkumné projekty vytvořené s prognostickou komunitou Metaculus.", + "initiativesHeroEyebrow": "Objevte Metaculus", + "initiativesHeroHeading": "Iniciativy poháněné naší prognostickou komunitou", + "initiativesHeroDescription": "Od AI benchmarků přes geopolitické indexy a centra trhu práce až po volební mapy – prozkoumejte iniciativy, které pohání naše komunita 60 000 prognostiků a partnerů.", + "initiativesHeroPartnerCta": "Spolupracujte s Metaculusem", + "initiativesHeroLearnMoreCta": "Zjistit více", + "initiativesCarouselLabel": "Iniciativy Metaculus", + "initiativesCarouselSlideLabel": "{position} z {total}", + "initiativesCarouselShowInitiative": "Zobrazit {name}", + "initiativesCarouselVisitInitiative": "Přejít na {name}", + "initiativeFutureEvalName": "FutureEval", + "initiativeFutureEvalTagline": "Měříme přesnost predikcí umělé inteligence", + "initiativeMidtermsName": "Mezičasové volby", + "initiativeMidtermsTagline": "Předpovědi o sporných soubojích a politikách", + "initiativeCaseStudiesName": "Případové studie", + "initiativeCaseStudiesTagline": "Prognostická řešení pro ty, kdo rozhodují", + "initiativeCaseStudiesInventoryDescription": "Prognostická řešení pro ty, kdo rozhodují", + "initiativeRadiantName": "Radiant", + "initiativeRadiantTagline": "Zmapujte budoucnost dřív, než ji postavíte", + "initiativeRadiantInventoryDescription": "Zmapujte budoucnost dřív, než ji postavíte", + "initiativeLaborHubName": "Labor Hub", + "initiativeLaborHubTagline": "Budoucnost automatizace práce pomocí AI", + "initiativesFeaturedTitle": "Vybrané iniciativy tohoto čtvrtletí", + "initiativesCategoryAI": "AI", + "initiativesCategoryPolicy": "Politika", + "initiativesFeaturedLearnMoreAbout": "Zjistit více o iniciativě {name}", + "initiativesFeaturedPartneringWith": "Ve spolupráci s", + "initiativesBadgeNew": "Nové", + "initiativesPartnerRenaissancePhilanthropy": "Renaissance Philanthropy", + "initiativesPartnerSchultzFamilyFoundation": "Schultz Family Foundation", + "initiativeLaborHubFeatureHeading": "Labor Hub", + "initiativeLaborHubFeatureDescription": "Aktuální předpovědi naší globální prognostické komunity o budoucnosti pracovní síly v USA s postupujícím rozvojem AI.", + "initiativesFeaturedLearnMore": "Zjistit více", + "initiativeFutureEvalFeatureHeading": "FutureEval", + "initiativeFutureEvalFeatureDescription": "FutureEval měří schopnost agentů AI předpovídat budoucí výsledky v různých odvětvích.", + "initiativeMidtermsFeatureHeading": "Přehled voleb v polovině mandátu v USA 2026", + "initiativeMidtermsFeatureDescription": "Předpovědi komunity Metaculus o sporných závodech a politikách, které utvářejí.", + "initiativesTestimonialsTitle": "Co říkají naši partneři", + "initiativesTestimonialBrendanQuote": "Metaculus is the ideal partner for forecasting risks - their platform encourages truthful revelation of probability estimates using prizes for accuracy rather than direct profit. This approach makes the results understandable and more credible to multiple audiences.", + "initiativesTestimonialBrendanAuthor": "Brendan Nyhan", + "initiativesTestimonialBrendanRole": "James O. Freedman Presidential Professor, Department of Government, Dartmouth College", + "initiativesTestimonialIlyaQuote": "Partnering with Metaculus has been both productive and engaging for us at the JetBrains Research team. Beyond being a valuable collaboration that helped us better understand the real-world utility and risks associated with AI coding assistance, it was also a very pleasant experience, given the Metaculus team's professionalism and openness.", + "initiativesTestimonialIlyaAuthor": "Ilya Zakharov", + "initiativesTestimonialIlyaRole": "Senior Researcher, Human-AI Experience Team, JetBrains Research", + "initiativesTestimonialRayQuote": "I was impressed with what the forecasters were able to generate on the basis of publicly available information. The forecasts will help me with decision-making around TB vaccines, and it’s very helpful to have an independent outside view on these questions.", + "initiativesTestimonialRayAuthor": "Ray Kennedy", + "initiativesTestimonialRayRole": "Senior Program Officer, Global Health R&D, Coefficient Giving", + "initiativesTestimonialKikoQuote": "As a data journalist, I spend a lot of time helping our readers think in probabilities rather than certainties. Metaculus is the best example of that idea in practice: a community where saying \"70%\" means something useful, where you are scored on it, and where being wrong is information.", + "initiativesTestimonialKikoAuthor": "Kiko Llaneras", + "initiativesTestimonialKikoRole": "Data Journalist and Author, El Pais", + "initiativesInventoryTitle": "Všechny iniciativy", + "initiativesProgramCtaEyebrow": "Pro programové týmy", + "initiativesProgramCtaHeading": "Máte nápad na veřejně zaměřený program?", + "initiativesProgramCtaDescription": "Navrhněte tematické centrum, benchmark, mapu nebo sérii případových studií — náš programový tým vám rád pomůže.", + "initiativesProgramCtaPitch": "Navrhnout iniciativu", + "initiativesInventoryFilterLabel": "Filtrovat iniciativy", + "initiativesInventoryFilterAll": "Vše", + "initiativesInventoryViewLabel": "Zobrazení", + "initiativesInventoryViewList": "Seznam", + "initiativesInventoryViewGrid": "Mřížka", + "initiativesCategoryHealthBio": "Zdraví a biologie", + "initiativesCategoryScience": "Věda", + "initiativeFrontiersDiseaseName": "Nové možnosti prevence nemocí", + "initiativeFrontiersDiseaseDescription": "Zpráva Pro Forecasting o technologiích prevence nemocí, u nichž se v příštích dvou desetiletích očekává největší dopad.", + "initiativeGlobalHealthMonitorName": "Globální monitor zdraví", + "initiativeGlobalHealthMonitorDescription": "Nejnovější informace o nově vznikajících zdravotních rizicích a sledování nemocí.", + "initiativeDemocracyThreatName": "Index ohrožení demokracie v USA", + "initiativeDemocracyThreatDescription": "Ve spolupráci s nestranickou skupinou Bright Line Watch tento index sleduje znepokojivé oblasti prostřednictvím prognostických otázek.", + "initiativeResearchAgenciesName": "Zpráva o výhledu výzkumných institucí", + "initiativeResearchAgenciesDescription": "Profesionální prognózy očekávaného financování výzkumných institucí za Trumpovy administrativy.", + "initiativeAIDiffusionName": "Index šíření AI", + "initiativeAIDiffusionDescription": "Ve spolupráci s Convergence Analysis sledujeme, jak se schopnosti AI do roku 2030 začlení do společnosti.", + "initiativeAGIReadinessName": "Index připravenosti na AGI 2030", + "initiativeAGIReadinessDescription": "Sledování klíčových ukazatelů určených účastníky workshopu The Curve v roce 2024, které odrážejí připravenost na obecnou umělou inteligenci.", + "initiativeCDCExpertElicitationName": "Expertní šetření CDC", + "initiativeCDCExpertElicitationDescription": "Názory odborníků na nadcházející podzimní a zimní sezónu respiračních onemocnění.", + "initiativeThreshold2030Name": "Threshold 2030", + "initiativeThreshold2030Description": "Konference pořádaná společně s Convergence Analysis o ekonomických dopadech pokročilých technologií AI do roku 2030.", + "initiativeScaleIsAllYouNeedName": "Scale is All You Need", + "initiativeScaleIsAllYouNeedDescription": "Workshop s Astera Institute zaměřený na rozvoj syntetické biologie.", + "initiativeFroCastingName": "FRO-casting", + "initiativeFroCastingDescription": "Spolupráce s Federation of American Scientists využívající prognózy k hodnocení dopadu, poskytování zpětné vazby a rozhodování o přidělování prostředků na výzkum.", + "initiativeAINuclearLandscapeName": "Prognózy AI a jaderné bezpečnosti", + "initiativeAINuclearLandscapeDescription": "Ve spolupráci s Institute for Security and Technology jsme posoudili rizika eskalace mezi USA a Čínou, včetně začlenění AI do jaderného velení, řízení a komunikace." } diff --git a/front_end/messages/en.json b/front_end/messages/en.json index 177908f8c4..7ed9c8a5ce 100644 --- a/front_end/messages/en.json +++ b/front_end/messages/en.json @@ -2492,5 +2492,90 @@ "midtermsHubEngagementNewsletterSuccess": "You're subscribed!", "midtermsHubEngagementEmailPlaceholder": "Email address", "midtermsHubEngagementToastSuccess": "Subscribed successfully!", - "midtermsHubEngagementToastError": "Failed to subscribe. Please try again." + "midtermsHubEngagementToastError": "Failed to subscribe. Please try again.", + "initiativesMetaTitle": "Initiatives | Metaculus", + "initiativesMetaDescription": "Products, dashboards, reports, indices, and research projects built with the Metaculus forecasting community.", + "initiativesHeroEyebrow": "Discover Metaculus", + "initiativesHeroHeading": "Initiatives powered by our forecasting community", + "initiativesHeroDescription": "From AI benchmarks to geopolitical indexes, labor-market hubs, and election maps — explore the initiatives that are powered by our community of 60,000 forecasters and partners.", + "initiativesHeroPartnerCta": "Partner with Metaculus", + "initiativesHeroLearnMoreCta": "Learn more", + "initiativesCarouselLabel": "Metaculus initiatives", + "initiativesCarouselSlideLabel": "{position} of {total}", + "initiativesCarouselShowInitiative": "Show {name}", + "initiativesCarouselVisitInitiative": "Visit {name}", + "initiativeFutureEvalName": "FutureEval", + "initiativeFutureEvalTagline": "Measuring the forecasting accuracy of AI", + "initiativeMidtermsName": "Midterms", + "initiativeMidtermsTagline": "Forecasts on contested races and policies", + "initiativeCaseStudiesName": "Case Studies", + "initiativeCaseStudiesTagline": "Forecasting solutions for decision-makers", + "initiativeCaseStudiesInventoryDescription": "Forecasting solutions for decision-makers", + "initiativeRadiantName": "Radiant", + "initiativeRadiantTagline": "Map the future before you build it", + "initiativeRadiantInventoryDescription": "Map the future before you build it", + "initiativeLaborHubName": "Labor Hub", + "initiativeLaborHubTagline": "Future of the AI workforce automation", + "initiativesFeaturedTitle": "Featured this quarter", + "initiativesCategoryAI": "AI", + "initiativesCategoryPolicy": "Policy", + "initiativesFeaturedLearnMoreAbout": "Learn more about {name}", + "initiativesFeaturedPartneringWith": "Partnering with", + "initiativesBadgeNew": "New", + "initiativesPartnerRenaissancePhilanthropy": "Renaissance Philanthropy", + "initiativesPartnerSchultzFamilyFoundation": "Schultz Family Foundation", + "initiativeLaborHubFeatureHeading": "Labor Hub", + "initiativeLaborHubFeatureDescription": "Real-time forecasts from our global forecasting community on the future of the US workforce as AI advances.", + "initiativesFeaturedLearnMore": "Learn more", + "initiativeFutureEvalFeatureHeading": "FutureEval", + "initiativeFutureEvalFeatureDescription": "FutureEval measures the ability of AI agents to predict future outcomes in various industries.", + "initiativeMidtermsFeatureHeading": "2026 US Midterms Tracker", + "initiativeMidtermsFeatureDescription": "Forecasts from the Metaculus community on contested races and the policies they will shape.", + "initiativesTestimonialsTitle": "What our partners say", + "initiativesTestimonialBrendanQuote": "Metaculus is the ideal partner for forecasting risks - their platform encourages truthful revelation of probability estimates using prizes for accuracy rather than direct profit. This approach makes the results understandable and more credible to multiple audiences.", + "initiativesTestimonialBrendanAuthor": "Brendan Nyhan", + "initiativesTestimonialBrendanRole": "James O. Freedman Presidential Professor, Department of Government, Dartmouth College", + "initiativesTestimonialIlyaQuote": "Partnering with Metaculus has been both productive and engaging for us at the JetBrains Research team. Beyond being a valuable collaboration that helped us better understand the real-world utility and risks associated with AI coding assistance, it was also a very pleasant experience, given the Metaculus team's professionalism and openness.", + "initiativesTestimonialIlyaAuthor": "Ilya Zakharov", + "initiativesTestimonialIlyaRole": "Senior Researcher, Human-AI Experience Team, JetBrains Research", + "initiativesTestimonialRayQuote": "I was impressed with what the forecasters were able to generate on the basis of publicly available information. The forecasts will help me with decision-making around TB vaccines, and it’s very helpful to have an independent outside view on these questions.", + "initiativesTestimonialRayAuthor": "Ray Kennedy", + "initiativesTestimonialRayRole": "Senior Program Officer, Global Health R&D, Coefficient Giving", + "initiativesTestimonialKikoQuote": "As a data journalist, I spend a lot of time helping our readers think in probabilities rather than certainties. Metaculus is the best example of that idea in practice: a community where saying \"70%\" means something useful, where you are scored on it, and where being wrong is information.", + "initiativesTestimonialKikoAuthor": "Kiko Llaneras", + "initiativesTestimonialKikoRole": "Data Journalist and Author, El Pais", + "initiativesInventoryTitle": "All initiatives", + "initiativesProgramCtaEyebrow": "For program teams", + "initiativesProgramCtaHeading": "Have an idea for a public-facing program?", + "initiativesProgramCtaDescription": "Pitch us a hub, benchmark, map, or case-study series — our programs team would love to help.", + "initiativesProgramCtaPitch": "Pitch an initiative", + "initiativesInventoryFilterLabel": "Filter initiatives", + "initiativesInventoryFilterAll": "All", + "initiativesInventoryViewLabel": "View", + "initiativesInventoryViewList": "List", + "initiativesInventoryViewGrid": "Grid", + "initiativesCategoryHealthBio": "Health & Bio", + "initiativesCategoryScience": "Science", + "initiativeFrontiersDiseaseName": "Frontiers in Disease Prevention", + "initiativeFrontiersDiseaseDescription": "Pro Forecasting report on the disease prevention technologies most likely to deliver impact over the next two decades.", + "initiativeGlobalHealthMonitorName": "Global Health Monitor", + "initiativeGlobalHealthMonitorDescription": "The latest updates on emerging health risks and disease monitoring.", + "initiativeDemocracyThreatName": "US Democracy Threat Index", + "initiativeDemocracyThreatDescription": "In collaboration with nonpartisan group Bright Line Watch, this index monitors the status of areas of concern through forecasting questions.", + "initiativeResearchAgenciesName": "Research Agencies Outlook Report", + "initiativeResearchAgenciesDescription": "Pro Forecasting on expected funding to research agencies under the Trump administration.", + "initiativeAIDiffusionName": "AI Diffusion Index", + "initiativeAIDiffusionDescription": "In partnership with Convergence Analysis, we're monitoring how AI capabilities will be integrated into society by 2030.", + "initiativeAGIReadinessName": "AGI 2030 Readiness Index", + "initiativeAGIReadinessDescription": "Tracking key metrics identified by workshop participants at The Curve in 2024 that reflect preparedness for Artificial General Intelligence.", + "initiativeCDCExpertElicitationName": "CDC Expert Elicitation", + "initiativeCDCExpertElicitationDescription": "Solicited views from experts on the upcoming fall and winter respiratory season.", + "initiativeThreshold2030Name": "Threshold 2030", + "initiativeThreshold2030Description": "Conference co-hosted with Convergence Analysis to evaluate the economic impacts of frontier AI technologies by 2030.", + "initiativeScaleIsAllYouNeedName": "Scale is All You Need", + "initiativeScaleIsAllYouNeedDescription": "Workshop with Astera Institute, focused on advancing the field of synthetic biology.", + "initiativeFroCastingName": "FRO-casting", + "initiativeFroCastingDescription": "Collaboration with the Federation of American Scientists to use predictions to assess impact, deliver feedback, and inform the allocation of research funding.", + "initiativeAINuclearLandscapeName": "Forecasting the AI and Nuclear Landscape", + "initiativeAINuclearLandscapeDescription": "In partnership with the Institute for Security and Technology, assessed the risks of escalation between the U.S. and China, including by the integration of AI into nuclear command, control, and communications." } diff --git a/front_end/messages/es.json b/front_end/messages/es.json index b61d7ad727..ac06e387f2 100644 --- a/front_end/messages/es.json +++ b/front_end/messages/es.json @@ -2503,5 +2503,90 @@ "loadFullComment": "Comentario truncado — carga el resto", "onlyBots": "Solo bots", "humansOnly": "Solo humanos", - "humansAndBots": "Humanos y Bots" + "humansAndBots": "Humanos y Bots", + "initiativesMetaTitle": "Iniciativas | Metaculus", + "initiativesMetaDescription": "Productos, paneles, informes, índices y proyectos de investigación creados con la comunidad de pronosticadores de Metaculus.", + "initiativesHeroEyebrow": "Descubre Metaculus", + "initiativesHeroHeading": "Iniciativas impulsadas por nuestra comunidad de pronosticadores", + "initiativesHeroDescription": "Desde comparativas de IA hasta índices geopolíticos, centros del mercado laboral y mapas electorales: explora las iniciativas impulsadas por nuestra comunidad de 60 000 pronosticadores y socios.", + "initiativesHeroPartnerCta": "Colabora con Metaculus", + "initiativesHeroLearnMoreCta": "Más información", + "initiativesCarouselLabel": "Iniciativas de Metaculus", + "initiativesCarouselSlideLabel": "{position} de {total}", + "initiativesCarouselShowInitiative": "Mostrar {name}", + "initiativesCarouselVisitInitiative": "Visitar {name}", + "initiativeFutureEvalName": "FutureEval", + "initiativeFutureEvalTagline": "Medimos la precisión de la IA al pronosticar", + "initiativeMidtermsName": "Elecciones intermedias", + "initiativeMidtermsTagline": "Pronósticos sobre contiendas reñidas y políticas", + "initiativeCaseStudiesName": "Estudios de caso", + "initiativeCaseStudiesTagline": "Soluciones de pronóstico para quienes toman decisiones", + "initiativeCaseStudiesInventoryDescription": "Soluciones de pronóstico para quienes toman decisiones", + "initiativeRadiantName": "Radiant", + "initiativeRadiantTagline": "Traza el futuro antes de construirlo", + "initiativeRadiantInventoryDescription": "Traza el futuro antes de construirlo", + "initiativeLaborHubName": "Labor Hub", + "initiativeLaborHubTagline": "El futuro de la automatización laboral con IA", + "initiativesFeaturedTitle": "Destacados de este trimestre", + "initiativesCategoryAI": "IA", + "initiativesCategoryPolicy": "Política", + "initiativesFeaturedLearnMoreAbout": "Más información sobre {name}", + "initiativesFeaturedPartneringWith": "En colaboración con", + "initiativesBadgeNew": "Nuevo", + "initiativesPartnerRenaissancePhilanthropy": "Renaissance Philanthropy", + "initiativesPartnerSchultzFamilyFoundation": "Schultz Family Foundation", + "initiativeLaborHubFeatureHeading": "Labor Hub", + "initiativeLaborHubFeatureDescription": "Pronósticos en tiempo real de nuestra comunidad global de pronosticadores sobre el futuro de la fuerza laboral de EE. UU. a medida que avanza la IA.", + "initiativesFeaturedLearnMore": "Más información", + "initiativeFutureEvalFeatureHeading": "FutureEval", + "initiativeFutureEvalFeatureDescription": "FutureEval mide la capacidad de los agentes de IA para predecir resultados futuros en diversos sectores.", + "initiativeMidtermsFeatureHeading": "Seguimiento de las elecciones intermedias de EE. UU. de 2026", + "initiativeMidtermsFeatureDescription": "Pronósticos de la comunidad de Metaculus sobre las contiendas disputadas y las políticas que moldearán el futuro.", + "initiativesTestimonialsTitle": "Lo que dicen nuestros socios", + "initiativesTestimonialBrendanQuote": "Metaculus is the ideal partner for forecasting risks - their platform encourages truthful revelation of probability estimates using prizes for accuracy rather than direct profit. This approach makes the results understandable and more credible to multiple audiences.", + "initiativesTestimonialBrendanAuthor": "Brendan Nyhan", + "initiativesTestimonialBrendanRole": "James O. Freedman Presidential Professor, Department of Government, Dartmouth College", + "initiativesTestimonialIlyaQuote": "Partnering with Metaculus has been both productive and engaging for us at the JetBrains Research team. Beyond being a valuable collaboration that helped us better understand the real-world utility and risks associated with AI coding assistance, it was also a very pleasant experience, given the Metaculus team's professionalism and openness.", + "initiativesTestimonialIlyaAuthor": "Ilya Zakharov", + "initiativesTestimonialIlyaRole": "Senior Researcher, Human-AI Experience Team, JetBrains Research", + "initiativesTestimonialRayQuote": "I was impressed with what the forecasters were able to generate on the basis of publicly available information. The forecasts will help me with decision-making around TB vaccines, and it’s very helpful to have an independent outside view on these questions.", + "initiativesTestimonialRayAuthor": "Ray Kennedy", + "initiativesTestimonialRayRole": "Senior Program Officer, Global Health R&D, Coefficient Giving", + "initiativesTestimonialKikoQuote": "As a data journalist, I spend a lot of time helping our readers think in probabilities rather than certainties. Metaculus is the best example of that idea in practice: a community where saying \"70%\" means something useful, where you are scored on it, and where being wrong is information.", + "initiativesTestimonialKikoAuthor": "Kiko Llaneras", + "initiativesTestimonialKikoRole": "Data Journalist and Author, El Pais", + "initiativesInventoryTitle": "Todas las iniciativas", + "initiativesProgramCtaEyebrow": "Para equipos de programas", + "initiativesProgramCtaHeading": "¿Tienes una idea para un programa público?", + "initiativesProgramCtaDescription": "Propón un centro, un benchmark, un mapa o una serie de casos prácticos; a nuestro equipo de programas le encantará ayudar.", + "initiativesProgramCtaPitch": "Proponer una iniciativa", + "initiativesInventoryFilterLabel": "Filtrar iniciativas", + "initiativesInventoryFilterAll": "Todas", + "initiativesInventoryViewLabel": "Vista", + "initiativesInventoryViewList": "Lista", + "initiativesInventoryViewGrid": "Cuadrícula", + "initiativesCategoryHealthBio": "Salud y biología", + "initiativesCategoryScience": "Ciencia", + "initiativeFrontiersDiseaseName": "Fronteras en la prevención de enfermedades", + "initiativeFrontiersDiseaseDescription": "Informe de Pro Forecasting sobre las tecnologías de prevención de enfermedades con mayor potencial de impacto en las próximas dos décadas.", + "initiativeGlobalHealthMonitorName": "Monitor global de salud", + "initiativeGlobalHealthMonitorDescription": "Últimas novedades sobre riesgos sanitarios emergentes y vigilancia de enfermedades.", + "initiativeDemocracyThreatName": "Índice de amenazas a la democracia en EE. UU.", + "initiativeDemocracyThreatDescription": "En colaboración con Bright Line Watch, un grupo apartidista, este índice monitorea las áreas de preocupación mediante preguntas de pronóstico.", + "initiativeResearchAgenciesName": "Informe sobre las agencias de investigación", + "initiativeResearchAgenciesDescription": "Pronósticos profesionales sobre la financiación prevista para las agencias de investigación durante la administración Trump.", + "initiativeAIDiffusionName": "Índice de difusión de la IA", + "initiativeAIDiffusionDescription": "En colaboración con Convergence Analysis, monitoreamos cómo se integrarán las capacidades de IA en la sociedad para 2030.", + "initiativeAGIReadinessName": "Índice de preparación para la AGI 2030", + "initiativeAGIReadinessDescription": "Seguimiento de indicadores clave identificados por participantes en un taller de The Curve en 2024 que reflejan la preparación para la inteligencia artificial general.", + "initiativeCDCExpertElicitationName": "Consulta a expertos de los CDC", + "initiativeCDCExpertElicitationDescription": "Opiniones solicitadas a expertos sobre la próxima temporada respiratoria de otoño e invierno.", + "initiativeThreshold2030Name": "Threshold 2030", + "initiativeThreshold2030Description": "Conferencia coorganizada con Convergence Analysis para evaluar el impacto económico de las tecnologías de IA de frontera para 2030.", + "initiativeScaleIsAllYouNeedName": "Scale is All You Need", + "initiativeScaleIsAllYouNeedDescription": "Taller con Astera Institute centrado en impulsar la biología sintética.", + "initiativeFroCastingName": "FRO-casting", + "initiativeFroCastingDescription": "Colaboración con la Federation of American Scientists para usar pronósticos que permitan evaluar impactos, aportar información y orientar la asignación de fondos de investigación.", + "initiativeAINuclearLandscapeName": "Pronósticos sobre la IA y el panorama nuclear", + "initiativeAINuclearLandscapeDescription": "En colaboración con el Institute for Security and Technology, se evaluaron los riesgos de escalada entre EE. UU. y China, incluida la integración de IA en el mando, control y comunicaciones nucleares." } diff --git a/front_end/messages/pt.json b/front_end/messages/pt.json index eba4d3a2c6..b272deb373 100644 --- a/front_end/messages/pt.json +++ b/front_end/messages/pt.json @@ -2501,5 +2501,90 @@ "loadFullComment": "Comentário truncado — carregar o resto", "onlyBots": "Apenas bots", "humansOnly": "Apenas humanos", - "humansAndBots": "Humanos e bots" + "humansAndBots": "Humanos e bots", + "initiativesMetaTitle": "Iniciativas | Metaculus", + "initiativesMetaDescription": "Produtos, painéis, relatórios, índices e projetos de pesquisa criados com a comunidade de previsores do Metaculus.", + "initiativesHeroEyebrow": "Descubra o Metaculus", + "initiativesHeroHeading": "Iniciativas impulsionadas pela nossa comunidade de previsores", + "initiativesHeroDescription": "De benchmarks de IA a índices geopolíticos, centros do mercado de trabalho e mapas eleitorais — explore as iniciativas impulsionadas pela nossa comunidade de 60.000 previsores e parceiros.", + "initiativesHeroPartnerCta": "Seja parceiro do Metaculus", + "initiativesHeroLearnMoreCta": "Saiba mais", + "initiativesCarouselLabel": "Iniciativas do Metaculus", + "initiativesCarouselSlideLabel": "{position} de {total}", + "initiativesCarouselShowInitiative": "Mostrar {name}", + "initiativesCarouselVisitInitiative": "Visitar {name}", + "initiativeFutureEvalName": "FutureEval", + "initiativeFutureEvalTagline": "Medindo a precisão da IA nas previsões", + "initiativeMidtermsName": "Eleições de meio de mandato", + "initiativeMidtermsTagline": "Previsões sobre disputas acirradas e políticas", + "initiativeCaseStudiesName": "Estudos de caso", + "initiativeCaseStudiesTagline": "Soluções de previsão para quem decide", + "initiativeCaseStudiesInventoryDescription": "Soluções de previsão para quem decide", + "initiativeRadiantName": "Radiant", + "initiativeRadiantTagline": "Mapeie o futuro antes de construí-lo", + "initiativeRadiantInventoryDescription": "Mapeie o futuro antes de construí-lo", + "initiativeLaborHubName": "Labor Hub", + "initiativeLaborHubTagline": "O futuro da automação do trabalho com IA", + "initiativesFeaturedTitle": "Destaques deste trimestre", + "initiativesCategoryAI": "IA", + "initiativesCategoryPolicy": "Política", + "initiativesFeaturedLearnMoreAbout": "Saiba mais sobre {name}", + "initiativesFeaturedPartneringWith": "Em parceria com", + "initiativesBadgeNew": "Novo", + "initiativesPartnerRenaissancePhilanthropy": "Renaissance Philanthropy", + "initiativesPartnerSchultzFamilyFoundation": "Schultz Family Foundation", + "initiativeLaborHubFeatureHeading": "Labor Hub", + "initiativeLaborHubFeatureDescription": "Previsões em tempo real da nossa comunidade global de previsores sobre o futuro da força de trabalho dos EUA à medida que a IA avança.", + "initiativesFeaturedLearnMore": "Saiba mais", + "initiativeFutureEvalFeatureHeading": "FutureEval", + "initiativeFutureEvalFeatureDescription": "O FutureEval mede a capacidade dos agentes de IA de prever resultados futuros em vários setores.", + "initiativeMidtermsFeatureHeading": "Monitor das eleições de meio de mandato dos EUA de 2026", + "initiativeMidtermsFeatureDescription": "Previsões da comunidade Metaculus sobre as disputas contestadas e as políticas que moldarão.", + "initiativesTestimonialsTitle": "O que dizem nossos parceiros", + "initiativesTestimonialBrendanQuote": "Metaculus is the ideal partner for forecasting risks - their platform encourages truthful revelation of probability estimates using prizes for accuracy rather than direct profit. This approach makes the results understandable and more credible to multiple audiences.", + "initiativesTestimonialBrendanAuthor": "Brendan Nyhan", + "initiativesTestimonialBrendanRole": "James O. Freedman Presidential Professor, Department of Government, Dartmouth College", + "initiativesTestimonialIlyaQuote": "Partnering with Metaculus has been both productive and engaging for us at the JetBrains Research team. Beyond being a valuable collaboration that helped us better understand the real-world utility and risks associated with AI coding assistance, it was also a very pleasant experience, given the Metaculus team's professionalism and openness.", + "initiativesTestimonialIlyaAuthor": "Ilya Zakharov", + "initiativesTestimonialIlyaRole": "Senior Researcher, Human-AI Experience Team, JetBrains Research", + "initiativesTestimonialRayQuote": "I was impressed with what the forecasters were able to generate on the basis of publicly available information. The forecasts will help me with decision-making around TB vaccines, and it’s very helpful to have an independent outside view on these questions.", + "initiativesTestimonialRayAuthor": "Ray Kennedy", + "initiativesTestimonialRayRole": "Senior Program Officer, Global Health R&D, Coefficient Giving", + "initiativesTestimonialKikoQuote": "As a data journalist, I spend a lot of time helping our readers think in probabilities rather than certainties. Metaculus is the best example of that idea in practice: a community where saying \"70%\" means something useful, where you are scored on it, and where being wrong is information.", + "initiativesTestimonialKikoAuthor": "Kiko Llaneras", + "initiativesTestimonialKikoRole": "Data Journalist and Author, El Pais", + "initiativesInventoryTitle": "Todas as iniciativas", + "initiativesProgramCtaEyebrow": "Para equipas de programas", + "initiativesProgramCtaHeading": "Tem uma ideia para um programa público?", + "initiativesProgramCtaDescription": "Proponha um centro temático, um benchmark, um mapa ou uma série de estudos de caso — a nossa equipa de programas terá todo o gosto em ajudar.", + "initiativesProgramCtaPitch": "Propor uma iniciativa", + "initiativesInventoryFilterLabel": "Filtrar iniciativas", + "initiativesInventoryFilterAll": "Todas", + "initiativesInventoryViewLabel": "Visualização", + "initiativesInventoryViewList": "Lista", + "initiativesInventoryViewGrid": "Grade", + "initiativesCategoryHealthBio": "Saúde e biologia", + "initiativesCategoryScience": "Ciência", + "initiativeFrontiersDiseaseName": "Fronteiras na prevenção de doenças", + "initiativeFrontiersDiseaseDescription": "Relatório de Pro Forecasting sobre as tecnologias de prevenção de doenças com maior potencial de impacto nas próximas duas décadas.", + "initiativeGlobalHealthMonitorName": "Monitor global de saúde", + "initiativeGlobalHealthMonitorDescription": "As atualizações mais recentes sobre riscos emergentes à saúde e monitoramento de doenças.", + "initiativeDemocracyThreatName": "Índice de ameaças à democracia nos EUA", + "initiativeDemocracyThreatDescription": "Em colaboração com o grupo apartidário Bright Line Watch, este índice acompanha áreas de preocupação por meio de perguntas de previsão.", + "initiativeResearchAgenciesName": "Relatório sobre agências de pesquisa", + "initiativeResearchAgenciesDescription": "Previsões profissionais sobre o financiamento esperado para agências de pesquisa durante o governo Trump.", + "initiativeAIDiffusionName": "Índice de difusão da IA", + "initiativeAIDiffusionDescription": "Em parceria com a Convergence Analysis, acompanhamos como as capacidades de IA serão integradas à sociedade até 2030.", + "initiativeAGIReadinessName": "Índice de preparação para AGI 2030", + "initiativeAGIReadinessDescription": "Acompanhamento de indicadores-chave identificados por participantes de um workshop da The Curve em 2024 que refletem a preparação para a inteligência artificial geral.", + "initiativeCDCExpertElicitationName": "Consulta a especialistas do CDC", + "initiativeCDCExpertElicitationDescription": "Opiniões solicitadas a especialistas sobre a próxima temporada de doenças respiratórias no outono e inverno.", + "initiativeThreshold2030Name": "Threshold 2030", + "initiativeThreshold2030Description": "Conferência coorganizada com a Convergence Analysis para avaliar os impactos econômicos das tecnologias de IA de fronteira até 2030.", + "initiativeScaleIsAllYouNeedName": "Scale is All You Need", + "initiativeScaleIsAllYouNeedDescription": "Workshop com o Astera Institute voltado ao avanço da biologia sintética.", + "initiativeFroCastingName": "FRO-casting", + "initiativeFroCastingDescription": "Colaboração com a Federation of American Scientists para usar previsões na avaliação de impactos, no fornecimento de feedback e na orientação da distribuição de recursos para pesquisa.", + "initiativeAINuclearLandscapeName": "Previsões sobre IA e o cenário nuclear", + "initiativeAINuclearLandscapeDescription": "Em parceria com o Institute for Security and Technology, foram avaliados os riscos de escalada entre os EUA e a China, inclusive pela integração da IA ao comando, controle e comunicações nucleares." } diff --git a/front_end/messages/zh-TW.json b/front_end/messages/zh-TW.json index 3856047747..041face61b 100644 --- a/front_end/messages/zh-TW.json +++ b/front_end/messages/zh-TW.json @@ -2500,5 +2500,90 @@ "loadFullComment": "評論被截斷 — 加載其餘部分", "onlyBots": "僅限機器人", "humansOnly": "僅限人類", - "humansAndBots": "人類和機器人" + "humansAndBots": "人類和機器人", + "initiativesMetaTitle": "專案 | Metaculus", + "initiativesMetaDescription": "與 Metaculus 預測社群共同打造的產品、儀表板、報告、指數與研究專案。", + "initiativesHeroEyebrow": "探索 Metaculus", + "initiativesHeroHeading": "由我們的預測社群共同打造的專案", + "initiativesHeroDescription": "從 AI 基準測試到地緣政治指數、勞動市場中心與選舉地圖——探索由我們 60,000 名預測者與合作夥伴共同打造的專案。", + "initiativesHeroPartnerCta": "與 Metaculus 合作", + "initiativesHeroLearnMoreCta": "了解更多", + "initiativesCarouselLabel": "Metaculus 專案", + "initiativesCarouselSlideLabel": "第 {position} 項,共 {total} 項", + "initiativesCarouselShowInitiative": "顯示 {name}", + "initiativesCarouselVisitInitiative": "造訪 {name}", + "initiativeFutureEvalName": "FutureEval", + "initiativeFutureEvalTagline": "衡量 AI 的預測準確度", + "initiativeMidtermsName": "期中選舉", + "initiativeMidtermsTagline": "對膠著選情與政策的預測", + "initiativeCaseStudiesName": "案例研究", + "initiativeCaseStudiesTagline": "為決策者提供的預測解決方案", + "initiativeCaseStudiesInventoryDescription": "為決策者提供的預測解決方案", + "initiativeRadiantName": "Radiant", + "initiativeRadiantTagline": "在建造未來之前先描繪它", + "initiativeRadiantInventoryDescription": "在建造未來之前先描繪它", + "initiativeLaborHubName": "Labor Hub", + "initiativeLaborHubTagline": "AI 勞動力自動化的未來", + "initiativesFeaturedTitle": "本季精選", + "initiativesCategoryAI": "人工智慧", + "initiativesCategoryPolicy": "政策", + "initiativesFeaturedLearnMoreAbout": "進一步了解 {name}", + "initiativesFeaturedPartneringWith": "合作夥伴", + "initiativesBadgeNew": "新", + "initiativesPartnerRenaissancePhilanthropy": "Renaissance Philanthropy", + "initiativesPartnerSchultzFamilyFoundation": "Schultz Family Foundation", + "initiativeLaborHubFeatureHeading": "Labor Hub", + "initiativeLaborHubFeatureDescription": "來自我們全球預測社群的即時預測,關注 AI 發展下美國勞動力的未來。", + "initiativesFeaturedLearnMore": "了解更多", + "initiativeFutureEvalFeatureHeading": "FutureEval", + "initiativeFutureEvalFeatureDescription": "FutureEval 衡量 AI 代理預測各產業未來結果的能力。", + "initiativeMidtermsFeatureHeading": "2026 年美國期中選舉追蹤", + "initiativeMidtermsFeatureDescription": "Metaculus 社群對競爭激烈的選舉以及由此形塑的政策的預測。", + "initiativesTestimonialsTitle": "合作夥伴怎麼說", + "initiativesTestimonialBrendanQuote": "Metaculus is the ideal partner for forecasting risks - their platform encourages truthful revelation of probability estimates using prizes for accuracy rather than direct profit. This approach makes the results understandable and more credible to multiple audiences.", + "initiativesTestimonialBrendanAuthor": "Brendan Nyhan", + "initiativesTestimonialBrendanRole": "James O. Freedman Presidential Professor, Department of Government, Dartmouth College", + "initiativesTestimonialIlyaQuote": "Partnering with Metaculus has been both productive and engaging for us at the JetBrains Research team. Beyond being a valuable collaboration that helped us better understand the real-world utility and risks associated with AI coding assistance, it was also a very pleasant experience, given the Metaculus team's professionalism and openness.", + "initiativesTestimonialIlyaAuthor": "Ilya Zakharov", + "initiativesTestimonialIlyaRole": "Senior Researcher, Human-AI Experience Team, JetBrains Research", + "initiativesTestimonialRayQuote": "I was impressed with what the forecasters were able to generate on the basis of publicly available information. The forecasts will help me with decision-making around TB vaccines, and it’s very helpful to have an independent outside view on these questions.", + "initiativesTestimonialRayAuthor": "Ray Kennedy", + "initiativesTestimonialRayRole": "Senior Program Officer, Global Health R&D, Coefficient Giving", + "initiativesTestimonialKikoQuote": "As a data journalist, I spend a lot of time helping our readers think in probabilities rather than certainties. Metaculus is the best example of that idea in practice: a community where saying \"70%\" means something useful, where you are scored on it, and where being wrong is information.", + "initiativesTestimonialKikoAuthor": "Kiko Llaneras", + "initiativesTestimonialKikoRole": "Data Journalist and Author, El Pais", + "initiativesInventoryTitle": "全部專案", + "initiativesProgramCtaEyebrow": "提供給專案團隊", + "initiativesProgramCtaHeading": "對面向大眾的專案有想法嗎?", + "initiativesProgramCtaDescription": "歡迎提出主題中心、基準測試、地圖或案例研究系列;我們的專案團隊很樂意提供協助。", + "initiativesProgramCtaPitch": "提議新專案", + "initiativesInventoryFilterLabel": "篩選專案", + "initiativesInventoryFilterAll": "全部", + "initiativesInventoryViewLabel": "檢視", + "initiativesInventoryViewList": "清單", + "initiativesInventoryViewGrid": "網格", + "initiativesCategoryHealthBio": "健康與生物", + "initiativesCategoryScience": "科學", + "initiativeFrontiersDiseaseName": "疾病預防前沿", + "initiativeFrontiersDiseaseDescription": "Pro Forecasting 報告評估未來二十年最可能產生影響的疾病預防技術。", + "initiativeGlobalHealthMonitorName": "全球健康監測", + "initiativeGlobalHealthMonitorDescription": "有關新興健康風險與疾病監測的最新動態。", + "initiativeDemocracyThreatName": "美國民主威脅指數", + "initiativeDemocracyThreatDescription": "此指數與無黨派組織 Bright Line Watch 合作,透過預測問題追蹤值得關注領域的狀況。", + "initiativeResearchAgenciesName": "研究機構前景報告", + "initiativeResearchAgenciesDescription": "專業預測川普政府期間研究機構的預期資金狀況。", + "initiativeAIDiffusionName": "人工智慧擴散指數", + "initiativeAIDiffusionDescription": "我們與 Convergence Analysis 合作,監測人工智慧能力在 2030 年前將如何融入社會。", + "initiativeAGIReadinessName": "2030 年 AGI 準備度指數", + "initiativeAGIReadinessDescription": "追蹤 The Curve 2024 年工作坊參與者確定的關鍵指標,以衡量社會對通用人工智慧的準備程度。", + "initiativeCDCExpertElicitationName": "CDC 專家意見徵詢", + "initiativeCDCExpertElicitationDescription": "徵詢專家對即將到來的秋冬呼吸道疾病季的看法。", + "initiativeThreshold2030Name": "Threshold 2030", + "initiativeThreshold2030Description": "與 Convergence Analysis 共同舉辦的會議,評估截至 2030 年前沿人工智慧技術的經濟影響。", + "initiativeScaleIsAllYouNeedName": "Scale is All You Need", + "initiativeScaleIsAllYouNeedDescription": "與 Astera Institute 合作舉辦的工作坊,重點推動合成生物學發展。", + "initiativeFroCastingName": "FRO-casting", + "initiativeFroCastingDescription": "與 Federation of American Scientists 合作,利用預測評估影響、提供回饋,並為研究經費分配提供依據。", + "initiativeAINuclearLandscapeName": "人工智慧與核安全局勢預測", + "initiativeAINuclearLandscapeDescription": "與 Institute for Security and Technology 合作,評估美中之間的局勢升級風險,包括將人工智慧納入核指揮、控制與通訊系統所帶來的風險。" } diff --git a/front_end/messages/zh.json b/front_end/messages/zh.json index 7856b986b2..80fa027220 100644 --- a/front_end/messages/zh.json +++ b/front_end/messages/zh.json @@ -2505,5 +2505,90 @@ "loadFullComment": "评论被截断——加载剩余部分", "onlyBots": "仅限机器人", "humansOnly": "仅限人类", - "humansAndBots": "人类和机器人" + "humansAndBots": "人类和机器人", + "initiativesMetaTitle": "项目 | Metaculus", + "initiativesMetaDescription": "与 Metaculus 预测社区共同打造的产品、仪表板、报告、指数与研究项目。", + "initiativesHeroEyebrow": "探索 Metaculus", + "initiativesHeroHeading": "由我们的预测社区共同打造的项目", + "initiativesHeroDescription": "从 AI 基准测试到地缘政治指数、劳动力市场中心和选举地图——探索由我们 60,000 名预测者和合作伙伴共同打造的项目。", + "initiativesHeroPartnerCta": "与 Metaculus 合作", + "initiativesHeroLearnMoreCta": "了解更多", + "initiativesCarouselLabel": "Metaculus 项目", + "initiativesCarouselSlideLabel": "第 {position} 项,共 {total} 项", + "initiativesCarouselShowInitiative": "显示 {name}", + "initiativesCarouselVisitInitiative": "访问 {name}", + "initiativeFutureEvalName": "FutureEval", + "initiativeFutureEvalTagline": "衡量 AI 的预测准确度", + "initiativeMidtermsName": "中期选举", + "initiativeMidtermsTagline": "对胶着选情与政策的预测", + "initiativeCaseStudiesName": "案例研究", + "initiativeCaseStudiesTagline": "为决策者提供的预测解决方案", + "initiativeCaseStudiesInventoryDescription": "为决策者提供的预测解决方案", + "initiativeRadiantName": "Radiant", + "initiativeRadiantTagline": "在建造未来之前先描绘它", + "initiativeRadiantInventoryDescription": "在建造未来之前先描绘它", + "initiativeLaborHubName": "Labor Hub", + "initiativeLaborHubTagline": "AI 劳动力自动化的未来", + "initiativesFeaturedTitle": "本季度精选", + "initiativesCategoryAI": "人工智能", + "initiativesCategoryPolicy": "政策", + "initiativesFeaturedLearnMoreAbout": "进一步了解 {name}", + "initiativesFeaturedPartneringWith": "合作伙伴", + "initiativesBadgeNew": "新", + "initiativesPartnerRenaissancePhilanthropy": "Renaissance Philanthropy", + "initiativesPartnerSchultzFamilyFoundation": "Schultz Family Foundation", + "initiativeLaborHubFeatureHeading": "Labor Hub", + "initiativeLaborHubFeatureDescription": "来自我们全球预测社区的实时预测,关注 AI 发展下美国劳动力的未来。", + "initiativesFeaturedLearnMore": "了解更多", + "initiativeFutureEvalFeatureHeading": "FutureEval", + "initiativeFutureEvalFeatureDescription": "FutureEval 衡量 AI 智能体预测各行业未来结果的能力。", + "initiativeMidtermsFeatureHeading": "2026 年美国中期选举追踪", + "initiativeMidtermsFeatureDescription": "Metaculus 社区对竞争激烈的选举以及由此塑造的政策的预测。", + "initiativesTestimonialsTitle": "合作伙伴怎么说", + "initiativesTestimonialBrendanQuote": "Metaculus is the ideal partner for forecasting risks - their platform encourages truthful revelation of probability estimates using prizes for accuracy rather than direct profit. This approach makes the results understandable and more credible to multiple audiences.", + "initiativesTestimonialBrendanAuthor": "Brendan Nyhan", + "initiativesTestimonialBrendanRole": "James O. Freedman Presidential Professor, Department of Government, Dartmouth College", + "initiativesTestimonialIlyaQuote": "Partnering with Metaculus has been both productive and engaging for us at the JetBrains Research team. Beyond being a valuable collaboration that helped us better understand the real-world utility and risks associated with AI coding assistance, it was also a very pleasant experience, given the Metaculus team's professionalism and openness.", + "initiativesTestimonialIlyaAuthor": "Ilya Zakharov", + "initiativesTestimonialIlyaRole": "Senior Researcher, Human-AI Experience Team, JetBrains Research", + "initiativesTestimonialRayQuote": "I was impressed with what the forecasters were able to generate on the basis of publicly available information. The forecasts will help me with decision-making around TB vaccines, and it’s very helpful to have an independent outside view on these questions.", + "initiativesTestimonialRayAuthor": "Ray Kennedy", + "initiativesTestimonialRayRole": "Senior Program Officer, Global Health R&D, Coefficient Giving", + "initiativesTestimonialKikoQuote": "As a data journalist, I spend a lot of time helping our readers think in probabilities rather than certainties. Metaculus is the best example of that idea in practice: a community where saying \"70%\" means something useful, where you are scored on it, and where being wrong is information.", + "initiativesTestimonialKikoAuthor": "Kiko Llaneras", + "initiativesTestimonialKikoRole": "Data Journalist and Author, El Pais", + "initiativesInventoryTitle": "全部项目", + "initiativesProgramCtaEyebrow": "面向项目团队", + "initiativesProgramCtaHeading": "对面向公众的项目有想法吗?", + "initiativesProgramCtaDescription": "欢迎提出专题中心、基准测试、地图或案例研究系列;我们的项目团队很乐意提供帮助。", + "initiativesProgramCtaPitch": "提议新项目", + "initiativesInventoryFilterLabel": "筛选项目", + "initiativesInventoryFilterAll": "全部", + "initiativesInventoryViewLabel": "视图", + "initiativesInventoryViewList": "列表", + "initiativesInventoryViewGrid": "网格", + "initiativesCategoryHealthBio": "健康与生物", + "initiativesCategoryScience": "科学", + "initiativeFrontiersDiseaseName": "疾病预防前沿", + "initiativeFrontiersDiseaseDescription": "Pro Forecasting 报告评估未来二十年最可能产生影响的疾病预防技术。", + "initiativeGlobalHealthMonitorName": "全球健康监测", + "initiativeGlobalHealthMonitorDescription": "有关新兴健康风险和疾病监测的最新动态。", + "initiativeDemocracyThreatName": "美国民主威胁指数", + "initiativeDemocracyThreatDescription": "该指数与无党派组织 Bright Line Watch 合作,通过预测问题追踪值得关注领域的状况。", + "initiativeResearchAgenciesName": "研究机构前景报告", + "initiativeResearchAgenciesDescription": "专业预测特朗普政府期间研究机构的预期资金情况。", + "initiativeAIDiffusionName": "人工智能扩散指数", + "initiativeAIDiffusionDescription": "我们与 Convergence Analysis 合作,监测人工智能能力到 2030 年将如何融入社会。", + "initiativeAGIReadinessName": "2030 年 AGI 准备度指数", + "initiativeAGIReadinessDescription": "追踪 The Curve 2024 年研讨会参与者确定的关键指标,以衡量社会对通用人工智能的准备程度。", + "initiativeCDCExpertElicitationName": "CDC 专家意见征询", + "initiativeCDCExpertElicitationDescription": "征询专家对即将到来的秋冬呼吸道疾病季的看法。", + "initiativeThreshold2030Name": "Threshold 2030", + "initiativeThreshold2030Description": "与 Convergence Analysis 联合举办的会议,评估到 2030 年前沿人工智能技术的经济影响。", + "initiativeScaleIsAllYouNeedName": "Scale is All You Need", + "initiativeScaleIsAllYouNeedDescription": "与 Astera Institute 合作举办的研讨会,重点推动合成生物学发展。", + "initiativeFroCastingName": "FRO-casting", + "initiativeFroCastingDescription": "与 Federation of American Scientists 合作,利用预测评估影响、提供反馈,并为研究资金分配提供依据。", + "initiativeAINuclearLandscapeName": "人工智能与核安全格局预测", + "initiativeAINuclearLandscapeDescription": "与 Institute for Security and Technology 合作,评估美中之间的局势升级风险,包括将人工智能纳入核指挥、控制和通信系统所带来的风险。" } diff --git a/front_end/public/images/initiatives/futureeval-featured.png b/front_end/public/images/initiatives/futureeval-featured.png new file mode 100644 index 0000000000..4f40e9433c Binary files /dev/null and b/front_end/public/images/initiatives/futureeval-featured.png differ diff --git a/front_end/public/images/initiatives/inventory-fallback.png b/front_end/public/images/initiatives/inventory-fallback.png new file mode 100644 index 0000000000..aa26668570 Binary files /dev/null and b/front_end/public/images/initiatives/inventory-fallback.png differ diff --git a/front_end/public/images/initiatives/labor-hub-featured.png b/front_end/public/images/initiatives/labor-hub-featured.png new file mode 100644 index 0000000000..071a7cadc4 Binary files /dev/null and b/front_end/public/images/initiatives/labor-hub-featured.png differ diff --git a/front_end/public/partners/renaissance-philanthropy-logo.svg b/front_end/public/partners/renaissance-philanthropy-logo.svg new file mode 100644 index 0000000000..194745876c --- /dev/null +++ b/front_end/public/partners/renaissance-philanthropy-logo.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/front_end/public/partners/schultz-family-foundation-logo.svg b/front_end/public/partners/schultz-family-foundation-logo.svg new file mode 100644 index 0000000000..6a1c322568 --- /dev/null +++ b/front_end/public/partners/schultz-family-foundation-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/front_end/src/app/(main)/initiatives/components/featured_initiative_row.tsx b/front_end/src/app/(main)/initiatives/components/featured_initiative_row.tsx new file mode 100644 index 0000000000..9cb36d7b71 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/featured_initiative_row.tsx @@ -0,0 +1,127 @@ +import Image from "next/image"; +import { useTranslations } from "next-intl"; +import { FC } from "react"; + +import Button from "@/components/ui/button"; +import cn from "@/utils/core/cn"; + +import { + INITIATIVE_FALLBACK_ARTWORK, + resolveAssetSource, +} from "../helpers/assets"; +import { FeaturedInitiative } from "../types"; + +type Props = { + initiative: FeaturedInitiative; + artworkSide: "start" | "end"; +}; + +const FeaturedInitiativeRow: FC = ({ initiative, artworkSide }) => { + const t = useTranslations(); + const { feature } = initiative; + const name = t(initiative.nameKey); + + return ( +
+
+ +
+ +
+
+ {feature.badgeKey && ( + + {t(feature.badgeKey)} + + )} + +

+ {t(feature.headingKey)} +

+ +

+ {t(feature.descriptionKey)} +

+ + +
+ + {feature.partners && feature.partners.length > 0 && ( +
+

+ {t("initiativesFeaturedPartneringWith")} +

+
    + {feature.partners.map((partner) => { + const logo = resolveAssetSource(partner.logo); + const image = ( + {t(partner.nameKey)} + ); + + return ( +
  • + {partner.url ? ( + + {image} + + ) : ( + image + )} +
  • + ); + })} +
+
+ )} +
+
+ ); +}; + +export default FeaturedInitiativeRow; diff --git a/front_end/src/app/(main)/initiatives/components/initiative_carousel.tsx b/front_end/src/app/(main)/initiatives/components/initiative_carousel.tsx new file mode 100644 index 0000000000..880c67199f --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/initiative_carousel.tsx @@ -0,0 +1,419 @@ +"use client"; + +import { faArrowRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import useEmblaCarousel from "embla-carousel-react"; +import Link from "next/link"; +import { useTranslations } from "next-intl"; +import { + FC, + KeyboardEvent, + useCallback, + useEffect, + useLayoutEffect, + useMemo, + useRef, + useState, +} from "react"; + +import cn from "@/utils/core/cn"; + +import InitiativeMark from "./initiative_mark"; +import { + applyEmphasis, + DESIGN_MARK_SIZE, + getEmphasisStyle, +} from "../helpers/emphasis"; +import { usePrefersReducedMotion } from "../helpers/use_prefers_reduced_motion"; +import { Initiative } from "../types"; + +const AUTOPLAY_INTERVAL = 5000; +const AUTOPLAY_RESUME_DELAY = 4000; +const WHEEL_STEP_THRESHOLD = 40; +const WHEEL_IDLE_RESET = 200; + +const VISIBLE_ITEMS = 5; +const MIN_LOOP_SLIDES = VISIBLE_ITEMS + 1; + +type ActiveInitiativeLinkProps = { + initiative: Initiative; + name: string; + isActive: boolean; +}; + +const ActiveInitiativeLink: FC = ({ + initiative, + name, + isActive, +}) => { + const t = useTranslations(); + + return ( + + + {name} + + {initiative.taglineKey && ( + + {t(initiative.taglineKey)}{" "} + + )} + + ); +}; + +type InitiativeDetailsProps = { + initiatives: Initiative[]; + selectedIndex: number; + className?: string; +}; + +const InitiativeDetails: FC = ({ + initiatives, + selectedIndex, + className, +}) => { + const t = useTranslations(); + + return ( +
+ {initiatives.map((initiative, index) => ( + + ))} +
+ ); +}; + +type Props = { + initiatives: Initiative[]; + initialInitiativeId?: string; +}; + +const InitiativeCarousel: FC = ({ + initiatives, + initialInitiativeId, +}) => { + const t = useTranslations(); + const prefersReducedMotion = usePrefersReducedMotion(); + const requestedStartIndex = initiatives.findIndex( + ({ id }) => id === initialInitiativeId + ); + const startIndex = + requestedStartIndex >= 0 + ? requestedStartIndex + : Math.max(0, Math.floor((initiatives.length - 1) / 2)); + + const slides = useMemo(() => { + if (initiatives.length < 2) return []; + + const cycles = Math.max(1, Math.ceil(MIN_LOOP_SLIDES / initiatives.length)); + const result: { + initiative: Initiative; + realIndex: number; + isRepeat: boolean; + }[] = []; + + for (let cycle = 0; cycle < cycles; cycle++) { + initiatives.forEach((initiative, realIndex) => { + result.push({ initiative, realIndex, isRepeat: cycle > 0 }); + }); + } + + return result; + }, [initiatives]); + + const [emblaRef, emblaApi] = useEmblaCarousel({ + align: "center", + loop: true, + startIndex, + watchFocus: true, + duration: prefersReducedMotion ? 0 : 25, + }); + + const [selectedIndex, setSelectedIndex] = useState(startIndex); + const [isAutoplayPaused, setIsAutoplayPaused] = useState(false); + const [isPointerDown, setIsPointerDown] = useState(false); + const resumeTimerRef = useRef(undefined); + + const autoplayEnabled = + !prefersReducedMotion && !isAutoplayPaused && !isPointerDown; + + const pauseAutoplay = useCallback(() => { + window.clearTimeout(resumeTimerRef.current); + setIsAutoplayPaused(true); + }, []); + + const scheduleAutoplayResume = useCallback(() => { + window.clearTimeout(resumeTimerRef.current); + resumeTimerRef.current = window.setTimeout( + () => setIsAutoplayPaused(false), + AUTOPLAY_RESUME_DELAY + ); + }, []); + + useEffect(() => () => window.clearTimeout(resumeTimerRef.current), []); + + useLayoutEffect(() => { + if (!emblaApi) return; + + const update = () => { + const viewportRect = emblaApi.rootNode().getBoundingClientRect(); + const viewportCenter = viewportRect.left + viewportRect.width / 2; + + for (const slide of emblaApi.slideNodes()) { + const visual = slide.firstElementChild; + if (!(visual instanceof HTMLElement)) continue; + + const mark = visual.firstElementChild; + const markSize = + mark instanceof HTMLElement ? mark.offsetWidth : DESIGN_MARK_SIZE; + + const slideRect = slide.getBoundingClientRect(); + const slideCenter = slideRect.left + slideRect.width / 2; + applyEmphasis( + visual, + (slideCenter - viewportCenter) / (slide.offsetWidth || 1), + markSize / DESIGN_MARK_SIZE + ); + } + }; + + update(); + emblaApi + .on("scroll", update) + .on("settle", update) + .on("resize", update) + .on("reInit", update); + + return () => { + emblaApi + .off("scroll", update) + .off("settle", update) + .off("resize", update) + .off("reInit", update); + }; + }, [emblaApi]); + + useEffect(() => { + if (!emblaApi) return; + + const onSelect = () => + setSelectedIndex(emblaApi.selectedScrollSnap() % initiatives.length); + + onSelect(); + emblaApi.on("select", onSelect).on("reInit", onSelect); + + return () => { + emblaApi.off("select", onSelect).off("reInit", onSelect); + }; + }, [emblaApi, initiatives.length]); + + useEffect(() => { + if (!emblaApi) return; + + const onPointerDown = () => { + setIsPointerDown(true); + pauseAutoplay(); + }; + const onPointerUp = () => { + setIsPointerDown(false); + scheduleAutoplayResume(); + }; + + emblaApi.on("pointerDown", onPointerDown).on("pointerUp", onPointerUp); + + return () => { + emblaApi.off("pointerDown", onPointerDown).off("pointerUp", onPointerUp); + }; + }, [emblaApi, pauseAutoplay, scheduleAutoplayResume]); + + useEffect(() => { + if (!emblaApi) return; + + const viewport = emblaApi.rootNode(); + let accumulated = 0; + let lastEventAt = 0; + + const onWheel = (event: WheelEvent) => { + if (Math.abs(event.deltaX) <= Math.abs(event.deltaY)) return; + event.preventDefault(); + pauseAutoplay(); + scheduleAutoplayResume(); + + if (event.timeStamp - lastEventAt > WHEEL_IDLE_RESET) accumulated = 0; + lastEventAt = event.timeStamp; + accumulated += event.deltaX; + + if (Math.abs(accumulated) < WHEEL_STEP_THRESHOLD) return; + if (accumulated > 0) { + emblaApi.scrollNext(); + } else { + emblaApi.scrollPrev(); + } + accumulated = 0; + }; + + viewport.addEventListener("wheel", onWheel, { passive: false }); + + return () => viewport.removeEventListener("wheel", onWheel); + }, [emblaApi, pauseAutoplay, scheduleAutoplayResume]); + + useEffect(() => { + if (!emblaApi || !autoplayEnabled) return; + + const intervalId = window.setInterval(() => { + if (document.hidden) return; + emblaApi.scrollNext(); + }, AUTOPLAY_INTERVAL); + + return () => window.clearInterval(intervalId); + }, [emblaApi, autoplayEnabled]); + + const handleKeyDown = (event: KeyboardEvent) => { + if (!emblaApi) return; + if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return; + + event.preventDefault(); + pauseAutoplay(); + scheduleAutoplayResume(); + + if (event.key === "ArrowLeft") { + emblaApi.scrollPrev(); + } else { + emblaApi.scrollNext(); + } + }; + + const activeInitiative = initiatives[selectedIndex] ?? initiatives[0]; + if (!activeInitiative) return null; + + const activeName = t(activeInitiative.nameKey); + + if (initiatives.length < 2) { + return ( +
+
+ +
+ +
+ ); + } + + return ( +
+
+
+
    + {slides.map(({ initiative, realIndex, isRepeat }, index) => { + const name = t(initiative.nameKey); + + return ( +
  • +
    + +
    +
  • + ); + })} +
+
+
+
+
+ +
+ +
+
+ ); +}; + +export default InitiativeCarousel; diff --git a/front_end/src/app/(main)/initiatives/components/initiative_inventory_card.tsx b/front_end/src/app/(main)/initiatives/components/initiative_inventory_card.tsx new file mode 100644 index 0000000000..05416f180c --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/initiative_inventory_card.tsx @@ -0,0 +1,97 @@ +import { faArrowRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import Image from "next/image"; +import Link from "next/link"; +import { useTranslations } from "next-intl"; +import { FC } from "react"; + +import cn from "@/utils/core/cn"; + +import InitiativeMark from "./initiative_mark"; +import { INITIATIVE_FALLBACK_ARTWORK } from "../helpers/assets"; +import { + DEFAULT_INITIATIVE_COLOR, + getReadableForeground, +} from "../helpers/contrast"; +import { Initiative, InitiativesInventoryView } from "../types"; + +type Props = { + initiative: Initiative; + view: InitiativesInventoryView; +}; + +const InitiativeInventoryCard: FC = ({ initiative, view }) => { + const t = useTranslations(); + const name = t(initiative.inventoryNameKey ?? initiative.nameKey); + const color = initiative.brand?.color ?? DEFAULT_INITIATIVE_COLOR; + const descriptionKey = + initiative.inventoryDescriptionKey ?? initiative.feature?.descriptionKey; + return ( +
  • + + + +
    +

    + {name} +

    + {descriptionKey && ( +

    + {t(descriptionKey)} +

    + )} + + {t("explore")} + +
    + +
  • + ); +}; + +export default InitiativeInventoryCard; diff --git a/front_end/src/app/(main)/initiatives/components/initiative_mark.tsx b/front_end/src/app/(main)/initiatives/components/initiative_mark.tsx new file mode 100644 index 0000000000..f462a231df --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/initiative_mark.tsx @@ -0,0 +1,58 @@ +import Image from "next/image"; +import { CSSProperties, FC } from "react"; + +import cn from "@/utils/core/cn"; + +import { resolveAssetSource } from "../helpers/assets"; +import { + DEFAULT_INITIATIVE_COLOR, + getReadableForeground, +} from "../helpers/contrast"; +import { Initiative } from "../types"; + +type Props = { + initiative: Initiative; + name: string; + className?: string; +}; + +const InitiativeMark: FC = ({ initiative, name, className }) => { + const { logo, brand } = initiative; + const color = brand?.color ?? DEFAULT_INITIATIVE_COLOR; + const logoSource = logo ? resolveAssetSource(logo) : null; + + return ( + + {logoSource ? ( + + ) : ( + + )} + + ); +}; + +export default InitiativeMark; diff --git a/front_end/src/app/(main)/initiatives/components/initiatives_inventory.tsx b/front_end/src/app/(main)/initiatives/components/initiatives_inventory.tsx new file mode 100644 index 0000000000..87539141d3 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/initiatives_inventory.tsx @@ -0,0 +1,88 @@ +"use client"; + +import { useTranslations } from "next-intl"; +import { FC, useState, useSyncExternalStore } from "react"; + +import cn from "@/utils/core/cn"; + +import InitiativeInventoryCard from "./initiative_inventory_card"; +import InventoryToolbar from "./inventory_toolbar"; +import { + Initiative, + InitiativesInventoryFilter, + InitiativesInventoryView, +} from "../types"; + +const RESULTS_ID = "initiatives-inventory-results"; +const DESKTOP_VIEW_QUERY = "(min-width: 769px)"; + +type Props = { + initiatives: Initiative[]; + filters: InitiativesInventoryFilter[]; + allFilterId: string; +}; + +const subscribeToViewport = (callback: () => void) => { + const mediaQuery = window.matchMedia(DESKTOP_VIEW_QUERY); + mediaQuery.addEventListener("change", callback); + return () => mediaQuery.removeEventListener("change", callback); +}; + +const getDesktopSnapshot = () => window.matchMedia(DESKTOP_VIEW_QUERY).matches; +const getServerSnapshot = () => true; + +const InitiativesInventory: FC = ({ + initiatives, + filters, + allFilterId, +}) => { + const t = useTranslations(); + const [activeFilterId, setActiveFilterId] = useState(allFilterId); + const [desktopView, setDesktopView] = + useState("grid"); + const isDesktop = useSyncExternalStore( + subscribeToViewport, + getDesktopSnapshot, + getServerSnapshot + ); + const view = isDesktop ? desktopView : "list"; + const visibleInitiatives = initiatives.filter( + (initiative) => + activeFilterId === allFilterId || initiative.categoryId === activeFilterId + ); + + return ( + <> + +
      + {visibleInitiatives.map((initiative) => ( + + ))} + {visibleInitiatives.length === 0 && ( +
    • + {t("noResults")} +
    • + )} +
    + + ); +}; + +export default InitiativesInventory; diff --git a/front_end/src/app/(main)/initiatives/components/initiatives_testimonials.tsx b/front_end/src/app/(main)/initiatives/components/initiatives_testimonials.tsx new file mode 100644 index 0000000000..285f3c81b4 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/initiatives_testimonials.tsx @@ -0,0 +1,106 @@ +import Image from "next/image"; +import { useTranslations } from "next-intl"; +import { FC } from "react"; + +import cn from "@/utils/core/cn"; + +import { resolveAssetSource } from "../helpers/assets"; +import { InitiativesTestimonial, TestimonialAccent } from "../types"; + +const ACCENT_BORDER: Record = { + blue: "border-[#2C77B4]", + purple: "border-purple-700 dark:border-purple-700-dark", +}; + +type Props = { + testimonials: InitiativesTestimonial[]; +}; + +const InitiativesTestimonials: FC = ({ testimonials }) => { + const t = useTranslations(); + + if (testimonials.length === 0) return null; + + const shouldScroll = testimonials.length > 3; + + return ( +
    +

    +

    + +
      + {testimonials.map( + ({ id, quoteKey, authorKey, roleKey, avatar, accent }) => { + const avatarSource = avatar ? resolveAssetSource(avatar) : null; + + return ( +
    • +
      +
      + {t(quoteKey)} +
      + +
      + {avatarSource ? ( + + ) : ( +
      +
      +
    • + ); + } + )} +
    +
    + ); +}; + +export default InitiativesTestimonials; diff --git a/front_end/src/app/(main)/initiatives/components/inventory_toolbar.tsx b/front_end/src/app/(main)/initiatives/components/inventory_toolbar.tsx new file mode 100644 index 0000000000..5f92f25f00 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/inventory_toolbar.tsx @@ -0,0 +1,107 @@ +"use client"; + +import { useTranslations } from "next-intl"; +import { FC } from "react"; + +import cn from "@/utils/core/cn"; + +import { GridViewIcon, ListViewIcon } from "./inventory_view_icons"; +import { InitiativesInventoryFilter, InitiativesInventoryView } from "../types"; + +const VIEW_OPTIONS = [ + { + value: "list", + labelKey: "initiativesInventoryViewList", + Icon: ListViewIcon, + }, + { + value: "grid", + labelKey: "initiativesInventoryViewGrid", + Icon: GridViewIcon, + }, +] as const; + +type Props = { + filters: InitiativesInventoryFilter[]; + activeFilterId: string; + onFilterChange: (filterId: string) => void; + view: InitiativesInventoryView; + onViewChange: (view: InitiativesInventoryView) => void; + resultsId?: string; +}; + +const InventoryToolbar: FC = ({ + filters, + activeFilterId, + onFilterChange, + view, + onViewChange, + resultsId, +}) => { + const t = useTranslations(); + + return ( +
    +
    +
    + {filters.map(({ id, labelKey }) => { + const isActive = id === activeFilterId; + + return ( + + ); + })} +
    +
    + +
    + {VIEW_OPTIONS.map(({ value, labelKey, Icon }) => { + const isActive = value === view; + + return ( + + ); + })} +
    +
    + ); +}; + +export default InventoryToolbar; diff --git a/front_end/src/app/(main)/initiatives/components/inventory_view_icons.tsx b/front_end/src/app/(main)/initiatives/components/inventory_view_icons.tsx new file mode 100644 index 0000000000..b426cd7cfb --- /dev/null +++ b/front_end/src/app/(main)/initiatives/components/inventory_view_icons.tsx @@ -0,0 +1,59 @@ +import { FC, SVGProps } from "react"; + +export const GridViewIcon: FC> = (props) => ( + +); + +export const ListViewIcon: FC> = (props) => ( + +); diff --git a/front_end/src/app/(main)/initiatives/data.ts b/front_end/src/app/(main)/initiatives/data.ts new file mode 100644 index 0000000000..44f5d8488f --- /dev/null +++ b/front_end/src/app/(main)/initiatives/data.ts @@ -0,0 +1,46 @@ +import rawInitiativesPageData from "./initiatives.json"; +import { + FeaturedInitiative, + Initiative, + InitiativePlacement, + InitiativesInventoryFilter, + InitiativesPageData, +} from "./types"; + +export const ALL_INITIATIVES_FILTER_ID = "all"; + +export const initiativesPageData = + rawInitiativesPageData as InitiativesPageData; + +export function getInitiativesByPlacement( + placement: InitiativePlacement +): Initiative[] { + return initiativesPageData.initiatives + .filter((initiative) => initiative.placements.includes(placement)) + .sort((a, b) => + placement === "inventory" + ? (a.inventoryOrder ?? a.order) - (b.inventoryOrder ?? b.order) + : a.order - b.order + ); +} + +export function getFeaturedInitiatives(): FeaturedInitiative[] { + return initiativesPageData.initiatives + .filter( + (initiative): initiative is FeaturedInitiative => + initiative.placements.includes("featured") && + !!initiative.feature && + !!initiative.brand + ) + .sort((a, b) => a.feature.order - b.feature.order); +} + +export function getInventoryFilters(): InitiativesInventoryFilter[] { + return [ + { + id: ALL_INITIATIVES_FILTER_ID, + labelKey: "initiativesInventoryFilterAll", + }, + ...(initiativesPageData.categories ?? []), + ]; +} diff --git a/front_end/src/app/(main)/initiatives/helpers/assets.ts b/front_end/src/app/(main)/initiatives/helpers/assets.ts new file mode 100644 index 0000000000..9b15fc7715 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/helpers/assets.ts @@ -0,0 +1,9 @@ +export const INITIATIVE_FALLBACK_ARTWORK = + "/images/initiatives/inventory-fallback.png"; + +export function resolveAssetSource(src: string): { + src: string; + unoptimized: boolean; +} { + return { src, unoptimized: /^https?:\/\//i.test(src) }; +} diff --git a/front_end/src/app/(main)/initiatives/helpers/contrast.ts b/front_end/src/app/(main)/initiatives/helpers/contrast.ts new file mode 100644 index 0000000000..e4a676401c --- /dev/null +++ b/front_end/src/app/(main)/initiatives/helpers/contrast.ts @@ -0,0 +1,35 @@ +import { METAC_COLORS } from "@/constants/colors"; + +const LIGHT_FOREGROUND = METAC_COLORS.gray["0"].DEFAULT; +const DARK_FOREGROUND = METAC_COLORS.blue["900"].DEFAULT; + +export const DEFAULT_INITIATIVE_COLOR = METAC_COLORS.blue["800"].DEFAULT; + +function toLinear(channel: number): number { + const value = channel / 255; + return value <= 0.03928 + ? value / 12.92 + : Math.pow((value + 0.055) / 1.055, 2.4); +} + +export function getReadableForeground(backgroundColor: string): string { + const hex = backgroundColor.replace("#", ""); + const full = + hex.length === 3 + ? hex + .split("") + .map((character) => character + character) + .join("") + : hex; + + const red = parseInt(full.slice(0, 2), 16); + const green = parseInt(full.slice(2, 4), 16); + const blue = parseInt(full.slice(4, 6), 16); + + if ([red, green, blue].some(Number.isNaN)) return LIGHT_FOREGROUND; + + const luminance = + 0.2126 * toLinear(red) + 0.7152 * toLinear(green) + 0.0722 * toLinear(blue); + + return luminance > 0.4 ? DARK_FOREGROUND : LIGHT_FOREGROUND; +} diff --git a/front_end/src/app/(main)/initiatives/helpers/emphasis.ts b/front_end/src/app/(main)/initiatives/helpers/emphasis.ts new file mode 100644 index 0000000000..48df6719f0 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/helpers/emphasis.ts @@ -0,0 +1,63 @@ +import { CSSProperties } from "react"; + +export const DESIGN_MARK_SIZE = 200; + +const STEPS = [ + { scale: 1, blur: 0, opacity: 1, shift: 0 }, + { scale: 0.72, blur: 10, opacity: 0.72, shift: 0 }, + { scale: 0.52, blur: 15, opacity: 0.45, shift: 48 }, +]; + +type Emphasis = { + blur: string; + scale: string; + opacity: string; + shift: string; +}; + +function getEmphasis(distance: number, markRatio: number): Emphasis { + const lastIndex = STEPS.length - 1; + const clamped = Math.min(Math.abs(distance), lastIndex); + const index = Math.min(Math.floor(clamped), lastIndex); + const from = STEPS[index]; + const to = STEPS[Math.min(index + 1, lastIndex)]; + + if (!from || !to) { + return { blur: "0px", scale: "1", opacity: "1", shift: "0px" }; + } + + const progress = clamped - index; + const lerp = (a: number, b: number) => a + (b - a) * progress; + const towardCentre = distance > 0 ? -1 : 1; + + return { + blur: `${(lerp(from.blur, to.blur) * markRatio).toFixed(2)}px`, + scale: lerp(from.scale, to.scale).toFixed(3), + opacity: lerp(from.opacity, to.opacity).toFixed(3), + shift: `${(lerp(from.shift, to.shift) * markRatio * towardCentre).toFixed(2)}px`, + }; +} + +export function getEmphasisStyle(distance: number): CSSProperties { + const { blur, scale, opacity, shift } = getEmphasis(distance, 1); + + return { + "--initiative-blur": blur, + "--initiative-scale": scale, + "--initiative-opacity": opacity, + "--initiative-shift": shift, + } as CSSProperties; +} + +export function applyEmphasis( + element: HTMLElement, + distance: number, + markRatio: number +): void { + const { blur, scale, opacity, shift } = getEmphasis(distance, markRatio); + + element.style.setProperty("--initiative-blur", blur); + element.style.setProperty("--initiative-scale", scale); + element.style.setProperty("--initiative-opacity", opacity); + element.style.setProperty("--initiative-shift", shift); +} diff --git a/front_end/src/app/(main)/initiatives/helpers/use_prefers_reduced_motion.ts b/front_end/src/app/(main)/initiatives/helpers/use_prefers_reduced_motion.ts new file mode 100644 index 0000000000..dcac7d6150 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/helpers/use_prefers_reduced_motion.ts @@ -0,0 +1,19 @@ +"use client"; + +import { useSyncExternalStore } from "react"; + +const REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)"; + +const subscribe = (callback: () => void) => { + const mediaQuery = window.matchMedia(REDUCED_MOTION_QUERY); + mediaQuery.addEventListener("change", callback); + return () => mediaQuery.removeEventListener("change", callback); +}; + +const getSnapshot = () => window.matchMedia(REDUCED_MOTION_QUERY).matches; + +const getServerSnapshot = () => false; + +export function usePrefersReducedMotion(): boolean { + return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); +} diff --git a/front_end/src/app/(main)/initiatives/initiatives.json b/front_end/src/app/(main)/initiatives/initiatives.json new file mode 100644 index 0000000000..9665281eb3 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/initiatives.json @@ -0,0 +1,263 @@ +{ + "hero": { + "eyebrowKey": "initiativesHeroEyebrow", + "headingKey": "initiativesHeroHeading", + "descriptionKey": "initiativesHeroDescription", + "initialInitiativeId": "radiant", + "actions": [ + { + "id": "partner", + "labelKey": "initiativesHeroPartnerCta", + "href": "/services/", + "variant": "primary" + }, + { + "id": "learn-more", + "labelKey": "initiativesHeroLearnMoreCta", + "href": "#initiatives-featured", + "variant": "secondary" + } + ] + }, + "programCta": { + "eyebrowKey": "initiativesProgramCtaEyebrow", + "headingKey": "initiativesProgramCtaHeading", + "descriptionKey": "initiativesProgramCtaDescription", + "pitchLabelKey": "initiativesProgramCtaPitch", + "pitchHref": "/services/#contact-us" + }, + "testimonials": [ + { + "id": "brendan-nyhan", + "quoteKey": "initiativesTestimonialBrendanQuote", + "authorKey": "initiativesTestimonialBrendanAuthor", + "roleKey": "initiativesTestimonialBrendanRole", + "accent": "blue" + }, + { + "id": "ilya-zakharov", + "quoteKey": "initiativesTestimonialIlyaQuote", + "authorKey": "initiativesTestimonialIlyaAuthor", + "roleKey": "initiativesTestimonialIlyaRole", + "accent": "purple" + }, + { + "id": "ray-kennedy", + "quoteKey": "initiativesTestimonialRayQuote", + "authorKey": "initiativesTestimonialRayAuthor", + "roleKey": "initiativesTestimonialRayRole", + "accent": "blue" + }, + { + "id": "kiko-llaneras", + "quoteKey": "initiativesTestimonialKikoQuote", + "authorKey": "initiativesTestimonialKikoAuthor", + "roleKey": "initiativesTestimonialKikoRole", + "accent": "purple" + } + ], + "categories": [ + { "id": "health-bio", "labelKey": "initiativesCategoryHealthBio" }, + { "id": "ai", "labelKey": "initiativesCategoryAI" }, + { "id": "science", "labelKey": "initiativesCategoryScience" }, + { "id": "policy", "labelKey": "initiativesCategoryPolicy" } + ], + "initiatives": [ + { + "id": "futureeval", + "nameKey": "initiativeFutureEvalName", + "taglineKey": "initiativeFutureEvalTagline", + "url": "/futureeval/", + "artwork": "/images/initiatives/futureeval-featured.png", + "brand": { "color": "#4BA79E" }, + "categoryId": "ai", + "order": 1, + "inventoryOrder": 1, + "placements": ["hero", "featured", "inventory"], + "feature": { + "order": 1, + "headingKey": "initiativeFutureEvalFeatureHeading", + "descriptionKey": "initiativeFutureEvalFeatureDescription" + } + }, + { + "id": "midterms", + "nameKey": "initiativeMidtermsName", + "taglineKey": "initiativeMidtermsTagline", + "inventoryNameKey": "initiativeMidtermsFeatureHeading", + "url": "/midterms-2026/", + "brand": { "color": "#2C77B4" }, + "categoryId": "policy", + "order": 2, + "inventoryOrder": 3, + "placements": ["hero", "featured", "inventory"], + "feature": { + "order": 3, + "headingKey": "initiativeMidtermsFeatureHeading", + "descriptionKey": "initiativeMidtermsFeatureDescription" + } + }, + { + "id": "case-studies", + "nameKey": "initiativeCaseStudiesName", + "taglineKey": "initiativeCaseStudiesTagline", + "inventoryDescriptionKey": "initiativeCaseStudiesInventoryDescription", + "url": "/services/", + "brand": { "color": "#C0B7AD" }, + "categoryId": "policy", + "order": 3, + "inventoryOrder": 4, + "placements": ["hero", "inventory"] + }, + { + "id": "radiant", + "nameKey": "initiativeRadiantName", + "taglineKey": "initiativeRadiantTagline", + "inventoryDescriptionKey": "initiativeRadiantInventoryDescription", + "url": "/notebooks/42293/map-the-future-before-you-build-it/", + "brand": { "color": "#f95700" }, + "categoryId": "ai", + "order": 4, + "inventoryOrder": 5, + "placements": ["hero", "inventory"] + }, + { + "id": "labor-hub", + "nameKey": "initiativeLaborHubName", + "taglineKey": "initiativeLaborHubTagline", + "url": "/labor-hub/", + "artwork": "/images/initiatives/labor-hub-featured.png", + "brand": { "color": "#AF6994" }, + "categoryId": "ai", + "order": 5, + "inventoryOrder": 2, + "placements": ["hero", "featured", "inventory"], + "feature": { + "order": 2, + "headingKey": "initiativeLaborHubFeatureHeading", + "descriptionKey": "initiativeLaborHubFeatureDescription", + "badgeKey": "initiativesBadgeNew", + "partners": [ + { + "logo": "/partners/renaissance-philanthropy-logo.svg", + "nameKey": "initiativesPartnerRenaissancePhilanthropy" + }, + { + "logo": "/partners/schultz-family-foundation-logo.svg", + "nameKey": "initiativesPartnerSchultzFamilyFoundation" + } + ] + } + }, + { + "id": "frontiers-disease-prevention", + "nameKey": "initiativeFrontiersDiseaseName", + "inventoryDescriptionKey": "initiativeFrontiersDiseaseDescription", + "url": "/notebooks/43979/frontiers-in-disease-prevention-findings/", + "brand": { "color": "#B5793A" }, + "categoryId": "health-bio", + "order": 6, + "placements": ["inventory"] + }, + { + "id": "global-health-monitor", + "nameKey": "initiativeGlobalHealthMonitorName", + "inventoryDescriptionKey": "initiativeGlobalHealthMonitorDescription", + "url": "/tournament/global-health-monitor-26-27/", + "brand": { "color": "#4E8C5A" }, + "categoryId": "health-bio", + "order": 7, + "placements": ["inventory"] + }, + { + "id": "us-democracy-threat-index", + "nameKey": "initiativeDemocracyThreatName", + "inventoryDescriptionKey": "initiativeDemocracyThreatDescription", + "url": "/index/us-democracy-threat/", + "brand": { "color": "#A0493F" }, + "categoryId": "policy", + "order": 8, + "placements": ["inventory"] + }, + { + "id": "research-agencies-outlook", + "nameKey": "initiativeResearchAgenciesName", + "inventoryDescriptionKey": "initiativeResearchAgenciesDescription", + "url": "/notebooks/39977/report-pro-forecasters-expect-steady-nih-and-nsf-funding/", + "brand": { "color": "#5B5FA8" }, + "categoryId": "science", + "order": 9, + "placements": ["inventory"] + }, + { + "id": "ai-diffusion-index", + "nameKey": "initiativeAIDiffusionName", + "inventoryDescriptionKey": "initiativeAIDiffusionDescription", + "url": "/index/diffusion-index/", + "brand": { "color": "#9C4F6B" }, + "categoryId": "ai", + "order": 10, + "placements": ["inventory"] + }, + { + "id": "agi-2030-readiness-index", + "nameKey": "initiativeAGIReadinessName", + "inventoryDescriptionKey": "initiativeAGIReadinessDescription", + "url": "/index/agi-readiness-index/", + "brand": { "color": "#2F7FA0" }, + "categoryId": "ai", + "order": 11, + "placements": ["inventory"] + }, + { + "id": "cdc-expert-elicitation", + "nameKey": "initiativeCDCExpertElicitationName", + "inventoryDescriptionKey": "initiativeCDCExpertElicitationDescription", + "url": "https://www.cdc.gov/cfa-qualitative-assessments/php/data-research/season-outlook25-26-dec-update.html", + "brand": { "color": "#7A8B3A" }, + "categoryId": "health-bio", + "order": 12, + "placements": ["inventory"] + }, + { + "id": "threshold-2030", + "nameKey": "initiativeThreshold2030Name", + "inventoryDescriptionKey": "initiativeThreshold2030Description", + "url": "/notebooks/30299/threshold-2030-modeling-ai-economic-futures/", + "brand": { "color": "#3E8E7E" }, + "categoryId": "ai", + "order": 13, + "placements": ["inventory"] + }, + { + "id": "scale-is-all-you-need", + "nameKey": "initiativeScaleIsAllYouNeedName", + "inventoryDescriptionKey": "initiativeScaleIsAllYouNeedDescription", + "url": "/notebooks/27413/scale-is-all-you-need-a-synthetic-biology-workshop-with-astera/", + "brand": { "color": "#C2553F" }, + "categoryId": "health-bio", + "order": 14, + "placements": ["inventory"] + }, + { + "id": "fro-casting", + "nameKey": "initiativeFroCastingName", + "inventoryDescriptionKey": "initiativeFroCastingDescription", + "url": "/notebooks/19150/fro-casting-to-support-a-new-research-model/", + "brand": { "color": "#8E5BA6" }, + "categoryId": "science", + "order": 15, + "placements": ["inventory"] + }, + { + "id": "ai-nuclear-landscape", + "nameKey": "initiativeAINuclearLandscapeName", + "inventoryDescriptionKey": "initiativeAINuclearLandscapeDescription", + "url": "https://securityandtechnology.org/virtual-library/report/forecasting-the-ai-and-nuclear-landscape/", + "brand": { "color": "#3F6E9E" }, + "categoryId": "policy", + "order": 16, + "placements": ["inventory"] + } + ] +} diff --git a/front_end/src/app/(main)/initiatives/page.tsx b/front_end/src/app/(main)/initiatives/page.tsx new file mode 100644 index 0000000000..7dd361f7bf --- /dev/null +++ b/front_end/src/app/(main)/initiatives/page.tsx @@ -0,0 +1,31 @@ +import { Metadata } from "next"; +import { getTranslations } from "next-intl/server"; + +import FeaturedSection from "./sections/featured"; +import HeroSection from "./sections/hero"; +import InventorySection from "./sections/inventory"; +import ProgramCtaSection from "./sections/program_cta"; + +export async function generateMetadata(): Promise { + const t = await getTranslations(); + + return { + title: t("initiativesMetaTitle"), + description: t("initiativesMetaDescription"), + }; +} + +export default function InitiativesPage() { + return ( +
    +
    + +
    +
    + + +
    + +
    + ); +} diff --git a/front_end/src/app/(main)/initiatives/sections/featured.tsx b/front_end/src/app/(main)/initiatives/sections/featured.tsx new file mode 100644 index 0000000000..37cd86593c --- /dev/null +++ b/front_end/src/app/(main)/initiatives/sections/featured.tsx @@ -0,0 +1,53 @@ +import { useTranslations } from "next-intl"; + +import FeaturedInitiativeRow from "../components/featured_initiative_row"; +import InitiativesTestimonials from "../components/initiatives_testimonials"; +import { getFeaturedInitiatives, initiativesPageData } from "../data"; + +const FeaturedSection = () => { + const t = useTranslations(); + const featured = getFeaturedInitiatives(); + + if (featured.length === 0) return null; + + const leading = featured.slice(0, 2); + const trailing = featured.slice(2); + + return ( + + ); +}; + +export default FeaturedSection; diff --git a/front_end/src/app/(main)/initiatives/sections/hero.tsx b/front_end/src/app/(main)/initiatives/sections/hero.tsx new file mode 100644 index 0000000000..3991783ca7 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/sections/hero.tsx @@ -0,0 +1,67 @@ +import { getTranslations } from "next-intl/server"; + +import Button from "@/components/ui/button"; +import cn from "@/utils/core/cn"; + +import InitiativeCarousel from "../components/initiative_carousel"; +import { getInitiativesByPlacement, initiativesPageData } from "../data"; + +const HeroSection = async () => { + const t = await getTranslations(); + const { hero } = initiativesPageData; + const heroInitiatives = getInitiativesByPlacement("hero"); + + return ( +
    +
    +

    +

    + +

    + {t(hero.headingKey)} +

    +
    + +

    + {t(hero.descriptionKey)} +

    + + {hero.actions.length > 0 && ( +
    + {hero.actions.map((action) => ( + + ))} +
    + )} + + {heroInitiatives.length > 0 && ( +
    + +
    + )} +
    + ); +}; + +export default HeroSection; diff --git a/front_end/src/app/(main)/initiatives/sections/inventory.tsx b/front_end/src/app/(main)/initiatives/sections/inventory.tsx new file mode 100644 index 0000000000..5fcdc22c84 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/sections/inventory.tsx @@ -0,0 +1,34 @@ +import { useTranslations } from "next-intl"; + +import InitiativesInventory from "../components/initiatives_inventory"; +import { + ALL_INITIATIVES_FILTER_ID, + getInitiativesByPlacement, + getInventoryFilters, +} from "../data"; + +const InventorySection = () => { + const t = useTranslations(); + + return ( +
    +
    +

    + {t("initiativesInventoryTitle")} +

    + + +
    +
    + ); +}; + +export default InventorySection; diff --git a/front_end/src/app/(main)/initiatives/sections/program_cta.tsx b/front_end/src/app/(main)/initiatives/sections/program_cta.tsx new file mode 100644 index 0000000000..c9d2b81697 --- /dev/null +++ b/front_end/src/app/(main)/initiatives/sections/program_cta.tsx @@ -0,0 +1,42 @@ +import { faArrowRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import Link from "next/link"; +import { useTranslations } from "next-intl"; + +import { initiativesPageData } from "../data"; + +const ProgramCtaSection = () => { + const t = useTranslations(); + const { programCta } = initiativesPageData; + + return ( +
    +
    +

    + {t(programCta.eyebrowKey)} +

    +

    + {t(programCta.headingKey)} +

    +

    + {t(programCta.descriptionKey)} +

    + {programCta.pitchHref && ( + + {t(programCta.pitchLabelKey)} +
    +
    + ); +}; + +export default ProgramCtaSection; diff --git a/front_end/src/app/(main)/initiatives/types.ts b/front_end/src/app/(main)/initiatives/types.ts new file mode 100644 index 0000000000..3c416230cc --- /dev/null +++ b/front_end/src/app/(main)/initiatives/types.ts @@ -0,0 +1,95 @@ +import { ButtonVariant } from "@/components/ui/button"; +import { TranslationKey } from "@/types/translations"; + +export type InitiativePlacement = "hero" | "featured" | "inventory"; + +export type InitiativeBrand = { + color: string; +}; + +export type InitiativeCategory = { + id: string; + labelKey: TranslationKey; +}; + +export type InitiativesInventoryFilter = InitiativeCategory; + +export type InitiativesInventoryView = "list" | "grid"; + +export type InitiativePartner = { + logo: string; + nameKey: TranslationKey; + url?: string; +}; + +export type InitiativeFeature = { + order: number; + headingKey: TranslationKey; + descriptionKey: TranslationKey; + badgeKey?: TranslationKey; + partners?: InitiativePartner[]; +}; + +export type Initiative = { + id: string; + nameKey: TranslationKey; + taglineKey?: TranslationKey; + inventoryNameKey?: TranslationKey; + inventoryDescriptionKey?: TranslationKey; + url: string; + logo?: string; + artwork?: string; + brand?: InitiativeBrand; + categoryId?: string; + order: number; + inventoryOrder?: number; + placements: InitiativePlacement[]; + feature?: InitiativeFeature; +}; + +export type FeaturedInitiative = Initiative & { + brand: InitiativeBrand; + feature: InitiativeFeature; +}; + +export type TestimonialAccent = "blue" | "purple"; + +export type InitiativesTestimonial = { + id: string; + quoteKey: TranslationKey; + authorKey: TranslationKey; + roleKey: TranslationKey; + avatar?: string; + accent?: TestimonialAccent; +}; + +export type InitiativesHeroAction = { + id: string; + labelKey: TranslationKey; + href: string; + variant: ButtonVariant; +}; + +export type InitiativesHero = { + eyebrowKey: TranslationKey; + headingKey: TranslationKey; + descriptionKey: TranslationKey; + initialInitiativeId?: string; + actions: InitiativesHeroAction[]; +}; + +export type InitiativesProgramCta = { + eyebrowKey: TranslationKey; + headingKey: TranslationKey; + descriptionKey: TranslationKey; + pitchLabelKey: TranslationKey; + pitchHref?: string; +}; + +export type InitiativesPageData = { + hero: InitiativesHero; + programCta: InitiativesProgramCta; + testimonials?: InitiativesTestimonial[]; + categories?: InitiativeCategory[]; + initiatives: Initiative[]; +};