@wordpress/block-library 9.31.1-next.233ccab9b.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 (177) 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 -7
  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 -12
  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 +6 -8
  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 +5 -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-item/save.js.map +1 -0
  23. package/build/accordion-panel/index.js +3 -2
  24. package/build/accordion-panel/index.js.map +1 -1
  25. package/build/block/index.js +1 -0
  26. package/build/block/index.js.map +1 -1
  27. package/build/index.js +24 -4
  28. package/build/index.js.map +1 -1
  29. package/build/navigation-link/edit.js +3 -140
  30. package/build/navigation-link/edit.js.map +1 -1
  31. package/build/navigation-link/shared/controls.js +171 -0
  32. package/build/navigation-link/shared/controls.js.map +1 -0
  33. package/build/navigation-link/shared/index.js +13 -0
  34. package/build/navigation-link/shared/index.js.map +1 -0
  35. package/build/navigation-submenu/edit.js +5 -110
  36. package/build/navigation-submenu/edit.js.map +1 -1
  37. package/build/pattern/index.js +1 -0
  38. package/build/pattern/index.js.map +1 -1
  39. package/build/post-time-to-read/edit.js +16 -61
  40. package/build/post-time-to-read/edit.js.map +1 -1
  41. package/build/post-time-to-read/index.js +5 -7
  42. package/build/post-time-to-read/index.js.map +1 -1
  43. package/build/post-time-to-read/variations.js +41 -0
  44. package/build/post-time-to-read/variations.js.map +1 -0
  45. package/build/query-title/edit.js +1 -1
  46. package/build/query-title/edit.js.map +1 -1
  47. package/build/template-part/index.js +1 -0
  48. package/build/template-part/index.js.map +1 -1
  49. package/build/utils/get-transformed-metadata.js +7 -0
  50. package/build/utils/get-transformed-metadata.js.map +1 -1
  51. package/build-module/accordion/edit.js +66 -16
  52. package/build-module/accordion/edit.js.map +1 -1
  53. package/build-module/accordion/index.js +15 -7
  54. package/build-module/accordion/index.js.map +1 -1
  55. package/build-module/accordion/view.js +15 -15
  56. package/build-module/accordion/view.js.map +1 -1
  57. package/build-module/accordion-heading/edit.js +61 -0
  58. package/build-module/accordion-heading/edit.js.map +1 -0
  59. package/build-module/accordion-heading/icon.js.map +1 -0
  60. package/build-module/{accordion-header → accordion-heading}/index.js +9 -12
  61. package/build-module/accordion-heading/index.js.map +1 -0
  62. package/build-module/{accordion-content → accordion-heading}/init.js.map +1 -1
  63. package/build-module/{accordion-header → accordion-heading}/save.js +6 -8
  64. package/build-module/accordion-heading/save.js.map +1 -0
  65. package/build-module/{accordion-content → accordion-item}/edit.js +8 -2
  66. package/build-module/accordion-item/edit.js.map +1 -0
  67. package/build-module/accordion-item/icon.js.map +1 -0
  68. package/build-module/{accordion-content → accordion-item}/index.js +5 -5
  69. package/build-module/accordion-item/index.js.map +1 -0
  70. package/build-module/accordion-item/init.js.map +1 -0
  71. package/build-module/accordion-item/save.js.map +1 -0
  72. package/build-module/accordion-panel/index.js +3 -2
  73. package/build-module/accordion-panel/index.js.map +1 -1
  74. package/build-module/block/index.js +1 -0
  75. package/build-module/block/index.js.map +1 -1
  76. package/build-module/index.js +25 -5
  77. package/build-module/index.js.map +1 -1
  78. package/build-module/navigation-link/edit.js +4 -141
  79. package/build-module/navigation-link/edit.js.map +1 -1
  80. package/build-module/navigation-link/shared/controls.js +165 -0
  81. package/build-module/navigation-link/shared/controls.js.map +1 -0
  82. package/build-module/navigation-link/shared/index.js +9 -0
  83. package/build-module/navigation-link/shared/index.js.map +1 -0
  84. package/build-module/navigation-submenu/edit.js +6 -111
  85. package/build-module/navigation-submenu/edit.js.map +1 -1
  86. package/build-module/pattern/index.js +1 -0
  87. package/build-module/pattern/index.js.map +1 -1
  88. package/build-module/post-time-to-read/edit.js +17 -62
  89. package/build-module/post-time-to-read/edit.js.map +1 -1
  90. package/build-module/post-time-to-read/index.js +5 -7
  91. package/build-module/post-time-to-read/index.js.map +1 -1
  92. package/build-module/post-time-to-read/variations.js +33 -0
  93. package/build-module/post-time-to-read/variations.js.map +1 -0
  94. package/build-module/query-title/edit.js +1 -1
  95. package/build-module/query-title/edit.js.map +1 -1
  96. package/build-module/template-part/index.js +1 -0
  97. package/build-module/template-part/index.js.map +1 -1
  98. package/build-module/utils/get-transformed-metadata.js +7 -0
  99. package/build-module/utils/get-transformed-metadata.js.map +1 -1
  100. package/build-style/{accordion-header → accordion-heading}/style-rtl.css +8 -7
  101. package/build-style/{accordion-header → accordion-heading}/style.css +8 -7
  102. package/build-style/{accordion-content → accordion-item}/style-rtl.css +5 -5
  103. package/build-style/{accordion-content → accordion-item}/style.css +5 -5
  104. package/build-style/style-rtl.css +13 -12
  105. package/build-style/style.css +13 -12
  106. package/package.json +35 -35
  107. package/src/accordion/block.json +11 -3
  108. package/src/accordion/edit.js +70 -13
  109. package/src/accordion/index.js +4 -4
  110. package/src/accordion/index.php +1 -1
  111. package/src/accordion/view.js +15 -15
  112. package/src/{accordion-header → accordion-heading}/block.json +10 -12
  113. package/src/accordion-heading/edit.js +70 -0
  114. package/src/{accordion-header → accordion-heading}/save.js +6 -8
  115. package/src/{accordion-header → accordion-heading}/style.scss +11 -7
  116. package/src/{accordion-content → accordion-item}/block.json +5 -5
  117. package/src/{accordion-content → accordion-item}/edit.js +12 -2
  118. package/src/{accordion-content → accordion-item}/index.php +11 -11
  119. package/src/{accordion-content → accordion-item}/style.scss +3 -3
  120. package/src/accordion-panel/block.json +3 -2
  121. package/src/block/block.json +1 -0
  122. package/src/index.js +23 -4
  123. package/src/navigation-link/edit.js +3 -142
  124. package/src/navigation-link/shared/README.md +47 -0
  125. package/src/navigation-link/shared/controls.js +167 -0
  126. package/src/navigation-link/shared/index.js +8 -0
  127. package/src/navigation-link/shared/test/controls.js +210 -0
  128. package/src/navigation-submenu/edit.js +7 -125
  129. package/src/pattern/block.json +1 -0
  130. package/src/post-time-to-read/block.json +3 -7
  131. package/src/post-time-to-read/edit.js +36 -94
  132. package/src/post-time-to-read/index.js +2 -0
  133. package/src/post-time-to-read/index.php +12 -7
  134. package/src/post-time-to-read/variations.js +39 -0
  135. package/src/query-title/edit.js +2 -1
  136. package/src/query-title/index.php +3 -1
  137. package/src/style.scss +2 -2
  138. package/src/template-part/block.json +1 -0
  139. package/src/utils/get-transformed-metadata.js +8 -0
  140. package/build/accordion-content/edit.js.map +0 -1
  141. package/build/accordion-content/icon.js.map +0 -1
  142. package/build/accordion-content/index.js.map +0 -1
  143. package/build/accordion-content/save.js.map +0 -1
  144. package/build/accordion-header/edit.js +0 -84
  145. package/build/accordion-header/edit.js.map +0 -1
  146. package/build/accordion-header/icon.js.map +0 -1
  147. package/build/accordion-header/index.js.map +0 -1
  148. package/build/accordion-header/init.js.map +0 -1
  149. package/build/accordion-header/save.js.map +0 -1
  150. package/build-module/accordion-content/edit.js.map +0 -1
  151. package/build-module/accordion-content/icon.js.map +0 -1
  152. package/build-module/accordion-content/index.js.map +0 -1
  153. package/build-module/accordion-content/save.js.map +0 -1
  154. package/build-module/accordion-header/edit.js +0 -77
  155. package/build-module/accordion-header/edit.js.map +0 -1
  156. package/build-module/accordion-header/icon.js.map +0 -1
  157. package/build-module/accordion-header/index.js.map +0 -1
  158. package/build-module/accordion-header/init.js.map +0 -1
  159. package/build-module/accordion-header/save.js.map +0 -1
  160. package/src/accordion-header/edit.js +0 -87
  161. /package/build/{accordion-header → accordion-heading}/icon.js +0 -0
  162. /package/build/{accordion-content → accordion-heading}/init.js +0 -0
  163. /package/build/{accordion-content → accordion-item}/icon.js +0 -0
  164. /package/build/{accordion-header → accordion-item}/init.js +0 -0
  165. /package/build/{accordion-content → accordion-item}/save.js +0 -0
  166. /package/build-module/{accordion-header → accordion-heading}/icon.js +0 -0
  167. /package/build-module/{accordion-content → accordion-heading}/init.js +0 -0
  168. /package/build-module/{accordion-content → accordion-item}/icon.js +0 -0
  169. /package/build-module/{accordion-header → accordion-item}/init.js +0 -0
  170. /package/build-module/{accordion-content → accordion-item}/save.js +0 -0
  171. /package/src/{accordion-header → accordion-heading}/icon.js +0 -0
  172. /package/src/{accordion-content → accordion-heading}/index.js +0 -0
  173. /package/src/{accordion-content → accordion-heading}/init.js +0 -0
  174. /package/src/{accordion-content → accordion-item}/icon.js +0 -0
  175. /package/src/{accordion-header → accordion-item}/index.js +0 -0
  176. /package/src/{accordion-header → accordion-item}/init.js +0 -0
  177. /package/src/{accordion-content → accordion-item}/save.js +0 -0
