diff --git a/.plugin-data b/.plugin-data index d549ec0..957e0dc 100644 --- a/.plugin-data +++ b/.plugin-data @@ -1,4 +1,4 @@ { - "version": "1.0.7", + "version": "1.0.8", "slug": "blockparty-accordion" } diff --git a/CHANGELOG.md b/CHANGELOG.md index d4ec2ce..745c64c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 1.0.8 - 2026-02-09 + +- Add option to open the first item by default + ## 1.0.7 - 2026-02-02 - Update `@beapi/be-a11y` to `1.7.3` diff --git a/blockparty-accordion.php b/blockparty-accordion.php index 3eb059d..0bbda08 100644 --- a/blockparty-accordion.php +++ b/blockparty-accordion.php @@ -4,7 +4,7 @@ * Description: Accessible Accordion block for WordPress editor. * Requires at least: 6.2 * Requires PHP: 8.1 - * Version: 1.0.7 + * Version: 1.0.8 * Author: Be API Technical team * Author URI: https://beapi.fr * License: GPL-2.0-or-later @@ -15,7 +15,7 @@ namespace Blockparty\Accordion; -define( 'BLOCKPARTY_ACCORDION_VERSION', '1.0.7' ); +define( 'BLOCKPARTY_ACCORDION_VERSION', '1.0.8' ); define( 'BLOCKPARTY_ACCORDION_URL', plugin_dir_url( __FILE__ ) ); define( 'BLOCKPARTY_ACCORDION_DIR', plugin_dir_path( __FILE__ ) ); define( 'BLOCKPARTY_ACCORDION_PLUGIN_DIRNAME', plugin_basename( __FILE__ ) ); @@ -70,5 +70,36 @@ function allow_aria_attributes( $tags, $context ) { return $tags; } +/** + * Set first accordion trigger to aria-expanded="true" when block has firstItemOpenByDefault. + * + * Done server-side for LCP: the BeAPI a11y JS library would set it on load, but that would cause a visible + * layout shift (first panel hidden then shown). Outputting the correct state in HTML + * avoids that shift. The summary block cannot know it is the first item, so it always + * outputs aria-expanded="false"; this filter corrects the first trigger only. + * + * @param string $block_content The block content. + * @param array $block The full block, including blockName and attrs. + * @return string Filtered block content. + */ +function render_accordion_first_item_expanded( $block_content, $block ) { + if ( ( $block['blockName'] ?? '' ) !== 'blockparty/accordion' ) { + return $block_content; + } + $first_open = $block['attrs']['firstItemOpenByDefault'] ?? false; + if ( ! $first_open ) { + return $block_content; + } + // Replace only the first occurrence (first trigger) so the first item is expanded. + $block_content = preg_replace( + '/aria-expanded="false"/', + 'aria-expanded="true"', + $block_content, + 1 + ); + return $block_content; +} + add_action( 'init', __NAMESPACE__ . '\\init' ); add_filter( 'wp_kses_allowed_html', __NAMESPACE__ . '\\allow_aria_attributes', 10, 2 ); +add_filter( 'render_block', __NAMESPACE__ . '\\render_accordion_first_item_expanded', 10, 2 ); diff --git a/languages/blockparty-accordion-fr_FR-3bdb9866ecb7462cab2e922d1e4a170c.json b/languages/blockparty-accordion-fr_FR-3bdb9866ecb7462cab2e922d1e4a170c.json new file mode 100644 index 0000000..0cfcd2a --- /dev/null +++ b/languages/blockparty-accordion-fr_FR-3bdb9866ecb7462cab2e922d1e4a170c.json @@ -0,0 +1 @@ +{"translation-revision-date":"2026-02-09 10:51+0100","generator":"WP-CLI\/2.12.0","source":"build\/blockparty-accordion\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fr","plural-forms":"nplurals=2; plural=(n != 1);"},"Accordion options":["Options de l\u2019accord\u00e9on"],"Open first item by default":["Ouvrir le premier \u00e9l\u00e9ment par d\u00e9faut"]}}} \ No newline at end of file diff --git a/languages/blockparty-accordion-fr_FR-4bc521b5ef5ba2ed581905d65686862a.json b/languages/blockparty-accordion-fr_FR-4bc521b5ef5ba2ed581905d65686862a.json index ad56655..3199d71 100644 --- a/languages/blockparty-accordion-fr_FR-4bc521b5ef5ba2ed581905d65686862a.json +++ b/languages/blockparty-accordion-fr_FR-4bc521b5ef5ba2ed581905d65686862a.json @@ -1 +1 @@ -{"translation-revision-date":"2025-11-07 16:32+0100","generator":"WP-CLI\/2.11.0","source":"build\/blockparty-accordion-summary\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fr","plural-forms":"nplurals=2; plural=(n != 1);"},"Icon":["Ic\u00f4ne"],"Summary\u2026":["Titre\u2026"]}}} \ No newline at end of file +{"translation-revision-date":"2026-02-09 10:51+0100","generator":"WP-CLI\/2.12.0","source":"build\/blockparty-accordion-summary\/index.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"fr","plural-forms":"nplurals=2; plural=(n != 1);"},"Icon":["Ic\u00f4ne"],"Summary\u2026":["Titre\u2026"]}}} \ No newline at end of file diff --git a/languages/blockparty-accordion-fr_FR.mo b/languages/blockparty-accordion-fr_FR.mo index 80f49e8..87515cc 100644 Binary files a/languages/blockparty-accordion-fr_FR.mo and b/languages/blockparty-accordion-fr_FR.mo differ diff --git a/languages/blockparty-accordion-fr_FR.po b/languages/blockparty-accordion-fr_FR.po index 5961441..95059a6 100644 --- a/languages/blockparty-accordion-fr_FR.po +++ b/languages/blockparty-accordion-fr_FR.po @@ -5,15 +5,15 @@ msgstr "" "Project-Id-Version: Blockparty Accordion 1.0.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/blockparty-" "accordion\n" -"POT-Creation-Date: 2025-11-07T15:31:42+00:00\n" -"PO-Revision-Date: 2025-11-07 16:32+0100\n" +"POT-Creation-Date: 2026-02-09T09:49:54+00:00\n" +"PO-Revision-Date: 2026-02-09 10:51+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.8\n" +"X-Generator: Poedit 3.1.1\n" "X-Domain: blockparty-accordion\n" #. Plugin Name of the plugin @@ -44,6 +44,14 @@ msgstr "Icône" msgid "Summary…" msgstr "Titre…" +#: build/blockparty-accordion/index.js:1 +msgid "Accordion options" +msgstr "Options de l’accordéon" + +#: build/blockparty-accordion/index.js:1 +msgid "Open first item by default" +msgstr "Ouvrir le premier élément par défaut" + #: build/blockparty-accordion-item/block.json msgctxt "block title" msgid "Item" diff --git a/languages/blockparty-accordion.pot b/languages/blockparty-accordion.pot index 264a53e..32bb596 100644 --- a/languages/blockparty-accordion.pot +++ b/languages/blockparty-accordion.pot @@ -1,17 +1,17 @@ -# Copyright (C) 2025 Be API Technical team +# Copyright (C) 2026 Be API Technical team # This file is distributed under the GPL-2.0-or-later. msgid "" msgstr "" -"Project-Id-Version: Blockparty Accordion 1.0.4\n" +"Project-Id-Version: Blockparty Accordion 1.0.8\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/blockparty-accordion\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2025-11-07T15:31:42+00:00\n" +"POT-Creation-Date: 2026-02-09T09:49:54+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.11.0\n" +"X-Generator: WP-CLI 2.12.0\n" "X-Domain: blockparty-accordion\n" #. Plugin Name of the plugin @@ -42,6 +42,14 @@ msgstr "" msgid "Summary…" msgstr "" +#: build/blockparty-accordion/index.js:1 +msgid "Accordion options" +msgstr "" + +#: build/blockparty-accordion/index.js:1 +msgid "Open first item by default" +msgstr "" + #: build/blockparty-accordion-item/block.json msgctxt "block title" msgid "Item" diff --git a/package-lock.json b/package-lock.json index 5e24b4f..737bb58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "blockparty-accordion", - "version": "1.0.6", + "version": "1.0.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "blockparty-accordion", - "version": "1.0.6", + "version": "1.0.8", "license": "GPL-2.0-or-later", "dependencies": { "@beapi/be-a11y": "^1.7.3", diff --git a/package.json b/package.json index f111f6b..ce54af9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockparty-accordion", - "version": "1.0.7", + "version": "1.0.8", "description": "Accessible Accordion block for WordPress", "author": "Be API Technical team", "license": "GPL-2.0-or-later", diff --git a/readme.txt b/readme.txt index 49d5469..c4fe2dc 100644 --- a/readme.txt +++ b/readme.txt @@ -31,6 +31,10 @@ directory take precedence. For example, `/assets/screenshot-1.png` would win ove == Changelog == += 1.0.8 = + +* Add option to open the first item by default + = 1.0.7 = * Update block icons diff --git a/src/blockparty-accordion-item/block.json b/src/blockparty-accordion-item/block.json index e910add..c29feb1 100644 --- a/src/blockparty-accordion-item/block.json +++ b/src/blockparty-accordion-item/block.json @@ -2,15 +2,20 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 2, "name": "blockparty/accordion-item", - "parent": [ "blockparty/accordion" ], - "version": "1.0.7", + "parent": [ + "blockparty/accordion" + ], + "version": "1.0.8", "title": "Item", "category": "widgets", "description": "Accessible accordion block item.", "supports": { "html": false, "anchor": false, - "align": [ "wide", "full" ], + "align": [ + "wide", + "full" + ], "reusable": false, "color": { "background": true, diff --git a/src/blockparty-accordion-panel/block.json b/src/blockparty-accordion-panel/block.json index 21e8e25..c2e1107 100644 --- a/src/blockparty-accordion-panel/block.json +++ b/src/blockparty-accordion-panel/block.json @@ -2,15 +2,20 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 2, "name": "blockparty/accordion-panel", - "parent": [ "blockparty/accordion-item" ], - "version": "1.0.7", + "parent": [ + "blockparty/accordion-item" + ], + "version": "1.0.8", "title": "Panel", "category": "widgets", "description": "Accessible accordion block panel.", "supports": { "html": false, "anchor": false, - "align": [ "wide", "full" ], + "align": [ + "wide", + "full" + ], "reusable": false, "color": { "background": true, diff --git a/src/blockparty-accordion-summary/block.json b/src/blockparty-accordion-summary/block.json index 299ee57..52c1aba 100644 --- a/src/blockparty-accordion-summary/block.json +++ b/src/blockparty-accordion-summary/block.json @@ -2,15 +2,20 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 2, "name": "blockparty/accordion-summary", - "parent": [ "blockparty/accordion-item" ], - "version": "1.0.7", + "parent": [ + "blockparty/accordion-item" + ], + "version": "1.0.8", "title": "Summary", "category": "widgets", "description": "Accessible accordion block summary.", "supports": { "html": false, "anchor": false, - "align": [ "wide", "full" ], + "align": [ + "wide", + "full" + ], "lock": true, "reusable": false, "color": { diff --git a/src/blockparty-accordion/block.json b/src/blockparty-accordion/block.json index c90bccc..164dbfe 100644 --- a/src/blockparty-accordion/block.json +++ b/src/blockparty-accordion/block.json @@ -2,14 +2,23 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 2, "name": "blockparty/accordion", - "version": "1.0.7", + "version": "1.0.8", "title": "Accordion", "category": "widgets", "description": "Accessible accordion block.", + "attributes": { + "firstItemOpenByDefault": { + "type": "boolean", + "default": false + } + }, "supports": { "html": false, "anchor": true, - "align": [ "wide", "full" ], + "align": [ + "wide", + "full" + ], "color": { "background": true, "text": true diff --git a/src/blockparty-accordion/edit.js b/src/blockparty-accordion/edit.js index ca194c5..9a56324 100644 --- a/src/blockparty-accordion/edit.js +++ b/src/blockparty-accordion/edit.js @@ -1,14 +1,41 @@ -import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor'; +import { + useBlockProps, + useInnerBlocksProps, + InspectorControls, +} from '@wordpress/block-editor'; +import { PanelBody, ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; import './editor.scss'; const BLOCKS_CHILD = 'blockparty/accordion-item'; const ALLOWED_BLOCKS = [BLOCKS_CHILD]; -export default function Edit() { +export default function Edit({ attributes, setAttributes }) { + const { firstItemOpenByDefault } = attributes; const blockProps = useBlockProps(); const innerBlocksProps = useInnerBlocksProps(blockProps, { allowedBlocks: ALLOWED_BLOCKS, template: [[BLOCKS_CHILD], [BLOCKS_CHILD], [BLOCKS_CHILD]], }); - return
; + return ( + <> + + + + setAttributes({ firstItemOpenByDefault: value }) + } + /> + + +
+ + ); } diff --git a/src/blockparty-accordion/editor.scss b/src/blockparty-accordion/editor.scss index ca91704..1244b9d 100644 --- a/src/blockparty-accordion/editor.scss +++ b/src/blockparty-accordion/editor.scss @@ -1,5 +1,6 @@ /* editor */ .wp-block-blockparty-accordion { + &-item, &-panel, .wp-block { @@ -12,6 +13,10 @@ margin-bottom: 0; } + &-panel { + display: none; + } + &-item.has-child-selected .wp-block-blockparty-accordion-panel { display: block; } diff --git a/src/blockparty-accordion/save.js b/src/blockparty-accordion/save.js index c41a197..e49841c 100644 --- a/src/blockparty-accordion/save.js +++ b/src/blockparty-accordion/save.js @@ -1,6 +1,12 @@ import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor'; -export default function save() { - const innerBlocksProps = useInnerBlocksProps.save(useBlockProps.save()); +export default function save({ attributes }) { + const { firstItemOpenByDefault } = attributes; + const blockProps = useBlockProps.save({ + 'data-first-item-open-by-default': firstItemOpenByDefault + ? 'true' + : undefined, + }); + const innerBlocksProps = useInnerBlocksProps.save(blockProps); return
; } diff --git a/src/blockparty-accordion/script.js b/src/blockparty-accordion/script.js index 8b796eb..80e7498 100644 --- a/src/blockparty-accordion/script.js +++ b/src/blockparty-accordion/script.js @@ -3,7 +3,15 @@ import { Accordion } from '@beapi/be-a11y'; // eslint-disable-next-line no-undef const accordionConfig = beapiAccordionBlock.accordionConfig; -// Initialize beapi-accordion +// Initialize beapi-accordion (closedDefault from block option firstItemOpenByDefault) window.addEventListener('load', function () { - Accordion.init('.wp-block-blockparty-accordion', accordionConfig); + const selector = '.wp-block-blockparty-accordion'; + const elements = document.querySelectorAll(selector); + elements.forEach((el) => { + const config = { ...accordionConfig }; + if (el.dataset.firstItemOpenByDefault === 'true') { + config.closedDefault = false; + } + Accordion.init(el, config); + }); }); diff --git a/src/blockparty-accordion/style.scss b/src/blockparty-accordion/style.scss index 8d4dfe7..730d6f7 100644 --- a/src/blockparty-accordion/style.scss +++ b/src/blockparty-accordion/style.scss @@ -32,7 +32,7 @@ } } - &-panel { + &-item:where(:has([aria-expanded="false"])) &-panel { display: none; }