From 62cff4e2070249d6f50a329fce8f8701c5d2a4ec Mon Sep 17 00:00:00 2001 From: Tommaso Casaburi Date: Tue, 19 May 2026 15:38:44 +0700 Subject: [PATCH] fix(catalog): improve empty search state and footer layout Show centered Nothing Found for catalog searches with no matches, mirror search results labels at the bottom footer, split nav from the style row, and drop the desktop catalog footer top margin. --- public/translations/ar/default.json | 3 +- public/translations/bn/default.json | 3 +- public/translations/cs/default.json | 3 +- public/translations/da/default.json | 3 +- public/translations/de/default.json | 3 +- public/translations/el/default.json | 3 +- public/translations/en/default.json | 1 + public/translations/es/default.json | 3 +- public/translations/fa/default.json | 3 +- public/translations/fi/default.json | 3 +- public/translations/fil/default.json | 3 +- public/translations/fr/default.json | 3 +- public/translations/he/default.json | 3 +- public/translations/hi/default.json | 3 +- public/translations/hu/default.json | 3 +- public/translations/id/default.json | 3 +- public/translations/it/default.json | 3 +- public/translations/ja/default.json | 3 +- public/translations/ko/default.json | 3 +- public/translations/mr/default.json | 3 +- public/translations/nl/default.json | 3 +- public/translations/no/default.json | 3 +- public/translations/pl/default.json | 3 +- public/translations/pt/default.json | 3 +- public/translations/ro/default.json | 3 +- public/translations/ru/default.json | 3 +- public/translations/sq/default.json | 3 +- public/translations/sv/default.json | 3 +- public/translations/te/default.json | 3 +- public/translations/th/default.json | 3 +- public/translations/tr/default.json | 3 +- public/translations/uk/default.json | 3 +- public/translations/ur/default.json | 3 +- public/translations/vi/default.json | 3 +- public/translations/zh/default.json | 3 +- .../board-buttons/board-buttons.tsx | 56 ++++++------- .../footer/__tests__/footer.test.tsx | 3 + src/components/footer/footer.module.css | 5 +- src/components/footer/footer.tsx | 44 +++++++--- src/components/footer/index.ts | 1 + src/views/catalog/__tests__/catalog.test.tsx | 27 +++++- src/views/catalog/catalog.module.css | 16 ++++ src/views/catalog/catalog.tsx | 84 +++++++++++-------- 43 files changed, 229 insertions(+), 110 deletions(-) diff --git a/public/translations/ar/default.json b/public/translations/ar/default.json index 22ba4d3e..71911715 100644 --- a/public/translations/ar/default.json +++ b/public/translations/ar/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "افتح الملف الأصلي", "media_failed_to_load_inline": "فشلت الصورة الخارجية من {{host}}. جرّب VPN.", "media_failed_to_load_inline_unknown": "فشلت الصورة الخارجية. جرّب VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/bn/default.json b/public/translations/bn/default.json index 1950c2de..0efb7040 100644 --- a/public/translations/bn/default.json +++ b/public/translations/bn/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "মূল ফাইল খুলুন", "media_failed_to_load_inline": "{{host}} থেকে বাইরের ছবি লোড হয়নি। VPN চেষ্টা করুন।", "media_failed_to_load_inline_unknown": "বাইরের ছবি লোড হয়নি। VPN চেষ্টা করুন।", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/cs/default.json b/public/translations/cs/default.json index 40ed5aba..4c278872 100644 --- a/public/translations/cs/default.json +++ b/public/translations/cs/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Otevřít původní soubor", "media_failed_to_load_inline": "Externí obrázek z {{host}} selhal. Zkuste VPN.", "media_failed_to_load_inline_unknown": "Externí obrázek selhal. Zkuste VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/da/default.json b/public/translations/da/default.json index ed6e2e43..e426af21 100644 --- a/public/translations/da/default.json +++ b/public/translations/da/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Åbn originalfil", "media_failed_to_load_inline": "Eksternt billede fra {{host}} fejlede. Prøv VPN.", "media_failed_to_load_inline_unknown": "Eksternt billede fejlede. Prøv VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/de/default.json b/public/translations/de/default.json index e8448503..3065ad9b 100644 --- a/public/translations/de/default.json +++ b/public/translations/de/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Originaldatei öffnen", "media_failed_to_load_inline": "Externes Bild von {{host}} fehlgeschlagen. VPN versuchen.", "media_failed_to_load_inline_unknown": "Externes Bild fehlgeschlagen. VPN versuchen.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/el/default.json b/public/translations/el/default.json index 8fe4deb2..e921316a 100644 --- a/public/translations/el/default.json +++ b/public/translations/el/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Άνοιγμα αρχικού αρχείου", "media_failed_to_load_inline": "Η εξωτερική εικόνα από {{host}} απέτυχε. Δοκιμάστε VPN.", "media_failed_to_load_inline_unknown": "Η εξωτερική εικόνα απέτυχε. Δοκιμάστε VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/en/default.json b/public/translations/en/default.json index 11edde70..6ab8cd6e 100644 --- a/public/translations/en/default.json +++ b/public/translations/en/default.json @@ -140,6 +140,7 @@ "sort_by": "Sort by", "posts_last_synced_info": "Posts last synced {{time}}, this board might be offline and publishing might fail.", "no_threads": "No threads", + "nothing_found": "Nothing Found", "hidden": "hidden", "save_options": "Save Options", "save_advanced_settings": "Save Advanced Settings", diff --git a/public/translations/es/default.json b/public/translations/es/default.json index 5aa82ec7..fb779779 100644 --- a/public/translations/es/default.json +++ b/public/translations/es/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Abrir archivo original", "media_failed_to_load_inline": "Falló la imagen externa de {{host}}. Prueba una VPN.", "media_failed_to_load_inline_unknown": "Falló la imagen externa. Prueba una VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/fa/default.json b/public/translations/fa/default.json index 57b7a108..43b0436a 100644 --- a/public/translations/fa/default.json +++ b/public/translations/fa/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "باز کردن فایل اصلی", "media_failed_to_load_inline": "تصویر خارجی از {{host}} بارگیری نشد. VPN را امتحان کنید.", "media_failed_to_load_inline_unknown": "تصویر خارجی بارگیری نشد. VPN را امتحان کنید.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/fi/default.json b/public/translations/fi/default.json index 5c9bfb0b..7f415551 100644 --- a/public/translations/fi/default.json +++ b/public/translations/fi/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Avaa alkuperäinen tiedosto", "media_failed_to_load_inline": "Ulkoinen kuva sivustolta {{host}} epäonnistui. Kokeile VPN:ää.", "media_failed_to_load_inline_unknown": "Ulkoinen kuva epäonnistui. Kokeile VPN:ää.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/fil/default.json b/public/translations/fil/default.json index 40650618..e08d1ede 100644 --- a/public/translations/fil/default.json +++ b/public/translations/fil/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Buksan ang orihinal na file", "media_failed_to_load_inline": "Nabigo ang panlabas na larawan mula sa {{host}}. Subukan ang VPN.", "media_failed_to_load_inline_unknown": "Nabigo ang panlabas na larawan. Subukan ang VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/fr/default.json b/public/translations/fr/default.json index 3e108196..bd77bdd6 100644 --- a/public/translations/fr/default.json +++ b/public/translations/fr/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Ouvrir le fichier original", "media_failed_to_load_inline": "L'image externe de {{host}} a échoué. Essayez un VPN.", "media_failed_to_load_inline_unknown": "L'image externe a échoué. Essayez un VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/he/default.json b/public/translations/he/default.json index ea6c62a0..d8048e2e 100644 --- a/public/translations/he/default.json +++ b/public/translations/he/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "פתח את הקובץ המקורי", "media_failed_to_load_inline": "התמונה החיצונית מ-{{host}} נכשלה. נסה VPN.", "media_failed_to_load_inline_unknown": "התמונה החיצונית נכשלה. נסה VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/hi/default.json b/public/translations/hi/default.json index 04ec9db1..3e36f03c 100644 --- a/public/translations/hi/default.json +++ b/public/translations/hi/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "मूल फ़ाइल खोलें", "media_failed_to_load_inline": "{{host}} से बाहरी छवि लोड नहीं हुई। VPN आज़माएँ।", "media_failed_to_load_inline_unknown": "बाहरी छवि लोड नहीं हुई। VPN आज़माएँ।", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/hu/default.json b/public/translations/hu/default.json index e4ca4ac4..a43df34f 100644 --- a/public/translations/hu/default.json +++ b/public/translations/hu/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Eredeti fájl megnyitása", "media_failed_to_load_inline": "A külső kép innen nem töltődött be: {{host}}. Próbálj VPN-t.", "media_failed_to_load_inline_unknown": "A külső kép nem töltődött be. Próbálj VPN-t.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/id/default.json b/public/translations/id/default.json index 40889508..0c335c43 100644 --- a/public/translations/id/default.json +++ b/public/translations/id/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Buka file asli", "media_failed_to_load_inline": "Gambar eksternal dari {{host}} gagal. Coba VPN.", "media_failed_to_load_inline_unknown": "Gambar eksternal gagal. Coba VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/it/default.json b/public/translations/it/default.json index dae8e787..4670640d 100644 --- a/public/translations/it/default.json +++ b/public/translations/it/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Apri file originale", "media_failed_to_load_inline": "Immagine esterna da {{host}} non caricata. Prova una VPN.", "media_failed_to_load_inline_unknown": "Immagine esterna non caricata. Prova una VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/ja/default.json b/public/translations/ja/default.json index 5dd39360..1f6a3c57 100644 --- a/public/translations/ja/default.json +++ b/public/translations/ja/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "元のファイルを開く", "media_failed_to_load_inline": "{{host}} の外部画像を読み込めませんでした。VPN を試してください。", "media_failed_to_load_inline_unknown": "外部画像を読み込めませんでした。VPN を試してください。", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/ko/default.json b/public/translations/ko/default.json index 3c329d64..73600df7 100644 --- a/public/translations/ko/default.json +++ b/public/translations/ko/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "원본 파일 열기", "media_failed_to_load_inline": "{{host}}의 외부 이미지를 불러오지 못했습니다. VPN을 시도하세요.", "media_failed_to_load_inline_unknown": "외부 이미지를 불러오지 못했습니다. VPN을 시도하세요.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/mr/default.json b/public/translations/mr/default.json index 4da962e6..0f4a7c9c 100644 --- a/public/translations/mr/default.json +++ b/public/translations/mr/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "मूळ फाइल उघडा", "media_failed_to_load_inline": "{{host}} वरील बाह्य प्रतिमा लोड झाली नाही. VPN वापरून पाहा.", "media_failed_to_load_inline_unknown": "बाह्य प्रतिमा लोड झाली नाही. VPN वापरून पाहा.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/nl/default.json b/public/translations/nl/default.json index 7870fbda..de347214 100644 --- a/public/translations/nl/default.json +++ b/public/translations/nl/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Origineel bestand openen", "media_failed_to_load_inline": "Externe afbeelding van {{host}} mislukt. Probeer VPN.", "media_failed_to_load_inline_unknown": "Externe afbeelding mislukt. Probeer VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/no/default.json b/public/translations/no/default.json index 2d3eeb51..b7aa3547 100644 --- a/public/translations/no/default.json +++ b/public/translations/no/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Åpne originalfil", "media_failed_to_load_inline": "Eksternt bilde fra {{host}} kunne ikke lastes. Prøv VPN.", "media_failed_to_load_inline_unknown": "Eksternt bilde kunne ikke lastes. Prøv VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/pl/default.json b/public/translations/pl/default.json index 918a7f49..277a1737 100644 --- a/public/translations/pl/default.json +++ b/public/translations/pl/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Otwórz oryginalny plik", "media_failed_to_load_inline": "Obraz zewnętrzny z {{host}} nie załadował się. Spróbuj VPN.", "media_failed_to_load_inline_unknown": "Obraz zewnętrzny nie załadował się. Spróbuj VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/pt/default.json b/public/translations/pt/default.json index d64a8e99..32dd80c1 100644 --- a/public/translations/pt/default.json +++ b/public/translations/pt/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Abrir arquivo original", "media_failed_to_load_inline": "Falha na imagem externa de {{host}}. Tente uma VPN.", "media_failed_to_load_inline_unknown": "Falha na imagem externa. Tente uma VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/ro/default.json b/public/translations/ro/default.json index 792c7376..b00fe822 100644 --- a/public/translations/ro/default.json +++ b/public/translations/ro/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Deschide fișierul original", "media_failed_to_load_inline": "Imaginea externă de la {{host}} a eșuat. Încearcă VPN.", "media_failed_to_load_inline_unknown": "Imaginea externă a eșuat. Încearcă VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/ru/default.json b/public/translations/ru/default.json index 680810cd..5d56ce57 100644 --- a/public/translations/ru/default.json +++ b/public/translations/ru/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Открыть исходный файл", "media_failed_to_load_inline": "Внешнее изображение с {{host}} не загрузилось. Попробуйте VPN.", "media_failed_to_load_inline_unknown": "Внешнее изображение не загрузилось. Попробуйте VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/sq/default.json b/public/translations/sq/default.json index 2a53216c..fad55932 100644 --- a/public/translations/sq/default.json +++ b/public/translations/sq/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Hap skedarin origjinal", "media_failed_to_load_inline": "Imazhi i jashtëm nga {{host}} dështoi. Provoni VPN.", "media_failed_to_load_inline_unknown": "Imazhi i jashtëm dështoi. Provoni VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/sv/default.json b/public/translations/sv/default.json index 92b78829..1af5b04a 100644 --- a/public/translations/sv/default.json +++ b/public/translations/sv/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Öppna originalfil", "media_failed_to_load_inline": "Extern bild från {{host}} kunde inte läsas in. Prova VPN.", "media_failed_to_load_inline_unknown": "Extern bild kunde inte läsas in. Prova VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/te/default.json b/public/translations/te/default.json index 161b3948..f8932c2f 100644 --- a/public/translations/te/default.json +++ b/public/translations/te/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "అసలు ఫైల్‌ను తెరవండి", "media_failed_to_load_inline": "{{host}} నుండి బాహ్య చిత్రం లోడ్ కాలేదు. VPN ప్రయత్నించండి.", "media_failed_to_load_inline_unknown": "బాహ్య చిత్రం లోడ్ కాలేదు. VPN ప్రయత్నించండి.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/th/default.json b/public/translations/th/default.json index 0c0889fd..b530285f 100644 --- a/public/translations/th/default.json +++ b/public/translations/th/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "เปิดไฟล์ต้นฉบับ", "media_failed_to_load_inline": "โหลดรูปภาพภายนอกจาก {{host}} ไม่สำเร็จ ลอง VPN", "media_failed_to_load_inline_unknown": "โหลดรูปภาพภายนอกไม่สำเร็จ ลอง VPN", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/tr/default.json b/public/translations/tr/default.json index b91d681e..c1611479 100644 --- a/public/translations/tr/default.json +++ b/public/translations/tr/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Orijinal dosyayı aç", "media_failed_to_load_inline": "{{host}} harici görseli yüklenemedi. VPN deneyin.", "media_failed_to_load_inline_unknown": "Harici görsel yüklenemedi. VPN deneyin.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/uk/default.json b/public/translations/uk/default.json index 4df79591..ba663866 100644 --- a/public/translations/uk/default.json +++ b/public/translations/uk/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Відкрити оригінальний файл", "media_failed_to_load_inline": "Зовнішнє зображення з {{host}} не завантажилося. Спробуйте VPN.", "media_failed_to_load_inline_unknown": "Зовнішнє зображення не завантажилося. Спробуйте VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/ur/default.json b/public/translations/ur/default.json index a8725937..b4be0ebc 100644 --- a/public/translations/ur/default.json +++ b/public/translations/ur/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "اصل فائل کھولیں", "media_failed_to_load_inline": "{{host}} سے بیرونی تصویر لوڈ نہیں ہوئی۔ VPN آزمائیں۔", "media_failed_to_load_inline_unknown": "بیرونی تصویر لوڈ نہیں ہوئی۔ VPN آزمائیں۔", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/vi/default.json b/public/translations/vi/default.json index 017fb8ce..2661236c 100644 --- a/public/translations/vi/default.json +++ b/public/translations/vi/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "Mở tệp gốc", "media_failed_to_load_inline": "Không tải được ảnh bên ngoài từ {{host}}. Thử VPN.", "media_failed_to_load_inline_unknown": "Không tải được ảnh bên ngoài. Thử VPN.", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/public/translations/zh/default.json b/public/translations/zh/default.json index fa7591e3..971eea58 100644 --- a/public/translations/zh/default.json +++ b/public/translations/zh/default.json @@ -388,5 +388,6 @@ "media_failed_to_load_open_source": "打开原始文件", "media_failed_to_load_inline": "来自 {{host}} 的外部图片加载失败。试试 VPN。", "media_failed_to_load_inline_unknown": "外部图片加载失败。试试 VPN。", - "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead." + "expiring_media_link_alert": "Media from {{domain}} expires quickly. Use a stable media link instead.", + "nothing_found": "Nothing Found" } diff --git a/src/components/board-buttons/board-buttons.tsx b/src/components/board-buttons/board-buttons.tsx index 46fa9d25..836963ca 100644 --- a/src/components/board-buttons/board-buttons.tsx +++ b/src/components/board-buttons/board-buttons.tsx @@ -523,7 +523,6 @@ export const MobileBoardButtons = () => { const resolvedAddress = useResolvedCommunityAddress(); const communityAddress = resolvedAddress || accountComment?.communityAddress; - const { filteredCount, searchText } = useCatalogFiltersStore(); const enableInfiniteScroll = useFeedViewSettingsStore((state) => state.enableInfiniteScroll); const isMultiboard = isInAllView || isInSubscriptionsView || isInModView; const showTimeFilter = isMultiboard; @@ -574,19 +573,7 @@ export const MobileBoardButtons = () => { isInModView={isInModView} isMobilePlacement={true} /> - {searchText ? ( - - {' '} - - {t('search_results_for')}: {searchText} - - ) : ( - filteredCount > 0 && ( - - {' '} - - {t('filtered_threads')}: {filteredCount} - - ) - )} + {(isInAllView || showTimeFilter || isInCatalogView) && ( <>
@@ -683,6 +670,31 @@ export const PostPageStats = () => { ); }; +export const CatalogSearchResultsLabel = () => { + const { t } = useTranslation(); + const { filteredCount, searchText } = useCatalogFiltersStore(); + + if (searchText) { + return ( + + {' '} + — {t('search_results_for')}: {searchText} + + ); + } + + if (filteredCount > 0) { + return ( + + {' '} + — {t('filtered_threads')}: {filteredCount} + + ); + } + + return null; +}; + export const DesktopBoardButtons = () => { const { t } = useTranslation(); const params = useParams(); @@ -698,7 +710,6 @@ export const DesktopBoardButtons = () => { const isInModView = isModView(location.pathname); const isInModQueueView = isModQueueView(location.pathname); - const { filteredCount, searchText } = useCatalogFiltersStore(); const enableInfiniteScroll = useFeedViewSettingsStore((state) => state.enableInfiniteScroll); const isMultiboard = isInAllView || isInSubscriptionsView || isInModView; const showTimeFilter = isMultiboard; @@ -794,20 +805,7 @@ export const DesktopBoardButtons = () => { )} - {isInCatalogView && searchText ? ( - - {' '} - - {t('search_results_for')}: {searchText} - - ) : ( - isInCatalogView && - filteredCount > 0 && ( - - {' '} - - {t('filtered_threads')}: {filteredCount} - - ) - )} + {isInCatalogView && } {isInCatalogView && ( <> diff --git a/src/components/footer/__tests__/footer.test.tsx b/src/components/footer/__tests__/footer.test.tsx index b2d98658..d6dbcb27 100644 --- a/src/components/footer/__tests__/footer.test.tsx +++ b/src/components/footer/__tests__/footer.test.tsx @@ -5,6 +5,7 @@ import { MemoryRouter } from 'react-router-dom'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { CatalogFooterFirstRow, + CatalogFooterStyleRow, PageFooterDesktop, PageFooterMobile, StyleOnlyFooterFirstRow, @@ -51,6 +52,7 @@ vi.mock('../../style-selector/style-selector', () => ({ })); vi.mock('../../board-buttons/board-buttons', () => ({ + CatalogSearchResultsLabel: () => null, AutoButton: () => createElement('button', { type: 'button' }, 'auto-button'), CatalogButton: ({ address, @@ -154,6 +156,7 @@ describe('footer', () => { isInAllView: true, communityAddress: 'music-posting.eth', }), + createElement(CatalogFooterStyleRow), createElement(ThreadFooterStyleRow), createElement(PageFooterMobile, { children: createElement('div', { 'data-testid': 'mobile-child' }, 'mobile-child'), diff --git a/src/components/footer/footer.module.css b/src/components/footer/footer.module.css index 21d4d225..eb865440 100644 --- a/src/components/footer/footer.module.css +++ b/src/components/footer/footer.module.css @@ -4,6 +4,10 @@ padding-bottom: 24px; } +.footerCatalog { + margin-top: 0; +} + .firstRow { display: flex; align-items: center; @@ -76,7 +80,6 @@ } .styleLabel { - font-size: 12px; text-transform: capitalize; } diff --git a/src/components/footer/footer.tsx b/src/components/footer/footer.tsx index 7ad765f6..916a08aa 100644 --- a/src/components/footer/footer.tsx +++ b/src/components/footer/footer.tsx @@ -4,7 +4,16 @@ import { useComment } from '@bitsocial/bitsocial-react-hooks'; import BoardsBar from '../boards-bar'; import SiteLegalMeta from '../site-legal-meta'; import StyleSelector from '../style-selector/style-selector'; -import { ReturnButton, CatalogButton, TopButton, UpdateButton, AutoButton, PostPageStats, RefreshButton } from '../board-buttons/board-buttons'; +import { + CatalogSearchResultsLabel, + ReturnButton, + CatalogButton, + TopButton, + UpdateButton, + AutoButton, + PostPageStats, + RefreshButton, +} from '../board-buttons/board-buttons'; import { isAllView, isSubscriptionsView, isModView } from '../../lib/utils/view-utils'; import useReplyModalStore from '../../stores/use-reply-modal-store'; import useThreadLiveUpdatesStore from '../../stores/use-thread-live-updates-store'; @@ -22,15 +31,17 @@ import styles from './footer.module.css'; interface PageFooterDesktopProps { /** Mode-specific first row content (e.g. board pagination or thread controls) */ - firstRow: React.ReactNode; + firstRow?: React.ReactNode; /** Optional row between first row and BoardsBar (e.g. style selector on thread page) */ styleRow?: React.ReactNode; + /** Catalog pages omit the default footer top margin */ + variant?: 'catalog'; } -export const PageFooterDesktop = ({ firstRow, styleRow }: PageFooterDesktopProps) => ( -