Repository navigation
Conversation
Align BBT with BFF slider base: Slider class, controls partial, styles, and script translations for a11y strings. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit dcf20ed. Configure here.
| @@ -0,0 +1 @@ | |||
| {"translation-revision-date":"2026-04-10 16:29+0200","generator":"WP-CLI\/2.12.0","source":"dist\/app.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fr_FR","plural-forms":"nplurals=2; plural=(n > 1);"},"Previous slide":["Diapositive pr\u00e9c\u00e9dente"],"Next slide":["Diapositive suivante"],"This is the first slide":["C'est la premi\u00e8re diapositive"],"This is the last slide":["C'est la derni\u00e8re diapositive"],"Go to slide {{index}}":["Aller \u00e0 la diapositive {{index}}"],"{{index}} of {{slidesLength}}":["{{index}} sur {{slidesLength}}"]}}} No newline at end of file | |||
There was a problem hiding this comment.
JS slider translations miss production file
Medium Severity
The Jed file is hashed from dist/app.js, but production webpack emits app-min.js. wp_set_script_translations looks up JSON by MD5 of the enqueued src, and core only strips a .min.js suffix, not -min.js. In production, __() in Slider.js stays English and Swiper overwrites the PHP-translated control labels with those strings.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit dcf20ed. Configure here.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


