@wordpress/block-library 9.31.1-next.f56bd8138.0 → 9.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/accordion/edit.js +62 -12
  3. package/build/accordion/edit.js.map +1 -1
  4. package/build/accordion/index.js +15 -8
  5. package/build/accordion/index.js.map +1 -1
  6. package/build/accordion/view.js +15 -15
  7. package/build/accordion/view.js.map +1 -1
  8. package/build/accordion-heading/edit.js +68 -0
  9. package/build/accordion-heading/edit.js.map +1 -0
  10. package/build/accordion-heading/icon.js.map +1 -0
  11. package/build/{accordion-header → accordion-heading}/index.js +9 -17
  12. package/build/accordion-heading/index.js.map +1 -0
  13. package/build/{accordion-content → accordion-heading}/init.js.map +1 -1
  14. package/build/{accordion-header → accordion-heading}/save.js +7 -20
  15. package/build/accordion-heading/save.js.map +1 -0
  16. package/build/{accordion-content → accordion-item}/edit.js +8 -2
  17. package/build/accordion-item/edit.js.map +1 -0
  18. package/build/accordion-item/icon.js.map +1 -0
  19. package/build/{accordion-content → accordion-item}/index.js +6 -5
  20. package/build/accordion-item/index.js.map +1 -0
  21. package/build/accordion-item/init.js.map +1 -0
  22. package/build/{accordion-content → accordion-item}/save.js +5 -7
  23. package/build/accordion-item/save.js.map +1 -0
  24. package/build/accordion-panel/edit.js +2 -1
  25. package/build/accordion-panel/edit.js.map +1 -1
  26. package/build/accordion-panel/index.js +5 -3
  27. package/build/accordion-panel/index.js.map +1 -1
  28. package/build/accordion-panel/save.js +3 -1
  29. package/build/accordion-panel/save.js.map +1 -1
  30. package/build/block/index.js +1 -0
  31. package/build/block/index.js.map +1 -1
  32. package/build/group/variations.js +3 -4
  33. package/build/group/variations.js.map +1 -1
  34. package/build/index.js +24 -4
  35. package/build/index.js.map +1 -1
  36. package/build/navigation/edit/leaf-more-menu.js +6 -1
  37. package/build/navigation/edit/leaf-more-menu.js.map +1 -1
  38. package/build/navigation-link/edit.js +3 -140
  39. package/build/navigation-link/edit.js.map +1 -1
  40. package/build/navigation-link/shared/controls.js +171 -0
  41. package/build/navigation-link/shared/controls.js.map +1 -0
  42. package/build/navigation-link/shared/index.js +13 -0
  43. package/build/navigation-link/shared/index.js.map +1 -0
  44. package/build/navigation-submenu/edit.js +7 -114
  45. package/build/navigation-submenu/edit.js.map +1 -1
  46. package/build/pattern/index.js +1 -0
  47. package/build/pattern/index.js.map +1 -1
  48. package/build/post-date/edit.js +16 -3
  49. package/build/post-date/edit.js.map +1 -1
  50. package/build/post-time-to-read/edit.js +27 -15
  51. package/build/post-time-to-read/edit.js.map +1 -1
  52. package/build/post-time-to-read/index.js +7 -1
  53. package/build/post-time-to-read/index.js.map +1 -1
  54. package/build/post-time-to-read/variations.js +41 -0
  55. package/build/post-time-to-read/variations.js.map +1 -0
  56. package/build/query-title/edit.js +1 -1
  57. package/build/query-title/edit.js.map +1 -1
  58. package/build/table-of-contents/index.js +1 -0
  59. package/build/table-of-contents/index.js.map +1 -1
  60. package/build/template-part/index.js +1 -0
  61. package/build/template-part/index.js.map +1 -1
  62. package/build/utils/get-transformed-metadata.js +7 -0
  63. package/build/utils/get-transformed-metadata.js.map +1 -1
  64. package/build-module/accordion/edit.js +66 -16
  65. package/build-module/accordion/edit.js.map +1 -1
  66. package/build-module/accordion/index.js +15 -8
  67. package/build-module/accordion/index.js.map +1 -1
  68. package/build-module/accordion/view.js +15 -15
  69. package/build-module/accordion/view.js.map +1 -1
  70. package/build-module/accordion-heading/edit.js +61 -0
  71. package/build-module/accordion-heading/edit.js.map +1 -0
  72. package/build-module/accordion-heading/icon.js.map +1 -0
  73. package/build-module/{accordion-header → accordion-heading}/index.js +9 -17
  74. package/build-module/accordion-heading/index.js.map +1 -0
  75. package/build-module/{accordion-content → accordion-heading}/init.js.map +1 -1
  76. package/build-module/{accordion-header → accordion-heading}/save.js +7 -18
  77. package/build-module/accordion-heading/save.js.map +1 -0
  78. package/build-module/{accordion-content → accordion-item}/edit.js +8 -2
  79. package/build-module/accordion-item/edit.js.map +1 -0
  80. package/build-module/accordion-item/icon.js.map +1 -0
  81. package/build-module/{accordion-content → accordion-item}/index.js +6 -5
  82. package/build-module/accordion-item/index.js.map +1 -0
  83. package/build-module/accordion-item/init.js.map +1 -0
  84. package/build-module/{accordion-content → accordion-item}/save.js +5 -7
  85. package/build-module/accordion-item/save.js.map +1 -0
  86. package/build-module/accordion-panel/edit.js +2 -1
  87. package/build-module/accordion-panel/edit.js.map +1 -1
  88. package/build-module/accordion-panel/index.js +5 -3
  89. package/build-module/accordion-panel/index.js.map +1 -1
  90. package/build-module/accordion-panel/save.js +3 -1
  91. package/build-module/accordion-panel/save.js.map +1 -1
  92. package/build-module/block/index.js +1 -0
  93. package/build-module/block/index.js.map +1 -1
  94. package/build-module/group/variations.js +3 -4
  95. package/build-module/group/variations.js.map +1 -1
  96. package/build-module/index.js +25 -5
  97. package/build-module/index.js.map +1 -1
  98. package/build-module/navigation/edit/leaf-more-menu.js +6 -1
  99. package/build-module/navigation/edit/leaf-more-menu.js.map +1 -1
  100. package/build-module/navigation-link/edit.js +4 -141
  101. package/build-module/navigation-link/edit.js.map +1 -1
  102. package/build-module/navigation-link/shared/controls.js +165 -0
  103. package/build-module/navigation-link/shared/controls.js.map +1 -0
  104. package/build-module/navigation-link/shared/index.js +9 -0
  105. package/build-module/navigation-link/shared/index.js.map +1 -0
  106. package/build-module/navigation-submenu/edit.js +7 -114
  107. package/build-module/navigation-submenu/edit.js.map +1 -1
  108. package/build-module/pattern/index.js +1 -0
  109. package/build-module/pattern/index.js.map +1 -1
  110. package/build-module/post-date/edit.js +17 -4
  111. package/build-module/post-date/edit.js.map +1 -1
  112. package/build-module/post-time-to-read/edit.js +27 -15
  113. package/build-module/post-time-to-read/edit.js.map +1 -1
  114. package/build-module/post-time-to-read/index.js +7 -1
  115. package/build-module/post-time-to-read/index.js.map +1 -1
  116. package/build-module/post-time-to-read/variations.js +33 -0
  117. package/build-module/post-time-to-read/variations.js.map +1 -0
  118. package/build-module/query-title/edit.js +1 -1
  119. package/build-module/query-title/edit.js.map +1 -1
  120. package/build-module/table-of-contents/index.js +1 -0
  121. package/build-module/table-of-contents/index.js.map +1 -1
  122. package/build-module/template-part/index.js +1 -0
  123. package/build-module/template-part/index.js.map +1 -1
  124. package/build-module/utils/get-transformed-metadata.js +7 -0
  125. package/build-module/utils/get-transformed-metadata.js.map +1 -1
  126. package/build-style/{accordion → accordion-heading}/style-rtl.css +9 -54
  127. package/build-style/{accordion → accordion-heading}/style.css +9 -54
  128. package/build-style/accordion-item/style-rtl.css +155 -0
  129. package/build-style/accordion-item/style.css +155 -0
  130. package/build-style/accordion-panel/style-rtl.css +140 -0
  131. package/build-style/accordion-panel/style.css +140 -0
  132. package/build-style/style-rtl.css +23 -42
  133. package/build-style/style.css +23 -42
  134. package/package.json +35 -35
  135. package/src/accordion/block.json +11 -4
  136. package/src/accordion/edit.js +70 -13
  137. package/src/accordion/index.js +4 -4
  138. package/src/accordion/index.php +1 -1
  139. package/src/accordion/view.js +15 -15
  140. package/src/{accordion-header → accordion-heading}/block.json +10 -17
  141. package/src/accordion-heading/edit.js +70 -0
  142. package/src/{accordion-header → accordion-heading}/save.js +8 -18
  143. package/src/accordion-heading/style.scss +43 -0
  144. package/src/{accordion-content → accordion-item}/block.json +6 -5
  145. package/src/{accordion-content → accordion-item}/edit.js +12 -2
  146. package/src/{accordion-content → accordion-item}/index.php +11 -11
  147. package/src/{accordion-content → accordion-item}/save.js +4 -10
  148. package/src/accordion-item/style.scss +21 -0
  149. package/src/accordion-panel/block.json +5 -3
  150. package/src/accordion-panel/edit.js +1 -0
  151. package/src/accordion-panel/save.js +3 -1
  152. package/src/accordion-panel/style.scss +8 -0
  153. package/src/block/block.json +1 -0
  154. package/src/comments/index.php +2 -2
  155. package/src/group/variations.js +3 -14
  156. package/src/index.js +23 -4
  157. package/src/navigation/edit/leaf-more-menu.js +9 -1
  158. package/src/navigation/index.php +2 -2
  159. package/src/navigation-link/edit.js +3 -142
  160. package/src/navigation-link/shared/README.md +47 -0
  161. package/src/navigation-link/shared/controls.js +167 -0
  162. package/src/navigation-link/shared/index.js +8 -0
  163. package/src/navigation-link/shared/test/controls.js +210 -0
  164. package/src/navigation-submenu/edit.js +8 -129
  165. package/src/pattern/block.json +1 -0
  166. package/src/post-date/edit.js +16 -16
  167. package/src/post-time-to-read/block.json +5 -1
  168. package/src/post-time-to-read/edit.js +87 -59
  169. package/src/post-time-to-read/index.js +2 -0
  170. package/src/post-time-to-read/index.php +48 -23
  171. package/src/post-time-to-read/variations.js +39 -0
  172. package/src/query-title/edit.js +2 -1
  173. package/src/query-title/index.php +3 -1
  174. package/src/social-link/index.php +2 -2
  175. package/src/style.scss +3 -1
  176. package/src/table-of-contents/block.json +1 -0
  177. package/src/table-of-contents/index.php +44 -0
  178. package/src/template-part/block.json +1 -0
  179. package/src/utils/get-transformed-metadata.js +8 -0
  180. package/build/accordion-content/edit.js.map +0 -1
  181. package/build/accordion-content/icon.js.map +0 -1
  182. package/build/accordion-content/index.js.map +0 -1
  183. package/build/accordion-content/save.js.map +0 -1
  184. package/build/accordion-header/edit.js +0 -94
  185. package/build/accordion-header/edit.js.map +0 -1
  186. package/build/accordion-header/icon.js.map +0 -1
  187. package/build/accordion-header/index.js.map +0 -1
  188. package/build/accordion-header/init.js.map +0 -1
  189. package/build/accordion-header/save.js.map +0 -1
  190. package/build-module/accordion-content/edit.js.map +0 -1
  191. package/build-module/accordion-content/icon.js.map +0 -1
  192. package/build-module/accordion-content/index.js.map +0 -1
  193. package/build-module/accordion-content/save.js.map +0 -1
  194. package/build-module/accordion-header/edit.js +0 -85
  195. package/build-module/accordion-header/edit.js.map +0 -1
  196. package/build-module/accordion-header/icon.js.map +0 -1
  197. package/build-module/accordion-header/index.js.map +0 -1
  198. package/build-module/accordion-header/init.js.map +0 -1
  199. package/build-module/accordion-header/save.js.map +0 -1
  200. package/src/accordion/style.scss +0 -90
  201. package/src/accordion-header/edit.js +0 -94
  202. /package/build/{accordion-header → accordion-heading}/icon.js +0 -0
  203. /package/build/{accordion-content → accordion-heading}/init.js +0 -0
  204. /package/build/{accordion-content → accordion-item}/icon.js +0 -0
  205. /package/build/{accordion-header → accordion-item}/init.js +0 -0
  206. /package/build-module/{accordion-header → accordion-heading}/icon.js +0 -0
  207. /package/build-module/{accordion-content → accordion-heading}/init.js +0 -0
  208. /package/build-module/{accordion-content → accordion-item}/icon.js +0 -0
  209. /package/build-module/{accordion-header → accordion-item}/init.js +0 -0
  210. /package/src/{accordion-header → accordion-heading}/icon.js +0 -0
  211. /package/src/{accordion-content → accordion-heading}/index.js +0 -0
  212. /package/src/{accordion-content → accordion-heading}/init.js +0 -0
  213. /package/src/{accordion-content → accordion-item}/icon.js +0 -0
  214. /package/src/{accordion-header → accordion-item}/index.js +0 -0
  215. /package/src/{accordion-header → accordion-item}/init.js +0 -0
