diff --git a/.gitignore b/.gitignore
index 1a63c916d6..ac8d21945e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,6 +40,7 @@ test-results/
# generated files
shared/types/lexicons
file-tree-sprite.svg
+public/blog/avatar
**/__screenshots__/**
diff --git a/app/assets/logos/oss-partners/iconify-light.svg b/app/assets/logos/oss-partners/iconify-light.svg
new file mode 100644
index 0000000000..fd3b1a912b
--- /dev/null
+++ b/app/assets/logos/oss-partners/iconify-light.svg
@@ -0,0 +1,42 @@
+
diff --git a/app/assets/logos/oss-partners/iconify.svg b/app/assets/logos/oss-partners/iconify.svg
index d41dfb3c8c..ceadfd7aa0 100644
--- a/app/assets/logos/oss-partners/iconify.svg
+++ b/app/assets/logos/oss-partners/iconify.svg
@@ -1 +1,42 @@
-
\ No newline at end of file
+
diff --git a/app/assets/logos/oss-partners/index.ts b/app/assets/logos/oss-partners/index.ts
index e27f78f6b7..2b0412e59c 100644
--- a/app/assets/logos/oss-partners/index.ts
+++ b/app/assets/logos/oss-partners/index.ts
@@ -29,6 +29,7 @@ import LogoFastCheck from './fast-check.svg'
import LogoLunaria from './lunaria.svg'
import LogoJsr from './jsr.svg'
import LogoIconify from './iconify.svg'
+import LogoIconifyLight from './iconify-light.svg'
import LogoFloatingUi from './floating-ui-vue.svg'
import LogoBlento from './blento.svg'
@@ -188,7 +189,10 @@ export const OSS_PARTNERS = [
},
{
name: 'Iconify',
- logo: LogoIconify,
+ logo: {
+ dark: LogoIconify,
+ light: LogoIconifyLight,
+ },
url: 'https://iconify.design/',
},
{
diff --git a/app/components/AppFooter.vue b/app/components/AppFooter.vue
index d89d3cf3d3..818168f1ba 100644
--- a/app/components/AppFooter.vue
+++ b/app/components/AppFooter.vue
@@ -131,10 +131,10 @@ const closeModal = () => modalRef.value?.close?.()
-
+
{{ $t('non_affiliation_disclaimer') }}
{{ $t('trademark_disclaimer') }}
-
+
diff --git a/app/components/AuthorList.vue b/app/components/AuthorList.vue
index ee5de3464a..ee70abbbc8 100644
--- a/app/components/AuthorList.vue
+++ b/app/components/AuthorList.vue
@@ -1,18 +1,16 @@
-
+
{{ author.name }}
@@ -34,7 +32,7 @@ const { resolvedAuthors } = useBlueskyAuthorProfiles(props.authors)
- {{ resolvedAuthors.map(a => a.name).join(', ') }}
+ {{ authors.map(a => a.name).join(', ') }}
diff --git a/app/components/BlogPostListCard.vue b/app/components/BlogPostListCard.vue
index 5fd17dc743..8597d865f1 100644
--- a/app/components/BlogPostListCard.vue
+++ b/app/components/BlogPostListCard.vue
@@ -1,9 +1,9 @@
@@ -87,26 +87,6 @@ function handleDisconnect() {
-
-
{{ $t('connector.modal.paste_token') }}
diff --git a/app/components/Header/SearchBox.vue b/app/components/Header/SearchBox.vue
index 6796554f48..8aeaecd158 100644
--- a/app/components/Header/SearchBox.vue
+++ b/app/components/Header/SearchBox.vue
@@ -17,11 +17,17 @@ const showSearchBar = computed(() => {
})
const { model: searchQuery, startSearch } = useGlobalSearch('header')
+const hasSearchQuery = computed(() => searchQuery.value.trim().length > 0)
function handleSubmit() {
startSearch()
}
+function clearSearch() {
+ searchQuery.value = ''
+ inputRef.value?.focus()
+}
+
// Expose focus method for parent components
const inputRef = useTemplateRef('inputRef')
function focus() {
@@ -52,11 +58,21 @@ defineExpose({ focus })
name="q"
:placeholder="$t('search.placeholder')"
no-correct
- class="w-full min-w-25 ps-7"
+ class="w-full min-w-25 ps-7 pe-8"
@focus="isSearchFocused = true"
@blur="isSearchFocused = false"
size="small"
/>
+
diff --git a/app/components/OgImage/BlogPost.vue b/app/components/OgImage/BlogPost.vue
index 2192be4f7e..01965a1abf 100644
--- a/app/components/OgImage/BlogPost.vue
+++ b/app/components/OgImage/BlogPost.vue
@@ -1,10 +1,10 @@
diff --git a/app/components/global/BlogPostWrapper.vue b/app/components/global/BlogPostWrapper.vue
index d50ad9b8dc..14508945b2 100644
--- a/app/components/global/BlogPostWrapper.vue
+++ b/app/components/global/BlogPostWrapper.vue
@@ -1,11 +1,14 @@
diff --git a/app/pages/profile/[identity]/index.vue b/app/pages/profile/[identity]/index.vue
index 45c9c0f577..fbf4b258cd 100644
--- a/app/pages/profile/[identity]/index.vue
+++ b/app/pages/profile/[identity]/index.vue
@@ -23,7 +23,7 @@ if (!profile.value || profileError.value?.statusCode === 404) {
})
}
-const { user } = useAtproto()
+const { user, pending: userPending } = useAtproto()
const isEditing = ref(false)
const displayNameInput = ref()
const descriptionInput = ref()
@@ -84,6 +84,7 @@ const showInviteSection = computed(() => {
profile.value.recordExists === false &&
status.value === 'success' &&
!likes.value?.records?.length &&
+ !userPending.value &&
user.value?.handle !== profile.value.handle
)
})
diff --git a/app/pages/search.vue b/app/pages/search.vue
index ffec3459f9..ce503b995b 100644
--- a/app/pages/search.vue
+++ b/app/pages/search.vue
@@ -164,8 +164,7 @@ const EAGER_LOAD_SIZE = { algolia: 500, npm: 500 } as const
// Calculate how many results we need based on current page and preferred page size
const requestedSize = computed(() => {
- const numericPrefSize = preferredPageSize.value === 'all' ? 250 : preferredPageSize.value
- const base = Math.max(pageSize, currentPage.value * numericPrefSize)
+ const base = Math.max(pageSize, currentPage.value * preferredPageSize.value)
// When sorting by something other than relevance, fetch a large batch
// so client-side sorting operates on a meaningful pool of matching results
if (!isRelevanceSort.value) {
@@ -587,10 +586,8 @@ const rawLiveRegionMessage = computed(() => {
if (visibleResults.value && displayResults.value.length > 0) {
if (viewMode.value === 'table' || paginationMode.value === 'paginated') {
- const pSize =
- preferredPageSize.value === 'all'
- ? $n(effectiveTotal.value)
- : Math.min(preferredPageSize.value, effectiveTotal.value)
+ const pSize = Math.min(preferredPageSize.value, effectiveTotal.value)
+
return $t(
'filters.count.showing_paginated',
{
@@ -781,10 +778,7 @@ onBeforeUnmount(() => {
$t(
'filters.count.showing_paginated',
{
- pageSize:
- preferredPageSize === 'all'
- ? $n(effectiveTotal)
- : Math.min(preferredPageSize, effectiveTotal),
+ pageSize: Math.min(preferredPageSize, effectiveTotal),
count: $n(effectiveTotal),
},
effectiveTotal,
diff --git a/app/utils/download-anomalies.data.ts b/app/utils/download-anomalies.data.ts
index 370a80bf05..3cb23fb858 100644
--- a/app/utils/download-anomalies.data.ts
+++ b/app/utils/download-anomalies.data.ts
@@ -7,4 +7,24 @@ export const DOWNLOAD_ANOMALIES: DownloadAnomaly[] = [
start: { date: '2025-08-04', weeklyDownloads: 33_913_132 },
end: { date: '2025-09-08', weeklyDownloads: 38_665_727 },
},
+ {
+ packageName: 'svelte',
+ start: { date: '2022-11-15', weeklyDownloads: 75_233 },
+ end: { date: '2022-11-30', weeklyDownloads: 69_524 },
+ },
+ {
+ packageName: 'svelte',
+ start: { date: '2023-06-19', weeklyDownloads: 107_491 },
+ end: { date: '2023-06-22', weeklyDownloads: 112_432 },
+ },
+ {
+ packageName: 'svelte',
+ start: { date: '2023-11-18', weeklyDownloads: 59_611 },
+ end: { date: '2023-11-21', weeklyDownloads: 150_680 },
+ },
+ /**
+ * NOTE:
+ * - please add new entries above this comment.
+ * - Add a comment before any new entry to explain the change
+ **/
]
diff --git a/i18n/locales/ar.json b/i18n/locales/ar.json
index fac959bf7d..5ed1a98565 100644
--- a/i18n/locales/ar.json
+++ b/i18n/locales/ar.json
@@ -462,9 +462,6 @@
"connector": {
"modal": {
"title": "الموصل المحلي",
- "contributor_badge": "للمساهمين فقط",
- "contributor_notice": "لم يُنشر الموصل بعد على npm. راجع {link} لمعرفة كيفية التشغيل محليًا.",
- "contributor_link": "دليل المساهمة",
"connected": "متصل",
"connected_as_user": "متصل كـ ~{user}",
"connected_hint": "يمكنك الآن إدارة الحزم والمؤسسات من واجهة الويب.",
@@ -771,7 +768,6 @@
"paginated": "مقسم إلى صفحات",
"items_per_page": "عدد العناصر في الصفحة",
"per_page": "{count} / صفحة",
- "all_yolo": "الكل (إنما هي حياة واحدة)",
"showing": "{start}-{end} من {total}",
"previous": "الصفحة السابقة",
"next": "الصفحة التالية",
diff --git a/i18n/locales/az-AZ.json b/i18n/locales/az-AZ.json
index 8ef671c536..2f6f7649a6 100644
--- a/i18n/locales/az-AZ.json
+++ b/i18n/locales/az-AZ.json
@@ -13,10 +13,12 @@
"trademark_disclaimer": "npm, npm, Inc.-in qeydiyyatlı ticarət markasıdır. Bu sayt npm, Inc. ilə əlaqəli deyil.",
"footer": {
"about": "haqqında",
+ "blog": "bloq",
"docs": "sənədlər",
"source": "mənbə",
"social": "sosial",
"chat": "söhbət",
+ "builders_chat": "qurucular",
"keyboard_shortcuts": "klaviatura qısayolları"
},
"shortcuts": {
@@ -62,7 +64,13 @@
"org": "təşkilat",
"view_user_packages": "Bu istifadəçinin paketlərinə bax",
"view_org_packages": "Bu təşkilatın paketlərinə bax"
- }
+ },
+ "instant_search": "Ani axtarış",
+ "instant_search_on": "açıq",
+ "instant_search_off": "bağlı",
+ "instant_search_turn_on": "aç",
+ "instant_search_turn_off": "bağla",
+ "instant_search_advisory": "{label} {state} — {action}"
},
"nav": {
"main_navigation": "Əsas",
@@ -76,6 +84,31 @@
"links": "Keçidlər",
"tap_to_search": "Axtarmaq üçün toxunun"
},
+ "blog": {
+ "title": "Bloq",
+ "heading": "bloq",
+ "meta_description": "npmx icmasından fikirlər və yeniliklər",
+ "author": {
+ "view_profile": "{name} Bluesky profilinə bax"
+ },
+ "draft_badge": "Qaralama",
+ "draft_banner": "Bu dərc edilməmiş qaralamadır. Natamam və ya qeyri-dəqiq məlumat ehtiva edə bilər.",
+ "atproto": {
+ "view_on_bluesky": "Bluesky-da bax",
+ "reply_on_bluesky": "Bluesky-da cavabla",
+ "likes_on_bluesky": "Bluesky-da bəyənmələr",
+ "like_or_reply_on_bluesky": "Bu yazını bəyənin və ya Bluesky-da şərh əlavə edin",
+ "no_comments_yet": "Hələ şərh yoxdur.",
+ "could_not_load_comments": "Şərhlər yüklənə bilmədi.",
+ "comments": "Şərhlər",
+ "loading_comments": "Şərhlər yüklənir...",
+ "updating": "Yenilənir...",
+ "reply_count": "{count} cavab",
+ "like_count": "{count} bəyənmə",
+ "repost_count": "{count} yenidən paylaşım",
+ "more_replies": "{count} cavab daha..."
+ }
+ },
"settings": {
"title": "tənzimləmələr",
"tagline": "npmx təcrübənizi fərdiləşdirin",
@@ -84,7 +117,8 @@
"appearance": "Görünüş",
"display": "Ekran",
"search": "Məlumat mənbəyi",
- "language": "Dil"
+ "language": "Dil",
+ "keyboard_shortcuts": "Klaviatura qısayolları"
},
"data_source": {
"label": "Məlumat mənbəyi",
@@ -94,6 +128,8 @@
"algolia": "Algolia",
"algolia_description": "Daha sürətli axtarış, təşkilat və istifadəçi səhifələri üçün Algolia istifadə edir."
},
+ "instant_search": "Ani axtarış",
+ "instant_search_description": "Axtarış səhifəsinə keçir və siz yazdıqca nəticələri yeniləyir.",
"relative_dates": "Nisbi tarixlər",
"include_types": "Quraşdırmaya {'@'}types daxil et",
"include_types_description": "Tipsiz paketlər üçün quraşdırma əmrlərinə {'@'}types paketi əlavə et",
@@ -108,7 +144,9 @@
"accent_colors": "Vurğu rəngləri",
"clear_accent": "Vurğu rəngini təmizlə",
"translation_progress": "Tərcümə irəliləyişi",
- "background_themes": "Fon tonu"
+ "background_themes": "Fon tonu",
+ "keyboard_shortcuts_enabled": "Klaviatura qısayollarını aktivləşdir",
+ "keyboard_shortcuts_enabled_description": "Klaviatura qısayolları digər brauzer və ya sistem qısayolları ilə toqquşarsa deaktiv edilə bilər"
},
"i18n": {
"missing_keys": "{count} çatışmayan tərcümə | {count} çatışmayan tərcümə",
@@ -118,6 +156,13 @@
"edit_on_github": "GitHub-da redaktə et",
"view_guide": "Tərcümə bələdçisi"
},
+ "error": {
+ "401": "İcazəsiz",
+ "404": "Səhifə tapılmadı",
+ "500": "Daxili server xətası",
+ "503": "Xidmət əlçatan deyil",
+ "default": "Nəsə səhv oldu"
+ },
"common": {
"loading": "Yüklənir...",
"loading_more": "Daha çox yüklənir...",
@@ -373,6 +418,9 @@
"date_range_multiline": "{start}\n- {end}",
"download_file": "{fileType} endir",
"toggle_annotator": "Annotator keçid",
+ "toggle_stack_mode": "Yığın rejimini dəyişdir",
+ "open_options": "Seçimləri aç",
+ "close_options": "Seçimləri bağla",
"legend_estimation": "Təxmin",
"no_data": "Məlumat mövcud deyil",
"y_axis_label": "{granularity} {facet}",
@@ -495,9 +543,6 @@
"connector": {
"modal": {
"title": "Lokal Konnektor",
- "contributor_badge": "Yalnız əməkdaşlar üçün",
- "contributor_notice": "Konnektor hələ npm-ə dərc edilməyib. Lokal işə salmaq üçün {link} baxın.",
- "contributor_link": "töhfə bələdçisi",
"connected": "Qoşulub",
"connected_as_user": "~{user} kimi qoşulub",
"connected_hint": "İndi veb interfeysdən paketləri və təşkilatları idarə edə bilərsiniz.",
@@ -805,7 +850,6 @@
"paginated": "Səhifələnmiş",
"items_per_page": "Səhifə başına element",
"per_page": "{count} / səhifə",
- "all_yolo": "Hamısı (YOLO)",
"showing": "{start}-{end} / {total}",
"previous": "Əvvəlki səhifə",
"next": "Növbəti səhifə",
@@ -886,6 +930,11 @@
"title": "Yeniliklərdən xəbərdar olun",
"description": "npmx haqqında son yenilikləri öyrənin.",
"cta": "Bluesky-da izlə"
+ },
+ "builders": {
+ "title": "Qurucular",
+ "description": "Qurucular icmasamıza qoşulun və npmx-in gələcəyini formalaşdırın",
+ "cta": "Qurucular söhbətinə qoşul"
}
}
},
@@ -937,6 +986,7 @@
}
},
"compare": {
+ "compare_versions_title": "Versiyaları müqayisə et",
"packages": {
"title": "paketləri müqayisə et",
"tagline": "düzgün seçim etməyinizə kömək etmək üçün npm paketlərini yan-yana müqayisə edin.",
@@ -1087,6 +1137,34 @@
"close_files_panel": "Fayllar panelini bağla",
"filter_files_label": "Faylları dəyişiklik növünə görə süz"
},
+ "pds": {
+ "title": "PDS",
+ "meta_description": "npmx PDS - Şəxsi Məlumat Serveri",
+ "join": {
+ "title": "Qoşul",
+ "description": "npmx PDS-ə qoşulun",
+ "migrate": "Köçür"
+ },
+ "server": {
+ "title": "Server",
+ "location_label": "Yer",
+ "location_value": "Nürnberq, Almaniya",
+ "infrastructure_label": "İnfrastruktur",
+ "infrastructure_value": "Hetzner üzərində yerləşdirilir",
+ "privacy_label": "Gizlilik",
+ "privacy_value": "Sərt AB Məlumat Mühafizəsi qanunlarına tabedir",
+ "learn_more": "Ətraflı öyrən"
+ },
+ "community": {
+ "title": "İcma",
+ "description": "{count} hesab ilə icmasamıza qoşulun",
+ "loading": "Yüklənir...",
+ "error": "Xəta",
+ "empty": "Boş",
+ "view_profile": "{handle} profilinə bax",
+ "new_accounts": "{count} yeni hesab"
+ }
+ },
"privacy_policy": {
"title": "gizlilik siyasəti",
"last_updated": "Son yenilənmə: {date}",
diff --git a/i18n/locales/bg-BG.json b/i18n/locales/bg-BG.json
index ae97d21f1a..78719069cb 100644
--- a/i18n/locales/bg-BG.json
+++ b/i18n/locales/bg-BG.json
@@ -533,9 +533,6 @@
"connector": {
"modal": {
"title": "Локален конектор",
- "contributor_badge": "Само за сътрудници",
- "contributor_notice": "Конекторът все още не е публикуван в npm. Вижте {link} за как да го стартирате локално.",
- "contributor_link": "ръководство за сътрудничество",
"connected": "Свързан",
"connected_as_user": "Свързан като ~{user}",
"connected_hint": "Сега можете да управлявате пакети и организации от уеб интерфейса.",
@@ -844,7 +841,6 @@
"paginated": "Със страници",
"items_per_page": "Елементи на страница",
"per_page": "{count} / страница",
- "all_yolo": "Всички (YOLO)",
"showing": "{start}-{end} от {total}",
"previous": "Предишна страница",
"next": "Следваща страница",
diff --git a/i18n/locales/bn-IN.json b/i18n/locales/bn-IN.json
index 14c5668b23..479c3f7b02 100644
--- a/i18n/locales/bn-IN.json
+++ b/i18n/locales/bn-IN.json
@@ -359,9 +359,6 @@
"connector": {
"modal": {
"title": "স্থানীয় কনেক্টর",
- "contributor_badge": "কন্ট্রিবিউটারদের জন্য মাত্র",
- "contributor_notice": "কনেক্টর এখনো npm এ প্রকাশিত হয়নি। স্থানীয়ভাবে চালানোর জন্য {link} দেখুন।",
- "contributor_link": "অবদানের নির্দেশনা",
"connected": "সংযুক্ত হয়েছে",
"connected_as_user": "~{user} হিসাবে সংযুক্ত",
"connected_hint": "এখন আপনি ওয়েব UI থেকে প্যাকেজ এবং সংস্থাগুলি পরিচালনা করতে পারবেন।",
@@ -657,7 +654,6 @@
"paginated": "পাতায়িত",
"items_per_page": "প্রতি পাতায় আইটেম",
"per_page": "{count} / পাতায়",
- "all_yolo": "সব (YOLO)",
"showing": "{total} এর মধ্যে {start}-{end}",
"previous": "আগের পাতা",
"next": "পরের পাতা",
diff --git a/i18n/locales/cs-CZ.json b/i18n/locales/cs-CZ.json
index 04af4be2b1..41791d087c 100644
--- a/i18n/locales/cs-CZ.json
+++ b/i18n/locales/cs-CZ.json
@@ -13,10 +13,12 @@
"trademark_disclaimer": "npm je registrovaná ochranná známka společnosti npm, Inc. Tato stránka není spojena s npm, Inc.",
"footer": {
"about": "o projektu",
+ "blog": "blog",
"docs": "dokumentace",
"source": "zdrojový kód",
"social": "sociální sítě",
"chat": "chat",
+ "builders_chat": "stavitelé",
"keyboard_shortcuts": "klávesové zkratky"
},
"shortcuts": {
@@ -63,7 +65,13 @@
"org": "organizace",
"view_user_packages": "Zobrazit balíčky tohoto uživatele",
"view_org_packages": "Zobrazit balíčky této organizace"
- }
+ },
+ "instant_search": "Okamžité hledání",
+ "instant_search_on": "zapnuto",
+ "instant_search_off": "vypnuto",
+ "instant_search_turn_on": "zapnout",
+ "instant_search_turn_off": "vypnout",
+ "instant_search_advisory": "{label} {state} — {action}"
},
"nav": {
"main_navigation": "Hlavní",
@@ -77,6 +85,31 @@
"links": "Odkazy",
"tap_to_search": "Klepněte pro hledání"
},
+ "blog": {
+ "title": "Blog",
+ "heading": "blog",
+ "meta_description": "Postřehy a novinky od npmx komunity",
+ "author": {
+ "view_profile": "Zobrazit profil uživatele {name} na Bluesky"
+ },
+ "draft_badge": "Návrh",
+ "draft_banner": "Toto je nepublikovaný návrh. Může být neúplný nebo obsahovat nepřesnosti.",
+ "atproto": {
+ "view_on_bluesky": "Zobrazit na Bluesky",
+ "reply_on_bluesky": "Odpovědět na Bluesky",
+ "likes_on_bluesky": "Lajky na Bluesky",
+ "like_or_reply_on_bluesky": "Olajkujte tento příspěvek nebo přidejte svůj komentář na Bluesky",
+ "no_comments_yet": "Ještě žádné komentáře.",
+ "could_not_load_comments": "Komentáře se nepodařilo načíst.",
+ "comments": "Komentáře",
+ "loading_comments": "Načítání komentářů ...",
+ "updating": "Aktualizace ...",
+ "reply_count": "{count} odpověď | {count} odpovědi | {count} odpovědí",
+ "like_count": "{count} lajk | {count} lajky | {count} lajků",
+ "repost_count": "{count} repost | {count} reposty | {count} repostů",
+ "more_replies": "{count} další odpověď ... | {count} další odpovědi ... | {count} dalších odpovědí ..."
+ }
+ },
"settings": {
"title": "nastavení",
"tagline": "přizpůsobte si své npmx",
@@ -96,6 +129,8 @@
"algolia": "Algolia",
"algolia_description": "Používá Algolia pro rychlejší vyhledávání, stránky organizací a uživatelů."
},
+ "instant_search": "Okamžité hledání",
+ "instant_search_description": "Naviguje na stránku hledání a aktualizuje výsledky při psaní.",
"relative_dates": "Relativní data",
"include_types": "Zahrnout {'@'}types při instalaci",
"include_types_description": "Přidat balíček {'@'}types do instalačních příkazů pro balíčky bez integrovaných typů",
@@ -122,6 +157,13 @@
"edit_on_github": "Upravit na GitHubu",
"view_guide": "Překladatelská příručka"
},
+ "error": {
+ "401": "Neoprávněný přístup",
+ "404": "Stránka nenalezena",
+ "500": "Interní chyba serveru",
+ "503": "Služba není dostupná",
+ "default": "Něco se pokazilo"
+ },
"common": {
"loading": "Načítání...",
"loading_more": "Načítání dalších...",
@@ -144,7 +186,28 @@
"role": "role",
"members": "členové"
},
- "scroll_to_top": "Posunout nahoru"
+ "scroll_to_top": "Posunout nahoru",
+ "cancel": "Zrušit",
+ "save": "Uložit",
+ "edit": "Upravit",
+ "error": "Chyba"
+ },
+ "profile": {
+ "display_name": "Zobrazované jméno",
+ "description": "Popis",
+ "no_description": "Bez popisu",
+ "website": "Webová stránka",
+ "website_placeholder": "https://example.com",
+ "likes": "Lajky",
+ "seo_title": "{handle} - npmx",
+ "seo_description": "npmx profil uživatele {handle}",
+ "not_found": "Profil nenalezen",
+ "not_found_message": "Profil uživatele {handle} nebyl nalezen.",
+ "invite": {
+ "message": "Zdá se, že ještě nepoužívají npmx. Chcete jim o tom říct?",
+ "share_button": "Sdílet na Bluesky",
+ "compose_text": "Ahoj {'@'}{handle}! Viděl jsi už npmx.dev? Je to prohlížeč pro npm registr, který je rychlý, moderní a open-source.\nhttps://npmx.dev"
+ }
},
"package": {
"not_found": "Balíček nenalezen",
@@ -378,6 +441,8 @@
"download_file": "Stáhnout {fileType}",
"toggle_annotator": "Přepnout popisovač",
"toggle_stack_mode": "Přepnout zobrazení nad sebou",
+ "open_options": "Otevřít možnosti",
+ "close_options": "Zavřít možnosti",
"legend_estimation": "Odhad",
"no_data": "Žádná dostupná data",
"y_axis_label": "{facet} - {granularity}",
@@ -417,7 +482,8 @@
},
"downloads": {
"title": "Týdenní stažení",
- "community_distribution": "Zobrazit rozložení adopce v komunitě"
+ "community_distribution": "Zobrazit rozložení adopce v komunitě",
+ "subtitle": "Napříč všemi verzemi"
},
"install_scripts": {
"title": "Instalační skripty",
@@ -511,9 +577,6 @@
"connector": {
"modal": {
"title": "Lokální konektor",
- "contributor_badge": "Pouze přispěvatelé",
- "contributor_notice": "Konektor ještě není publikován na npm. Viz {link} pro informace, jak jej spustit lokálně.",
- "contributor_link": "příručka pro přispěvatele",
"connected": "Připojeno",
"connected_as_user": "Připojeno jako ~{user}",
"connected_hint": "Nyní můžete spravovat balíčky a organizace z webového rozhraní.",
@@ -822,7 +885,6 @@
"paginated": "Stránkované",
"items_per_page": "Položek na stránku",
"per_page": "{count} / stránku",
- "all_yolo": "Vše (YOLO)",
"showing": "{start}-{end} z {total}",
"previous": "Předchozí stránka",
"next": "Další stránka",
@@ -899,6 +961,11 @@
"description": "Chatujte, pokládejte otázky a sdílejte nápady.",
"cta": "Připojit se na Discordu"
},
+ "builders": {
+ "title": "Pomozte zlepšovat npmx",
+ "description": "Připojte se ke stavitelům, kteří budují budoucnost npmx.",
+ "cta": "Připojit se k Builders Discordu"
+ },
"follow": {
"title": "Zůstaňte v obraze",
"description": "Zjistěte nejnovější informace o npmx.",
@@ -931,7 +998,8 @@
"connect_bluesky": "Připojit k Bluesky",
"what_is_atmosphere": "Co je účet Atmosphere?",
"atmosphere_explanation": "{npmx} používá {atproto} k pohánění mnoha svých sociálních funkcí, což uživatelům umožňuje vlastnit svá data a používat jeden účet pro všechny kompatibilní aplikace. Jakmile si vytvoříte účet, můžete používat i jiné aplikace jako {bluesky} a {tangled} se stejným účtem.",
- "default_input_error": "Zadejte platný handle, DID nebo úplnou URL PDS"
+ "default_input_error": "Zadejte platný handle, DID nebo úplnou URL PDS",
+ "profile": "Profil"
}
},
"header": {
@@ -1076,7 +1144,10 @@
"file_changes": "Změny souborů",
"files_count": "{count} souborů",
"lines_hidden": "{count} skrytých řádků",
+ "file_too_large": "Soubor je k porovnání příliš velký",
+ "file_size_warning": "{size} překračuje limit 250KB pro porovnání",
"compare_versions": "porovnat",
+ "compare_versions_title": "Porovnat s nejnovější verzí",
"summary": "Souhrn",
"deps_count": "{count} závislostí",
"dependencies": "Závislosti",
@@ -1104,6 +1175,34 @@
"close_files_panel": "Zavřít panel souborů",
"filter_files_label": "Filtrovat soubory podle typu změny"
},
+ "pds": {
+ "title": "npmx.social",
+ "meta_description": "Oficiální AT Protocol Personal Data Server (PDS) pro npmx komunitu.",
+ "join": {
+ "title": "Připojte se ke komunitě",
+ "description": "Ať už vytváříte svůj první účet na atmosféře nebo migrujete stávající, patříte sem. Můžete migrovat svůj aktuální účet, aniž byste ztratili svůj handle, příspěvky nebo sledující.",
+ "migrate": "Migrovat s PDS MOOver"
+ },
+ "server": {
+ "title": "Detaily serveru",
+ "location_label": "Umístění:",
+ "location_value": "Norimberk, Německo",
+ "infrastructure_label": "Infrastruktura:",
+ "infrastructure_value": "Hostováno u Hetzner",
+ "privacy_label": "Soukromí:",
+ "privacy_value": "Podléhá přísným zákonům EU o ochraně osobních údajů",
+ "learn_more": "Zjistěte, jak npmx využívá Atmosphere"
+ },
+ "community": {
+ "title": "Kdo je tu",
+ "description": "Některé z {count} účtů, které již nazývají npmx.social svým domovem:",
+ "loading": "Načítání komunity z PDS ...",
+ "error": "Nepodařilo se načíst komunitu z PDS.",
+ "empty": "Žádní členové komunity k zobrazení.",
+ "view_profile": "Zobrazit profil uživatele {handle}",
+ "new_accounts": "... plus {count} dalších, kteří jsou na atmosféře nováčky"
+ }
+ },
"privacy_policy": {
"title": "zásady ochrany osobních údajů",
"last_updated": "Poslední aktualizace: {date}",
@@ -1185,7 +1284,7 @@
}
},
"a11y": {
- "title": "Přístupnost",
+ "title": "přístupnost",
"footer_title": "a11y",
"welcome": "Chceme, aby {app} bylo použitelné pro co největší počet lidí.",
"approach": {
diff --git a/i18n/locales/de-DE.json b/i18n/locales/de-DE.json
index 73252b2569..0dc56065c5 100644
--- a/i18n/locales/de-DE.json
+++ b/i18n/locales/de-DE.json
@@ -577,9 +577,6 @@
"connector": {
"modal": {
"title": "Lokaler Connector",
- "contributor_badge": "Nur für Mitwirkende",
- "contributor_notice": "Der Connector ist noch nicht auf npm veröffentlicht. Siehe den {link} für Informationen zum lokalen Ausführen.",
- "contributor_link": "Leitfaden für Mitwirkende",
"connected": "Verbunden",
"connected_as_user": "Verbunden als ~{user}",
"connected_hint": "Du kannst jetzt Pakete und Organisationen über die Web-Oberfläche verwalten.",
@@ -888,7 +885,6 @@
"paginated": "Paginiert",
"items_per_page": "Elemente pro Seite",
"per_page": "{count} / Seite",
- "all_yolo": "Alle (YOLO)",
"showing": "{start}-{end} von {total}",
"previous": "Vorherige Seite",
"next": "Nächste Seite",
diff --git a/i18n/locales/en.json b/i18n/locales/en.json
index 4374ceff5b..5bc57ea17e 100644
--- a/i18n/locales/en.json
+++ b/i18n/locales/en.json
@@ -577,9 +577,6 @@
"connector": {
"modal": {
"title": "Local Connector",
- "contributor_badge": "Contributors only",
- "contributor_notice": "The connector is not yet published to npm. See the {link} for how to run locally.",
- "contributor_link": "contributing guide",
"connected": "Connected",
"connected_as_user": "Connected as ~{user}",
"connected_hint": "You can now manage packages and organizations from the web UI.",
@@ -888,7 +885,6 @@
"paginated": "Paginated",
"items_per_page": "Items per page",
"per_page": "{count} / page",
- "all_yolo": "All (YOLO)",
"showing": "{start}-{end} of {total}",
"previous": "Previous page",
"next": "Next page",
diff --git a/i18n/locales/es.json b/i18n/locales/es.json
index ce4e5a2f67..02ed71d176 100644
--- a/i18n/locales/es.json
+++ b/i18n/locales/es.json
@@ -533,9 +533,6 @@
"connector": {
"modal": {
"title": "Conector Local",
- "contributor_badge": "Solo colaboradores",
- "contributor_notice": "El conector aún no está publicado en npm. Consulta la {link} para saber cómo ejecutarlo localmente.",
- "contributor_link": "guía de contribución",
"connected": "Conectado",
"connected_as_user": "Conectado como ~{user}",
"connected_hint": "Ahora puedes gestionar paquetes y organizaciones desde la interfaz web.",
@@ -844,7 +841,6 @@
"paginated": "Paginado",
"items_per_page": "Elementos por página",
"per_page": "{count} / página",
- "all_yolo": "Todo (YOLO)",
"showing": "{start}-{end} de {total}",
"previous": "Página anterior",
"next": "Página siguiente",
diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json
index 0f8861326d..bbe2af2f00 100644
--- a/i18n/locales/fr-FR.json
+++ b/i18n/locales/fr-FR.json
@@ -577,9 +577,6 @@
"connector": {
"modal": {
"title": "Connecteur local",
- "contributor_badge": "Contributeurs uniquement",
- "contributor_notice": "Le connecteur n'est pas encore publié sur npm. Consultez le {link} pour savoir comment l'exécuter localement.",
- "contributor_link": "guide de contribution",
"connected": "Connecté·e",
"connected_as_user": "Connecté·e en tant que ~{user}",
"connected_hint": "Vous pouvez maintenant gérer les paquets et les organisations depuis l'interface web.",
@@ -888,7 +885,6 @@
"paginated": "Paginé",
"items_per_page": "Éléments par page",
"per_page": "{count} / page",
- "all_yolo": "Tout (YOLO)",
"showing": "{start}-{end} sur {total}",
"previous": "Page précédente",
"next": "Page suivante",
diff --git a/i18n/locales/hi-IN.json b/i18n/locales/hi-IN.json
index 4ef77c57b5..c7bc09ca48 100644
--- a/i18n/locales/hi-IN.json
+++ b/i18n/locales/hi-IN.json
@@ -360,9 +360,6 @@
"connector": {
"modal": {
"title": "लोकल कनेक्टर",
- "contributor_badge": "केवल योगदानकर्ताओं के लिए",
- "contributor_notice": "कनेक्टर अभी तक npm पर प्रकाशित नहीं हुआ है। स्थानीय रूप से चलाने के लिए {link} देखें।",
- "contributor_link": "योगदान गाइड",
"connected": "कनेक्ट किया गया",
"connected_as_user": "~{user} के रूप में कनेक्ट किया गया",
"connected_hint": "अब आप वेब UI से पैकेज और संगठन प्रबंधित कर सकते हैं।",
@@ -658,7 +655,6 @@
"paginated": "पेजिनेटेड",
"items_per_page": "प्रति पृष्ठ आइटम",
"per_page": "{count} / पृष्ठ",
- "all_yolo": "सभी (YOLO)",
"showing": "{total} में से {start}-{end}",
"previous": "पिछला पृष्ठ",
"next": "अगला पृष्ठ",
diff --git a/i18n/locales/hu-HU.json b/i18n/locales/hu-HU.json
index e53d02b37c..c24450e5f1 100644
--- a/i18n/locales/hu-HU.json
+++ b/i18n/locales/hu-HU.json
@@ -533,9 +533,6 @@
"connector": {
"modal": {
"title": "Helyi Connector",
- "contributor_badge": "Csak közreműködőknek",
- "contributor_notice": "A connector még nincs közzétéve az npm-en. Lásd a(z) {link} -et a helyi futtatásról.",
- "contributor_link": "közreműködési útmutató",
"connected": "Csatlakoztatva",
"connected_as_user": "Csatlakoztatva mint ~{user}",
"connected_hint": "Most már kezelheted a csomagokat és szervezeteket a webes felületről.",
@@ -844,7 +841,6 @@
"paginated": "Lapozható",
"items_per_page": "Elem per oldal",
"per_page": "{count} / oldal",
- "all_yolo": "Összes (YOLO)",
"showing": "{start}-{end} / {total}",
"previous": "Előző oldal",
"next": "Következő oldal",
diff --git a/i18n/locales/id-ID.json b/i18n/locales/id-ID.json
index 07efe2b2de..bed3494461 100644
--- a/i18n/locales/id-ID.json
+++ b/i18n/locales/id-ID.json
@@ -511,9 +511,6 @@
"connector": {
"modal": {
"title": "Konektor Lokal",
- "contributor_badge": "Hanya untuk kontributor",
- "contributor_notice": "Konektor belum diterbitkan ke npm. Lihat {link} untuk cara menjalankannya secara lokal.",
- "contributor_link": "panduan kontribusi",
"connected": "Terhubung",
"connected_as_user": "Terhubung sebagai ~{user}",
"connected_hint": "Anda sekarang dapat mengelola paket dan organisasi dari UI web.",
@@ -822,7 +819,6 @@
"paginated": "Terpaginasi",
"items_per_page": "Item per halaman",
"per_page": "{count} / halaman",
- "all_yolo": "Semua (YOLO)",
"showing": "{start}-{end} dari {total}",
"previous": "Halaman sebelumnya",
"next": "Halaman berikutnya",
diff --git a/i18n/locales/it-IT.json b/i18n/locales/it-IT.json
index 45c6a37421..76506bb846 100644
--- a/i18n/locales/it-IT.json
+++ b/i18n/locales/it-IT.json
@@ -449,9 +449,6 @@
"connector": {
"modal": {
"title": "Connettore locale",
- "contributor_badge": "Solo collaboratori",
- "contributor_notice": "Il connettore non è ancora pubblicato su npm. Vedi {link} per come eseguire localmente.",
- "contributor_link": "guida ai contributi",
"connected": "Connesso",
"connected_as_user": "Connesso come ~{user}",
"connected_hint": "Puoi ora gestire i pacchetti e le organizzazioni dall'interfaccia web.",
@@ -755,7 +752,6 @@
"paginated": "Paginato",
"items_per_page": "Elementi per pagina",
"per_page": "{count} / pagina",
- "all_yolo": "Tutti (YOLO)",
"showing": "{start}-{end} su {total}",
"previous": "Pagina precedente",
"next": "Pagina successiva",
diff --git a/i18n/locales/ja-JP.json b/i18n/locales/ja-JP.json
index 69d3230fae..46d417b762 100644
--- a/i18n/locales/ja-JP.json
+++ b/i18n/locales/ja-JP.json
@@ -18,6 +18,7 @@
"source": "ソースコード",
"social": "ソーシャル",
"chat": "チャット",
+ "builders_chat": "ビルダー",
"keyboard_shortcuts": "キーボードショートカット"
},
"shortcuts": {
@@ -64,7 +65,13 @@
"org": "organization",
"view_user_packages": "このユーザーのパッケージを表示",
"view_org_packages": "このorganizationのパッケージを表示"
- }
+ },
+ "instant_search": "インスタント検索",
+ "instant_search_on": "オン",
+ "instant_search_off": "オフ",
+ "instant_search_turn_on": "オンにする",
+ "instant_search_turn_off": "オフにする",
+ "instant_search_advisory": "{label} {state} — {action}"
},
"nav": {
"main_navigation": "メイン",
@@ -570,9 +577,6 @@
"connector": {
"modal": {
"title": "ローカルコネクタ",
- "contributor_badge": "コントリビューター専用",
- "contributor_notice": "コネクタはまだ npm に公開されていません。ローカルでの実行方法については {link} を参照してください。",
- "contributor_link": "コントリビューションガイド",
"connected": "接続済み",
"connected_as_user": "~{user} として接続済み",
"connected_hint": "Web UIからパッケージとorganizationを管理できるようになりました。",
@@ -881,7 +885,6 @@
"paginated": "ページ分割",
"items_per_page": "1ページあたりの項目数",
"per_page": "{count} / ページ",
- "all_yolo": "すべて表示 (YOLO)",
"showing": "{total} 件中 {start}-{end}",
"previous": "前のページ",
"next": "次のページ",
@@ -950,7 +953,7 @@
"title": "参加するには",
"contribute": {
"title": "貢献する",
- "description": "より良いnpm体験の開発に協力してください。",
+ "description": "より良いnpm体験の開発に協力しましょう。",
"cta": "GitHubで表示"
},
"community": {
@@ -958,6 +961,11 @@
"description": "チャット、質問、アイデアの共有。",
"cta": "Discordに参加"
},
+ "builders": {
+ "title": "npmxの開発に参加",
+ "description": "npmxの未来を形作るビルダーたちに参加しましょう。",
+ "cta": "Builders Discordに参加"
+ },
"follow": {
"title": "最新情報を入手",
"description": "npmxの最新情報をお届けします。",
diff --git a/i18n/locales/kn-IN.json b/i18n/locales/kn-IN.json
index 0c3a0abc12..6a1cee3f2f 100644
--- a/i18n/locales/kn-IN.json
+++ b/i18n/locales/kn-IN.json
@@ -360,9 +360,6 @@
"connector": {
"modal": {
"title": "ಸ್ಥಳೀಯ ಸಂಪರ್ಕಕ",
- "contributor_badge": "ಸಹಯೋಗಿಗಳಿಗೆ ಮಾತ್ರ",
- "contributor_notice": "ಸಂಪರ್ಕಕ ಇನ್ನೂ npm ನಲ್ಲಿ ಪ್ರಕಟವಾಗಿಲ್ಲ. ಸ್ಥಳೀಯವಾಗಿ ಚಾಲನೆ ಮಾಡಲು {link} ನೋಡಿ.",
- "contributor_link": "ಸಹಯೋಗ ಮಾರ್ಗದರ್ಶಿ",
"connected": "ಸಂಪರ್ಕಿಸಲಾಗಿದೆ",
"connected_as_user": "~{user} ಎಂದು ಸಂಪರ್ಕಿಸಲಾಗಿದೆ",
"connected_hint": "ಈಗ ನೀವು ವೆಬ್ UI ಯಿಂದ ಪ್ಯಾಕೇಜ್ಗಳು ಮತ್ತು ಸಂಸ್ಥೆಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು.",
@@ -658,7 +655,6 @@
"paginated": "ಪುಟೀಕರಿಸಿದ",
"items_per_page": "ಪ್ರತಿ ಪುಟದ ಅಂಶಗಳು",
"per_page": "{count} / ಪುಟ",
- "all_yolo": "ಎಲ್ಲ (YOLO)",
"showing": "{total} ನಲ್ಲಿ {start}-{end}",
"previous": "ಹಿಂದಿನ ಪುಟ",
"next": "ಮುಂದಿನ ಪುಟ",
diff --git a/i18n/locales/nb-NO.json b/i18n/locales/nb-NO.json
index cad981bb86..6ed21cfca2 100644
--- a/i18n/locales/nb-NO.json
+++ b/i18n/locales/nb-NO.json
@@ -419,9 +419,6 @@
"connector": {
"modal": {
"title": "Lokal Connector",
- "contributor_badge": "Kun for bidragsytere",
- "contributor_notice": "Connectoren er ennå ikke publisert til npm. Se {link} for hvordan du kjører den lokalt.",
- "contributor_link": "bidragsguiden",
"connected": "Tilkoblet",
"connected_as_user": "Koblet til som ~{user}",
"connected_hint": "Du kan nå administrere pakker og organisasjoner fra nettleseren.",
@@ -725,7 +722,6 @@
"paginated": "Sideinndelt",
"items_per_page": "Elementer per side",
"per_page": "{count} / side",
- "all_yolo": "Alt (YOLO)",
"showing": "{start}-{end} av {total}",
"previous": "Forrige side",
"next": "Neste side",
diff --git a/i18n/locales/ne-NP.json b/i18n/locales/ne-NP.json
index aa847e97e2..9427484fef 100644
--- a/i18n/locales/ne-NP.json
+++ b/i18n/locales/ne-NP.json
@@ -345,9 +345,6 @@
"connector": {
"modal": {
"title": "लोकल कनेक्टर",
- "contributor_badge": "कन्ट्रिब्युटर मात्र",
- "contributor_notice": "कनेक्टर अझै npm मा प्रकाशित गरिएको छैन। लोकल रूपमा चलाउने तरिका हेर्न {link} हेर्नुहोस्।",
- "contributor_link": "कन्ट्रिब्युटिङ गाइड",
"connected": "जोडियो",
"connected_as_user": "~{user} रूपमा जोडियो",
"connected_hint": "अब तपाईं वेब UI बाट प्याकेज र संगठनहरू व्यवस्थापन गर्न सक्नुहुन्छ।",
@@ -643,7 +640,6 @@
"paginated": "पृष्ठमा विभाजित",
"items_per_page": "प्रति पृष्ठ वस्तुहरू",
"per_page": "{count} / पृष्ठ",
- "all_yolo": "सबै (YOLO)",
"showing": "{total} मध्ये {start}-{end}",
"previous": "अघिल्लो पृष्ठ",
"next": "अर्को पृष्ठ",
diff --git a/i18n/locales/pl-PL.json b/i18n/locales/pl-PL.json
index c1eb0e73e3..048e6fbafc 100644
--- a/i18n/locales/pl-PL.json
+++ b/i18n/locales/pl-PL.json
@@ -511,9 +511,6 @@
"connector": {
"modal": {
"title": "Lokalny konektor",
- "contributor_badge": "Tylko dla współtwórców",
- "contributor_notice": "Konektor nie jest jeszcze opublikowany na npm. Zobacz {link}, aby uruchomić lokalnie.",
- "contributor_link": "przewodnik współtworzenia",
"connected": "Połączono",
"connected_as_user": "Połączono jako ~{user}",
"connected_hint": "Możesz teraz zarządzać pakietami i organizacjami z poziomu interfejsu WWW.",
@@ -822,7 +819,6 @@
"paginated": "Stronicowane",
"items_per_page": "Elementów na stronę",
"per_page": "{count} / stronę",
- "all_yolo": "Wszystkie (YOLO)",
"showing": "{start}-{end} z {total}",
"previous": "Poprzednia strona",
"next": "Następna strona",
diff --git a/i18n/locales/pt-BR.json b/i18n/locales/pt-BR.json
index 423d72b129..0d008131e0 100644
--- a/i18n/locales/pt-BR.json
+++ b/i18n/locales/pt-BR.json
@@ -361,9 +361,6 @@
"connector": {
"modal": {
"title": "Conector Local",
- "contributor_badge": "Apenas contribuidores",
- "contributor_notice": "O conector ainda não foi publicado no npm. Veja o {link} para saber como executar localmente.",
- "contributor_link": "guia de contribuição",
"connected": "Conectado",
"connected_as_user": "Conectado como ~{user}",
"connected_hint": "Agora você pode gerenciar pacotes e organizações a partir da interface web.",
@@ -659,7 +656,6 @@
"paginated": "Paginada",
"items_per_page": "Itens por página",
"per_page": "{count} / página",
- "all_yolo": "Todos (YOLO)",
"showing": "{start}-{end} de {total}",
"previous": "Página anterior",
"next": "Próxima página",
diff --git a/i18n/locales/ru-RU.json b/i18n/locales/ru-RU.json
index 9e43dc0970..ee400df62d 100644
--- a/i18n/locales/ru-RU.json
+++ b/i18n/locales/ru-RU.json
@@ -507,9 +507,6 @@
"connector": {
"modal": {
"title": "Локальный коннектор",
- "contributor_badge": "Только для контрибьюторов",
- "contributor_notice": "Коннектор ещё не опубликован в npm. См. {link}, чтобы узнать, как запустить его локально.",
- "contributor_link": "руководстве для участников",
"connected": "Подключено",
"connected_as_user": "Подключен как ~{user}",
"connected_hint": "Теперь вы можете управлять пакетами и организациями из веб-интерфейса.",
@@ -817,7 +814,6 @@
"paginated": "Страничный",
"items_per_page": "Элементов на странице",
"per_page": "{count} / стр.",
- "all_yolo": "Все (YOLO)",
"showing": "{start}-{end} из {total}",
"previous": "Предыдущая страница",
"next": "Следующая страница",
diff --git a/i18n/locales/ta-IN.json b/i18n/locales/ta-IN.json
index 99db87a1c1..d0a0babf2c 100644
--- a/i18n/locales/ta-IN.json
+++ b/i18n/locales/ta-IN.json
@@ -439,9 +439,6 @@
"connector": {
"modal": {
"title": "உள்ளூர் இணைப்பான்",
- "contributor_badge": "பங்களிப்பாளர்கள் மட்டும்",
- "contributor_notice": "இணைப்பான் இன்னும் npm-ல் வெளியிடப்படவில்லை. உள்ளூரில் இயக்குவதற்கு {link} ஐப் பார்க்கவும்.",
- "contributor_link": "பங்களிப்பு வழிகாட்டி",
"connected": "இணைக்கப்பட்டது",
"connected_as_user": "~{user} ஆக இணைக்கப்பட்டது",
"connected_hint": "இப்போது நீங்கள் இணைய இடைமுகத்திலிருந்து தொகுப்புகளையும் நிறுவனங்களையும் நிர்வகிக்கலாம்.",
@@ -745,7 +742,6 @@
"paginated": "பக்கமிடப்பட்ட",
"items_per_page": "ஒரு பக்கத்திற்கான உருப்படிகள்",
"per_page": "{count} / பக்கம்",
- "all_yolo": "அனைத்தும் (YOLO)",
"showing": "{start}-{end} / {total}",
"previous": "முந்தைய பக்கம்",
"next": "அடுத்த பக்கம்",
diff --git a/i18n/locales/te-IN.json b/i18n/locales/te-IN.json
index e1c1f23a86..6afb9aff75 100644
--- a/i18n/locales/te-IN.json
+++ b/i18n/locales/te-IN.json
@@ -360,9 +360,6 @@
"connector": {
"modal": {
"title": "లోకల్ కనెక్టర్",
- "contributor_badge": "కంట్రిబ్యూటర్లకు మాత్రమే",
- "contributor_notice": "కనెక్టర్ ఇంకా npm లో ప్రచురించబడలేదు. స్థానికంగా అమలు చేయడానికి {link} చూడండి.",
- "contributor_link": "కంట్రిబ్యూషన్ గైడ్",
"connected": "కనెక్ట్ చేయబడింది",
"connected_as_user": "~{user} గా కనెక్ట్ చేయబడింది",
"connected_hint": "ఇప్పుడు మీరు వెబ్ UI నుండి ప్యాకేజ్లు మరియు సంస్థలను నిర్వహించవచ్చు.",
@@ -658,7 +655,6 @@
"paginated": "పేజినేటెడ్",
"items_per_page": "పేజీకి అంశాలు",
"per_page": "{count} / పేజీ",
- "all_yolo": "అన్నీ (YOLO)",
"showing": "{total} లో {start}-{end}",
"previous": "మునుపటి పేజీ",
"next": "తర్వాతి పేజీ",
diff --git a/i18n/locales/tr-TR.json b/i18n/locales/tr-TR.json
index 56055a68f3..81246c99d2 100644
--- a/i18n/locales/tr-TR.json
+++ b/i18n/locales/tr-TR.json
@@ -13,10 +13,12 @@
"trademark_disclaimer": "npm, npm, Inc.'in tescilli ticari markasıdır. Bu site npm, Inc. ile bağlantılı değildir.",
"footer": {
"about": "hakkında",
+ "blog": "blog",
"docs": "belgeler",
"source": "kaynak",
"social": "sosyal",
"chat": "sohbet",
+ "builders_chat": "yapımcılar",
"keyboard_shortcuts": "klavye kısayolları"
},
"shortcuts": {
@@ -63,6 +65,37 @@
"org": "organizasyon",
"view_user_packages": "Bu kullanıcının paketlerine bak",
"view_org_packages": "Bu organizasyonun paketlerine bak"
+ },
+ "instant_search": "Anında arama",
+ "instant_search_on": "açık",
+ "instant_search_off": "kapalı",
+ "instant_search_turn_on": "aç",
+ "instant_search_turn_off": "kapat",
+ "instant_search_advisory": "{label} {state} — {action}"
+ },
+ "blog": {
+ "title": "Blog",
+ "heading": "blog",
+ "meta_description": "npmx topluluğundan içgörüler ve güncellemeler",
+ "author": {
+ "view_profile": "{name}'in Bluesky profilini görüntüle"
+ },
+ "draft_badge": "Taslak",
+ "draft_banner": "Bu yayınlanmamış bir taslaktır. Eksik veya hatalı bilgiler içerebilir.",
+ "atproto": {
+ "view_on_bluesky": "Bluesky'da görüntüle",
+ "reply_on_bluesky": "Bluesky'da yanıtla",
+ "likes_on_bluesky": "Bluesky'daki beğeniler",
+ "like_or_reply_on_bluesky": "Bu gönderiyi beğenin veya Bluesky'da yorum ekleyin",
+ "no_comments_yet": "Henüz yorum yok.",
+ "could_not_load_comments": "Yorumlar yüklenemedi.",
+ "comments": "Yorumlar",
+ "loading_comments": "Yorumlar yükleniyor...",
+ "updating": "Güncelleniyor...",
+ "reply_count": "{count} yanıt",
+ "like_count": "{count} beğeni",
+ "repost_count": "{count} yeniden paylaşım",
+ "more_replies": "{count} yanıt daha..."
}
},
"nav": {
@@ -96,6 +129,8 @@
"algolia": "Algolia",
"algolia_description": "Daha hızlı arama, organizasyon ve kullanıcı sayfaları için Algolia kullanır."
},
+ "instant_search": "Anında arama",
+ "instant_search_description": "Arama sayfasına gider ve siz yazarken sonuçları günceller.",
"relative_dates": "Göreceli tarihler",
"include_types": "Kuruluma {'@'}types dahil et",
"include_types_description": "Tipsiz paketler için kurulum komutlarına {'@'}types paketi ekle",
@@ -122,6 +157,13 @@
"edit_on_github": "GitHub'da düzenle",
"view_guide": "Çeviri rehberi"
},
+ "error": {
+ "401": "Yetkisiz",
+ "404": "Sayfa bulunamadı",
+ "500": "Sunucu hatası",
+ "503": "Hizmet kullanılamıyor",
+ "default": "Bir şeyler ters gitti"
+ },
"common": {
"loading": "Yükleniyor...",
"loading_more": "Daha fazla yükleniyor...",
@@ -399,6 +441,8 @@
"download_file": "{fileType} indir",
"toggle_annotator": "Annotator geçişi",
"toggle_stack_mode": "Yığın modunu değiştir",
+ "open_options": "Seçenekleri aç",
+ "close_options": "Seçenekleri kapat",
"legend_estimation": "Tahmin",
"no_data": "Veri mevcut değil",
"y_axis_label": "{granularity} {facet}",
@@ -533,9 +577,6 @@
"connector": {
"modal": {
"title": "Yerel Bağlayıcı",
- "contributor_badge": "Yalnızca katkıda bulunanlar için",
- "contributor_notice": "Bağlayıcı henüz npm'e yayınlanmadı. Yerel olarak çalıştırmak için {link} bakın.",
- "contributor_link": "katkı rehberi",
"connected": "Bağlandı",
"connected_as_user": "~{user} olarak bağlandı",
"connected_hint": "Artık web arayüzünden paketleri ve organizasyonları yönetebilirsiniz.",
@@ -844,7 +885,6 @@
"paginated": "Sayfalı",
"items_per_page": "Sayfa başına öğe",
"per_page": "/ sayfa",
- "all_yolo": "Tümü (YOLO)",
"showing": "Gösteriliyor",
"previous": "Önceki",
"next": "Sonraki",
@@ -925,6 +965,11 @@
"title": "Takip edin",
"description": "Güncellemeler için bizi takip edin",
"cta": "Bluesky'da takip et"
+ },
+ "builders": {
+ "title": "Yapımcılar",
+ "description": "Yapımcı topluluğumuza katılın ve npmx'in geleceğini şekillendirin",
+ "cta": "Yapımcı sohbetine katıl"
}
}
},
@@ -977,6 +1022,7 @@
}
},
"compare": {
+ "compare_versions_title": "Sürümleri karşılaştır",
"packages": {
"title": "Paketleri Karşılaştır",
"tagline": "npm paketlerini yan yana karşılaştırın",
@@ -1101,7 +1147,6 @@
"lines_hidden": "{count} satır gizlendi",
"file_too_large": "Dosya çok büyük",
"file_size_warning": "Dosya boyutu {size}",
- "compare_versions": "Sürümleri karşılaştır",
"summary": "Özet",
"deps_count": "{count} bağımlılık",
"dependencies": "Bağımlılıklar",
@@ -1129,6 +1174,34 @@
"close_files_panel": "Dosya panelini kapat",
"filter_files_label": "Dosyaları filtrele"
},
+ "pds": {
+ "title": "PDS",
+ "meta_description": "npmx PDS - Kişisel Veri Sunucusu",
+ "join": {
+ "title": "Katıl",
+ "description": "npmx PDS'ye katılın",
+ "migrate": "Geçiş yap"
+ },
+ "server": {
+ "title": "Sunucu",
+ "location_label": "Konum",
+ "location_value": "Nürnberg, Almanya",
+ "infrastructure_label": "Altyapı",
+ "infrastructure_value": "Hetzner üzerinde barındırılıyor",
+ "privacy_label": "Gizlilik",
+ "privacy_value": "Katı AB Veri Koruma yasalarına tabidir",
+ "learn_more": "Daha fazla bilgi"
+ },
+ "community": {
+ "title": "Topluluk",
+ "description": "{count} hesap ile topluluğumuza katılın",
+ "loading": "Yükleniyor...",
+ "error": "Hata",
+ "empty": "Boş",
+ "view_profile": "{handle} profilini görüntüle",
+ "new_accounts": "{count} yeni hesap"
+ }
+ },
"privacy_policy": {
"title": "Gizlilik Politikası",
"last_updated": "Son güncelleme: {date}",
diff --git a/i18n/locales/uk-UA.json b/i18n/locales/uk-UA.json
index 7ab379a127..796e41846f 100644
--- a/i18n/locales/uk-UA.json
+++ b/i18n/locales/uk-UA.json
@@ -13,10 +13,12 @@
"trademark_disclaimer": "npm є зареєстрованою торговою маркою npm, Inc. Цей сайт не пов'язаний з npm, Inc.",
"footer": {
"about": "про проект",
+ "blog": "Блог",
"docs": "документація",
"source": "код",
"social": "соціальні мережі",
"chat": "чат",
+ "builders_chat": "розробники",
"keyboard_shortcuts": "гарячі клавіші"
},
"shortcuts": {
@@ -63,7 +65,13 @@
"org": "організація",
"view_user_packages": "Переглянути пакети цього користувача",
"view_org_packages": "Переглянути пакети цієї організації"
- }
+ },
+ "instant_search": "Миттєвий пошук",
+ "instant_search_on": "увімкнено",
+ "instant_search_off": "вимкнено",
+ "instant_search_turn_on": "увімкнути",
+ "instant_search_turn_off": "вимкнути",
+ "instant_search_advisory": "{label} {state} — {action}"
},
"nav": {
"main_navigation": "Головна",
@@ -77,6 +85,31 @@
"links": "Посилання",
"tap_to_search": "Натисніть для пошуку"
},
+ "blog": {
+ "title": "Блог",
+ "heading": "блог",
+ "meta_description": "Думки та оновлення від спільноти npmx",
+ "author": {
+ "view_profile": "Переглянути профіль {name} у Bluesky"
+ },
+ "draft_badge": "Чернетка",
+ "draft_banner": "Це неопублікована чернетка. Вона може бути неповною або містити неточності.",
+ "atproto": {
+ "view_on_bluesky": "Переглянути у Bluesky",
+ "reply_on_bluesky": "Відповісти у Bluesky",
+ "likes_on_bluesky": "Вподобайки у Bluesky",
+ "like_or_reply_on_bluesky": "Вподобайте цей пост або залиште коментар у Bluesky",
+ "no_comments_yet": "Коментарів поки немає.",
+ "could_not_load_comments": "Не вдалося завантажити коментарі.",
+ "comments": "Коментарі",
+ "loading_comments": "Завантаження коментарів...",
+ "updating": "Оновлення...",
+ "reply_count": "{count} відповідь | {count} відповіді | {count} відповідей",
+ "like_count": "{count} вподобайка | {count} вподобайки | {count} вподобайок",
+ "repost_count": "{count} репост | {count} репости | {count} репостів",
+ "more_replies": "ще {count} відповідь... | ще {count} відповіді... | ще {count} відповідей..."
+ }
+ },
"settings": {
"title": "параметри",
"tagline": "налаштуйте ваше середовище npmx",
@@ -96,6 +129,8 @@
"algolia": "Algolia",
"algolia_description": "Використовує Algolia для швидшого пошуку, сторінок організацій та користувачів."
},
+ "instant_search": "Миттєвий пошук",
+ "instant_search_description": "Переходить на сторінку пошуку та оновлює результати під час введення.",
"relative_dates": "Відносні дати",
"include_types": "Включити {'@'}types у встановлення",
"include_types_description": "Додавайте пакет {'@'}types до команд встановлення для пакетів без типів",
@@ -122,6 +157,13 @@
"edit_on_github": "Редагувати на GitHub",
"view_guide": "Керівництво з перекладу"
},
+ "error": {
+ "401": "Не авторизовано",
+ "404": "Сторінку не знайдено",
+ "500": "Внутрішня помилка сервера",
+ "503": "Сервіс недоступний",
+ "default": "Щось пішло не так"
+ },
"common": {
"loading": "Завантаження...",
"loading_more": "Завантаження ще...",
@@ -399,6 +441,8 @@
"download_file": "Завантажити {fileType}",
"toggle_annotator": "Перемкнути анотатор",
"toggle_stack_mode": "Перемкнути режим стека",
+ "open_options": "Відкрити параметри",
+ "close_options": "Закрити параметри",
"legend_estimation": "Оцінка",
"no_data": "Дані недоступні",
"y_axis_label": "{granularity} {facet}",
@@ -533,9 +577,6 @@
"connector": {
"modal": {
"title": "Локальний сполучник",
- "contributor_badge": "Лише для контриб'юторів",
- "contributor_notice": "Сполучник ще не опублікований на npm. Дивіться {link} для запуску локально.",
- "contributor_link": "керівництво для контриб'юторів",
"connected": "Підключено",
"connected_as_user": "Підключено як ~{user}",
"connected_hint": "Тепер ви можете керувати пакетами та організаціями з веб-інтерфейсу.",
@@ -844,7 +885,6 @@
"paginated": "По сторінках",
"items_per_page": "Елементів на сторінці",
"per_page": "{count} / сторінка",
- "all_yolo": "Усі (YOLO)",
"showing": "{start}-{end} з {total}",
"previous": "Попередня сторінка",
"next": "Наступна сторінка",
@@ -921,6 +961,11 @@
"description": "Спілкуйтеся в чаті, ставте питання та діліться ідеями.",
"cta": "Приєднатися до спільноти Discord"
},
+ "builders": {
+ "title": "Допоможіть розвивати npmx",
+ "description": "Приєднайтесь до розробників, що формують майбутнє npmx.",
+ "cta": "Приєднатися до Discord для розробників"
+ },
"follow": {
"title": "Залишайтеся в курсі",
"description": "Дізнайтеся останні новини про npmx.",
@@ -1102,6 +1147,7 @@
"file_too_large": "Файл завеликий для порівняння",
"file_size_warning": "{size} перевищує ліміт 250 КБ для порівняння",
"compare_versions": "різниця",
+ "compare_versions_title": "Порівняти з останньою версією",
"summary": "Підсумок",
"deps_count": "{count} залежн.",
"dependencies": "Залежності",
@@ -1129,6 +1175,34 @@
"close_files_panel": "Закрити панель файлів",
"filter_files_label": "Фільтрувати файли за типом зміни"
},
+ "pds": {
+ "title": "npmx.social",
+ "meta_description": "Офіційний сервер особистих даних AT Protocol (PDS) для спільноти npmx.",
+ "join": {
+ "title": "Приєднатися до спільноти",
+ "description": "Незалежно від того, чи ви створюєте свій перший акаунт в атмосфері, чи мігруєте наявний — ви тут на своєму місці. Ви можете перенести поточний акаунт, не втрачаючи нікнейм, пости або підписників.",
+ "migrate": "Мігрувати за допомогою PDS MOOver"
+ },
+ "server": {
+ "title": "Деталі сервера",
+ "location_label": "Розташування:",
+ "location_value": "Нюрнберг, Німеччина",
+ "infrastructure_label": "Інфраструктура:",
+ "infrastructure_value": "Розміщено на Hetzner",
+ "privacy_label": "Конфіденційність:",
+ "privacy_value": "Підпадає під суворе законодавство ЄС про захист даних",
+ "learn_more": "Дізнайтесь, як npmx використовує Атмосферу"
+ },
+ "community": {
+ "title": "Хто тут є",
+ "description": "Деякі з {count} акаунтів, що вже вважають npmx.social своїм домом:",
+ "loading": "Завантаження спільноти PDS...",
+ "error": "Не вдалося завантажити спільноту PDS.",
+ "empty": "Немає учасників спільноти для відображення.",
+ "view_profile": "Переглянути профіль {handle}",
+ "new_accounts": "...та ще {count} нових в атмосфері"
+ }
+ },
"privacy_policy": {
"title": "політика конфіденційності",
"last_updated": "Останнє оновлення: {date}",
diff --git a/i18n/locales/zh-CN.json b/i18n/locales/zh-CN.json
index 4d2dd6d763..ee7d0a3796 100644
--- a/i18n/locales/zh-CN.json
+++ b/i18n/locales/zh-CN.json
@@ -18,6 +18,7 @@
"source": "源码",
"social": "社交媒体",
"chat": "聊天",
+ "builders_chat": "构建者",
"keyboard_shortcuts": "键盘快捷键"
},
"shortcuts": {
@@ -64,7 +65,13 @@
"org": "组织",
"view_user_packages": "查看该用户的包",
"view_org_packages": "查看该组织的包"
- }
+ },
+ "instant_search": "即时搜索",
+ "instant_search_on": "已开启",
+ "instant_search_off": "已关闭",
+ "instant_search_turn_on": "开启",
+ "instant_search_turn_off": "关闭",
+ "instant_search_advisory": "{label} {state} — {action}"
},
"nav": {
"main_navigation": "主页",
@@ -85,6 +92,8 @@
"author": {
"view_profile": "在 Bluesky 上查看 {name} 的资料"
},
+ "draft_badge": "草稿",
+ "draft_banner": "这是一篇未发布的草稿。内容可能不完整或包含不准确的信息。",
"atproto": {
"view_on_bluesky": "在 Bluesky 上查看",
"reply_on_bluesky": "在 Bluesky 上回复",
@@ -120,6 +129,8 @@
"algolia": "Algolia",
"algolia_description": "使用 Algolia 来实现更快的搜索,适用于组织页和用户页。"
},
+ "instant_search": "即时搜索",
+ "instant_search_description": "导航到搜索页面并在输入时更新结果。",
"relative_dates": "相对时间",
"include_types": "在安装时包含 {'@'}types",
"include_types_description": "为未提供类型定义的包自动添加 {'@'}types 包到安装命令",
@@ -566,9 +577,6 @@
"connector": {
"modal": {
"title": "本地连接器",
- "contributor_badge": "贡献者专用",
- "contributor_notice": "连接器尚未发布到 npm。请参阅 {link} 了解如何本地运行。",
- "contributor_link": "贡献指南",
"connected": "已连接",
"connected_as_user": "已连接为 ~{user}",
"connected_hint": "现在你可以通过 Web UI 管理包和组织。",
@@ -877,7 +885,6 @@
"paginated": "分页",
"items_per_page": "每页显示",
"per_page": "{count} / 页",
- "all_yolo": "全部(YOLO)",
"showing": "第 {start} - {end} 条,共 {total} 条",
"previous": "上一页",
"next": "下一页",
@@ -954,6 +961,11 @@
"description": "聊天、提出问题并分享想法。",
"cta": "加入 Discord"
},
+ "builders": {
+ "title": "参与构建 npmx",
+ "description": "加入构建者团队,共同塑造 npmx 的未来。",
+ "cta": "加入构建者 Discord"
+ },
"follow": {
"title": "保持更新",
"description": "了解 npmx 的最新动态。",
@@ -1163,6 +1175,34 @@
"close_files_panel": "关闭文件面板",
"filter_files_label": "按更改类型筛选文件"
},
+ "pds": {
+ "title": "npmx.social",
+ "meta_description": "npmx 社区的官方 AT Protocol 个人数据服务器 (PDS)。",
+ "join": {
+ "title": "加入社区",
+ "description": "无论你是第一次在 Atmosphere 上创建账户,还是迁移现有账户,这里都是你的归属。你可以迁移当前账户,而不会丢失你的账户、帖子或关注者。",
+ "migrate": "使用 PDS MOOver 迁移"
+ },
+ "server": {
+ "title": "服务器详情",
+ "location_label": "位置:",
+ "location_value": "德国,纽伦堡",
+ "infrastructure_label": "基础设施:",
+ "infrastructure_value": "托管于 Hetzner",
+ "privacy_label": "隐私:",
+ "privacy_value": "受欧盟严格的数据保护法律约束",
+ "learn_more": "了解 npmx 如何使用 Atmosphere"
+ },
+ "community": {
+ "title": "谁在这里",
+ "description": "在 {count} 个已将 npmx.social 视为家的账户中,这里有一些:",
+ "loading": "正在加载 PDS 社区...",
+ "error": "加载 PDS 社区失败。",
+ "empty": "没有社区成员可显示。",
+ "view_profile": "查看 {handle} 的资料",
+ "new_accounts": "...以及 {count} 个新加入 Atmosphere 的账户"
+ }
+ },
"privacy_policy": {
"title": "隐私政策",
"last_updated": "上次更新:{date}",
diff --git a/i18n/locales/zh-TW.json b/i18n/locales/zh-TW.json
index 4e28dbeb28..bf648cc7e5 100644
--- a/i18n/locales/zh-TW.json
+++ b/i18n/locales/zh-TW.json
@@ -532,9 +532,6 @@
"connector": {
"modal": {
"title": "本機連線器",
- "contributor_badge": "僅限貢獻者",
- "contributor_notice": "連線器尚未發布到 npm。請參閱 {link} 了解如何在本機執行。",
- "contributor_link": "貢獻指南",
"connected": "已連線",
"connected_as_user": "已連線為 ~{user}",
"connected_hint": "現在你可以透過 Web UI 管理套件與組織。",
@@ -843,7 +840,6 @@
"paginated": "分頁",
"items_per_page": "每頁項目數",
"per_page": "{count} / 頁",
- "all_yolo": "全部(YOLO)",
"showing": "顯示第 {start}-{end} 項,共 {total} 項",
"previous": "上一頁",
"next": "下一頁",
diff --git a/i18n/schema.json b/i18n/schema.json
index 5842a37bca..4ed08a60b2 100644
--- a/i18n/schema.json
+++ b/i18n/schema.json
@@ -1735,15 +1735,6 @@
"title": {
"type": "string"
},
- "contributor_badge": {
- "type": "string"
- },
- "contributor_notice": {
- "type": "string"
- },
- "contributor_link": {
- "type": "string"
- },
"connected": {
"type": "string"
},
@@ -2668,9 +2659,6 @@
"per_page": {
"type": "string"
},
- "all_yolo": {
- "type": "string"
- },
"showing": {
"type": "string"
},
diff --git a/lunaria/styles.ts b/lunaria/styles.ts
index 9e7d0db23e..f12df0e783 100644
--- a/lunaria/styles.ts
+++ b/lunaria/styles.ts
@@ -121,8 +121,7 @@ export const BaseStyles = html`
}
a {
- color: var(--ln-color-link);
- text-decoration: none;
+ color: var(--fg);
}
h2 a {
@@ -131,6 +130,7 @@ export const BaseStyles = html`
a:hover {
text-decoration: underline;
+ color: var(--ln-color-gray-5);
}
ul {
@@ -333,16 +333,6 @@ export const CustomStyles = html`
color: var(--fg-muted);
}
- p a {
- color: var(--fg);
- text-decoration: underline;
- }
-
- .status-by-file a,
- .progress-details a {
- color: var(--fg);
- }
-
.create-button {
background-color: hsl(213deg 89% 64% / 20%);
border-radius: 0.5em;
diff --git a/modules/blog.ts b/modules/blog.ts
index 6c96b867cb..cbfa5424ec 100644
--- a/modules/blog.ts
+++ b/modules/blog.ts
@@ -5,19 +5,91 @@ import shiki from '@shikijs/markdown-exit'
import MarkdownItAnchor from 'markdown-it-anchor'
import { defu } from 'defu'
import { read } from 'gray-matter'
-import { safeParse } from 'valibot'
-import { BlogPostSchema, type BlogPostFrontmatter } from '../shared/schemas/blog'
+import { array, safeParse } from 'valibot'
+import {
+ AuthorSchema,
+ RawBlogPostSchema,
+ type Author,
+ type BlogPostFrontmatter,
+ type ResolvedAuthor,
+} from '../shared/schemas/blog'
import { globSync } from 'tinyglobby'
import { isProduction } from '../config/env'
+import { BLUESKY_API } from '../shared/utils/constants'
+import { mkdir, writeFile } from 'node:fs/promises'
+import { existsSync } from 'node:fs'
+import crypto from 'node:crypto'
+
+/**
+ * Fetches Bluesky avatars for a set of authors at build time.
+ * Returns a map of handle → avatar URL.
+ */
+async function fetchBlueskyAvatars(
+ imagesDir: string,
+ handles: string[],
+): Promise