Reprise / adaptation de la PR du BFF : BeAPI/beapi-frontend-framework#510
Contexte et objectif
Cette évolution ajoute au thème Be API Frontend Framework une base réutilisable pour les carrousels basés sur Swiper (v14). L’objectif est de centraliser la configuration (modules, navigation, messages d’accessibilité), d’aligner le markup et les styles sur les conventions du thème, et de préparer l’internationalisation des chaînes exposées aux technologies d’assistance.
Il ne s’agit pas d’un bloc Gutenberg ni d’un composant visuel figé : c’est une brique technique (classe JS, partial PHP, feuille SCSS) que les projets enfants ou les futurs blocs/composants pourront brancher selon leurs besoins (
slidesPerView, pagination, autoplay, etc.).Dépendances
swiper(^14.3.0)@wordpress/i18nLes styles de base Swiper sont importés dans le SCSS du thème (
swiper/css,swiper/css/a11y).Fichiers livrés
src/js/classes/Slider.jsWrapper fin autour de
Swiper, héritant deAbstractDomElementcomme les autres classes DOM du thème.Comportement par défaut
options.modulessont ajoutés sans écraser les défauts (évite la perte d’A11y/Navigation quand l’utilisateur ne redéclare pas tout).__()et le text domainbeapi-frontend-framework(prevSlideMessage,nextSlideMessage, première/dernière diapositive, pagination, libellé de slide).onChange(option du wrapper) branché sur l’événementslideChangede Swiper.Options spécifiques au wrapper
hideNavigationFromA11yfalsetrue: boutons préc./suiv. retirés de l’arbre d’accessibilité (tabindex="-1",aria-hidden="true") et suppression de.swiper-notification, utile quand chaque slide est déjà navigable au clavier (cartes focusables). Réappliqué aprèstransitionEndcar Swiper réinitialise letabindex.fixLastSlideActiveOnEndfalse.swiper-slide-activeen fin de parcours pourslidesPerView: 'auto'ou des fractions « non demi » (ex. 2,75), où la dernière slide peut rester partiellement visible sans la classe active.optionsSlider.defaultsSwiperOptionsfusionné avec les défauts (donta11y).Accessibilité intégrée
<li>,slideRoleest vidé pour ne pas imposerrole="group"sur des éléments de liste (sémantique liste préservée pour les lecteurs d’écran). Surcharge possible viaoptions.a11y..swiper-notificationest conservée pour les annonces première / précédente / suivante / dernière diapositive au clavier.wrapperLiveRegion: laissé au comportement Swiper par défaut (politesans autoplay,offavec autoplay), surcharge possible viaoptions.a11y.Initialisation
Slider.init('.selector', { … })(patternAbstractDomElement) ounew Slider(element, { … }).getInstance()renvoie l’instance Swiper native pour les API avancées.components/parts/common/swiper-controls.phpPartial PHP pour les contrôles de navigation :
.swiper__controls>.swiper__buttons> boutons.swiper-button-prev/.swiper-button-nextavec classe thème.swiper__button.aria-labeltraduits viaesc_attr_e()(Previous slide/Next slide, même msgid que le JS) ; Swiper peut les ajuster au runtime selon sa config A11y.À inclure dans le conteneur
.swiper:Markup minimal attendu côté slide :
La navigation Swiper doit pointer vers les sélecteurs des boutons (ex.
navigation: { prevEl: '.swiper-button-prev', nextEl: '.swiper-button-next' }), en général dans le scope du carrousel concerné.src/scss/10-vendor/_swiper.scssCouche de style projet par-dessus Swiper :
--swiper-theme-color(variable SCSS primaire).:has(.swiper-button-lock)).cursor: not-allowed).scaleX(-1)..swiper-overflow-visiblepour déborder le viewport si besoin..swiper-wrapper(padding, margin,list-style) pour usage avec<ul>/<li>.Import ajouté dans
style.scsseteditor.scsspour cohérence front et éditeur.inc/Services/Assets.phpwp-i18najoutée au script principalscripts(en plus de jQuery).wp_set_script_translationssurscriptsavec le domainebeapi-frontend-frameworket le dossierlanguages/, pour que les chaînes__()du bundle JS soient servies en.json(format Jed) côté WordPress.Fichiers de traduction
beapi-frontend-framework.potetfr_FR.popour les six messages A11y du slider.beapi-frontend-framework-fr_FR-*.json(hash lié au fichierdist/app.jsaprès build).Workflow traduction : après modification des chaînes dans
Slider.js, rebuild du JS puis régénération / mise à jour des fichiers.pot,.poet JSON (WP-CLI ou outil du projet).Exemple d’utilisation côté JavaScript
Les modules optionnels (Pagination, Autoplay, etc.) s’importent depuis
swiper/moduleset se déclarent dansoptions.modules; A11y et Navigation restent présents sauf configuration Swiper explicite qui les désactiverait.Points d’attention pour les intégrateurs
npm run buildou équivalent) pour quedist/app.jset le hash du fichier JSON de traduction restent alignés.<ul class="swiper-wrapper">/<li class="swiper-slide">, le wrapper gère déjàslideRole; conserver une structure HTML valide.hideNavigationFromA11y: à activer lorsque la navigation prev/next est purement visuelle et que l’usage clavier se fait dans le contenu des slides ; à laisser àfalsesi les boutons doivent rester utilisables et annoncés par les AT.aria-labelpartagent les mêmes chaînes queSlider.defaults; recompiler le.moaprès mise à jour du.posi besoin.Synthèse
Cette PR pose les fondations Swiper + a11y + i18n + styles thème sans imposer un composant métier unique. Les prochaines étapes typiques sur un projet : brancher
Slider.initdepuis le point d’entrée JS du composant concerné, fournir le markup slide + partial contrôles, et étendre les options Swiper (pagination, breakpoints, loop, etc.) au cas par cas.Note
Low Risk
Additive theme infrastructure (new deps, assets, and i18n) with no changes to auth or core business logic; integrators must wire markup and scoped navigation selectors correctly.
Overview
Introduces a reusable Swiper v14 carousel foundation for child blocks and components—not a finished Gutenberg block.
A new
SliderJS class wraps Swiper with default A11y and Navigation modules, translated screen-reader strings via@wordpress/i18n, and theme-specific options (hideNavigationFromA11y,fixLastSlideActiveOnEnd, list-item slide semantics).Slideris exposed onwindow.beapi.classesfor partial assets.PHP adds
swiper-controls.php(prev/next markup with translatedaria-labels). SCSS layers theme styles over Swiper base CSS in front and editor bundles.Assets.phpregisterswp-i18non the main script and callswp_set_script_translationsforbeapi-blocks-theme; POT/PO/JSON include the six slider a11y strings (with French translations). ESLint gainsbrowser: true. Dependencies:swiper,@wordpress/i18n.Reviewed by Cursor Bugbot for commit dcf20ed. Bugbot is set up for automated code reviews on this repo. Configure here.