diff --git a/package-lock.json b/package-lock.json
index 96da3ca5..68afea17 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,13 +1,18 @@
{
- "name": "keepandroidopen.org",
+ "name": "keepandroidopen-dot-org",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "keepandroidopen.org",
+ "name": "keepandroidopen-dot-org",
"version": "0.0.1",
"dependencies": {
+ "@fontsource-variable/source-sans-3": "^5.3.0",
+ "@fontsource-variable/source-serif-4": "^5.3.0",
+ "@fontsource/ibm-plex-sans-arabic": "^5.3.0",
+ "@fontsource/ibm-plex-sans-hebrew": "^5.3.0",
+ "@fontsource/noto-naskh-arabic": "^5.3.0",
"astro": "^6.3.3",
"marked": "^17.0.2",
"rehype-autolink-headings": "^7.1.0",
@@ -598,6 +603,51 @@
"node": ">=18"
}
},
+ "node_modules/@fontsource-variable/source-sans-3": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@fontsource-variable/source-sans-3/-/source-sans-3-5.3.0.tgz",
+ "integrity": "sha512-dpi0GZk7EQe2tYpg6Q0Fx0OmUgnuGu+0rHPgtXqtKhglYmJuP7jZ12Mu1uN+NfRaJRY1Emn8AQJEWzmoZ4wa9g==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
+ }
+ },
+ "node_modules/@fontsource-variable/source-serif-4": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@fontsource-variable/source-serif-4/-/source-serif-4-5.3.0.tgz",
+ "integrity": "sha512-9vch9WqxjaaA+1o9Ur8pOgIGbCYLjRReOUel23A6lOpD1syptgjtkORevvNmldJ5kGXQL29onQUqI5Ltz0s3bQ==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
+ }
+ },
+ "node_modules/@fontsource/ibm-plex-sans-arabic": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@fontsource/ibm-plex-sans-arabic/-/ibm-plex-sans-arabic-5.3.0.tgz",
+ "integrity": "sha512-ZZ4g+JDgQY0NqSh4o0MNWU1sHQmtcee1g++aKAwyJvZxnT5y51JXsN1cIXnaQaMd40dcbK6QFYa+Z1LbaiNuqA==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
+ }
+ },
+ "node_modules/@fontsource/ibm-plex-sans-hebrew": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@fontsource/ibm-plex-sans-hebrew/-/ibm-plex-sans-hebrew-5.3.0.tgz",
+ "integrity": "sha512-6sYM3VzG65AnG1jul3dl+H8eBWYfx6Rqzm7946VNBIXx/ArU1NR5ZKdFx80EDehVqdbPsLOpP1fjImQFjVMopg==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
+ }
+ },
+ "node_modules/@fontsource/noto-naskh-arabic": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@fontsource/noto-naskh-arabic/-/noto-naskh-arabic-5.3.0.tgz",
+ "integrity": "sha512-S/GDgQ6mh/PKo4mz5+eXNYbEarvpI7yh6eCdOz8tTVbeM7+OUiacIEscaYEibr/+egDtGbO2ZB00sjy1bJC1kQ==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
+ }
+ },
"node_modules/@html-validate/stylish": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@html-validate/stylish/-/stylish-5.2.0.tgz",
diff --git a/package.json b/package.json
index d44dc201..12ad57ae 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,11 @@
"validate": "html-validate 'dist/**/*.html'"
},
"dependencies": {
+ "@fontsource-variable/source-sans-3": "^5.3.0",
+ "@fontsource-variable/source-serif-4": "^5.3.0",
+ "@fontsource/ibm-plex-sans-arabic": "^5.3.0",
+ "@fontsource/ibm-plex-sans-hebrew": "^5.3.0",
+ "@fontsource/noto-naskh-arabic": "^5.3.0",
"astro": "^6.3.3",
"marked": "^17.0.2",
"rehype-autolink-headings": "^7.1.0",
diff --git a/src/components/BackArrow.astro b/src/components/BackArrow.astro
index d971a2d4..f278e6fe 100644
--- a/src/components/BackArrow.astro
+++ b/src/components/BackArrow.astro
@@ -16,12 +16,13 @@
display: inline-flex;
align-items: center;
justify-content: center;
- width: 2rem;
- height: 2rem;
- padding: 0.3rem;
+ width: 2.75rem;
+ height: 2.75rem;
+ padding: 0;
border-radius: 0.5rem;
+ border: 1px solid var(--pico-muted-border-color);
color: var(--pico-muted-color, #888);
- opacity: 0.6;
+ opacity: 0.8;
text-decoration: none;
transition: opacity 0.2s ease, transform 0.2s ease, background-color 0.2s ease;
}
@@ -31,6 +32,14 @@
background-color: rgba(128, 128, 128, 0.08);
color: var(--pico-color, inherit);
}
+
+ :global([dir='rtl']) .back-arrow svg {
+ transform: scaleX(-1);
+ }
+
+ :global([dir='rtl']) .back-arrow:hover {
+ transform: translateX(2px);
+ }
.back-arrow:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
diff --git a/src/components/LanguagePicker.astro b/src/components/LanguagePicker.astro
index 24f05903..a390514a 100644
--- a/src/components/LanguagePicker.astro
+++ b/src/components/LanguagePicker.astro
@@ -10,7 +10,7 @@
* (e.g. "cta/" for CTA page so entries link to /{locale}/cta/).
* For English ("en"), the root is "/" so "/cta/" is the result.
*/
-import { languages } from '../i18n/config';
+import { languages, isRtl } from '../i18n/config';
interface Props {
locale: string;
@@ -20,6 +20,7 @@ interface Props {
const { locale, suffix = '' } = Astro.props;
const currentLabel = languages[locale as keyof typeof languages]?.label ?? 'English';
const entries = Object.entries(languages) as [string, { label: string; path: string }][];
+const menuId = `language-picker-${locale}-${suffix || 'home'}`.replace(/[^a-zA-Z0-9_-]/g, '-');
// Build the URL for a given locale, honoring the suffix
function localeHref(code: string, basePath: string): string {
@@ -30,19 +31,31 @@ function localeHref(code: string, basePath: string): string {
---
-
diff --git a/src/components/ThemeToggle.astro b/src/components/ThemeToggle.astro
index e6add2b7..28501f4e 100644
--- a/src/components/ThemeToggle.astro
+++ b/src/components/ThemeToggle.astro
@@ -1,8 +1,8 @@
-
-