From e082c7b4286ba2c073520ec2b56c53903a2643ce Mon Sep 17 00:00:00 2001 From: Tommaso Casaburi Date: Fri, 29 May 2026 17:09:07 +0700 Subject: [PATCH] fix(react): address Doctor findings (#1143) Accessibility/semantics pass aligned with React Doctor: role-based spans/divs become real buttons, role=status becomes , modals use native , author/peer flags render as , and embed/challenge iframes are sandboxed. Includes review follow-ups: correct button chrome/centering/themed dialog colors and focus rings, the missing aria-label i18n keys (all languages), the Yandex image-search URL, clearer .bso setup steps, a keyboard-accessible image-search dropdown, and removal of the post-edit ('comment edited') display (mod edits unchanged). --- public/translations/ar/default.json | 14 +- public/translations/bn/default.json | 14 +- public/translations/cs/default.json | 14 +- public/translations/da/default.json | 14 +- public/translations/de/default.json | 14 +- public/translations/el/default.json | 14 +- public/translations/en/default.json | 14 +- public/translations/es/default.json | 14 +- public/translations/fa/default.json | 14 +- public/translations/fi/default.json | 14 +- public/translations/fil/default.json | 14 +- public/translations/fr/default.json | 14 +- public/translations/he/default.json | 14 +- public/translations/hi/default.json | 14 +- public/translations/hu/default.json | 14 +- public/translations/id/default.json | 14 +- public/translations/it/default.json | 14 +- public/translations/ja/default.json | 14 +- public/translations/ko/default.json | 14 +- public/translations/mr/default.json | 14 +- public/translations/nl/default.json | 14 +- public/translations/no/default.json | 14 +- public/translations/pl/default.json | 14 +- public/translations/pt/default.json | 14 +- public/translations/ro/default.json | 14 +- public/translations/ru/default.json | 14 +- public/translations/sq/default.json | 14 +- public/translations/sv/default.json | 14 +- public/translations/te/default.json | 14 +- public/translations/th/default.json | 14 +- public/translations/tr/default.json | 14 +- public/translations/uk/default.json | 14 +- public/translations/ur/default.json | 14 +- public/translations/vi/default.json | 14 +- public/translations/zh/default.json | 14 +- src/app.tsx | 4 +- .../board-blotter/board-blotter.module.css | 16 ++ .../board-blotter/board-blotter.tsx | 10 +- .../board-buttons/board-buttons.tsx | 27 +- .../__tests__/board-header.test.tsx | 2 +- .../board-header/board-header.module.css | 13 + src/components/board-header/board-header.tsx | 6 +- .../__tests__/board-pagination.test.tsx | 2 +- .../board-pagination/board-pagination.tsx | 6 +- .../__tests__/boards-bar-edit-modal.test.tsx | 4 +- .../boards-bar-edit-modal.module.css | 13 +- .../boards-bar-edit-modal.tsx | 47 ++-- .../boards-bar/__tests__/boards-bar.test.tsx | 2 +- .../boards-bar/boards-bar.module.css | 35 ++- src/components/boards-bar/boards-bar.tsx | 53 ++-- .../__tests__/catalog-filters.test.tsx | 9 +- .../catalog-filters.module.css | 26 ++ .../catalog-filters/catalog-filters.tsx | 49 ++-- .../highlight-color-picker.module.css | 31 +++ .../highlight-color-picker.tsx | 53 ++-- src/components/catalog-row/catalog-row.tsx | 39 +-- .../__tests__/catalog-search.test.tsx | 4 +- .../catalog-search/catalog-search.module.css | 10 + .../catalog-search/catalog-search.tsx | 13 +- .../__tests__/challenge-modal.test.tsx | 4 +- .../challenge-modal/challenge-modal.tsx | 66 +++-- .../__tests__/comment-content.test.tsx | 35 --- .../comment-content/comment-content.tsx | 96 ++----- .../__tests__/comment-media.test.tsx | 8 +- .../comment-media/comment-media.module.css | 48 +++- .../comment-media/comment-media.tsx | 245 +++++------------- .../create-board-modal.module.css | 13 +- .../create-board-modal/create-board-modal.tsx | 30 +-- .../directory-modal.module.css | 26 +- .../directory-modal/directory-modal.tsx | 36 +-- .../disclaimer-modal.module.css | 21 +- .../disclaimer-modal/disclaimer-modal.tsx | 40 ++- src/components/edit-menu/edit-menu.tsx | 75 +++++- src/components/embed/__tests__/embed.test.tsx | 3 +- src/components/embed/embed-utils.ts | 60 +++++ src/components/embed/embed.tsx | 91 ++----- src/components/embed/index.ts | 3 +- src/components/footer/footer.tsx | 2 +- .../markdown/__tests__/markdown.test.tsx | 4 +- .../markdown/external-number-quote-link.tsx | 33 +-- src/components/markdown/markdown.module.css | 13 + src/components/markdown/markdown.tsx | 24 +- .../mod-empty-state.module.css | 1 + .../mod-empty-state/mod-empty-state.tsx | 4 +- src/components/post-author-flags.tsx | 7 +- src/components/post-desktop/post-desktop.tsx | 50 ++-- .../__tests__/post-menu-desktop.test.tsx | 14 +- .../post-menu-desktop.module.css | 31 ++- .../post-menu-desktop/post-menu-desktop.tsx | 65 ++--- src/components/post-form/post-form.tsx | 15 +- .../__tests__/post-menu-mobile.test.tsx | 2 +- .../post-menu-mobile.module.css | 26 +- .../post-menu-mobile/post-menu-mobile.tsx | 64 ++--- src/components/post-mobile/post-mobile.tsx | 34 ++- src/components/reply-modal/reply-modal.tsx | 63 +++-- .../reply-quote-preview.tsx | 4 + .../__tests__/settings-modal.test.tsx | 24 +- .../account-settings/account-settings.tsx | 14 +- .../advanced-settings/advanced-settings.tsx | 20 +- .../crypto-address-setting.tsx | 36 ++- .../crypto-wallets-setting.tsx | 18 +- .../interface-settings/interface-settings.tsx | 21 +- .../media-hosting-settings.tsx | 31 ++- .../__tests__/p2p-stats-settings.test.tsx | 8 +- .../p2p-stats-settings/p2p-stats-settings.tsx | 11 +- .../settings-modal/settings-modal.module.css | 33 ++- .../settings-modal/settings-modal.tsx | 42 +-- .../__tests__/subscriptions-setting.test.tsx | 2 +- .../subscriptions-setting.module.css | 11 + .../subscriptions-setting.tsx | 12 +- .../account-data-editor.tsx | 16 +- src/views/archive/archive.tsx | 2 +- src/views/blotter/blotter.tsx | 2 +- src/views/board/__tests__/board.test.tsx | 4 +- src/views/board/board.module.css | 1 + src/views/board/board.tsx | 54 ++-- src/views/catalog/__tests__/catalog.test.tsx | 9 +- src/views/catalog/catalog-render-feed.ts | 2 + src/views/catalog/catalog.tsx | 58 +++-- .../directory/__tests__/directory.test.tsx | 2 +- src/views/directory/directory.module.css | 9 + src/views/directory/directory.tsx | 6 +- src/views/faq/faq.tsx | 2 +- .../home/boards-list/boards-filter-modal.tsx | 32 +-- src/views/home/box-modal/box-modal.tsx | 26 +- src/views/home/home.module.css | 24 +- src/views/home/home.tsx | 15 +- src/views/mod-queue/mod-queue.tsx | 18 +- src/views/pass/pass.tsx | 4 +- src/views/post/post.module.css | 65 ++++- src/views/post/post.tsx | 12 +- src/views/rules/rules.tsx | 11 +- 132 files changed, 1753 insertions(+), 1224 deletions(-) create mode 100644 src/components/embed/embed-utils.ts create mode 100644 src/views/catalog/catalog-render-feed.ts diff --git a/public/translations/ar/default.json b/public/translations/ar/default.json index fb9fd630..25c4e071 100644 --- a/public/translations/ar/default.json +++ b/public/translations/ar/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "عرض لوحات آمنة للعمل فقط", "show_all_content": "عرض جميع المحتويات", "link_type": "نوع الرابط", - "comment_edited_at_timestamp": "تم تحرير التعليق في <1>{{timestamp}}", - "reason_reason": "السبب: \"{{reason}}\".", - "click_here_to_show_original": "<1>انقر هنا لعرض الأصل.", - "click_here_to_hide_original": "<1>انقر هنا لإخفاء الأصل.", "loading": "جار التحميل", "posted_by": "نشر بواسطة", "by": "بواسطة", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "انتقل إلى <1>الإعدادات لاستيراد حساب المشرف الخاص بك", "post_form_rules_faq_prompt": "يُرجى قراءة القواعد والأسئلة الشائعة قبل النشر.", "pending_mod_approval_reason": "أرسل الإشراف بالذكاء الاصطناعي هذا المنشور إلى قائمة انتظار المشرفين. السبب: \"{{reason}}\".", - "flag": "علم" + "flag": "علم", + "show_replies": "عرض الردود", + "hide_replies": "إخفاء الردود", + "unhide": "إظهار", + "account_data": "بيانات الحساب", + "ban_duration_days": "مدة الحظر بالأيام", + "challenge_answer": "إجابة التحدي", + "ban": "حظر", + "timestamp": "الطابع الزمني" } diff --git a/public/translations/bn/default.json b/public/translations/bn/default.json index fb1f8f11..d4d5bc62 100644 --- a/public/translations/bn/default.json +++ b/public/translations/bn/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "শুধুমাত্র কাজ-সম্পূর্ণ বোর্ড দেখান", "show_all_content": "সমস্ত কন্টেন্ট দেখান", "link_type": "লিংক প্রকার", - "comment_edited_at_timestamp": "<1>{{timestamp}} এ মন্তব্য সম্পাদিত হয়েছে", - "reason_reason": "কারণ: \"{{reason}}\".", - "click_here_to_show_original": "<1>এখানে ক্লিক করুন অসল দেখানোর জন্য।", - "click_here_to_hide_original": "<1>এখানে ক্লিক করুন অসল লুকাতে।", "loading": "লোড হচ্ছে", "posted_by": "পোস্ট করেছেন", "by": "দ্বারা", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "আপনার মড অ্যাকাউন্ট আমদানি করতে <1>সেটিংস-এ যান", "post_form_rules_faq_prompt": "পোস্ট করার আগে নিয়ম এবং প্রশ্নোত্তর পড়ুন।", "pending_mod_approval_reason": "AI মডারেশন এই পোস্টটি মডারেটর কিউতে পাঠিয়েছে। কারণ: \"{{reason}}\".", - "flag": "পতাকা" + "flag": "পতাকা", + "show_replies": "উত্তরগুলি দেখান", + "hide_replies": "উত্তরগুলি লুকান", + "unhide": "লুকানো সরান", + "account_data": "অ্যাকাউন্ট ডেটা", + "ban_duration_days": "ব্যান মেয়াদ দিনে", + "challenge_answer": "চ্যালেঞ্জ উত্তর", + "ban": "নিষেধ করুন", + "timestamp": "টাইমস্ট্যাম্প" } diff --git a/public/translations/cs/default.json b/public/translations/cs/default.json index ed5e0176..0e43bedd 100644 --- a/public/translations/cs/default.json +++ b/public/translations/cs/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Zobrazit pouze bezpečné pracovní desky", "show_all_content": "Zobrazit veškerý obsah", "link_type": "Typ odkazu", - "comment_edited_at_timestamp": "Komentář byl upraven dne <1>{{timestamp}}", - "reason_reason": "Důvod: \"{{reason}}\".", - "click_here_to_show_original": "Klikněte <1>zde pro zobrazení původního.", - "click_here_to_hide_original": "Klikněte <1>zde pro skrytí původního.", "loading": "Načítání", "posted_by": "Publikoval(a)", "by": "od", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Přejděte do <1>nastavení a importujte svůj moderátorský účet", "post_form_rules_faq_prompt": "Před odesláním si přečtěte Pravidla a FAQ.", "pending_mod_approval_reason": "AI moderace odeslala tento příspěvek do fronty moderátorů. Důvod: \"{{reason}}\".", - "flag": "Vlajka" + "flag": "Vlajka", + "show_replies": "Zobrazit odpovědi", + "hide_replies": "skrýt odpovědi", + "unhide": "odkrýt", + "account_data": "data účtu", + "ban_duration_days": "doba zákazu v dnech", + "challenge_answer": "odpověď na výzvu", + "ban": "zakázat", + "timestamp": "časové razítko" } diff --git a/public/translations/da/default.json b/public/translations/da/default.json index 39b15192..2cefbb46 100644 --- a/public/translations/da/default.json +++ b/public/translations/da/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Vis kun Worksafe boards", "show_all_content": "Vis alt indhold", "link_type": "Link type", - "comment_edited_at_timestamp": "Kommentaren blev redigeret den <1>{{timestamp}}", - "reason_reason": "Grund: \"{{reason}}\".", - "click_here_to_show_original": "<1>Klik her for at vise originalen.", - "click_here_to_hide_original": "<1>Klik her for at skjule originalen.", "loading": "Indlæser", "posted_by": "Skrevet af", "by": "af", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Gå til <1>indstillinger for at importere din mod-konto", "post_form_rules_faq_prompt": "Læs venligst Reglerne og FAQ, før du poster.", "pending_mod_approval_reason": "AI-moderering sendte dette opslag til moderatorkøen. Grund: \"{{reason}}\".", - "flag": "Flag" + "flag": "Flag", + "show_replies": "Vis svar", + "hide_replies": "skjul svar", + "unhide": "unhide", + "account_data": "kontodata", + "ban_duration_days": "banvarighed i dage", + "challenge_answer": "svar på udfordring", + "ban": "forbyd", + "timestamp": "tidsstempel" } diff --git a/public/translations/de/default.json b/public/translations/de/default.json index 2427f2cc..43de0d67 100644 --- a/public/translations/de/default.json +++ b/public/translations/de/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Nur sichere Boards anzeigen", "show_all_content": "Alle Inhalte anzeigen", "link_type": "Linktyp", - "comment_edited_at_timestamp": "Kommentar bearbeitet am <1>{{timestamp}}", - "reason_reason": "Grund: \"{{reason}}\".", - "click_here_to_show_original": "<1>Hier klicken, um das Original anzuzeigen.", - "click_here_to_hide_original": "<1>Hier klicken, um das Original zu verstecken.", "loading": "Laden", "posted_by": "Geschrieben von", "by": "von", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Gehe zu <1>Einstellungen, um dein Moderatorkonto zu importieren", "post_form_rules_faq_prompt": "Bitte lesen Sie die Regeln und die FAQ, bevor Sie posten.", "pending_mod_approval_reason": "Die KI-Moderation hat diesen Beitrag in die Moderationswarteschlange verschoben. Grund: \"{{reason}}\".", - "flag": "Flagge" + "flag": "Flagge", + "show_replies": "Antworten anzeigen", + "hide_replies": "Antworten ausblenden", + "unhide": "einblenden", + "account_data": "kontodaten", + "ban_duration_days": "bannierungsdauer in tagen", + "challenge_answer": "herausforderungsantwort", + "ban": "sperren", + "timestamp": "Zeitstempel" } diff --git a/public/translations/el/default.json b/public/translations/el/default.json index b25136c9..256a9f9e 100644 --- a/public/translations/el/default.json +++ b/public/translations/el/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Εμφάνιση μόνο ασφαλών πινάκων εργασίας", "show_all_content": "Εμφάνιση όλων των περιεχομένων", "link_type": "Τύπος συνδέσμου", - "comment_edited_at_timestamp": "Σχόλιο επεξεργασμένο στις <1>{{timestamp}}", - "reason_reason": "Λόγος: \"{{reason}}\".", - "click_here_to_show_original": "<1>Κάντε κλικ εδώ για να εμφανιστεί το αρχικό.", - "click_here_to_hide_original": "<1>Κάντε κλικ εδώ για να κρύψετε το αρχικό.", "loading": "Φόρτωση", "posted_by": "Δημοσιεύτηκε από", "by": "από", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Μεταβείτε στις <1>ρυθμίσεις για να εισαγάγετε τον λογαριασμό διαχειριστή σας", "post_form_rules_faq_prompt": "Παρακαλώ διαβάστε τους Κανόνες και τις Συχνές ερωτήσεις πριν δημοσιεύσετε.", "pending_mod_approval_reason": "Η εποπτεία AI έστειλε αυτή την ανάρτηση στην ουρά των συντονιστών. Λόγος: \"{{reason}}\".", - "flag": "Σημαία" + "flag": "Σημαία", + "show_replies": "Εμφάνιση απαντήσεων", + "hide_replies": "Απόκρυψη απαντήσεων", + "unhide": "εμφάνιση", + "account_data": "δεδομένα λογαριασμού", + "ban_duration_days": "διάρκεια απαγόρευσης σε ημέρες", + "challenge_answer": "απάντηση πρόκλησης", + "ban": "απαγόρευση", + "timestamp": "χρονοσήμανση" } diff --git a/public/translations/en/default.json b/public/translations/en/default.json index 0be4c552..86a5bf99 100644 --- a/public/translations/en/default.json +++ b/public/translations/en/default.json @@ -162,10 +162,6 @@ "nsfw_boards_only": "NSFW Boards Only", "worksafe_boards_only": "Worksafe Boards Only", "link_type": "Link type", - "comment_edited_at_timestamp": "Comment edited at <1>{{timestamp}}", - "reason_reason": "Reason: \"{{reason}}\".", - "click_here_to_show_original": "<1>Click here to show the original.", - "click_here_to_hide_original": "<1>Click here to hide the original.", "loading": "Loading", "posted_by": "Posted by", "by": "by", @@ -412,5 +408,13 @@ "board_address_unverified_warning": "This board address is not verified. The board owner might not own this address.", "post_form_rules_faq_prompt": "Please read the Rules and FAQ before posting.", "pending_mod_approval_reason": "AI moderation sent this post to the mod queue. Reason: \"{{reason}}\".", - "flag": "Flag" + "flag": "Flag", + "show_replies": "show replies", + "hide_replies": "hide replies", + "unhide": "unhide", + "account_data": "account data", + "ban_duration_days": "ban duration in days", + "challenge_answer": "challenge answer", + "ban": "ban", + "timestamp": "timestamp" } diff --git a/public/translations/es/default.json b/public/translations/es/default.json index d5ea20ac..be0682a1 100644 --- a/public/translations/es/default.json +++ b/public/translations/es/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Mostrar solo tableros seguros para el trabajo", "show_all_content": "Mostrar todo el contenido", "link_type": "Tipo de enlace", - "comment_edited_at_timestamp": "Comentario editado el <1>{{timestamp}}", - "reason_reason": "Motivo: \"{{reason}}\".", - "click_here_to_show_original": "<1>Haga clic aquí para mostrar el original.", - "click_here_to_hide_original": "<1>Haga clic aquí para ocultar el original.", "loading": "Cargando", "posted_by": "Publicado por", "by": "por", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Ve a <1>configuración para importar tu cuenta de moderador", "post_form_rules_faq_prompt": "Por favor, lee las Reglas y las FAQ antes de publicar.", "pending_mod_approval_reason": "La moderación con IA envió esta publicación a la cola de moderación. Motivo: \"{{reason}}\".", - "flag": "Bandera" + "flag": "Bandera", + "show_replies": "mostrar respuestas", + "hide_replies": "ocultar respuestas", + "unhide": "mostrar", + "account_data": "datos de cuenta", + "ban_duration_days": "duración del baneo en días", + "challenge_answer": "respuesta del desafío", + "ban": "prohibir", + "timestamp": "marca de tiempo" } diff --git a/public/translations/fa/default.json b/public/translations/fa/default.json index 986f8f46..eb474882 100644 --- a/public/translations/fa/default.json +++ b/public/translations/fa/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "نمایش تنها بوردهای ایمن برای کار", "show_all_content": "نمایش تمام محتوا", "link_type": "نوع پیوند", - "comment_edited_at_timestamp": "نظر ویرایش شده در <1>{{timestamp}}", - "reason_reason": "دلیل: \"{{reason}}\".", - "click_here_to_show_original": "<1>برای نمایش اصلی اینجا کلیک کنید.", - "click_here_to_hide_original": "<1>برای پنهان کردن اصل اینجا کلیک کنید.", "loading": "در حال بارگذاری", "posted_by": "ارسال شده توسط", "by": "توسط", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "برای وارد کردن حساب مدیر خود به <1>تنظیمات بروید", "post_form_rules_faq_prompt": "لطفاً قبل از ارسال قوانین و پرسش‌های متداول را بخوانید.", "pending_mod_approval_reason": "مدیریت با هوش مصنوعی این پست را به صف مدیران فرستاد. دلیل: \"{{reason}}\".", - "flag": "پرچم" + "flag": "پرچم", + "show_replies": "نمایش پاسخ‌ها", + "hide_replies": "پنهان کردن پاسخ‌ها", + "unhide": "نمایش دادن", + "account_data": "داده‌های حساب", + "ban_duration_days": "مدت بن به روز", + "challenge_answer": "پاسخ چالش", + "ban": "مسدود کردن", + "timestamp": "مهر زمان" } diff --git a/public/translations/fi/default.json b/public/translations/fi/default.json index fc7688b3..56a35535 100644 --- a/public/translations/fi/default.json +++ b/public/translations/fi/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Näytä vain työturvalliset hallit", "show_all_content": "Näytä kaikki sisällöt", "link_type": "Linkin tyyppi", - "comment_edited_at_timestamp": "Kommentti muokattu <1>{{timestamp}}", - "reason_reason": "Syy: \"{{reason}}\".", - "click_here_to_show_original": "<1>Klikkaa tästä näyttääksesi alkuperäisen.", - "click_here_to_hide_original": "<1>Klikkaa tästä piilottaaksesi alkuperäisen.", "loading": "Lataa", "posted_by": "Lähettäjä", "by": "kirjoittanut", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Siirry <1>asetuksiin tuodaksesi moderaattoritilisi", "post_form_rules_faq_prompt": "Lue Säännöt ja UKK ennen julkaisemista.", "pending_mod_approval_reason": "Tekoälymoderointi lähetti tämän viestin moderointijonoon. Syy: \"{{reason}}\".", - "flag": "Lippu" + "flag": "Lippu", + "show_replies": "Näytä vastaukset", + "hide_replies": "piilota vastaukset", + "unhide": "paljasta", + "account_data": "tilin tiedot", + "ban_duration_days": "kiellon kesto päivissä", + "challenge_answer": "haasteen vastaus", + "ban": "kielto", + "timestamp": "aikaleimaustiedosto" } diff --git a/public/translations/fil/default.json b/public/translations/fil/default.json index 735dc7a1..9410ff0f 100644 --- a/public/translations/fil/default.json +++ b/public/translations/fil/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Ipakita lamang ang mga Worksafe boards", "show_all_content": "Ipakita lahat ng nilalaman", "link_type": "Uri ng Link", - "comment_edited_at_timestamp": "Na-edit ang komento sa <1>{{timestamp}}", - "reason_reason": "Dahilan: \"{{reason}}\".", - "click_here_to_show_original": "<1>I-click dito upang ipakita ang orihinal.", - "click_here_to_hide_original": "<1>I-click dito upang itago ang orihinal.", "loading": "Naglo-load", "posted_by": "Nai-post ni", "by": "ni", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Pumunta sa <1>mga setting para i-import ang iyong mod account", "post_form_rules_faq_prompt": "Pakibasa ang Rules at FAQ bago mag-post.", "pending_mod_approval_reason": "Ipinadala ng AI moderation ang post na ito sa mod queue. Dahilan: \"{{reason}}\".", - "flag": "Bandila" + "flag": "Bandila", + "show_replies": "Ipakita ang mga sagot", + "hide_replies": "itago ang mga sagot", + "unhide": "ipakita", + "account_data": "data ng account", + "ban_duration_days": "tagal ng ban sa araw", + "challenge_answer": "sagot sa hamon", + "ban": "ipagbawal", + "timestamp": "timestamp" } diff --git a/public/translations/fr/default.json b/public/translations/fr/default.json index ed8bf97b..b86ba1f4 100644 --- a/public/translations/fr/default.json +++ b/public/translations/fr/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Afficher uniquement les tableaux Worksafe", "show_all_content": "Afficher tout le contenu", "link_type": "Type de lien", - "comment_edited_at_timestamp": "Commentaire modifié le <1>{{timestamp}}", - "reason_reason": "Raison: \"{{reason}}\".", - "click_here_to_show_original": "<1>Cliquez ici pour afficher l'original.", - "click_here_to_hide_original": "<1>Cliquez ici pour masquer l'original.", "loading": "Chargement", "posted_by": "Posté par", "by": "par", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Allez dans les <1>paramètres pour importer votre compte de modération", "post_form_rules_faq_prompt": "Veuillez lire le Règlement et la FAQ avant de publier.", "pending_mod_approval_reason": "La modération par IA a envoyé ce post dans la file de modération. Raison: \"{{reason}}\".", - "flag": "Drapeau" + "flag": "Drapeau", + "show_replies": "afficher les réponses", + "hide_replies": "masquer les réponses", + "unhide": "afficher", + "account_data": "données du compte", + "ban_duration_days": "durée du bannissement en jours", + "challenge_answer": "réponse au défi", + "ban": "interdire", + "timestamp": "horodatage" } diff --git a/public/translations/he/default.json b/public/translations/he/default.json index 39c82ec7..9a6d8325 100644 --- a/public/translations/he/default.json +++ b/public/translations/he/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "הצג לוחות עבודה בטוחים בלבד", "show_all_content": "הצג את כל התוכן", "link_type": "סוג קישור", - "comment_edited_at_timestamp": "התגובה נערכה ב-<1>{{timestamp}}", - "reason_reason": "סיבה: \"{{reason}}\".", - "click_here_to_show_original": "<1>לחץ כאן כדי להציג את המקור.", - "click_here_to_hide_original": "<1>לחץ כאן כדי להסתיר את המקור.", "loading": "טוען", "posted_by": "פורסם על ידי", "by": "על ידי", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "עבור אל <1>הגדרות כדי לייבא את חשבון המוד שלך", "post_form_rules_faq_prompt": "אנא קרא את הכללים ואת שאלות נפוצות לפני פרסום.", "pending_mod_approval_reason": "סינון ה-AI שלח את הפוסט הזה לתור המודרציה. סיבה: \"{{reason}}\".", - "flag": "דגל" + "flag": "דגל", + "show_replies": "הצג תגובות", + "hide_replies": "הסתרת תגובות", + "unhide": "הצג", + "account_data": "נתוני חשבון", + "ban_duration_days": "משך הבן בימים", + "challenge_answer": "תשובת אתגר", + "ban": "חסימה", + "timestamp": "חותמת זמן" } diff --git a/public/translations/hi/default.json b/public/translations/hi/default.json index 28945024..3aca4ada 100644 --- a/public/translations/hi/default.json +++ b/public/translations/hi/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "केवल कामसुरक्षित बोर्ड्स दिखाएं", "show_all_content": "सभी सामग्री दिखाएं", "link_type": "लिंक प्रकार", - "comment_edited_at_timestamp": "<1>{{timestamp}} पर टिप्पणी संपादित की गई", - "reason_reason": "कारण: \"{{reason}}\".", - "click_here_to_show_original": "<1>यहां क्लिक करें मूल दिखाने के लिए।", - "click_here_to_hide_original": "<1>यहां क्लिक करें मूल छुपाने के लिए।", "loading": "लोड हो रहा है", "posted_by": "द्वारा लिखित", "by": "द्वारा", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "अपना मॉड खाता इम्पोर्ट करने के लिए <1>सेटिंग्स पर जाएं", "post_form_rules_faq_prompt": "पोस्ट करने से पहले कृपया नियम और अक्सर पूछे जाने वाले सवाल पढ़ें।", "pending_mod_approval_reason": "AI मॉडरेशन ने इस पोस्ट को मॉड कतार में भेजा। कारण: \"{{reason}}\".", - "flag": "ध्वज" + "flag": "ध्वज", + "show_replies": "उत्तर दिखाएं", + "hide_replies": "जवाब छुपाएं", + "unhide": "दिखाएं", + "account_data": "खाता डेटा", + "ban_duration_days": "प्रतिबंध की अवधि दिनों में", + "challenge_answer": "चुनौती उत्तर", + "ban": "प्रतिबंध", + "timestamp": "टाइमस्टैंप" } diff --git a/public/translations/hu/default.json b/public/translations/hu/default.json index a28e015a..9c2916f2 100644 --- a/public/translations/hu/default.json +++ b/public/translations/hu/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Csak munkabiztos táblák mutatása", "show_all_content": "Mutasd az összes tartalmat", "link_type": "Link típusa", - "comment_edited_at_timestamp": "Megjegyzés szerkesztve ekkor: <1>{{timestamp}}", - "reason_reason": "Ok: \"{{reason}}\".", - "click_here_to_show_original": "<1>Kattints ide az eredeti megjelenítéséhez.", - "click_here_to_hide_original": "<1>Kattints ide az eredeti elrejtéséhez.", "loading": "Betöltés", "posted_by": "Írta", "by": "által", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Lépj a <1>beállítások menübe a moderátori fiókod importálásához", "post_form_rules_faq_prompt": "Kérjük, olvasd el a Szabályokat és a GYIK-et posztolás előtt.", "pending_mod_approval_reason": "Az AI-moderáció ezt a bejegyzést a moderátori várólistára küldte. Ok: \"{{reason}}\".", - "flag": "Zászló" + "flag": "Zászló", + "show_replies": "Válaszok megjelenítése", + "hide_replies": "válaszok elrejtése", + "unhide": "mutat", + "account_data": "fiókadat", + "ban_duration_days": "kitiltás időtartama napokban", + "challenge_answer": "kihívás válasza", + "ban": "tiltás", + "timestamp": "időbélyeg" } diff --git a/public/translations/id/default.json b/public/translations/id/default.json index b9a130b4..cc58d8a2 100644 --- a/public/translations/id/default.json +++ b/public/translations/id/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Tampilkan Hanya Board Worksafe", "show_all_content": "Tampilkan Semua Konten", "link_type": "Tipe tautan", - "comment_edited_at_timestamp": "Komentar diedit pada <1>{{timestamp}}", - "reason_reason": "Alasan: \"{{reason}}\".", - "click_here_to_show_original": "<1>Klik di sini untuk menampilkan aslinya.", - "click_here_to_hide_original": "<1>Klik di sini untuk menyembunyikan aslinya.", "loading": "Memuat", "posted_by": "Diposting oleh", "by": "oleh", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Buka <1>pengaturan untuk mengimpor akun mod Anda", "post_form_rules_faq_prompt": "Silakan baca Aturan dan FAQ sebelum memposting.", "pending_mod_approval_reason": "Moderasi AI mengirim postingan ini ke antrean moderator. Alasan: \"{{reason}}\".", - "flag": "Bendera" + "flag": "Bendera", + "show_replies": "Tampilkan balasan", + "hide_replies": "sembunyikan balasan", + "unhide": "tampilkan", + "account_data": "data akun", + "ban_duration_days": "durasi larangan dalam hari", + "challenge_answer": "jawaban tantangan", + "ban": "larangan", + "timestamp": "stempel waktu" } diff --git a/public/translations/it/default.json b/public/translations/it/default.json index 28845597..f2360635 100644 --- a/public/translations/it/default.json +++ b/public/translations/it/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Mostra solo le board Worksafe", "show_all_content": "Mostra tutti i contenuti", "link_type": "Tipo di link", - "comment_edited_at_timestamp": "Commento modificato il <1>{{timestamp}}", - "reason_reason": "Motivo: \"{{reason}}\".", - "click_here_to_show_original": "<1>Clicca qui per mostrare l'originale.", - "click_here_to_hide_original": "<1>Clicca qui per nascondere l'originale.", "loading": "Caricamento", "posted_by": "Pubblicato da", "by": "da", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Vai alle <1>impostazioni per importare il tuo account mod", "post_form_rules_faq_prompt": "Leggi le Regole e le FAQ prima di pubblicare.", "pending_mod_approval_reason": "La moderazione AI ha inviato questo post alla coda di moderazione. Motivo: \"{{reason}}\".", - "flag": "Bandiera" + "flag": "Bandiera", + "show_replies": "mostra risposte", + "hide_replies": "nascondi risposte", + "unhide": "mostra", + "account_data": "dati account", + "ban_duration_days": "durata del ban in giorni", + "challenge_answer": "risposta alla sfida", + "ban": "vietare", + "timestamp": "marca temporale" } diff --git a/public/translations/ja/default.json b/public/translations/ja/default.json index 906fd3a3..aa167399 100644 --- a/public/translations/ja/default.json +++ b/public/translations/ja/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Worksafeボードのみ表示", "show_all_content": "すべてのコンテンツを表示", "link_type": "リンクの種類", - "comment_edited_at_timestamp": "<1>{{timestamp}} にコメントを編集しました", - "reason_reason": "理由: \"{{reason}}\".", - "click_here_to_show_original": "<1>ここをクリック して元の表示。", - "click_here_to_hide_original": "<1>ここをクリック して元を非表示にする。", "loading": "読み込み中", "posted_by": "投稿者", "by": "によって", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "モデレーターアカウントをインポートするには<1>設定に移動してください", "post_form_rules_faq_prompt": "投稿する前にルールFAQをお読みください。", "pending_mod_approval_reason": "AIモデレーションがこの投稿をモデレーターキューに送りました。理由: \"{{reason}}\".", - "flag": "旗" + "flag": "旗", + "show_replies": "返信を表示", + "hide_replies": "返信を非表示", + "unhide": "表示", + "account_data": "アカウントデータ", + "ban_duration_days": "バン期間(日数)", + "challenge_answer": "チャレンジ回答", + "ban": "ブロック", + "timestamp": "タイムスタンプ" } diff --git a/public/translations/ko/default.json b/public/translations/ko/default.json index c841af09..59b9b40a 100644 --- a/public/translations/ko/default.json +++ b/public/translations/ko/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "작업 안전 보드만 표시", "show_all_content": "모든 콘텐츠 보기", "link_type": "링크 유형", - "comment_edited_at_timestamp": "댓글 편집 시간: <1>{{timestamp}}", - "reason_reason": "이유: \"{{reason}}\".", - "click_here_to_show_original": "<1>여기를 클릭 하여 원본 표시.", - "click_here_to_hide_original": "<1>여기를 클릭 하여 원본 숨기기.", "loading": "로딩 중", "posted_by": "작성자", "by": "작성자:", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "관리자 계정을 가져오려면 <1>설정으로 이동하세요", "post_form_rules_faq_prompt": "게시하기 전에 규칙FAQ을 읽어 주세요.", "pending_mod_approval_reason": "AI 모더레이션이 이 게시물을 모더레이터 대기열로 보냈습니다. 이유: \"{{reason}}\".", - "flag": "깃발" + "flag": "깃발", + "show_replies": "답글 표시", + "hide_replies": "답글 숨기기", + "unhide": "표시", + "account_data": "계정 데이터", + "ban_duration_days": "차단 기간(일)", + "challenge_answer": "챌린지 답변", + "ban": "차단", + "timestamp": "타임스탬프" } diff --git a/public/translations/mr/default.json b/public/translations/mr/default.json index ffefbfaa..142c6994 100644 --- a/public/translations/mr/default.json +++ b/public/translations/mr/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "केवळ कामसुरक्षित बोर्ड्स दाखवा", "show_all_content": "सर्व सामग्री दाखवा", "link_type": "लिंक प्रकार", - "comment_edited_at_timestamp": "<1>{{timestamp}} ला संपादित केला", - "reason_reason": "कारण: \"{{reason}}\".", - "click_here_to_show_original": "<1>येथे क्लिक करा मूळ पाहण्यासाठी।", - "click_here_to_hide_original": "<1>येथे क्लिक करा मूळ लपविण्यासाठी।", "loading": "लोड होत आहे", "posted_by": "ने टप्पल केला", "by": "व्यक्ती", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "तुमचे मॉड खाते आयात करण्यासाठी <1>सेटिंग्ज वर जा", "post_form_rules_faq_prompt": "पोस्ट करण्यापूर्वी नियम आणि वारंवार विचारले जाणारे प्रश्न वाचा.", "pending_mod_approval_reason": "AI मॉडरेशनने ही पोस्ट मॉड कतारमध्ये पाठवली. कारण: \"{{reason}}\".", - "flag": "ध्वज" + "flag": "ध्वज", + "show_replies": "उत्तरे दर्शवा", + "hide_replies": "उत्तरे लपवा", + "unhide": "दाखवा", + "account_data": "खाता डेटा", + "ban_duration_days": "बंद मुदत दिवसांमध्ये", + "challenge_answer": "आव्हान उत्तर", + "ban": "प्रतिबंध", + "timestamp": "टाइमस्टॅम्प" } diff --git a/public/translations/nl/default.json b/public/translations/nl/default.json index 8483d981..d3d6d222 100644 --- a/public/translations/nl/default.json +++ b/public/translations/nl/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Toon alleen Worksafe boards", "show_all_content": "Toon alle inhoud", "link_type": "Link type", - "comment_edited_at_timestamp": "Reactie bewerkt op <1>{{timestamp}}", - "reason_reason": "Reden: \"{{reason}}\".", - "click_here_to_show_original": "<1>Klik hier om de originele te tonen.", - "click_here_to_hide_original": "<1>Klik hier om de originele te verbergen.", "loading": "Laden", "posted_by": "Geplaatst door", "by": "door", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Ga naar <1>instellingen om je mod-account te importeren", "post_form_rules_faq_prompt": "Lees de Regels en de FAQ voordat je plaatst.", "pending_mod_approval_reason": "AI-moderatie heeft dit bericht naar de moderatiewachtrij gestuurd. Reden: \"{{reason}}\".", - "flag": "Vlag" + "flag": "Vlag", + "show_replies": "antwoorden weergeven", + "hide_replies": "reacties verbergen", + "unhide": "weergeven", + "account_data": "accountgegevens", + "ban_duration_days": "banningsduur in dagen", + "challenge_answer": "antwoord op uitdaging", + "ban": "verbannen", + "timestamp": "tijdstempel" } diff --git a/public/translations/no/default.json b/public/translations/no/default.json index fe6ec26b..d0c16b40 100644 --- a/public/translations/no/default.json +++ b/public/translations/no/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Vis kun Worksafe boards", "show_all_content": "Vis allt innhold", "link_type": "Lenketype", - "comment_edited_at_timestamp": "Kommentaren ble redigert på <1>{{timestamp}}", - "reason_reason": "Årsak: \"{{reason}}\".", - "click_here_to_show_original": "<1>Klikk her for å vise originalen.", - "click_here_to_hide_original": "<1>Klikk her for å skjule originalen.", "loading": "Laster", "posted_by": "Skrevet av", "by": "av", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Gå til <1>innstillinger for å importere modkontoen din", "post_form_rules_faq_prompt": "Vennligst les Reglene og FAQ før du poster.", "pending_mod_approval_reason": "AI-moderering sendte dette innlegget til moderatorkøen. Årsak: \"{{reason}}\".", - "flag": "Flagg" + "flag": "Flagg", + "show_replies": "vis svar", + "hide_replies": "skjul svar", + "unhide": "vis", + "account_data": "kontodata", + "ban_duration_days": "bannvarighet i dager", + "challenge_answer": "svar på utfordring", + "ban": "forbud", + "timestamp": "tidsstempel" } diff --git a/public/translations/pl/default.json b/public/translations/pl/default.json index 4932bb70..62b3a662 100644 --- a/public/translations/pl/default.json +++ b/public/translations/pl/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Pokaż tylko bezpieczne tablice", "show_all_content": "Pokaż całą zawartość", "link_type": "Typ łącza", - "comment_edited_at_timestamp": "Komentarz edytowany <1>{{timestamp}}", - "reason_reason": "Powód: \"{{reason}}\".", - "click_here_to_show_original": "<1>Kliknij tutaj, aby pokazać oryginał.", - "click_here_to_hide_original": "<1>Kliknij tutaj, aby ukryć oryginał.", "loading": "Ładowanie", "posted_by": "Opublikowane przez", "by": "przez", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Przejdź do <1>ustawień, aby zaimportować swoje konto moderatora", "post_form_rules_faq_prompt": "Przed opublikowaniem przeczytaj Zasady i FAQ.", "pending_mod_approval_reason": "Moderacja AI wysłała ten post do kolejki moderatorów. Powód: \"{{reason}}\".", - "flag": "Flaga" + "flag": "Flaga", + "show_replies": "Pokaż odpowiedzi", + "hide_replies": "ukryj odpowiedzi", + "unhide": "pokaż", + "account_data": "dane konta", + "ban_duration_days": "czas trwania banu w dniach", + "challenge_answer": "odpowiedź na wyzwanie", + "ban": "zbanować", + "timestamp": "znacznik czasu" } diff --git a/public/translations/pt/default.json b/public/translations/pt/default.json index 91bde7cc..491378f3 100644 --- a/public/translations/pt/default.json +++ b/public/translations/pt/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Mostrar apenas boards Worksafe", "show_all_content": "Mostrar Todo o Conteúdo", "link_type": "Tipo de link", - "comment_edited_at_timestamp": "Comentário editado em <1>{{timestamp}}", - "reason_reason": "Razão: \"{{reason}}\".", - "click_here_to_show_original": "<1>Clique aqui para mostrar o original.", - "click_here_to_hide_original": "<1>Clique aqui para ocultar o original.", "loading": "Carregando", "posted_by": "Postado por", "by": "por", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Vá para <1>configurações para importar sua conta de mod", "post_form_rules_faq_prompt": "Leia as Regras e as FAQ antes de publicar.", "pending_mod_approval_reason": "A moderação por IA enviou esta postagem para a fila de moderação. Razão: \"{{reason}}\".", - "flag": "Bandeira" + "flag": "Bandeira", + "show_replies": "mostrar respostas", + "hide_replies": "ocultar respostas", + "unhide": "mostrar", + "account_data": "dados da conta", + "ban_duration_days": "duração do banimento em dias", + "challenge_answer": "resposta do desafio", + "ban": "banir", + "timestamp": "marca de tempo" } diff --git a/public/translations/ro/default.json b/public/translations/ro/default.json index 9fec568a..dec40c4c 100644 --- a/public/translations/ro/default.json +++ b/public/translations/ro/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Afișați doar tablourile Worksafe", "show_all_content": "Afișați tot conținutul", "link_type": "Tipul linkului", - "comment_edited_at_timestamp": "Comentariu editat la <1>{{timestamp}}", - "reason_reason": "Motiv: \"{{reason}}\".", - "click_here_to_show_original": "<1>Click aici pentru a arăta originalul.", - "click_here_to_hide_original": "<1>Click aici pentru a ascunde originalul.", "loading": "Încărcare", "posted_by": "Postat de", "by": "de către", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Accesează <1>setările pentru a importa contul tău de moderator", "post_form_rules_faq_prompt": "Citește Regulile și Întrebările frecvente înainte de a publica.", "pending_mod_approval_reason": "Moderarea AI a trimis această postare în coada moderatorilor. Motiv: \"{{reason}}\".", - "flag": "Steag" + "flag": "Steag", + "show_replies": "arată răspunsuri", + "hide_replies": "ascunde răspunsuri", + "unhide": "afișează", + "account_data": "date cont", + "ban_duration_days": "durata banului în zile", + "challenge_answer": "răspunsul la provocare", + "ban": "interzice", + "timestamp": "marcă de timp" } diff --git a/public/translations/ru/default.json b/public/translations/ru/default.json index a993ba38..2707ffef 100644 --- a/public/translations/ru/default.json +++ b/public/translations/ru/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Показывать только безопасные доски", "show_all_content": "Показать весь контент", "link_type": "Тип ссылки", - "comment_edited_at_timestamp": "Комментарий изменен в <1>{{timestamp}}", - "reason_reason": "Причина: \"{{reason}}\".", - "click_here_to_show_original": "<1>Нажмите здесь для отображения оригинала.", - "click_here_to_hide_original": "<1>Нажмите здесь чтобы скрыть оригинал.", "loading": "Загрузка", "posted_by": "Опубликовано", "by": "от", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Перейдите в <1>настройки, чтобы импортировать свой аккаунт модератора", "post_form_rules_faq_prompt": "Пожалуйста, прочитайте Правила и FAQ перед публикацией.", "pending_mod_approval_reason": "ИИ-модерация отправила этот пост в очередь модераторов. Причина: \"{{reason}}\".", - "flag": "Флаг" + "flag": "Флаг", + "show_replies": "показать ответы", + "hide_replies": "скрыть ответы", + "unhide": "показать", + "account_data": "данные аккаунта", + "ban_duration_days": "продолжительность бана в днях", + "challenge_answer": "ответ на задачу", + "ban": "блокировка", + "timestamp": "временная метка" } diff --git a/public/translations/sq/default.json b/public/translations/sq/default.json index c85fab2b..a50991bb 100644 --- a/public/translations/sq/default.json +++ b/public/translations/sq/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Shfaq vetëm taulat e sigurta të punës", "show_all_content": "Shfaq të gjitha përmbajtjet", "link_type": "Lloji i lidhjes", - "comment_edited_at_timestamp": "Komenti u redaktua në <1>{{timestamp}}", - "reason_reason": "Arsye: \"{{reason}}\".", - "click_here_to_show_original": "<1>Kliko këtu për të treguar origjinalin.", - "click_here_to_hide_original": "<1>Kliko këtu për të fshehur origjinalin.", "loading": "Ngarkimi", "posted_by": "Postuar nga", "by": "nga", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Shkoni te <1>parametrat për të importuar llogarinë tuaj të modit", "post_form_rules_faq_prompt": "Ju lutemi lexoni Rregullat dhe Pyetjet e shpeshta para se të postoni.", "pending_mod_approval_reason": "Moderimi me AI e dërgoi këtë postim në radhën e moderatorëve. Arsye: \"{{reason}}\".", - "flag": "Flamur" + "flag": "Flamur", + "show_replies": "Shfaq përgjigjet", + "hide_replies": "fsheh përgjigjet", + "unhide": "shfaq", + "account_data": "të dhënat e llogarisë", + "ban_duration_days": "kohëzgjatja e ndalimit në ditë", + "challenge_answer": "përgjigje ndaj sfidës", + "ban": "ndalim", + "timestamp": "vulë kohe" } diff --git a/public/translations/sv/default.json b/public/translations/sv/default.json index df997b79..c085d8f5 100644 --- a/public/translations/sv/default.json +++ b/public/translations/sv/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Visa endast Worksafe-styrelser", "show_all_content": "Visa allt innehåll", "link_type": "Länktyp", - "comment_edited_at_timestamp": "Kommentar redigerad vid <1>{{timestamp}}", - "reason_reason": "Anledning: \"{{reason}}\".", - "click_here_to_show_original": "<1>Klicka här för att visa original.", - "click_here_to_hide_original": "<1>Klicka här för att dölja original.", "loading": "Laddar", "posted_by": "Postat av", "by": "av", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Gå till <1>inställningar för att importera ditt modkonto", "post_form_rules_faq_prompt": "Läs Reglerna och FAQ innan du postar.", "pending_mod_approval_reason": "AI-moderering skickade det här inlägget till moderatorkön. Anledning: \"{{reason}}\".", - "flag": "Flagga" + "flag": "Flagga", + "show_replies": "visa svar", + "hide_replies": "dölj svar", + "unhide": "visa", + "account_data": "kontoupplysningar", + "ban_duration_days": "bannlängd i dagar", + "challenge_answer": "svar på utmaning", + "ban": "förbjud", + "timestamp": "tidsstämpel" } diff --git a/public/translations/te/default.json b/public/translations/te/default.json index 615b32de..889e6df9 100644 --- a/public/translations/te/default.json +++ b/public/translations/te/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "పనిమాడు భద్రపరిచిన బోర్డులను మాత్రమే చూపించు", "show_all_content": "అన్ని కాంటెంట్ చూపించు", "link_type": "లింక్ రకం", - "comment_edited_at_timestamp": "<1>{{timestamp}} లో సమీక్ష సవరించబడింది", - "reason_reason": "కారణం: \"{{reason}}\".", - "click_here_to_show_original": "<1>ఇక్కడ క్లిక్ చేయండి అసలు చూపించడానికి.", - "click_here_to_hide_original": "<1>ఇక్కడ క్లిక్ చేయండి అసలు దాచడానికి.", "loading": "లోడ్ అవుతోంది", "posted_by": "పోస్ట్ చేసినవాడు", "by": "ద్వారా", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "మీ మోడ్ ఖాతాను దిగుమతి చేయడానికి <1>అమరికలుకి వెళ్లండి", "post_form_rules_faq_prompt": "పోస్ట్ చేయడానికి ముందు నియమాలు మరియు తరచుగా అడిగే ప్రశ్నలు చదవండి.", "pending_mod_approval_reason": "AI మోడరేషన్ ఈ పోస్ట్‌ను మోడరేటర్ క్యూకు పంపింది. కారణం: \"{{reason}}\".", - "flag": "జెండా" + "flag": "జెండా", + "show_replies": "సమాధానాలను చూపించు", + "hide_replies": "సమాధానలను దాచు", + "unhide": "చూపించు", + "account_data": "ఖాతా డేటా", + "ban_duration_days": "నిషేధ వ్యవధి రోజుల్లో", + "challenge_answer": "సవాలు సమాధానం", + "ban": "నిషేధం", + "timestamp": "టైమ్‌స్టాంప్" } diff --git a/public/translations/th/default.json b/public/translations/th/default.json index 626e3b84..49a9aa98 100644 --- a/public/translations/th/default.json +++ b/public/translations/th/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "แสดงบอร์ด Worksafe เท่านั้น", "show_all_content": "แสดงเนื้อหาทั้งหมด", "link_type": "ประเภทลิงก์", - "comment_edited_at_timestamp": "แก้ไขความคิดเห็นที่ <1>{{timestamp}}", - "reason_reason": "เหตุผล: \"{{reason}}\".", - "click_here_to_show_original": "<1>คลิกที่นี่ เพื่อแสดงข้อมูลต้นฉบับ", - "click_here_to_hide_original": "<1>คลิกที่นี่ เพื่อซ่อนข้อมูลต้นฉบับ", "loading": "กำลังโหลด", "posted_by": "โพสต์โดย", "by": "โดย", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "ไปที่ <1>การตั้งค่า เพื่อนำเข้าบัญชีผู้ดูแลของคุณ", "post_form_rules_faq_prompt": "โปรดอ่านกฎและคำถามที่พบบ่อยก่อนโพสต์", "pending_mod_approval_reason": "การกลั่นกรองด้วย AI ส่งโพสต์นี้ไปยังคิวผู้ดูแล เหตุผล: \"{{reason}}\".", - "flag": "ธง" + "flag": "ธง", + "show_replies": "แสดงคำตอบ", + "hide_replies": "ซ่อนคำตอบ", + "unhide": "แสดง", + "account_data": "ข้อมูลบัญชี", + "ban_duration_days": "ระยะเวลาแบนในวัน", + "challenge_answer": "คำตอบความท้าทาย", + "ban": "แบน", + "timestamp": "แสตมป์เวลา" } diff --git a/public/translations/tr/default.json b/public/translations/tr/default.json index 01ed819d..ac0ff0a0 100644 --- a/public/translations/tr/default.json +++ b/public/translations/tr/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Sadece Worksafe Panoları Göster", "show_all_content": "Tüm İçeriği Göster", "link_type": "Bağlantı türü", - "comment_edited_at_timestamp": "<1>{{timestamp}} tarihinde yorum düzenlendi", - "reason_reason": "Sebep: \"{{reason}}\".", - "click_here_to_show_original": "<1>Buraya tıklayın orijinali göstermek için.", - "click_here_to_hide_original": "<1>Buraya tıklayın orijinali gizlemek için.", "loading": "Yükleniyor", "posted_by": "Tarafından gönderildi", "by": "tarafından", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Mod hesabınızı içe aktarmak için <1>ayarlara gidin", "post_form_rules_faq_prompt": "Lütfen göndermeden önce Kuralları ve SSS'yi okuyun.", "pending_mod_approval_reason": "AI moderasyonu bu gönderiyi moderatör kuyruğuna gönderdi. Neden: \"{{reason}}\".", - "flag": "Bayrak" + "flag": "Bayrak", + "show_replies": "yanıtları göster", + "hide_replies": "yanıtları gizle", + "unhide": "göster", + "account_data": "hesap verileri", + "ban_duration_days": "ban süresi gün cinsinden", + "challenge_answer": "zorluk yanıtı", + "ban": "yasakla", + "timestamp": "zaman damgası" } diff --git a/public/translations/uk/default.json b/public/translations/uk/default.json index ab06bbad..f7390ced 100644 --- a/public/translations/uk/default.json +++ b/public/translations/uk/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Показувати лише безпечні дошки", "show_all_content": "Показати весь вміст", "link_type": "Тип посилання", - "comment_edited_at_timestamp": "Коментар відредаговано в <1>{{timestamp}}", - "reason_reason": "Причина: \"{{reason}}\".", - "click_here_to_show_original": "<1>Натисніть тут для відображення оригіналу.", - "click_here_to_hide_original": "<1>Натисніть тут для приховання оригіналу.", "loading": "Завантаження", "posted_by": "Опубліковано", "by": "від", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Перейдіть до <1>налаштувань, щоб імпортувати свій обліковий запис модератора", "post_form_rules_faq_prompt": "Будь ласка, прочитайте Правила і Часті запитання перед публікацією.", "pending_mod_approval_reason": "AI-модерація надіслала цей допис до черги модераторів. Причина: \"{{reason}}\".", - "flag": "Прапор" + "flag": "Прапор", + "show_replies": "показати відповіді", + "hide_replies": "приховати відповіді", + "unhide": "показати", + "account_data": "дані аккаунту", + "ban_duration_days": "тривалість бану в днях", + "challenge_answer": "відповідь на виклик", + "ban": "заблокувати", + "timestamp": "часова мітка" } diff --git a/public/translations/ur/default.json b/public/translations/ur/default.json index c7ed77e5..63b647e5 100644 --- a/public/translations/ur/default.json +++ b/public/translations/ur/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "صرف کام سے بچائے گئے بورڈز دکھائیں", "show_all_content": "تمام مواد دکھائیں", "link_type": "لنک کی قسم", - "comment_edited_at_timestamp": "تبدیل کیا گیا تبصرہ <1>{{timestamp}} پر", - "reason_reason": "وجہ: \"{{reason}}\".", - "click_here_to_show_original": "<1>یہاں کلک کریں تاکہ اصل دکھائی دے۔", - "click_here_to_hide_original": "<1>یہاں کلک کریں تاکہ اصل چھپ جائے۔", "loading": "لوڈ ہو رہا ہے", "posted_by": "پوسٹ کیا گیا", "by": "کے ذریعے", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "اپنا موڈ اکاؤنٹ درآمد کرنے کے لیے <1>ترتیبات پر جائیں", "post_form_rules_faq_prompt": "براہ کرم پوسٹ کرنے سے پہلے اصول اور اکثر پوچھے گئے سوالات پڑھیں۔", "pending_mod_approval_reason": "AI موڈریشن نے اس پوسٹ کو موڈریٹر قطار میں بھیج دیا۔ وجہ: \"{{reason}}\".", - "flag": "پرچم" + "flag": "پرچم", + "show_replies": "جوابات دکھائیں", + "hide_replies": "جوابات چھپائیں", + "unhide": "دکھائیں", + "account_data": "اکاؤنٹ ڈیٹا", + "ban_duration_days": "بین کی مدت دنوں میں", + "challenge_answer": "چ یلنج کا جواب", + "ban": "روک", + "timestamp": "ٹائم سٹیمپ" } diff --git a/public/translations/vi/default.json b/public/translations/vi/default.json index 67425543..469c950a 100644 --- a/public/translations/vi/default.json +++ b/public/translations/vi/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "Chỉ hiển thị bảng Worksafe", "show_all_content": "Hiển thị tất cả nội dung", "link_type": "Loại liên kết", - "comment_edited_at_timestamp": "Bình luận được chỉnh sửa lúc <1>{{timestamp}}", - "reason_reason": "Lý do: \"{{reason}}\".", - "click_here_to_show_original": "<1>Nhấp vào đây để hiển thị nguyên bản.", - "click_here_to_hide_original": "<1>Nhấp vào đây để ẩn nguyên bản.", "loading": "Đang tải", "posted_by": "Được đăng bởi", "by": "bởi", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "Vào <1>cài đặt để nhập tài khoản mod của bạn", "post_form_rules_faq_prompt": "Vui lòng đọc Quy tắcCâu hỏi thường gặp trước khi đăng.", "pending_mod_approval_reason": "Kiểm duyệt AI đã gửi bài viết này vào hàng đợi kiểm duyệt. Lý do: \"{{reason}}\".", - "flag": "Cờ" + "flag": "Cờ", + "show_replies": "hiển thị câu trả lời", + "hide_replies": "ẩn các trả lời", + "unhide": "hiển thị", + "account_data": "dữ liệu tài khoản", + "ban_duration_days": "thời gian cấm theo ngày", + "challenge_answer": "câu trả lời thử thách", + "ban": "cấm", + "timestamp": "dấu thời gian" } diff --git a/public/translations/zh/default.json b/public/translations/zh/default.json index c38b6473..9d65fddb 100644 --- a/public/translations/zh/default.json +++ b/public/translations/zh/default.json @@ -144,10 +144,6 @@ "show_worksafe_boards_only": "仅显示安全工作板", "show_all_content": "显示所有内容", "link_type": "链接类型", - "comment_edited_at_timestamp": "评论于 <1>{{timestamp}} 被编辑", - "reason_reason": "原因: \"{{reason}}\".", - "click_here_to_show_original": "<1>点击这里 显示原文。", - "click_here_to_hide_original": "<1>点击这里 隐藏原文。", "loading": "加载中", "posted_by": "由...发布", "by": "由...发布", @@ -393,5 +389,13 @@ "go_to_settings_to_import_mod_account": "前往<1>设置以导入您的版主账户", "post_form_rules_faq_prompt": "发帖前请阅读规则常见问题。", "pending_mod_approval_reason": "AI 审核已将此帖子发送到版主队列。原因:\"{{reason}}\"。", - "flag": "旗帜" + "flag": "旗帜", + "show_replies": "显示回复", + "hide_replies": "隐藏回复", + "unhide": "显示", + "account_data": "账户数据", + "ban_duration_days": "封禁时长(天数)", + "challenge_answer": "挑战答案", + "ban": "封禁", + "timestamp": "时间戳" } diff --git a/src/app.tsx b/src/app.tsx index 81e762b1..4ccdc9ef 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -33,7 +33,7 @@ import { import styles from './app.module.css'; import { DesktopBoardButtons, MobileAllFeedFilter, MobileBoardButtons } from './components/board-buttons'; import Blotter from './views/blotter'; -import FAQ from './views/faq'; +import Faq from './views/faq'; import Home from './views/home'; import Archive from './views/archive/archive'; import Directory from './views/directory/directory'; @@ -282,7 +282,7 @@ const App = () => { }> } /> - } /> + } /> } /> } /> } /> diff --git a/src/components/board-blotter/board-blotter.module.css b/src/components/board-blotter/board-blotter.module.css index bb9c20ce..4a0b68a8 100644 --- a/src/components/board-blotter/board-blotter.module.css +++ b/src/components/board-blotter/board-blotter.module.css @@ -34,6 +34,22 @@ text-transform: capitalize; } +.hideButton { + appearance: none; + background: transparent; + border: 0; + display: inline; + font: inherit; + line-height: inherit; + margin: 0; + padding: 0; +} + +.hideButton:focus-visible { + outline: 1px dotted currentcolor; + outline-offset: 1px; +} + .hideButton:hover, .actionLink:hover { cursor: pointer; diff --git a/src/components/board-blotter/board-blotter.tsx b/src/components/board-blotter/board-blotter.tsx index d7a5e363..484afd74 100644 --- a/src/components/board-blotter/board-blotter.tsx +++ b/src/components/board-blotter/board-blotter.tsx @@ -19,8 +19,8 @@ const BoardBlotter = () => {
- - + @@ -40,9 +40,9 @@ const BoardBlotter = () => {
+

[ - { if (e.key === 'Enter' || e.key === ' ') { @@ -53,7 +53,7 @@ const BoardBlotter = () => { onClick={() => toggleVisibility()} > {isHidden ? t('show_blotter') : t('hide')} - + ] {!isHidden && ( <> diff --git a/src/components/board-buttons/board-buttons.tsx b/src/components/board-buttons/board-buttons.tsx index 6306974a..9f9078ec 100644 --- a/src/components/board-buttons/board-buttons.tsx +++ b/src/components/board-buttons/board-buttons.tsx @@ -110,7 +110,7 @@ export const ArchiveButton = ({ address, isInAllView, isInSubscriptionsView, isI } return ( - ); @@ -121,7 +121,7 @@ const SubscribeButton = ({ address }: BoardButtonsProps) => { const { subscribed, subscribe, unsubscribe } = useSubscribe({ communityAddress: address }); return ( - ); @@ -186,7 +186,7 @@ export const RefreshButton = () => { const { t } = useTranslation(); const reset = useFeedResetStore((state) => state.reset); return ( - ); @@ -250,7 +250,7 @@ export const UpdateButton = () => { const { t } = useTranslation(); const requestUpdate = useThreadLiveUpdatesStore((state) => state.requestUpdate); return ( - ); @@ -281,7 +281,7 @@ export const BottomButton = () => { window.scrollTo({ top: document.documentElement.scrollHeight, behavior: 'instant' }); }; return ( - ); @@ -293,7 +293,7 @@ export const TopButton = () => { window.scrollTo({ top: 0, left: 0, behavior: 'instant' }); }; return ( - ); @@ -381,6 +381,7 @@ const ModQueueAlertThreshold = () => { {t('alert_threshold')}: { return ( {' '} - — {t('search_results_for')}: {searchText} + ({t('search_results_for')}: {searchText}) ); } @@ -679,7 +680,7 @@ export const CatalogSearchResultsLabel = () => { return ( {' '} - — {t('filtered_threads')}: {filteredCount} + ({t('filtered_threads')}: {filteredCount}) ); } @@ -865,5 +866,13 @@ const SearchOPsBar = () => { } }; - return ; + return ( + + ); }; diff --git a/src/components/board-header/__tests__/board-header.test.tsx b/src/components/board-header/__tests__/board-header.test.tsx index d5e4b5d1..6eb383a9 100644 --- a/src/components/board-header/__tests__/board-header.test.tsx +++ b/src/components/board-header/__tests__/board-header.test.tsx @@ -177,7 +177,7 @@ describe('BoardHeader', () => { expect(container.textContent).toContain('/subs/ - Subscriptions'); expect(container.textContent).toContain('subscriptions_subtitle:{"count":2}'); - const clickableSubtitle = container.querySelector('[role="button"]'); + const clickableSubtitle = Array.from(container.querySelectorAll('button')).find((button) => button.textContent?.includes('subscriptions_subtitle')); await act(async () => { clickableSubtitle?.dispatchEvent(new MouseEvent('click', { bubbles: true })); }); diff --git a/src/components/board-header/board-header.module.css b/src/components/board-header/board-header.module.css index e6751bc8..7a65b311 100644 --- a/src/components/board-header/board-header.module.css +++ b/src/components/board-header/board-header.module.css @@ -25,14 +25,27 @@ } .clickableSubtitle { + appearance: none; + background: transparent; + border: 0; + color: inherit; cursor: pointer; display: inline-block; + font: inherit; + line-height: inherit; + margin: 0; + padding: 0; } .clickableSubtitle:hover { text-decoration: underline; } +.clickableSubtitle:focus-visible { + outline: 1px dotted currentcolor; + outline-offset: 1px; +} + .content hr { width: 90%; } diff --git a/src/components/board-header/board-header.tsx b/src/components/board-header/board-header.tsx index 65e4b4e0..3c01dde8 100644 --- a/src/components/board-header/board-header.tsx +++ b/src/components/board-header/board-header.tsx @@ -110,9 +110,9 @@ const BoardHeader = () => {
{isInSubscriptionsView ? ( - { if (e.key === 'Enter' || e.key === ' ') { @@ -123,7 +123,7 @@ const BoardHeader = () => { onClick={() => navigate('/subs/settings#subscriptions-settings')} > {subtitle} - + ) : isInDirectoryListView ? ( {subtitle} ) : !isInAllView && !isInModView && subtitle ? ( diff --git a/src/components/board-pagination/__tests__/board-pagination.test.tsx b/src/components/board-pagination/__tests__/board-pagination.test.tsx index 9fb7b131..a5134a21 100644 --- a/src/components/board-pagination/__tests__/board-pagination.test.tsx +++ b/src/components/board-pagination/__tests__/board-pagination.test.tsx @@ -90,7 +90,7 @@ describe('BoardPagination', () => { expect(container.textContent).toContain('catalog'); expect(container.textContent).toContain('archive'); - const allLink = Array.from(container.querySelectorAll('[role="button"]')).find((element) => element.textContent === 'all'); + const allLink = Array.from(container.querySelectorAll('button')).find((element) => element.textContent === 'all'); expect(allLink).toBeTruthy(); await act(async () => { diff --git a/src/components/board-pagination/board-pagination.tsx b/src/components/board-pagination/board-pagination.tsx index e14ca68f..8126572a 100644 --- a/src/components/board-pagination/board-pagination.tsx +++ b/src/components/board-pagination/board-pagination.tsx @@ -45,9 +45,9 @@ const BoardPagination = ({ basePath, currentPage, search = '', totalPages, foote {currentPage === 1 && ( [ - setEnableInfiniteScroll(true)} onKeyDown={(e) => { @@ -58,7 +58,7 @@ const BoardPagination = ({ basePath, currentPage, search = '', totalPages, foote }} > {t('all')} - + ] )} diff --git a/src/components/boards-bar-edit-modal/__tests__/boards-bar-edit-modal.test.tsx b/src/components/boards-bar-edit-modal/__tests__/boards-bar-edit-modal.test.tsx index 746cbff0..c7920450 100644 --- a/src/components/boards-bar-edit-modal/__tests__/boards-bar-edit-modal.test.tsx +++ b/src/components/boards-bar-edit-modal/__tests__/boards-bar-edit-modal.test.tsx @@ -56,14 +56,14 @@ describe('BoardsBarEditModal', () => { input?.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true })); }); - expect(container.querySelector('[role="dialog"]')).toBeTruthy(); + expect(container.querySelector('dialog')).toBeTruthy(); expect(useBoardsBarEditModalStore.getState().showModal).toBe(true); }); it('still closes when the backdrop itself handles keyboard activation', async () => { await renderModal(); - const backdrop = container.querySelector('[role="button"]'); + const backdrop = container.querySelector('button[aria-label="Close board list modal"]'); expect(backdrop).toBeTruthy(); await act(async () => { diff --git a/src/components/boards-bar-edit-modal/boards-bar-edit-modal.module.css b/src/components/boards-bar-edit-modal/boards-bar-edit-modal.module.css index fc806fc7..4e4ae57e 100644 --- a/src/components/boards-bar-edit-modal/boards-bar-edit-modal.module.css +++ b/src/components/boards-bar-edit-modal/boards-bar-edit-modal.module.css @@ -8,6 +8,14 @@ z-index: 999; } +.backdropButton { + all: unset; + position: absolute; + inset: 0; + cursor: default; + z-index: 0; +} + .boardsbarEditDialog { position: absolute; width: 400px; @@ -25,9 +33,12 @@ box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 5px 0px; font-size: var(--body-font-size); line-height: normal; - z-index: 1000; + z-index: 1; display: flex; flex-direction: column; + color: inherit; + margin-top: 0; + margin-bottom: 0; } @media (max-width: 600px) { diff --git a/src/components/boards-bar-edit-modal/boards-bar-edit-modal.tsx b/src/components/boards-bar-edit-modal/boards-bar-edit-modal.tsx index c5f84278..b5c3028e 100644 --- a/src/components/boards-bar-edit-modal/boards-bar-edit-modal.tsx +++ b/src/components/boards-bar-edit-modal/boards-bar-edit-modal.tsx @@ -71,7 +71,13 @@ const BoardsBarEditModalForm = ({ {subscriptions.length > 0 && (
- setShowSubscriptions(e.target.checked)} /> + setShowSubscriptions(e.target.checked)} + /> ( @@ -91,7 +97,9 @@ const BoardsBarEditModalForm = ({
)}
- +
); @@ -108,28 +116,23 @@ const BoardsBarEditModal = () => { return null; } - const handleBackdropClick = (e: React.MouseEvent) => { - if (e.target === e.currentTarget) { - closeBoardsBarEditModal(); - } - }; - const formKey = `${directoriesToString(visibleDirectories)}-${showSubscriptionsInBoardsBar}`; return ( -
{ - if (e.target === e.currentTarget && (e.key === 'Enter' || e.key === ' ')) { - e.preventDefault(); - closeBoardsBarEditModal(); - } - }} - onClick={handleBackdropClick} - > -
+
+
-
+
); }; diff --git a/src/components/boards-bar/__tests__/boards-bar.test.tsx b/src/components/boards-bar/__tests__/boards-bar.test.tsx index dfc6c27c..0c0f8c25 100644 --- a/src/components/boards-bar/__tests__/boards-bar.test.tsx +++ b/src/components/boards-bar/__tests__/boards-bar.test.tsx @@ -220,7 +220,7 @@ describe('BoardsBar', () => { await renderBoardsBar('/mu'); await act(async () => { - findExactText('search')?.dispatchEvent(new MouseEvent('click', { bubbles: true })); + findExactText('Search')?.dispatchEvent(new MouseEvent('click', { bubbles: true })); }); const inputs = container.querySelectorAll('input[type="text"]'); diff --git a/src/components/boards-bar/boards-bar.module.css b/src/components/boards-bar/boards-bar.module.css index 94680822..cbf96876 100644 --- a/src/components/boards-bar/boards-bar.module.css +++ b/src/components/boards-bar/boards-bar.module.css @@ -5,13 +5,30 @@ position: relative; } +.boardNavDesktop button, .boardNavMobile button { + appearance: none; + background: transparent; + border: 0; + color: inherit; + display: inline; + font: inherit; + line-height: inherit; + margin: 0; + padding: 0; +} + +.boardNavDesktop button:focus-visible, .boardNavMobile button:focus-visible { + outline: 1px dotted currentcolor; + outline-offset: 1px; +} + .checkingSubscriptions { font-size: var(--boardsbar-font-size); color: var(--boardsbar-desktop-link-text-color); text-transform: lowercase; } -.boardNavDesktop a, .navTopRight span { +.boardNavDesktop a, .navTopRight span, .navTopRight button { color: var(--boardsbar-desktop-link-text-color); text-decoration: var(--boardsbar-desktop-link-text-decoration); } @@ -20,13 +37,13 @@ padding: 0 1px; } -.boardNavDesktop a:hover, .navTopRight span:hover { +.boardNavDesktop a:hover, .navTopRight span:hover, .navTopRight button:hover { color: var(--boardsbar-desktop-link-text-color-hover); text-decoration: var(--boardsbar-desktop-link-text-decoration-hover); cursor: pointer; } -.placeholder { +.boardNavDesktop .placeholder { color: var(--boardsbar-separator-color); } @@ -45,13 +62,17 @@ margin-right: -7px; } -.temporaryButton { +.boardNavDesktop .temporaryButton { color: var(--boardsbar-desktop-link-text-color); text-decoration: var(--boardsbar-desktop-link-text-decoration); text-transform: capitalize; } -.temporaryButton:hover { +.navTopRight button { + text-transform: capitalize; +} + +.boardNavDesktop .temporaryButton:hover { color: var(--boardsbar-desktop-link-text-color-hover); text-decoration: var(--boardsbar-desktop-link-text-decoration-hover); cursor: pointer; @@ -80,7 +101,7 @@ justify-content: space-around; } -.boardNavMobile .pageJump a, .boardNavMobile .pageJump span { +.boardNavMobile .pageJump a, .boardNavMobile .pageJump span, .boardNavMobile .pageJump button { color: var(--boardsbar-mobile-button-text-color); text-decoration: var(--button-text-decoration-mobile); } @@ -108,7 +129,7 @@ padding: 3px 5px 0 0; } -.pageJump a, .pageJump span { +.pageJump a, .pageJump span, .pageJump button { padding-right: 5px; text-decoration: var(--homepage-box-link-text-decoration); cursor: pointer; diff --git a/src/components/boards-bar/boards-bar.tsx b/src/components/boards-bar/boards-bar.tsx index 8021f493..d6b733bc 100644 --- a/src/components/boards-bar/boards-bar.tsx +++ b/src/components/boards-bar/boards-bar.tsx @@ -70,7 +70,16 @@ const SearchBar = ({ setShowSearchBar }: { setShowSearchBar: (show: boolean) => return (
- +
); @@ -154,9 +163,9 @@ const BoardsBarDesktop = () => { const linkContent = ( <> {isPlaceholder ? ( - { if (e.key === 'Enter' || e.key === ' ') { @@ -168,7 +177,7 @@ const BoardsBarDesktop = () => { style={{ cursor: 'pointer' }} > {code} - + ) : ( {code} @@ -209,19 +218,19 @@ const BoardsBarDesktop = () => { )} ]{' '} - {BOARD_CODE_GROUPS.map((group, groupIndex) => { + {BOARD_CODE_GROUPS.map((group) => { const visibleCodes = group.filter((code) => directoriesToShow.has(code)); if (visibleCodes.length === 0) return null; - return [{visibleCodes.map((code, codeIndex) => renderBoardCode(code, codeIndex === visibleCodes.length - 1))}] ; + return [{visibleCodes.map((code, codeIndex) => renderBoardCode(code, codeIndex === visibleCodes.length - 1))}] ; })} {hasHiddenDirectories && !showAllTemporarily && ( <> {' '} [ - { if (e.key === 'Enter' || e.key === ' ') { @@ -234,7 +243,7 @@ const BoardsBarDesktop = () => { title='Show all' > ... - + ]{' '} )} @@ -242,9 +251,9 @@ const BoardsBarDesktop = () => { <>[{visibleSubscriptionAddresses.map((address: string, index: number) => renderSubscription(address, index, visibleSubscriptionAddresses.length))}] )} [ - { if (e.key === 'Enter' || e.key === ' ') { @@ -256,11 +265,11 @@ const BoardsBarDesktop = () => { style={{ cursor: 'pointer' }} > {capitalize(t('edit'))} - + ] [ - { if (e.key === 'Enter' || e.key === ' ') { @@ -272,13 +281,13 @@ const BoardsBarDesktop = () => { style={{ cursor: 'pointer' }} > {t('create_board')} - + ] [{t('settings')}] [ - { if (e.key === 'Enter' || e.key === ' ') { @@ -288,8 +297,8 @@ const BoardsBarDesktop = () => { }} onClick={() => setShowSearchBar(!showSearchBar)} > - {t('search')} - + {capitalize(t('search'))} + ] [{t('home')}] {showSearchBar && } @@ -387,8 +396,8 @@ const BoardsBarMobile = ({ communityAddress }: { communityAddress?: string }) =>
{t('settings')} - { if (e.key === 'Enter' || e.key === ' ') { @@ -399,7 +408,7 @@ const BoardsBarMobile = ({ communityAddress }: { communityAddress?: string }) => onClick={() => setShowSearchBar(!showSearchBar)} > {capitalize(t('search'))} - + {t('home')} {showSearchBar && }
diff --git a/src/components/catalog-filters/__tests__/catalog-filters.test.tsx b/src/components/catalog-filters/__tests__/catalog-filters.test.tsx index 805a2c26..52ca7826 100644 --- a/src/components/catalog-filters/__tests__/catalog-filters.test.tsx +++ b/src/components/catalog-filters/__tests__/catalog-filters.test.tsx @@ -122,7 +122,7 @@ const renderCatalogFilters = () => { }; const openModal = async () => { - const button = Array.from(container.querySelectorAll('[role="button"]')).find((candidate) => candidate.textContent === 'filters'); + const button = Array.from(container.querySelectorAll('button')).find((candidate) => candidate.textContent === 'filters'); await click(button ?? null); }; @@ -176,7 +176,7 @@ describe('CatalogFilters', () => { expect(container.querySelector('[data-testid="filters-protip"]')?.textContent).toBe('filters-protip'); expect(container.textContent).toContain('filter_and_highlights_help'); - const overlay = Array.from(container.querySelectorAll('[role="button"]')).find((candidate) => candidate.tagName === 'DIV'); + const overlay = container.querySelector('button[class*="overlay"]'); await click(overlay ?? null); expect(container.querySelector('[data-testid="filters-protip"]')).toBeNull(); @@ -220,14 +220,15 @@ describe('CatalogFilters', () => { expect(container.textContent).toContain('x4'); const initialRows = getRows(); - const moveUpButton = initialRows[1]?.querySelector('[role="button"]'); + const moveUpButton = initialRows[1]?.querySelector('button'); await click(moveUpButton ?? null); const reorderedInputs = getTextInputs(); expect(reorderedInputs[0]?.value).toBe('beta'); expect(reorderedInputs[1]?.value).toBe('alpha'); - const deleteButton = getRows()[1]?.querySelectorAll('[role="button"]')[1]; + const rowButtons = Array.from(getRows()[1]?.querySelectorAll('button') ?? []); + const deleteButton = rowButtons.at(-1); await click(deleteButton ?? null); expect(getTextInputs()).toHaveLength(1); diff --git a/src/components/catalog-filters/catalog-filters.module.css b/src/components/catalog-filters/catalog-filters.module.css index c8609028..d5f9b38c 100644 --- a/src/components/catalog-filters/catalog-filters.module.css +++ b/src/components/catalog-filters/catalog-filters.module.css @@ -1,4 +1,5 @@ .overlay { + all: unset; position: fixed; top: 0; left: 0; @@ -88,6 +89,11 @@ } .closeButton { + appearance: none; + background-color: transparent; + border: 0; + margin: 0; + padding: 0; right: 5px; width: 18px; height: 18px; @@ -101,6 +107,11 @@ } .openHelpButton { + appearance: none; + background-color: transparent; + border: 0; + margin: 0; + padding: 0; right: 23px; width: 18px; height: 18px; @@ -113,6 +124,11 @@ cursor: pointer; } +.closeButton:focus-visible, .openHelpButton:focus-visible { + outline: 1px dotted currentcolor; + outline-offset: 1px; +} + .filters { padding: 5px; text-align: left; @@ -190,6 +206,16 @@ cursor: pointer; } +.filtersTable button { + appearance: none; + background: transparent; + border: 0; + color: inherit; + font: inherit; + margin: 0; + padding: 0; +} + .filtersTable tfoot td { padding-top: 20px; } diff --git a/src/components/catalog-filters/catalog-filters.tsx b/src/components/catalog-filters/catalog-filters.tsx index 2dbab9a3..16e7b8e2 100644 --- a/src/components/catalog-filters/catalog-filters.tsx +++ b/src/components/catalog-filters/catalog-filters.tsx @@ -152,9 +152,9 @@ const FiltersTable = ({ onSave }: { onSave: () => void }) => { {localFilterItems.map((item, index) => (
- { if (e.key === 'Enter' || e.key === ' ') { @@ -165,11 +165,12 @@ const FiltersTable = ({ onSave }: { onSave: () => void }) => { onClick={() => moveLocalFilterItemUp(index)} > ↑ - + updateLocalFilterItem(index, { ...item, enabled: e.target.checked })} @@ -178,6 +179,7 @@ const FiltersTable = ({ onSave }: { onSave: () => void }) => { void }) => { - updateLocalFilterItem(index, { ...item, hide: e.target.checked })} /> + updateLocalFilterItem(index, { ...item, hide: e.target.checked })} + /> - updateLocalFilterItem(index, { ...item, top: e.target.checked })} /> + updateLocalFilterItem(index, { ...item, top: e.target.checked })} + /> - { if (e.key === 'Enter' || e.key === ' ') { @@ -211,7 +223,7 @@ const FiltersTable = ({ onSave }: { onSave: () => void }) => { onClick={() => removeLocalFilterItem(index)} > × - + {currentCommunityAddress && item.communityFilteredCids?.has(currentCommunityAddress) && `x${item.communityCounts?.get(currentCommunityAddress) ?? 0}`} @@ -259,9 +271,10 @@ const FiltersModal = ({ closeModal }: { closeModal: () => void }) => { return ( <> -
{ if (e.key === 'Enter' || e.key === ' ') { @@ -279,10 +292,11 @@ const FiltersModal = ({ closeModal }: { closeModal: () => void }) => {
{showHelp ? t('filter_and_highlights_help') : t('filter_and_highlights')} {!showHelp && ( - { if (e.key === 'Enter' || e.key === ' ') { @@ -293,10 +307,11 @@ const FiltersModal = ({ closeModal }: { closeModal: () => void }) => { onClick={openHelp} /> )} - { if (e.key === 'Enter' || e.key === ' ') { @@ -323,9 +338,9 @@ const CatalogFilters = () => { return ( <> - { if (e.key === 'Enter' || e.key === ' ') { @@ -336,7 +351,7 @@ const CatalogFilters = () => { onClick={() => setShowModal(true)} > {t('filters')} - + {showModal && } ); diff --git a/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.module.css b/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.module.css index 04f79cac..8a354968 100644 --- a/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.module.css +++ b/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.module.css @@ -1,4 +1,16 @@ +.colorPickerBackdrop { + all: unset; + cursor: default; + position: fixed; + inset: 0; + z-index: 30; +} + .colorClickbox { + appearance: none; + padding: 0; + margin: 0; + box-sizing: border-box; width: 16px; height: 16px; line-height: 16px; @@ -35,6 +47,9 @@ } .colorOption { + appearance: none; + padding: 0; + box-sizing: border-box; box-shadow: 0 0 2px rgba(0, 0, 0, 0.2); margin: auto; width: 16px; @@ -52,6 +67,9 @@ } .colorPreview { + appearance: none; + padding: 0; + box-sizing: border-box; display: inline-block; width: 16px; height: 16px; @@ -100,6 +118,11 @@ } .colorPickerModal tfoot .button { + appearance: none; + background: transparent; + border: 0; + font: inherit; + padding: 0; color: var(--button-desktop-text-color); cursor: pointer; margin: 0 2px; @@ -118,3 +141,11 @@ content: ']'; color: var(--body-font-color); } + +.colorClickbox:focus-visible, +.colorOption:focus-visible, +.colorPreview:focus-visible, +.colorPickerModal tfoot .button:focus-visible { + outline: 1px dotted currentcolor; + outline-offset: 1px; +} diff --git a/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.tsx b/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.tsx index 2a5cf0f6..b60a698c 100644 --- a/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.tsx +++ b/src/components/catalog-filters/highlight-color-picker/highlight-color-picker.tsx @@ -57,10 +57,11 @@ const HighlightColorPicker = ({ item, index, updateLocalFilterItem, localFilterI return ( <> - { if (e.key === 'Enter' || e.key === ' ') { @@ -72,20 +73,14 @@ const HighlightColorPicker = ({ item, index, updateLocalFilterItem, localFilterI {...getReferenceProps()} > {!item.color && '∕'} - + {isColorPickerOpen && ( -
{ if (e.key === 'Enter' || e.key === ' ') { @@ -111,14 +106,15 @@ const HighlightColorPicker = ({ item, index, updateLocalFilterItem, localFilterI > - {colorRows.map((row, rowIndex) => ( - - {row.map((color, colorIndex) => ( - + {row.map((color) => ( + diff --git a/src/components/catalog-row/catalog-row.tsx b/src/components/catalog-row/catalog-row.tsx index 507dc768..c9ba79b1 100644 --- a/src/components/catalog-row/catalog-row.tsx +++ b/src/components/catalog-row/catalog-row.tsx @@ -92,14 +92,14 @@ export const CatalogPostMedia = ({ cid, commentMediaInfo, linkWidth, linkHeight, ) : ( // show first frame of the video, as a workaround for Safari not loading thumbnails -
- ( +
+
- - +
- { if (e.key === 'Enter' || e.key === ' ') { @@ -172,10 +169,10 @@ const HighlightColorPicker = ({ item, index, updateLocalFilterItem, localFilterI onClick={() => setIsColorPickerOpen(false)} > Close - - +