@@ -6,7 +6,9 @@ import {
6
6
  useInnerBlocksProps,
7
7
  InspectorControls,
8
8
  BlockControls,
9
+ useBlockEditingMode,
9
10
  store as blockEditorStore,
11
+ HeadingLevelDropdown,
10
12
  } from '@wordpress/block-editor';
11
13
  import { __ } from '@wordpress/i18n';
12
14
  import {
@@ -16,8 +18,9 @@ import {
16
18
  __experimentalToolsPanel as ToolsPanel,
17
19
  __experimentalToolsPanelItem as ToolsPanelItem,
18
20
  ToolbarButton,
21
+ ToolbarGroup,
19
22
  } from '@wordpress/components';
20
- import { useDispatch } from '@wordpress/data';
23
+ import { useDispatch, useSelect, useRegistry } from '@wordpress/data';
21
24
  import { createBlock } from '@wordpress/blocks';
22
25
 
23
26
  /**
@@ -25,20 +28,32 @@ import { createBlock } from '@wordpress/blocks';
25
28
  */
26
29
  import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
27
30
 
28
- const ACCORDION_BLOCK_NAME = 'core/accordion-content';
31
+ const ACCORDION_BLOCK_NAME = 'core/accordion-item';
32
+ const ACCORDION_HEADING_BLOCK_NAME = 'core/accordion-heading';
29
33
  const ACCORDION_BLOCK = {
30
34
  name: ACCORDION_BLOCK_NAME,
31
35
  };
32
36
 
33
37
  export default function Edit( {
34
- attributes: { autoclose, iconPosition, showIcon },
38
+ attributes: {
39
+ autoclose,
40
+ iconPosition,
41
+ showIcon,
42
+ headingLevel,
43
+ levelOptions,
44
+ },
35
45
  clientId,
36
46
  setAttributes,
37
47
  isSelected: isSingleSelected,
38
48
  } ) {
49
+ const registry = useRegistry();
50
+ const { getBlockOrder } = useSelect( blockEditorStore );
39
51
  const blockProps = useBlockProps();
40
52
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
41
- const { insertBlock } = useDispatch( blockEditorStore );
53
+ const { updateBlockAttributes, insertBlock } =
54
+ useDispatch( blockEditorStore );
55
+ const blockEditingMode = useBlockEditingMode();
56
+ const isContentOnlyMode = blockEditingMode === 'contentOnly';
42
57
 
43
58
  const innerBlocksProps = useInnerBlocksProps( blockProps, {
44
59
  template: [ [ ACCORDION_BLOCK_NAME ], [ ACCORDION_BLOCK_NAME ] ],
@@ -47,19 +62,60 @@ export default function Edit( {
47
62
  templateInsertUpdatesSelection: true,
48
63
  } );
49
64
 
50
- const addAccordionContentBlock = () => {
51
- const newAccordionContent = createBlock( ACCORDION_BLOCK_NAME );
52
- insertBlock( newAccordionContent, undefined, clientId );
65
+ const addAccordionItemBlock = () => {
66
+ // When adding, set the header's level to current headingLevel
67
+ const newAccordionItem = createBlock( ACCORDION_BLOCK_NAME, {}, [
68
+ createBlock( ACCORDION_HEADING_BLOCK_NAME, {
69
+ level: headingLevel,
70
+ } ),
71
+ createBlock( 'core/accordion-panel', {} ),
72
+ ] );
73
+ insertBlock( newAccordionItem, undefined, clientId );
74
+ };
75
+
76
+ /**
77
+ * Update all child Accordion Header blocks with a new heading level
78
+ * based on the accordion group setting.
79
+ * @param {number} newHeadingLevel The new heading level to set
80
+ */
81
+ const updateHeadingLevel = ( newHeadingLevel ) => {
82
+ const innerBlockClientIds = getBlockOrder( clientId );
83
+
84
+ // Get all accordion-header blocks from all accordion-content blocks.
85
+ const accordionHeaderClientIds = [];
86
+ innerBlockClientIds.forEach( ( contentClientId ) => {
87
+ const headerClientIds = getBlockOrder( contentClientId );
88
+ accordionHeaderClientIds.push( ...headerClientIds );
89
+ } );
90
+
91
+ // Update own and child block heading levels.
92
+ registry.batch( () => {
93
+ setAttributes( { headingLevel: newHeadingLevel } );
94
+ updateBlockAttributes( accordionHeaderClientIds, {
95
+ level: newHeadingLevel,
96
+ } );
97
+ } );
53
98
  };
54
99
 
55
100
  return (
56
101
  <>
57
- { isSingleSelected && (
58
- <BlockControls group="other">
59
- <ToolbarButton onClick={ addAccordionContentBlock }>
60
- { __( 'Add' ) }
61
- </ToolbarButton>
62
- </BlockControls>
102
+ { isSingleSelected && ! isContentOnlyMode && (
103
+ <>
104
+ <BlockControls>
105
+ <ToolbarGroup>
106
+ <HeadingLevelDropdown
107
+ value={ headingLevel }
108
+ options={ levelOptions }
109
+ onChange={ updateHeadingLevel }
110
+ />
111
+ </ToolbarGroup>
112
+ </BlockControls>
113
+ <BlockControls group="other">
114
+ <ToolbarButton onClick={ addAccordionItemBlock }>
115
+ { __( 'Add' ) }
116
+ </ToolbarButton>
117
+ </BlockControls>
118
+ </>
63
119
  ) }
64
120
  <InspectorControls key="setting">
65
121
  <ToolsPanel
@@ -69,6 +125,7 @@ export default function Edit( {
69
125
  autoclose: false,
70
126
  showIcon: true,
71
127
  iconPosition: 'right',
128
+ headingLevel: 3,
72
129
  } );
73
130
  } }
74
131
  dropdownMenuProps={ dropdownMenuProps }
@@ -21,10 +21,10 @@ export const settings = {
21
21
  example: {
22
22
  innerBlocks: [
23
23
  {
24
- name: 'core/accordion-content',
24
+ name: 'core/accordion-item',
25
25
  innerBlocks: [
26
26
  {
27
- name: 'core/accordion-header',
27
+ name: 'core/accordion-heading',
28
28
  attributes: {
29
29
  title: __(
30
30
  'Lorem ipsum dolor sit amet, consectetur.'
@@ -34,10 +34,10 @@ export const settings = {
34
34
  ],
35
35
  },
36
36
  {
37
- name: 'core/accordion-content',
37
+ name: 'core/accordion-item',
38
38
  innerBlocks: [
39
39
  {
40
- name: 'core/accordion-header',
40
+ name: 'core/accordion-heading',
41
41
  attributes: {
42
42
  title: __(
43
43
  'Suspendisse commodo lacus, interdum et.'
@@ -20,7 +20,7 @@ function render_block_core_accordion( $attributes, $content ) {
20
20
 
21
21
  if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion' ) ) ) {
22
22
  $p->set_attribute( 'data-wp-interactive', 'core/accordion' );
23
- $p->set_attribute( 'data-wp-context', '{ "autoclose": ' . $autoclose . ', "accordionContents": [] }' );
23
+ $p->set_attribute( 'data-wp-context', '{ "autoclose": ' . $autoclose . ', "accordionItems": [] }' );
24
24
 
25
25
  // Only modify content if directives have been set.
26
26
  $content = $p->get_updated_html();
@@ -6,28 +6,28 @@ import { store, getContext, withSyncEvent } from '@wordpress/interactivity';
6
6
  store( 'core/accordion', {
7
7
  state: {
8
8
  get isOpen() {
9
- const { id, accordionContents } = getContext();
10
- const accordionContent = accordionContents.find(
9
+ const { id, accordionItems } = getContext();
10
+ const accordionItem = accordionItems.find(
11
11
  ( item ) => item.id === id
12
12
  );
13
- return accordionContent ? accordionContent.isOpen : false;
13
+ return accordionItem ? accordionItem.isOpen : false;
14
14
  },
15
15
  },
16
16
  actions: {
17
17
  toggle: () => {
18
18
  const context = getContext();
19
- const { id, autoclose, accordionContents } = context;
20
- const accordionContent = accordionContents.find(
19
+ const { id, autoclose, accordionItems } = context;
20
+ const accordionItem = accordionItems.find(
21
21
  ( item ) => item.id === id
22
22
  );
23
23
 
24
24
  if ( autoclose ) {
25
- accordionContents.forEach( ( item ) => {
25
+ accordionItems.forEach( ( item ) => {
26
26
  item.isOpen =
27
- item.id === id ? ! accordionContent.isOpen : false;
27
+ item.id === id ? ! accordionItem.isOpen : false;
28
28
  } );
29
29
  } else {
30
- accordionContent.isOpen = ! accordionContent.isOpen;
30
+ accordionItem.isOpen = ! accordionItem.isOpen;
31
31
  }
32
32
  },
33
33
  handleKeyDown: withSyncEvent( ( event ) => {
@@ -42,8 +42,8 @@ store( 'core/accordion', {
42
42
 
43
43
  event.preventDefault();
44
44
  const context = getContext();
45
- const { id, accordionContents } = context;
46
- const currentIndex = accordionContents.findIndex(
45
+ const { id, accordionItems } = context;
46
+ const currentIndex = accordionItems.findIndex(
47
47
  ( item ) => item.id === id
48
48
  );
49
49
 
@@ -56,18 +56,18 @@ store( 'core/accordion', {
56
56
  case 'ArrowDown':
57
57
  nextIndex = Math.min(
58
58
  currentIndex + 1,
59
- accordionContents.length - 1
59
+ accordionItems.length - 1
60
60
  );
61
61
  break;
62
62
  case 'Home':
63
63
  nextIndex = 0;
64
64
  break;
65
65
  case 'End':
66
- nextIndex = accordionContents.length - 1;
66
+ nextIndex = accordionItems.length - 1;
67
67
  break;
68
68
  }
69
69
 
70
- const nextId = accordionContents[ nextIndex ].id;
70
+ const nextId = accordionItems[ nextIndex ].id;
71
71
  const nextButton = document.getElementById( nextId );
72
72
  if ( nextButton ) {
73
73
  nextButton.focus();
@@ -75,10 +75,10 @@ store( 'core/accordion', {
75
75
  } ),
76
76
  },
77
77
  callbacks: {
78
- initAccordionContents: () => {
78
+ initAccordionItems: () => {
79
79
  const context = getContext();
80
80
  const { id, openByDefault } = context;
81
- context.accordionContents.push( {
81
+ context.accordionItems.push( {
82
82
  id,
83
83
  isOpen: openByDefault,
84
84
  } );
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "$schema": "https://schemas.wp.org/trunk/block.json",
3
3
  "apiVersion": 3,
4
- "name": "core/accordion-header",
5
- "title": "Accordion Header",
4
+ "name": "core/accordion-heading",
5
+ "title": "Accordion Heading",
6
6
  "category": "design",
7
- "description": "Displays an accordion header.",
7
+ "description": "Displays an accordion heading.",
8
8
  "__experimental": true,
9
- "parent": [ "core/accordion-content" ],
9
+ "parent": [ "core/accordion-item" ],
10
10
  "usesContext": [
11
11
  "core/accordion-icon-position",
12
- "core/accordion-show-icon"
12
+ "core/accordion-show-icon",
13
+ "core/accordion-heading-level"
13
14
  ],
14
15
  "supports": {
15
16
  "anchor": true,
@@ -39,7 +40,6 @@
39
40
  }
40
41
  },
41
42
  "typography": {
42
- "textAlign": true,
43
43
  "fontSize": true,
44
44
  "__experimentalFontFamily": true,
45
45
  "__experimentalFontWeight": true,
@@ -52,7 +52,8 @@
52
52
  "fontFamily": true
53
53
  }
54
54
  },
55
- "shadow": true
55
+ "shadow": true,
56
+ "blockVisibility": false
56
57
  },
57
58
  "attributes": {
58
59
  "openByDefault": {
@@ -62,19 +63,11 @@
62
63
  "title": {
63
64
  "type": "rich-text",
64
65
  "source": "rich-text",
65
- "selector": ".accordion-content__toggle-title",
66
+ "selector": ".wp-block-accordion-heading__toggle-title",
66
67
  "role": "content"
67
68
  },
68
69
  "level": {
69
- "type": "number",
70
- "default": 3
71
- },
72
- "levelOptions": {
73
- "type": "array"
74
- },
75
- "textAlignment": {
76
- "type": "string",
77
- "default": "left"
70
+ "type": "number"
78
71
  },
79
72
  "iconPosition": {
80
73
  "type": "string",
@@ -0,0 +1,70 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useEffect } from '@wordpress/element';
6
+ import {
7
+ useBlockProps,
8
+ __experimentalGetSpacingClassesAndStyles as useSpacingProps,
9
+ RichText,
10
+ } from '@wordpress/block-editor';
11
+
12
+ export default function Edit( { attributes, setAttributes, context } ) {
13
+ const { title } = attributes;
14
+ const {
15
+ 'core/accordion-icon-position': iconPosition,
16
+ 'core/accordion-show-icon': showIcon,
17
+ 'core/accordion-heading-level': headingLevel,
18
+ } = context;
19
+ const TagName = 'h' + headingLevel;
20
+
21
+ // Set icon attributes.
22
+ useEffect( () => {
23
+ if ( iconPosition !== undefined && showIcon !== undefined ) {
24
+ setAttributes( {
25
+ iconPosition,
26
+ showIcon,
27
+ } );
28
+ }
29
+ }, [ iconPosition, showIcon, setAttributes ] );
30
+
31
+ const blockProps = useBlockProps();
32
+ const spacingProps = useSpacingProps( attributes );
33
+
34
+ return (
35
+ <TagName { ...blockProps }>
36
+ <button
37
+ className="wp-block-accordion-heading__toggle"
38
+ style={ spacingProps.style }
39
+ >
40
+ { showIcon && iconPosition === 'left' && (
41
+ <span
42
+ className="wp-block-accordion-heading__toggle-icon"
43
+ aria-hidden="true"
44
+ >
45
+ +
46
+ </span>
47
+ ) }
48
+ <RichText
49
+ withoutInteractiveFormatting
50
+ disableLineBreaks
51
+ tagName="span"
52
+ value={ title }
53
+ onChange={ ( newTitle ) =>
54
+ setAttributes( { title: newTitle } )
55
+ }
56
+ placeholder={ __( 'Accordion title' ) }
57
+ className="wp-block-accordion-heading__toggle-title"
58
+ />
59
+ { showIcon && iconPosition === 'right' && (
60
+ <span
61
+ className="wp-block-accordion-heading__toggle-icon"
62
+ aria-hidden="true"
63
+ >
64
+ +
65
+ </span>
66
+ ) }
67
+ </button>
68
+ </TagName>
69
+ );
70
+ }
@@ -1,7 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import clsx from 'clsx';
5
1
  /**
6
2
  * WordPress dependencies
7
3
  */
@@ -12,40 +8,34 @@ import {
12
8
  } from '@wordpress/block-editor';
13
9
 
14
10
  export default function save( { attributes } ) {
15
- const { level, title, iconPosition, textAlign, showIcon } = attributes;
16
- const TagName = 'h' + level;
11
+ const { level, title, iconPosition, showIcon } = attributes;
12
+ const TagName = 'h' + ( level || 3 );
17
13
 
18
- const blockProps = useBlockProps.save( {
19
- className: clsx( 'accordion-content__heading', {
20
- [ `has-text-align-${ textAlign }` ]: textAlign,
21
- } ),
22
- } );
14
+ const blockProps = useBlockProps.save();
23
15
  const spacingProps = getSpacingClassesAndStyles( attributes );
24
16
 
25
17
  return (
26
18
  <TagName { ...blockProps }>
27
19
  <button
28
- className={ clsx( 'accordion-content__toggle' ) }
29
- style={ {
30
- ...spacingProps.style,
31
- } }
20
+ className="wp-block-accordion-heading__toggle"
21
+ style={ spacingProps.style }
32
22
  >
33
23
  { showIcon && iconPosition === 'left' && (
34
24
  <span
35
- className="accordion-content__toggle-icon"
25
+ className="wp-block-accordion-heading__toggle-icon"
36
26
  aria-hidden="true"
37
27
  >
38
28
  +
39
29
  </span>
40
30
  ) }
41
31
  <RichText.Content
42
- className="accordion-content__toggle-title"
32
+ className="wp-block-accordion-heading__toggle-title"
43
33
  tagName="span"
44
34
  value={ title }
45
35
  />
46
36
  { showIcon && iconPosition === 'right' && (
47
37
  <span
48
- className="accordion-content__toggle-icon"
38
+ className="wp-block-accordion-heading__toggle-icon"
49
39
  aria-hidden="true"
50
40
  >
51
41
  +
@@ -0,0 +1,43 @@
1
+ .wp-block-accordion-heading__toggle {
2
+ font-family: inherit;
3
+ font-size: inherit;
4
+ font-weight: inherit;
5
+ line-height: inherit;
6
+ letter-spacing: inherit;
7
+ text-transform: inherit;
8
+ text-decoration: inherit;
9
+ word-spacing: inherit;
10
+ background: none;
11
+ border: none;
12
+ color: inherit;
13
+ padding: var(--wp--preset--spacing--20, 1em) 0;
14
+ cursor: pointer;
15
+ overflow: hidden;
16
+ display: flex;
17
+ align-items: center;
18
+ text-align: inherit;
19
+ position: relative;
20
+ width: 100%;
21
+
22
+ &:not(:focus-visible) {
23
+ outline: none;
24
+ }
25
+
26
+ &:hover {
27
+ .wp-block-accordion-heading__toggle-title {
28
+ text-decoration: underline;
29
+ }
30
+ }
31
+ }
32
+
33
+ .wp-block-accordion-heading__toggle-title {
34
+ flex: 1;
35
+ }
36
+
37
+ .wp-block-accordion-heading__toggle-icon {
38
+ width: 1.2em;
39
+ height: 1.2em;
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ }
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "$schema": "https://schemas.wp.org/trunk/block.json",
3
3
  "apiVersion": 3,
4
- "name": "core/accordion-content",
5
- "title": "Accordion Content",
4
+ "name": "core/accordion-item",
5
+ "title": "Accordion Item",
6
6
  "category": "design",
7
- "description": "Displays a section of content in an accordion, including a header and expandable content.",
7
+ "description": "Displays a section of content in an accordion, including a heading and expandable content.",
8
8
  "__experimental": true,
9
9
  "parent": [ "core/accordion" ],
10
- "allowedBlocks": [ "core/accordion-header", "core/accordion-panel" ],
10
+ "allowedBlocks": [ "core/accordion-heading", "core/accordion-panel" ],
11
11
  "supports": {
12
12
  "color": {
13
13
  "background": true,
@@ -52,5 +52,6 @@
52
52
  "default": false
53
53
  }
54
54
  },
55
- "textdomain": "default"
55
+ "textdomain": "default",
56
+ "style": "wp-block-accordion-item"
56
57
  }
@@ -25,7 +25,12 @@ import clsx from 'clsx';
25
25
  */
26
26
  import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
27
27
 
28
- export default function Edit( { attributes, clientId, setAttributes } ) {
28
+ export default function Edit( {
29
+ attributes,
30
+ clientId,
31
+ setAttributes,
32
+ context,
33
+ } ) {
29
34
  const { openByDefault } = attributes;
30
35
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
31
36
 
@@ -70,9 +75,14 @@ export default function Edit( { attributes, clientId, setAttributes } ) {
70
75
  } ),
71
76
  } );
72
77
 
78
+ // Get heading level from context.
79
+ const headingLevel = context && context[ 'core/accordion-heading-level' ];
73
80
  const innerBlocksProps = useInnerBlocksProps( blockProps, {
74
81
  template: [
75
- [ 'core/accordion-header', {} ],
82
+ [
83
+ 'core/accordion-heading',
84
+ headingLevel ? { level: headingLevel } : {},
85
+ ],
76
86
  [
77
87
  'core/accordion-panel',
78
88
  {
@@ -1,7 +1,7 @@
1
1
  <?php
2
2
 
3
3
  /**
4
- * Server-side rendering of the `core/accordion-content` block.
4
+ * Server-side rendering of the `core/accordion-item` block.
5
5
  *
6
6
  * @package WordPress
7
7
  * @since 6.6.0
@@ -11,13 +11,13 @@
11
11
  *
12
12
  * @return string Returns the updated markup.
13
13
  */
14
- function block_core_accordion_content_render( $attributes, $content ) {
14
+ function block_core_accordion_item_render( $attributes, $content ) {
15
15
  if ( ! $content ) {
16
16
  return $content;
17
17
  }
18
18
 
19
19
  $p = new WP_HTML_Tag_Processor( $content );
20
- $unique_id = wp_unique_id( 'accordion-content-' );
20
+ $unique_id = wp_unique_id( 'accordion-item-' );
21
21
 
22
22
  // Initialize the state of the item on the server using a closure,
23
23
  // since we need to get derived state based on the current context.
@@ -31,13 +31,13 @@ function block_core_accordion_content_render( $attributes, $content ) {
31
31
  )
32
32
  );
33
33
 
34
- if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-content' ) ) ) {
34
+ if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-item' ) ) ) {
35
35
  $open_by_default = $attributes['openByDefault'] ? 'true' : 'false';
36
36
  $p->set_attribute( 'data-wp-context', '{ "id": "' . $unique_id . '", "openByDefault": ' . $open_by_default . ' }' );
37
37
  $p->set_attribute( 'data-wp-class--is-open', 'state.isOpen' );
38
- $p->set_attribute( 'data-wp-init', 'callbacks.initAccordionContents' );
38
+ $p->set_attribute( 'data-wp-init', 'callbacks.initAccordionItems' );
39
39
 
40
- if ( $p->next_tag( array( 'class_name' => 'accordion-content__toggle' ) ) ) {
40
+ if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-heading__toggle' ) ) ) {
41
41
  $p->set_attribute( 'data-wp-on--click', 'actions.toggle' );
42
42
  $p->set_attribute( 'data-wp-on--keydown', 'actions.handleKeyDown' );
43
43
  $p->set_attribute( 'id', $unique_id );
@@ -59,16 +59,16 @@ function block_core_accordion_content_render( $attributes, $content ) {
59
59
  }
60
60
 
61
61
  /**
62
- * Registers the `core/accordion-content` block on server.
62
+ * Registers the `core/accordion-item` block on server.
63
63
  *
64
64
  * @since 6.6.0
65
65
  */
66
- function register_block_core_accordion_content() {
66
+ function register_block_core_accordion_item() {
67
67
  register_block_type_from_metadata(
68
- __DIR__ . '/accordion-content',
68
+ __DIR__ . '/accordion-item',
69
69
  array(
70
- 'render_callback' => 'block_core_accordion_content_render',
70
+ 'render_callback' => 'block_core_accordion_item_render',
71
71
  )
72
72
  );
73
73
  }
74
- add_action( 'init', 'register_block_core_accordion_content' );
74
+ add_action( 'init', 'register_block_core_accordion_item' );
@@ -9,17 +9,11 @@ import clsx from 'clsx';
9
9
 
10
10
  export default function save( { attributes } ) {
11
11
  const { openByDefault } = attributes;
12
- const blockProps = useBlockProps.save();
13
- const className = clsx(
14
- {
12
+ const blockProps = useBlockProps.save( {
13
+ className: clsx( {
15
14
  'is-open': openByDefault,
16
- },
17
- blockProps.className
18
- );
19
- const innerBlocksProps = useInnerBlocksProps.save( {
20
- ...blockProps,
21
- className,
15
+ } ),
22
16
  } );
23
-
17
+ const innerBlocksProps = useInnerBlocksProps.save( blockProps );
24
18
  return <div { ...innerBlocksProps } />;
25
19
  }
@@ -0,0 +1,21 @@
1
+ .wp-block-accordion-item {
2
+ display: grid;
3
+ grid-template-rows: max-content 0fr;
4
+
5
+ &.is-open {
6
+ grid-template-rows: max-content 1fr;
7
+
8
+ > .wp-block-accordion-heading .wp-block-accordion-heading__toggle-icon {
9
+ transform: rotate(45deg);
10
+ }
11
+ }
12
+
13
+ /* Add transitions only for users who do not prefer reduced motion */
14
+ @media (prefers-reduced-motion: no-preference) {
15
+ transition: grid-template-rows 0.3s ease-out;
16
+
17
+ > .wp-block-accordion-heading .wp-block-accordion-heading__toggle-icon {
18
+ transition: transform 0.2s ease-in-out;
19
+ }
20
+ }
21
+ }
@@ -6,7 +6,7 @@
6
6
  "category": "design",
7
7
  "description": "Displays an accordion panel.",
8
8
  "__experimental": true,
9
- "parent": [ "core/accordion-content" ],
9
+ "parent": [ "core/accordion-item" ],
10
10
  "supports": {
11
11
  "color": {
12
12
  "background": true,
@@ -47,7 +47,8 @@
47
47
  }
48
48
  },
49
49
  "shadow": true,
50
- "layout": true
50
+ "layout": true,
51
+ "blockVisibility": false
51
52
  },
52
53
  "attributes": {
53
54
  "allowedBlocks": {
@@ -67,5 +68,6 @@
67
68
  "default": false
68
69
  }
69
70
  },
70
- "textdomain": "default"
71
+ "textdomain": "default",
72
+ "style": "wp-block-accordion-panel"
71
73
  }