-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathindex.html
More file actions
executable file
·37 lines (27 loc) · 23.9 KB
/
index.html
File metadata and controls
executable file
·37 lines (27 loc) · 23.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="/assets/static/src_styles_global-00f5cfaf.CXa4PXwI.css">
<link rel="stylesheet" type="text/css" href="/assets/static/style-f8c9f72e.C6uyB5YP.css">
<link rel="stylesheet" type="text/css" href="/assets/static/src_styles_global-00f5cfaf.D2wDgbW7.css">
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FormatJS - Internationalize your web apps on the client & server</title><meta name="description" content="Industry-standard i18n libraries for JavaScript. FormatJS provides modular libraries for formatting numbers, dates, and strings for React, Vue, and vanilla JS. Built on ICU Message syntax and ECMA-402."/><meta property="og:title" content="FormatJS - Internationalize your web apps"/><meta property="og:description" content="Industry-standard i18n libraries for JavaScript. Built on ICU Message syntax."/><meta property="og:type" content="website"/><meta property="og:url" content="https://formatjs.io/"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="FormatJS - Internationalize your web apps"/><meta name="twitter:description" content="Industry-standard i18n libraries for JavaScript. Built on ICU Message syntax."/><link rel="canonical" href="https://formatjs.io/"/>
<meta charSet="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><script async="" src="https://www.googletagmanager.com/gtag/js?id=G-4H6ZM973P2"></script><link rel="icon" href="/img/logo-icon.svg" type="image/svg+xml"/><meta name="theme-color" content="#6f3c97"/><script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-4H6ZM973P2');
</script>
</head>
<body>
<div id="root"><link rel="preload" as="image" href="/img/logo-icon.svg"/><link rel="preload" as="image" href="/img/logo-header.svg"/><link rel="preload" as="image" href="/img/react.svg"/><link rel="preload" as="image" href="/img/ember.svg"/><link rel="preload" as="image" href="/img/vue-logo.svg"/><link rel="preload" as="image" href="/img/js.svg"/><link rel="preload" as="image" href="/img/chrome.png"/><link rel="preload" as="image" href="/img/firefox.png"/><link rel="preload" as="image" href="/img/safari.png"/><link rel="preload" as="image" href="/img/edge.png"/><link rel="preload" as="image" href="/img/ie11.png"/><link rel="preload" as="image" href="/img/node.svg"/><link rel="preload" as="image" href="/img/rust.svg"/><link rel="preload" as="image" href="/img/yahoo.svg"/><link rel="preload" as="image" href="/img/dropbox.svg"/><link rel="preload" as="image" href="/img/tinder.svg"/><link rel="preload" as="image" href="/img/ethereum.svg"/><link rel="preload" as="image" href="/img/mozilla.svg"/><link rel="preload" as="image" href="/img/coinbase_white.svg"/><div><nav class="sticky top-0 z-50 bg-gradient-to-r from-purple-600/90 via-purple-700/90 to-indigo-700/90 backdrop-blur-lg border-b border-white/10 shadow-xl"><div class="max-w-7xl mx-auto flex items-center h-16 px-4 lg:px-6"><a href="/" class="flex items-center gap-3 mr-8 group"><div class="relative"><div class="absolute inset-0 bg-white/20 rounded-lg blur-md group-hover:bg-white/30 transition-all"></div><img src="/img/logo-icon.svg" alt="FormatJS" class="relative h-8 w-8 transition-transform group-hover:scale-110"/></div><span class="hidden sm:block text-xl font-bold text-white tracking-tight">FormatJS</span></a><div class="flex flex-1 md:hidden"><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:text-accent-foreground h-9 w-9 text-white hover:bg-white/10" aria-label="navigation menu" type="button" id="radix-_R_h_" aria-haspopup="menu" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu h-5 w-5"><line x1="4" x2="20" y1="12" y2="12"></line><line x1="4" x2="20" y1="6" y2="6"></line><line x1="4" x2="20" y1="18" y2="18"></line></svg></button></div><div class="hidden md:flex flex-1 gap-1 items-center"><a href="/docs/getting-started/installation" class="px-4 py-2 text-sm font-medium text-white/90 no-underline rounded-lg transition-all hover:bg-white/10 hover:text-white cursor-pointer">Docs</a><a href="/docs/react-intl" class="px-4 py-2 text-sm font-medium text-white/90 no-underline rounded-lg transition-all hover:bg-white/10 hover:text-white cursor-pointer">API References</a><a href="/docs/polyfills" class="px-4 py-2 text-sm font-medium text-white/90 no-underline rounded-lg transition-all hover:bg-white/10 hover:text-white cursor-pointer">Polyfills</a><a href="/docs/tooling/cli" class="px-4 py-2 text-sm font-medium text-white/90 no-underline rounded-lg transition-all hover:bg-white/10 hover:text-white cursor-pointer">Tooling</a></div><div class="mr-3 flex-1 sm:flex-initial"><button class="flex items-center gap-2 h-10 px-3 rounded-lg border border-border bg-popover text-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-colors"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search h-4 w-4"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><span class="hidden sm:inline">Search docs...</span><kbd class="hidden sm:inline-flex items-center gap-1 rounded border border-border bg-muted px-1.5 text-[10px] font-medium text-muted-foreground"><span class="text-xs">⌘</span>K</kbd></button></div><a href="https://github.com/formatjs/formatjs" target="_blank" rel="noopener noreferrer" class="hidden md:flex items-center gap-2 px-4 py-2 text-sm font-medium text-white/90 no-underline rounded-lg transition-all hover:bg-white/10 hover:text-white group"><span>GitHub</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-4 w-4 transition-transform group-hover:translate-x-0.5 group-hover:-translate-y-0.5"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></nav><div class="relative overflow-hidden"><div class="absolute inset-0 bg-gradient-to-br from-purple-600 via-purple-700 to-indigo-800"></div><div class="absolute inset-0 opacity-20"><div class="absolute top-20 left-10 w-72 h-72 bg-purple-300 rounded-full mix-blend-multiply filter blur-3xl animate-blob"></div><div class="absolute top-40 right-10 w-72 h-72 bg-indigo-300 rounded-full mix-blend-multiply filter blur-3xl animate-blob animation-delay-2000"></div><div class="absolute -bottom-8 left-1/2 w-72 h-72 bg-pink-300 rounded-full mix-blend-multiply filter blur-3xl animate-blob animation-delay-4000"></div></div><div class="absolute inset-0 opacity-10" style="background-image:url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='1'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")"></div><div class="relative max-w-7xl mx-auto px-4 py-20 md:py-32"><div class="text-center mb-16"><div class="inline-block mb-6 relative"><div class="absolute inset-0 bg-white/10 rounded-2xl blur-2xl"></div><img src="/img/logo-header.svg" alt="FormatJS" class="relative h-20 md:h-28 mx-auto drop-shadow-2xl"/></div><h1 class="text-3xl md:text-5xl lg:text-6xl font-bold text-white mb-6 leading-tight">Internationalize your web apps<br/><span class="bg-gradient-to-r from-purple-200 to-pink-200 bg-clip-text text-transparent">on the client & server</span></h1><p class="text-lg md:text-xl text-purple-100 max-w-2xl mx-auto">Industry-standard i18n libraries for JavaScript. Built on ICU Message syntax.</p></div><div class="max-w-3xl mx-auto"><div class="bg-white/95 backdrop-blur-xl rounded-2xl shadow-2xl p-6 md:p-8 border border-white/20"><div class="mb-6"><div class="flex items-center gap-2 mb-4"><div class="w-3 h-3 rounded-full bg-red-400"></div><div class="w-3 h-3 rounded-full bg-yellow-400"></div><div class="w-3 h-3 rounded-full bg-green-400"></div><span class="ml-2 text-sm font-medium text-gray-600">Live Demo</span></div><div class="space-y-2"><div class="text-sm font-semibold text-gray-700 flex items-center gap-2"><svg class="w-4 h-4 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>Output</div><div class="bg-gradient-to-r from-purple-50 to-indigo-50 rounded-lg p-4 border-2 border-purple-200"><p class="text-lg font-medium text-gray-800">Alex took no photos on March 15, 2023.</p></div></div></div><div class="grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6"><div><label for="num-photos-input" class="block text-sm font-semibold text-gray-700 mb-2"># Photos</label><input type="number" class="flex rounded-md border border-input bg-transparent px-3 py-1 shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm w-full h-11 text-base text-gray-900" id="num-photos-input" value="0"/></div><div><label for="locale-select" class="block text-sm font-semibold text-gray-700 mb-2">Locale</label><select id="locale-select" class="flex h-11 w-full rounded-md border border-input bg-background px-3 py-2 text-base shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-purple-500 disabled:cursor-not-allowed disabled:opacity-50"><option value="en-US" selected="">English (US)</option><option value="es-AR">Español (AR)</option><option value="fr-FR">Français</option><option value="de-DE">Deutsch</option><option value="ja-JP">日本語</option><option value="pt-BR">Português (BR)</option></select></div></div><div class="flex flex-col sm:flex-row gap-3 items-center justify-center pt-4 border-t border-gray-200"><a href="/docs/getting-started/installation" class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-primary/90 h-10 rounded-md px-8 w-full sm:w-auto bg-gradient-to-r from-purple-600 to-indigo-600 hover:from-purple-700 hover:to-indigo-700 text-white shadow-lg">Get Started<svg class="w-4 h-4 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path></svg></a><a href="/docs/core-concepts/basic-internationalization-principles" class="inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-10 rounded-md px-8 w-full sm:w-auto border-2">Learn More</a></div></div></div><div class="mt-16 grid grid-cols-2 md:grid-cols-4 gap-8 max-w-4xl mx-auto"><div class="text-center"><div class="text-2xl md:text-3xl font-bold text-white mb-1">50M+/month</div><div class="text-sm text-purple-200">NPM Downloads</div></div><div class="text-center"><div class="text-2xl md:text-3xl font-bold text-white mb-1">14K+</div><div class="text-sm text-purple-200">GitHub Stars</div></div><div class="text-center"><div class="text-2xl md:text-3xl font-bold text-white mb-1">150+</div><div class="text-sm text-purple-200">Languages</div></div><div class="text-center"><div class="text-2xl md:text-3xl font-bold text-white mb-1">1000+</div><div class="text-sm text-purple-200">Companies</div></div></div></div></div><div class="bg-gradient-to-b from-background to-gray-950 py-16 md:py-24"><div class="max-w-7xl mx-auto px-4"><div class="text-center mb-16"><h2 class="text-3xl md:text-4xl font-bold text-white mb-4">Why FormatJS?</h2><p class="text-lg text-gray-400 max-w-2xl mx-auto">Industry-standard internationalization built on web standards</p></div><div class="grid grid-cols-1 md:grid-cols-3 gap-8"><div class="group relative"><div class="absolute inset-0 bg-gradient-to-r from-purple-600 to-indigo-600 rounded-2xl opacity-0 group-hover:opacity-100 blur-xl transition-opacity duration-300"></div><div class="relative bg-gray-900 border border-gray-800 rounded-2xl p-8 h-full transition-all duration-300 group-hover:border-purple-500"><div class="mb-6 space-y-2"><div class="bg-gradient-to-r from-purple-600 to-purple-700 rounded-lg p-3 text-center transform transition-transform group-hover:scale-105"><p class="uppercase text-xs font-bold text-white tracking-wider">FormatJS Integrations</p></div><div class="bg-gradient-to-r from-purple-700 to-indigo-700 rounded-lg p-3 text-center transform transition-transform group-hover:scale-105"><p class="uppercase text-xs font-bold text-white tracking-wider">FormatJS Core Libs</p></div><div class="bg-gradient-to-r from-yellow-400 to-yellow-500 rounded-lg p-3 text-center transform transition-transform group-hover:scale-105"><p class="uppercase text-xs font-bold text-gray-900 tracking-wider">ECMA-402 + Polyfills</p></div></div><div class="flex items-center gap-2 mb-4"><div class="w-10 h-10 rounded-lg bg-purple-600/20 flex items-center justify-center"><svg class="w-5 h-5 text-purple-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg></div><h3 class="text-xl font-bold text-white">Modular Libraries</h3></div><p class="text-gray-400 leading-relaxed">A modular collection of JavaScript libraries focused on formatting numbers, dates, and strings. Core libraries build on JavaScript Intl built-ins and industry-wide i18n standards.</p></div></div><div class="group relative"><div class="absolute inset-0 bg-gradient-to-r from-indigo-600 to-blue-600 rounded-2xl opacity-0 group-hover:opacity-100 blur-xl transition-opacity duration-300"></div><div class="relative bg-gray-900 border border-gray-800 rounded-2xl p-8 h-full transition-all duration-300 group-hover:border-indigo-500"><div class="flex gap-4 items-center justify-center mb-6 min-h-[140px]"><div class="transition-transform group-hover:scale-110 duration-300"><img src="/img/react.svg" alt="React" class="h-16 w-16 object-contain drop-shadow-lg"/></div><div class="transition-transform group-hover:scale-110 duration-300"><img src="/img/ember.svg" alt="Ember" class="h-16 w-16 object-contain drop-shadow-lg"/></div><div class="transition-transform group-hover:scale-110 duration-300"><img src="/img/vue-logo.svg" alt="Vue" class="h-16 w-16 object-contain drop-shadow-lg"/></div></div><div class="flex items-center gap-2 mb-4"><div class="w-10 h-10 rounded-lg bg-indigo-600/20 flex items-center justify-center"><svg class="w-5 h-5 text-indigo-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"></path></svg></div><h3 class="text-xl font-bold text-white">Framework Integrations</h3></div><p class="text-gray-400 leading-relaxed">Built-in integrations with React and Vue. Internationalization happens in the template or view layer with easy-to-use components and hooks.</p></div></div><div class="group relative"><div class="absolute inset-0 bg-gradient-to-r from-yellow-500 to-orange-500 rounded-2xl opacity-0 group-hover:opacity-100 blur-xl transition-opacity duration-300"></div><div class="relative bg-gray-900 border border-gray-800 rounded-2xl p-8 h-full transition-all duration-300 group-hover:border-yellow-500"><div class="flex items-center justify-center mb-6 min-h-[140px]"><div class="transition-transform group-hover:scale-110 group-hover:rotate-3 duration-300"><img src="/img/js.svg" alt="JavaScript" class="h-20 w-20 drop-shadow-2xl"/></div></div><div class="flex items-center gap-2 mb-4"><div class="w-10 h-10 rounded-lg bg-yellow-600/20 flex items-center justify-center"><svg class="w-5 h-5 text-yellow-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg></div><h3 class="text-xl font-bold text-white">Standards Based</h3></div><p class="text-gray-400 leading-relaxed mb-4">Aligned with<!-- --> <a href="https://tc39.es/ecma402/" target="_blank" rel="noopener noreferrer" class="text-yellow-400 hover:text-yellow-300 underline transition-colors">ECMAScript</a>,<!-- --> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl" target="_blank" rel="noopener noreferrer" class="text-yellow-400 hover:text-yellow-300 underline transition-colors">ECMA-402</a>,<!-- --> <a href="http://cldr.unicode.org/" target="_blank" rel="noopener noreferrer" class="text-yellow-400 hover:text-yellow-300 underline transition-colors">Unicode CLDR</a>, and<!-- --> <a href="https://unicode-org.github.io/icu/userguide/format_parse/messages/" target="_blank" rel="noopener noreferrer" class="text-yellow-400 hover:text-yellow-300 underline transition-colors">ICU Message syntax</a>.</p></div></div></div></div></div><div class="max-w-7xl mx-auto px-4 py-8 md:py-16"><h2 class="text-xl md:text-2xl font-semibold mb-4">Runs in the browser, Node.js, and Rust.</h2><p class="text-sm md:text-base text-muted-foreground mb-4">FormatJS has been tested in all the major browsers (IE11, Chrome, FF & Safari) on both desktop and mobile devices. For many web apps rendering happens on the server, so we made sure FormatJS works perfectly in Node.js. This allows developers to use FormatJS on both the server and client-side of their apps. FormatJS also provides native Rust implementations for high-performance parsing and formatting.</p><div class="flex flex-wrap gap-4 md:gap-8 my-8 items-center"><img src="/img/chrome.png" alt="Chrome" class="h-10 md:h-[60px]"/><img src="/img/firefox.png" alt="Firefox" class="h-10 md:h-[60px]"/><img src="/img/safari.png" alt="Safari" class="h-10 md:h-[60px]"/><img src="/img/edge.png" alt="Edge" class="h-10 md:h-[60px]"/><img src="/img/ie11.png" alt="IE11" class="h-10 md:h-[60px]"/><img src="/img/node.svg" alt="Node.js" class="h-10 md:h-[60px]"/><img src="/img/rust.svg" alt="Rust" class="h-10 md:h-[60px]"/></div></div><div class="bg-gray-900 py-8 md:py-16"><div class="max-w-7xl mx-auto px-4"><h2 class="text-xl md:text-2xl font-semibold text-center mb-8">Trusted by industry leaders.</h2><div class="flex flex-wrap justify-center items-center gap-8 md:gap-12"><img src="/img/yahoo.svg" alt="Yahoo" class="h-[30px] md:h-10 brightness-75"/><img src="/img/dropbox.svg" alt="Dropbox" class="h-[30px] md:h-10 brightness-75"/><img src="/img/tinder.svg" alt="Tinder" class="h-[30px] md:h-10 brightness-75"/><img src="/img/ethereum.svg" alt="Ethereum" class="h-[30px] md:h-10 brightness-75"/><img src="/img/mozilla.svg" alt="Mozilla" class="h-[30px] md:h-10 brightness-75"/><img src="/img/coinbase_white.svg" alt="Coinbase" class="h-[30px] md:h-10"/></div></div></div><footer class="bg-gray-900 text-gray-400 py-8 md:py-12"><div class="max-w-6xl mx-auto px-4"><div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6 md:gap-8"><div><h3 class="text-lg font-semibold text-white mb-4">Docs</h3><div class="flex flex-col gap-2"><a href="/docs/getting-started/installation" class="text-gray-400 no-underline cursor-pointer hover:text-white hover:underline">Getting Started</a><a href="/docs/polyfills" class="text-gray-400 no-underline cursor-pointer hover:text-white hover:underline">Polyfills</a><a href="/docs/react-intl" class="text-gray-400 no-underline cursor-pointer hover:text-white hover:underline">Libraries</a><a href="/docs/tooling/cli" class="text-gray-400 no-underline cursor-pointer hover:text-white hover:underline">Tooling</a></div></div><div><h3 class="text-lg font-semibold text-white mb-4">Community</h3><div class="flex flex-col gap-2"><a href="https://stackoverflow.com/questions/tagged/formatjs" target="_blank" rel="noopener noreferrer" class="text-gray-400 no-underline flex items-center gap-2 hover:text-white hover:underline">Stack Overflow<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-4 w-4"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a href="https://join.slack.com/t/formatjs/shared_invite/enQtNjYwMzE4NjM1MDQzLTA5NDE1Y2Y1ZWNiZWI1YTU5MGUxY2M0YjA4NWNhMmU3YTRjZmQ3MTE3NzJmOTAxMWRmYWE1ZTdkMmYzNzA5Y2M" class="text-gray-400 no-underline flex items-center gap-2 hover:text-white hover:underline">Slack<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-4 w-4"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div><div><h3 class="text-lg font-semibold text-white mb-4">Social</h3><div class="flex flex-col gap-2"><a href="https://github.com/formatjs/formatjs" target="_blank" rel="noopener noreferrer" class="text-gray-400 no-underline flex items-center gap-2 hover:text-white hover:underline">GitHub<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link h-4 w-4"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><p class="text-sm text-gray-600 text-center mt-12">Copyright © <!-- -->2026<!-- --> FormatJS.</p></div></footer></div></div>
<script id="vike_pageContext" type="application/json">{"pageId":"\\/src\\/pages\\/index","routeParams":{}}</script>
<script id="vike_globalContext" type="application/json">{}</script>
<script src="/assets/entries/entry-client-routing.BolmW-qF.js" type="module" async></script>
<link rel="modulepreload" href="/assets/entries/src_pages_index.hM1HjE9O.js" as="script" type="text/javascript">
<link rel="modulepreload" href="/assets/chunks/chunk-Bion_s63.js" as="script" type="text/javascript">
<link rel="modulepreload" href="/assets/chunks/chunk-Ck09OOcZ.js" as="script" type="text/javascript">
<link rel="modulepreload" href="/assets/chunks/chunk-SAmD9nuY.js" as="script" type="text/javascript">
</body>
</html>