@@ -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,
@@ -51,7 +52,8 @@
51
52
  "fontFamily": true
52
53
  }
53
54
  },
54
- "shadow": true
55
+ "shadow": true,
56
+ "blockVisibility": false
55
57
  },
56
58
  "attributes": {
57
59
  "openByDefault": {
@@ -61,15 +63,11 @@
61
63
  "title": {
62
64
  "type": "rich-text",
63
65
  "source": "rich-text",
64
- "selector": ".wp-block-accordion-header__toggle-title",
66
+ "selector": ".wp-block-accordion-heading__toggle-title",
65
67
  "role": "content"
66
68
  },
67
69
  "level": {
68
- "type": "number",
69
- "default": 3
70
- },
71
- "levelOptions": {
72
- "type": "array"
70
+ "type": "number"
73
71
  },
74
72
  "iconPosition": {
75
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
+ }
@@ -9,7 +9,7 @@ import {
9
9
 
10
10
  export default function save( { attributes } ) {
11
11
  const { level, title, iconPosition, showIcon } = attributes;
12
- const TagName = 'h' + level;
12
+ const TagName = 'h' + ( level || 3 );
13
13
 
14
14
  const blockProps = useBlockProps.save();
15
15
  const spacingProps = getSpacingClassesAndStyles( attributes );
@@ -17,27 +17,25 @@ export default function save( { attributes } ) {
17
17
  return (
18
18
  <TagName { ...blockProps }>
19
19
  <button
20
- className="wp-block-accordion-header__toggle"
21
- style={ {
22
- ...spacingProps.style,
23
- } }
20
+ className="wp-block-accordion-heading__toggle"
21
+ style={ spacingProps.style }
24
22
  >
25
23
  { showIcon && iconPosition === 'left' && (
26
24
  <span
27
- className="wp-block-accordion-header__toggle-icon"
25
+ className="wp-block-accordion-heading__toggle-icon"
28
26
  aria-hidden="true"
29
27
  >
30
28
  +
31
29
  </span>
32
30
  ) }
33
31
  <RichText.Content
34
- className="wp-block-accordion-header__toggle-title"
32
+ className="wp-block-accordion-heading__toggle-title"
35
33
  tagName="span"
36
34
  value={ title }
37
35
  />
38
36
  { showIcon && iconPosition === 'right' && (
39
37
  <span
40
- className="wp-block-accordion-header__toggle-icon"
38
+ className="wp-block-accordion-heading__toggle-icon"
41
39
  aria-hidden="true"
42
40
  >
43
41
  +
@@ -1,4 +1,4 @@
1
- .wp-block-accordion-header__toggle {
1
+ .wp-block-accordion-heading__toggle {
2
2
  font-family: inherit;
3
3
  font-size: inherit;
4
4
  font-weight: inherit;
@@ -12,7 +12,6 @@
12
12
  color: inherit;
13
13
  padding: var(--wp--preset--spacing--20, 1em) 0;
14
14
  cursor: pointer;
15
- outline: none;
16
15
  overflow: hidden;
17
16
  display: flex;
18
17
  align-items: center;
@@ -20,17 +19,22 @@
20
19
  position: relative;
21
20
  width: 100%;
22
21
 
23
- &:focus-visible {
24
- outline: 2px solid -webkit-focus-ring-color;
25
- outline-offset: 2px;
22
+ &:not(:focus-visible) {
23
+ outline: none;
24
+ }
25
+
26
+ &:hover {
27
+ .wp-block-accordion-heading__toggle-title {
28
+ text-decoration: underline;
29
+ }
26
30
  }
27
31
  }
28
32
 
29
- .wp-block-accordion-header__toggle-title {
33
+ .wp-block-accordion-heading__toggle-title {
30
34
  flex: 1;
31
35
  }
32
36
 
33
- .wp-block-accordion-header__toggle-icon {
37
+ .wp-block-accordion-heading__toggle-icon {
34
38
  width: 1.2em;
35
39
  height: 1.2em;
36
40
  display: flex;
@@ -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,
@@ -53,5 +53,5 @@
53
53
  }
54
54
  },
55
55
  "textdomain": "default",
56
- "style": "wp-block-accordion-content"
56
+ "style": "wp-block-accordion-item"
57
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' => 'wp-block-accordion-header__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' );
@@ -1,11 +1,11 @@
1
- .wp-block-accordion-content {
1
+ .wp-block-accordion-item {
2
2
  display: grid;
3
3
  grid-template-rows: max-content 0fr;
4
4
 
5
5
  &.is-open {
6
6
  grid-template-rows: max-content 1fr;
7
7
 
8
- > .wp-block-accordion-header .wp-block-accordion-header__toggle-icon {
8
+ > .wp-block-accordion-heading .wp-block-accordion-heading__toggle-icon {
9
9
  transform: rotate(45deg);
10
10
  }
11
11
  }
@@ -14,7 +14,7 @@
14
14
  @media (prefers-reduced-motion: no-preference) {
15
15
  transition: grid-template-rows 0.3s ease-out;
16
16
 
17
- > .wp-block-accordion-header .wp-block-accordion-header__toggle-icon {
17
+ > .wp-block-accordion-heading .wp-block-accordion-heading__toggle-icon {
18
18
  transition: transform 0.2s ease-in-out;
19
19
  }
20
20
  }
@@ -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": {
@@ -24,6 +24,7 @@
24
24
  "html": false,
25
25
  "inserter": false,
26
26
  "renaming": false,
27
+ "blockVisibility": false,
27
28
  "interactivity": {
28
29
  "clientNavigation": true
29
30
  }
package/src/index.js CHANGED
@@ -6,7 +6,10 @@ import {
6
6
  setFreeformContentHandlerName,
7
7
  setUnregisteredTypeHandlerName,
8
8
  setGroupingBlockName,
9
+ registerBlockType,
9
10
  } from '@wordpress/blocks';
11
+ import { createElement } from '@wordpress/element';
12
+ import ServerSideRender from '@wordpress/server-side-render';
10
13
 
11
14
  /**
12
15
  * Internal dependencies
@@ -21,8 +24,8 @@ import {
21
24
  //
22
25
  // See https://github.com/WordPress/gutenberg/pull/40655 for more context.
23
26
  import * as accordion from './accordion';
24
- import * as accordionContent from './accordion-content';
25
- import * as accordionHeader from './accordion-header';
27
+ import * as accordionItem from './accordion-item';
28
+ import * as accordionHeading from './accordion-heading';
26
29
  import * as accordionPanel from './accordion-panel';
27
30
  import * as archives from './archives';
28
31
  import * as avatar from './avatar';
@@ -243,8 +246,8 @@ const getAllBlocks = () => {
243
246
 
244
247
  if ( window?.__experimentalEnableBlockExperiments ) {
245
248
  blocks.push( accordion );
246
- blocks.push( accordionContent );
247
- blocks.push( accordionHeader );
249
+ blocks.push( accordionItem );
250
+ blocks.push( accordionHeading );
248
251
  blocks.push( accordionPanel );
249
252
  blocks.push( termsQuery );
250
253
  blocks.push( termTemplate );
@@ -309,6 +312,22 @@ export const registerCoreBlocks = (
309
312
  ) => {
310
313
  blocks.forEach( ( { init } ) => init() );
311
314
 
315
+ // Auto-register PHP-only blocks with ServerSideRender
316
+ if ( window.__unstableAutoRegisterBlocks ) {
317
+ window.__unstableAutoRegisterBlocks.forEach( ( blockName ) => {
318
+ registerBlockType( blockName, {
319
+ title: blockName,
320
+ edit: ( { attributes } ) => {
321
+ return createElement( ServerSideRender, {
322
+ block: blockName,
323
+ attributes,
324
+ } );
325
+ },
326
+ save: () => null,
327
+ } );
328
+ } );
329
+ }
330
+
312
331
  setDefaultBlockName( paragraph.name );
313
332
  if (
314
333
  window.wp &&
@@ -8,15 +8,7 @@ import clsx from 'clsx';
8
8
  */
9
9
  import { createBlock } from '@wordpress/blocks';
10
10
  import { useSelect, useDispatch } from '@wordpress/data';
11
- import {
12
- __experimentalToolsPanel as ToolsPanel,
13
- __experimentalToolsPanelItem as ToolsPanelItem,
14
- CheckboxControl,
15
- TextControl,
16
- TextareaControl,
17
- ToolbarButton,
18
- ToolbarGroup,
19
- } from '@wordpress/components';
11
+ import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
20
12
  import { displayShortcut, isKeyboardEvent } from '@wordpress/keycodes';
21
13
  import { __ } from '@wordpress/i18n';
22
14
  import {
@@ -29,9 +21,8 @@ import {
29
21
  useInnerBlocksProps,
30
22
  useBlockEditingMode,
31
23
  } from '@wordpress/block-editor';
32
- import { isURL, prependHTTP, safeDecodeURI } from '@wordpress/url';
24
+ import { isURL, prependHTTP } from '@wordpress/url';
33
25
  import { useState, useEffect, useRef } from '@wordpress/element';
34
- import { __unstableStripHTML as stripHTML } from '@wordpress/dom';
35
26
  import { decodeEntities } from '@wordpress/html-entities';
36
27
  import { link as linkIcon, addSubmenu } from '@wordpress/icons';
37
28
  import { store as coreStore } from '@wordpress/core-data';
@@ -43,7 +34,7 @@ import { useMergeRefs, usePrevious } from '@wordpress/compose';
43
34
  import { LinkUI } from './link-ui';
44
35
  import { updateAttributes } from './update-attributes';
45
36
  import { getColors } from '../navigation/edit/utils';
46
- import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
37
+ import { Controls } from './shared';
47
38
 
48
39
  const DEFAULT_BLOCK = { name: 'core/navigation-link' };
49
40
  const NESTING_BLOCK_NAMES = [
@@ -175,136 +166,6 @@ function getMissingText( type ) {
175
166
  * packages/block-library/src/navigation-submenu/edit.js
176
167
  * Consider reusing this components for both blocks.
177
168
  */
178
- function Controls( { attributes, setAttributes, setIsEditingControl } ) {
179
- const { label, url, description, rel, opensInNewTab } = attributes;
180
- const lastURLRef = useRef( url );
181
- const dropdownMenuProps = useToolsPanelDropdownMenuProps();
182
- return (
183
- <ToolsPanel
184
- label={ __( 'Settings' ) }
185
- resetAll={ () => {
186
- setAttributes( {
187
- label: '',
188
- url: '',
189
- description: '',
190
- rel: '',
191
- opensInNewTab: false,
192
- } );
193
- } }
194
- dropdownMenuProps={ dropdownMenuProps }
195
- >
196
- <ToolsPanelItem
197
- hasValue={ () => !! label }
198
- label={ __( 'Text' ) }
199
- onDeselect={ () => setAttributes( { label: '' } ) }
200
- isShownByDefault
201
- >
202
- <TextControl
203
- __nextHasNoMarginBottom
204
- __next40pxDefaultSize
205
- label={ __( 'Text' ) }
206
- value={ label ? stripHTML( label ) : '' }
207
- onChange={ ( labelValue ) => {
208
- setAttributes( { label: labelValue } );
209
- } }
210
- autoComplete="off"
211
- onFocus={ () => setIsEditingControl( true ) }
212
- onBlur={ () => setIsEditingControl( false ) }
213
- />
214
- </ToolsPanelItem>
215
-
216
- <ToolsPanelItem
217
- hasValue={ () => !! url }
218
- label={ __( 'Link' ) }
219
- onDeselect={ () => setAttributes( { url: '' } ) }
220
- isShownByDefault
221
- >
222
- <TextControl
223
- __nextHasNoMarginBottom
224
- __next40pxDefaultSize
225
- label={ __( 'Link' ) }
226
- value={ url ? safeDecodeURI( url ) : '' }
227
- onChange={ ( urlValue ) => {
228
- setAttributes( {
229
- url: encodeURI( safeDecodeURI( urlValue ) ),
230
- } );
231
- } }
232
- autoComplete="off"
233
- type="url"
234
- onFocus={ () => {
235
- lastURLRef.current = url;
236
- setIsEditingControl( true );
237
- } }
238
- onBlur={ () => {
239
- // Defer the updateAttributes call to ensure entity connection isn't severed by accident.
240
- updateAttributes(
241
- { url: ! url ? lastURLRef.current : url },
242
- setAttributes,
243
- { ...attributes, url: lastURLRef.current }
244
- );
245
- setIsEditingControl( false );
246
- } }
247
- />
248
- </ToolsPanelItem>
249
-
250
- <ToolsPanelItem
251
- hasValue={ () => !! opensInNewTab }
252
- label={ __( 'Open in new tab' ) }
253
- onDeselect={ () => setAttributes( { opensInNewTab: false } ) }
254
- isShownByDefault
255
- >
256
- <CheckboxControl
257
- __nextHasNoMarginBottom
258
- label={ __( 'Open in new tab' ) }
259
- checked={ opensInNewTab }
260
- onChange={ ( value ) =>
261
- setAttributes( { opensInNewTab: value } )
262
- }
263
- />
264
- </ToolsPanelItem>
265
-
266
- <ToolsPanelItem
267
- hasValue={ () => !! description }
268
- label={ __( 'Description' ) }
269
- onDeselect={ () => setAttributes( { description: '' } ) }
270
- isShownByDefault
271
- >
272
- <TextareaControl
273
- __nextHasNoMarginBottom
274
- label={ __( 'Description' ) }
275
- value={ description || '' }
276
- onChange={ ( descriptionValue ) => {
277
- setAttributes( { description: descriptionValue } );
278
- } }
279
- help={ __(
280
- 'The description will be displayed in the menu if the current theme supports it.'
281
- ) }
282
- />
283
- </ToolsPanelItem>
284
-
285
- <ToolsPanelItem
286
- hasValue={ () => !! rel }
287
- label={ __( 'Rel attribute' ) }
288
- onDeselect={ () => setAttributes( { rel: '' } ) }
289
- isShownByDefault
290
- >
291
- <TextControl
292
- __nextHasNoMarginBottom
293
- __next40pxDefaultSize
294
- label={ __( 'Rel attribute' ) }
295
- value={ rel || '' }
296
- onChange={ ( relValue ) => {
297
- setAttributes( { rel: relValue } );
298
- } }
299
- autoComplete="off"
300
- help={ __(
301
- 'The relationship of the linked URL as space-separated link types.'
302
- ) }
303
- />
304
- </ToolsPanelItem>
305
- </ToolsPanel>
306
- );
307
- }
308
169
 
309
170
  export default function NavigationLinkEdit( {
310
171
  attributes,