Repository navigation
feat(slider): add accessible Swiper carousel foundation - #197
Merged
Merged
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.
Production webpack emits app-min.js while wp_set_script_translations hashes the enqueued path; point PO/POT and JSON translations at dist/app-min.js. Co-authored-by: Cursor <cursoragent@cursor.com>
francoistibo
approved these changes
Nov 5, 2026
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 (carousel helper, styles, translations) with no auth or data-path changes; integrators must scope navigation selectors when multiple carousels share a page.
Overview
Introduces a reusable Swiper v14 carousel stack for the blocks theme (adapted from the BFF work): a
SliderJS wrapper onAbstractDomElement, a PHP partial for prev/next controls, and theme SCSS over Swiper’s base + a11y CSS—wired into front and editor bundles.The
Sliderclass always merges A11y and Navigation modules, ships translated default a11y strings via@wordpress/i18n, and adds wrapper options (hideNavigationFromA11y,fixLastSlideActiveOnEnd,onChange). It is exposed onwindow.beapi.classesfor child components and blocks.Asset/i18n wiring adds
wp-i18nto the main script, callswp_set_script_translationsforbeapi-blocks-theme, and extends POT/PO plus French JSON for slider strings (PHParia-labels align with the same msgids). ESLint gainsbrowser: true; dependencies addswiperand@wordpress/i18n.Reviewed by Cursor Bugbot for commit 9ee535f. Bugbot is set up for automated code reviews on this repo. Configure here.