@wordpress/block-library 9.28.0 → 9.29.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 (196) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/accordion/edit.js +123 -0
  3. package/build/accordion/edit.js.map +1 -0
  4. package/build/accordion/icon.js +33 -0
  5. package/build/accordion/icon.js.map +1 -0
  6. package/build/accordion/index.js +100 -0
  7. package/build/accordion/index.js.map +1 -0
  8. package/build/accordion/init.js +12 -0
  9. package/build/accordion/init.js.map +1 -0
  10. package/build/accordion/save.js +36 -0
  11. package/build/accordion/save.js.map +1 -0
  12. package/build/accordion/view.js +49 -0
  13. package/build/accordion/view.js.map +1 -0
  14. package/build/accordion-content/edit.js +129 -0
  15. package/build/accordion-content/edit.js.map +1 -0
  16. package/build/accordion-content/icon.js +35 -0
  17. package/build/accordion-content/icon.js.map +1 -0
  18. package/build/accordion-content/icons.js +30 -0
  19. package/build/accordion-content/icons.js.map +1 -0
  20. package/build/accordion-content/index.js +76 -0
  21. package/build/accordion-content/index.js.map +1 -0
  22. package/build/accordion-content/init.js +12 -0
  23. package/build/accordion-content/init.js.map +1 -0
  24. package/build/accordion-content/save.js +37 -0
  25. package/build/accordion-content/save.js.map +1 -0
  26. package/build/accordion-header/edit.js +118 -0
  27. package/build/accordion-header/edit.js.map +1 -0
  28. package/build/accordion-header/icon.js +25 -0
  29. package/build/accordion-header/icon.js.map +1 -0
  30. package/build/accordion-header/index.js +121 -0
  31. package/build/accordion-header/index.js.map +1 -0
  32. package/build/accordion-header/init.js +12 -0
  33. package/build/accordion-header/init.js.map +1 -0
  34. package/build/accordion-header/save.js +81 -0
  35. package/build/accordion-header/save.js.map +1 -0
  36. package/build/accordion-panel/edit.js +59 -0
  37. package/build/accordion-panel/edit.js.map +1 -0
  38. package/build/accordion-panel/icon.js +22 -0
  39. package/build/accordion-panel/icon.js.map +1 -0
  40. package/build/accordion-panel/index.js +105 -0
  41. package/build/accordion-panel/index.js.map +1 -0
  42. package/build/accordion-panel/init.js +12 -0
  43. package/build/accordion-panel/init.js.map +1 -0
  44. package/build/accordion-panel/save.js +46 -0
  45. package/build/accordion-panel/save.js.map +1 -0
  46. package/build/cover/index.js +2 -1
  47. package/build/cover/index.js.map +1 -1
  48. package/build/freeform/edit.js +6 -0
  49. package/build/freeform/edit.js.map +1 -1
  50. package/build/index.js +10 -0
  51. package/build/index.js.map +1 -1
  52. package/build/media-text/media-container.js +2 -1
  53. package/build/media-text/media-container.js.map +1 -1
  54. package/build/media-text/transforms.js +7 -3
  55. package/build/media-text/transforms.js.map +1 -1
  56. package/build/post-comments-link/edit.js +6 -1
  57. package/build/post-comments-link/edit.js.map +1 -1
  58. package/build/query-title/edit.js +52 -2
  59. package/build/query-title/edit.js.map +1 -1
  60. package/build/query-title/index.js +1 -0
  61. package/build/query-title/index.js.map +1 -1
  62. package/build/query-title/use-post-type-label.js +42 -0
  63. package/build/query-title/use-post-type-label.js.map +1 -0
  64. package/build/query-title/variations.js +10 -0
  65. package/build/query-title/variations.js.map +1 -1
  66. package/build/site-logo/edit.js +56 -41
  67. package/build/site-logo/edit.js.map +1 -1
  68. package/build/site-title/edit.js +9 -3
  69. package/build/site-title/edit.js.map +1 -1
  70. package/build/video/edit-common-settings.js +6 -3
  71. package/build/video/edit-common-settings.js.map +1 -1
  72. package/build-module/accordion/edit.js +116 -0
  73. package/build-module/accordion/edit.js.map +1 -0
  74. package/build-module/accordion/icon.js +27 -0
  75. package/build-module/accordion/icon.js.map +1 -0
  76. package/build-module/accordion/index.js +92 -0
  77. package/build-module/accordion/index.js.map +1 -0
  78. package/build-module/accordion/init.js +6 -0
  79. package/build-module/accordion/init.js.map +1 -0
  80. package/build-module/accordion/save.js +27 -0
  81. package/build-module/accordion/save.js.map +1 -0
  82. package/build-module/accordion/view.js +46 -0
  83. package/build-module/accordion/view.js.map +1 -0
  84. package/build-module/accordion-content/edit.js +120 -0
  85. package/build-module/accordion-content/edit.js.map +1 -0
  86. package/build-module/accordion-content/icon.js +29 -0
  87. package/build-module/accordion-content/icon.js.map +1 -0
  88. package/build-module/accordion-content/icons.js +22 -0
  89. package/build-module/accordion-content/icons.js.map +1 -0
  90. package/build-module/accordion-content/index.js +68 -0
  91. package/build-module/accordion-content/index.js.map +1 -0
  92. package/build-module/accordion-content/init.js +6 -0
  93. package/build-module/accordion-content/init.js.map +1 -0
  94. package/build-module/accordion-content/save.js +28 -0
  95. package/build-module/accordion-content/save.js.map +1 -0
  96. package/build-module/accordion-header/edit.js +108 -0
  97. package/build-module/accordion-header/edit.js.map +1 -0
  98. package/build-module/accordion-header/icon.js +19 -0
  99. package/build-module/accordion-header/icon.js.map +1 -0
  100. package/build-module/accordion-header/index.js +113 -0
  101. package/build-module/accordion-header/index.js.map +1 -0
  102. package/build-module/accordion-header/init.js +6 -0
  103. package/build-module/accordion-header/init.js.map +1 -0
  104. package/build-module/accordion-header/save.js +71 -0
  105. package/build-module/accordion-header/save.js.map +1 -0
  106. package/build-module/accordion-panel/edit.js +50 -0
  107. package/build-module/accordion-panel/edit.js.map +1 -0
  108. package/build-module/accordion-panel/icon.js +16 -0
  109. package/build-module/accordion-panel/icon.js.map +1 -0
  110. package/build-module/accordion-panel/index.js +97 -0
  111. package/build-module/accordion-panel/index.js.map +1 -0
  112. package/build-module/accordion-panel/init.js +6 -0
  113. package/build-module/accordion-panel/init.js.map +1 -0
  114. package/build-module/accordion-panel/save.js +37 -0
  115. package/build-module/accordion-panel/save.js.map +1 -0
  116. package/build-module/cover/index.js +2 -1
  117. package/build-module/cover/index.js.map +1 -1
  118. package/build-module/freeform/edit.js +6 -0
  119. package/build-module/freeform/edit.js.map +1 -1
  120. package/build-module/index.js +10 -0
  121. package/build-module/index.js.map +1 -1
  122. package/build-module/media-text/media-container.js +2 -1
  123. package/build-module/media-text/media-container.js.map +1 -1
  124. package/build-module/media-text/transforms.js +7 -3
  125. package/build-module/media-text/transforms.js.map +1 -1
  126. package/build-module/post-comments-link/edit.js +6 -1
  127. package/build-module/post-comments-link/edit.js.map +1 -1
  128. package/build-module/query-title/edit.js +52 -2
  129. package/build-module/query-title/edit.js.map +1 -1
  130. package/build-module/query-title/index.js +1 -0
  131. package/build-module/query-title/index.js.map +1 -1
  132. package/build-module/query-title/use-post-type-label.js +36 -0
  133. package/build-module/query-title/use-post-type-label.js.map +1 -0
  134. package/build-module/query-title/variations.js +10 -0
  135. package/build-module/query-title/variations.js.map +1 -1
  136. package/build-module/site-logo/edit.js +57 -42
  137. package/build-module/site-logo/edit.js.map +1 -1
  138. package/build-module/site-title/edit.js +10 -4
  139. package/build-module/site-title/edit.js.map +1 -1
  140. package/build-module/video/edit-common-settings.js +6 -3
  141. package/build-module/video/edit-common-settings.js.map +1 -1
  142. package/build-style/accordion/style-rtl.css +223 -0
  143. package/build-style/accordion/style.css +223 -0
  144. package/build-style/style-rtl.css +88 -0
  145. package/build-style/style.css +88 -0
  146. package/package.json +36 -35
  147. package/src/accordion/block.json +69 -0
  148. package/src/accordion/edit.js +133 -0
  149. package/src/accordion/icon.js +23 -0
  150. package/src/accordion/index.js +21 -0
  151. package/src/accordion/index.php +61 -0
  152. package/src/accordion/init.js +6 -0
  153. package/src/accordion/save.js +23 -0
  154. package/src/accordion/style.scss +91 -0
  155. package/src/accordion/view.js +38 -0
  156. package/src/accordion-content/block.json +45 -0
  157. package/src/accordion-content/edit.js +149 -0
  158. package/src/accordion-content/icon.js +28 -0
  159. package/src/accordion-content/icons.js +23 -0
  160. package/src/accordion-content/index.js +21 -0
  161. package/src/accordion-content/index.php +73 -0
  162. package/src/accordion-content/init.js +6 -0
  163. package/src/accordion-content/save.js +25 -0
  164. package/src/accordion-header/block.json +93 -0
  165. package/src/accordion-header/edit.js +131 -0
  166. package/src/accordion-header/icon.js +16 -0
  167. package/src/accordion-header/index.js +21 -0
  168. package/src/accordion-header/init.js +6 -0
  169. package/src/accordion-header/save.js +79 -0
  170. package/src/accordion-panel/block.json +74 -0
  171. package/src/accordion-panel/edit.js +61 -0
  172. package/src/accordion-panel/icon.js +15 -0
  173. package/src/accordion-panel/index.js +21 -0
  174. package/src/accordion-panel/init.js +6 -0
  175. package/src/accordion-panel/save.js +51 -0
  176. package/src/block/index.php +16 -14
  177. package/src/cover/block.json +2 -1
  178. package/src/file/index.php +28 -22
  179. package/src/freeform/edit.js +7 -0
  180. package/src/index.js +12 -0
  181. package/src/media-text/media-container.js +1 -0
  182. package/src/media-text/transforms.js +5 -1
  183. package/src/navigation/edit/test/navigation-menu-selector.js +2 -2
  184. package/src/post-comments-link/edit.js +7 -1
  185. package/src/post-excerpt/index.php +16 -12
  186. package/src/query-title/block.json +1 -0
  187. package/src/query-title/edit.js +58 -1
  188. package/src/query-title/index.php +30 -5
  189. package/src/query-title/use-post-type-label.js +34 -0
  190. package/src/query-title/variations.js +13 -0
  191. package/src/site-logo/edit.js +33 -12
  192. package/src/site-title/edit.js +24 -16
  193. package/src/social-link/README.md +4 -1
  194. package/src/social-link/index.php +1 -1
  195. package/src/style.scss +1 -0
  196. package/src/video/edit-common-settings.js +14 -5
@@ -0,0 +1,149 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import {
6
+ useBlockProps,
7
+ useInnerBlocksProps,
8
+ InspectorControls,
9
+ store as blockEditorStore,
10
+ } from '@wordpress/block-editor';
11
+ import { useDispatch, useSelect } from '@wordpress/data';
12
+ import { useEffect } from '@wordpress/element';
13
+ import {
14
+ ToggleControl,
15
+ __experimentalToolsPanel as ToolsPanel,
16
+ __experimentalToolsPanelItem as ToolsPanelItem,
17
+ } from '@wordpress/components';
18
+ /**
19
+ * External dependencies
20
+ */
21
+ import clsx from 'clsx';
22
+
23
+ /**
24
+ * Internal dependencies
25
+ */
26
+ import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
27
+
28
+ export default function Edit( {
29
+ attributes: { openByDefault },
30
+ clientId,
31
+ setAttributes,
32
+ } ) {
33
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
34
+
35
+ const { isSelected, getBlockOrder } = useSelect(
36
+ ( select ) => {
37
+ const {
38
+ isBlockSelected,
39
+ hasSelectedInnerBlock,
40
+ getBlockOrder: getBlockOrderSelector,
41
+ } = select( blockEditorStore );
42
+ return {
43
+ isSelected:
44
+ isBlockSelected( clientId ) ||
45
+ hasSelectedInnerBlock( clientId, true ),
46
+ getBlockOrder: getBlockOrderSelector,
47
+ };
48
+ },
49
+ [ clientId ]
50
+ );
51
+
52
+ const contentBlockClientId = getBlockOrder( clientId )[ 1 ];
53
+ const { updateBlockAttributes, __unstableMarkNextChangeAsNotPersistent } =
54
+ useDispatch( blockEditorStore );
55
+
56
+ useEffect( () => {
57
+ if ( contentBlockClientId ) {
58
+ __unstableMarkNextChangeAsNotPersistent();
59
+ updateBlockAttributes( contentBlockClientId, {
60
+ isSelected,
61
+ } );
62
+ }
63
+ }, [
64
+ isSelected,
65
+ contentBlockClientId,
66
+ __unstableMarkNextChangeAsNotPersistent,
67
+ updateBlockAttributes,
68
+ ] );
69
+
70
+ const blockProps = useBlockProps();
71
+ const innerBlocksProps = useInnerBlocksProps(
72
+ {
73
+ ...blockProps,
74
+ className: clsx( blockProps.className, {
75
+ 'is-open': openByDefault || isSelected,
76
+ } ),
77
+ },
78
+ {
79
+ template: [
80
+ [ 'core/accordion-header', {} ],
81
+ [
82
+ 'core/accordion-panel',
83
+ {
84
+ openByDefault,
85
+ },
86
+ ],
87
+ ],
88
+ templateLock: 'all',
89
+ directInsert: true,
90
+ templateInsertUpdatesSelection: true,
91
+ }
92
+ );
93
+
94
+ return (
95
+ <>
96
+ <InspectorControls key="setting">
97
+ <ToolsPanel
98
+ label={ __( 'Settings' ) }
99
+ resetAll={ () => {
100
+ setAttributes( { openByDefault: false } );
101
+ if ( contentBlockClientId ) {
102
+ updateBlockAttributes( contentBlockClientId, {
103
+ openByDefault: false,
104
+ } );
105
+ }
106
+ } }
107
+ dropdownMenuProps={ dropdownMenuProps }
108
+ >
109
+ <ToolsPanelItem
110
+ label={ __( 'Open by default' ) }
111
+ isShownByDefault
112
+ hasValue={ () => !! openByDefault }
113
+ onDeselect={ () => {
114
+ setAttributes( { openByDefault: false } );
115
+ if ( contentBlockClientId ) {
116
+ updateBlockAttributes( contentBlockClientId, {
117
+ openByDefault: false,
118
+ } );
119
+ }
120
+ } }
121
+ >
122
+ <ToggleControl
123
+ label={ __( 'Open by default' ) }
124
+ __nextHasNoMarginBottom
125
+ onChange={ ( value ) => {
126
+ setAttributes( {
127
+ openByDefault: value,
128
+ } );
129
+ if ( contentBlockClientId ) {
130
+ updateBlockAttributes(
131
+ contentBlockClientId,
132
+ {
133
+ openByDefault: value,
134
+ }
135
+ );
136
+ }
137
+ } }
138
+ checked={ openByDefault }
139
+ help={ __(
140
+ 'Accordion content will be displayed by default.'
141
+ ) }
142
+ />
143
+ </ToolsPanelItem>
144
+ </ToolsPanel>
145
+ </InspectorControls>
146
+ <div { ...innerBlocksProps } />
147
+ </>
148
+ );
149
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { SVG, Path } from '@wordpress/primitives';
5
+
6
+ export default (
7
+ <SVG xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
8
+ <Path
9
+ fillRule="evenodd"
10
+ clipRule="evenodd"
11
+ d="M19.5 9.5L9.5 9.5L9.5 8L19.5 8L19.5 9.5Z"
12
+ fill="currentColor"
13
+ />
14
+ <Path
15
+ fillRule="evenodd"
16
+ clipRule="evenodd"
17
+ d="M19.5 13L9.5 13L9.5 11.5L19.5 11.5L19.5 13Z"
18
+ fill="currentColor"
19
+ />
20
+ <Path
21
+ fillRule="evenodd"
22
+ clipRule="evenodd"
23
+ d="M19.5 16.3999L9.5 16.3999L9.5 14.8999L19.5 14.8999L19.5 16.3999Z"
24
+ fill="currentColor"
25
+ />
26
+ <Path d="M4.5 6.25L8.5 8.75L4.5 11.25L4.5 6.25Z" fill="currentColor" />
27
+ </SVG>
28
+ );
@@ -0,0 +1,23 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { createElement } from '@wordpress/element';
5
+
6
+ export const plus = ( { width, height } ) => {
7
+ return createElement(
8
+ 'span',
9
+ {
10
+ style: {
11
+ display: 'inline-block',
12
+ width: width || 24,
13
+ height: height || 24,
14
+ lineHeight: `${ height || 24 }px`,
15
+ textAlign: 'center',
16
+ fontSize: `${ ( height || 24 ) * 0.6 }px`,
17
+ fontWeight: 'bold',
18
+ color: 'currentColor',
19
+ },
20
+ },
21
+ '+'
22
+ );
23
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import edit from './edit';
5
+ import save from './save';
6
+ import metadata from './block.json';
7
+ import initBlock from '../utils/init-block';
8
+ import icon from './icon';
9
+
10
+ const { name } = metadata;
11
+
12
+ export { metadata, name };
13
+
14
+ export const settings = {
15
+ icon,
16
+ example: {},
17
+ edit,
18
+ save,
19
+ };
20
+
21
+ export const init = () => initBlock( { name, metadata, settings } );
@@ -0,0 +1,73 @@
1
+ <?php
2
+
3
+ /**
4
+ * Server-side rendering of the `core/accordion-content` block.
5
+ *
6
+ * @package WordPress
7
+ * @since 6.6.0
8
+ *
9
+ * @param array $attributes The block attributes.
10
+ * @param string $content The block content.
11
+ *
12
+ * @return string Returns the updated markup.
13
+ */
14
+ function block_core_accordion_content_render( $attributes, $content ) {
15
+ if ( ! $content ) {
16
+ return $content;
17
+ }
18
+
19
+ $p = new WP_HTML_Tag_Processor( $content );
20
+ $unique_id = wp_unique_id( 'accordion-content-' );
21
+
22
+ // Initialize the state of the item on the server using a closure,
23
+ // since we need to get derived state based on the current context.
24
+ wp_interactivity_state(
25
+ 'core/accordion',
26
+ array(
27
+ 'isOpen' => function () {
28
+ $context = wp_interactivity_get_context();
29
+ return $context['openByDefault'];
30
+ },
31
+ )
32
+ );
33
+
34
+ if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-content' ) ) ) {
35
+ $open_by_default = $attributes['openByDefault'] ? 'true' : 'false';
36
+ $p->set_attribute( 'data-wp-context', '{ "id": "' . $unique_id . '", "openByDefault": ' . $open_by_default . ' }' );
37
+ $p->set_attribute( 'data-wp-class--is-open', 'state.isOpen' );
38
+ $p->set_attribute( 'data-wp-init', 'callbacks.initIsOpen' );
39
+
40
+ if ( $p->next_tag( array( 'class_name' => 'accordion-content__toggle' ) ) ) {
41
+ $p->set_attribute( 'data-wp-on--click', 'actions.toggle' );
42
+ $p->set_attribute( 'id', $unique_id );
43
+ $p->set_attribute( 'aria-controls', $unique_id . '-panel' );
44
+ $p->set_attribute( 'data-wp-bind--aria-expanded', 'state.isOpen' );
45
+
46
+ if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-panel' ) ) ) {
47
+ $p->set_attribute( 'id', $unique_id . '-panel' );
48
+ $p->set_attribute( 'aria-labelledby', $unique_id );
49
+ $p->set_attribute( 'data-wp-bind--inert', '!state.isOpen' );
50
+
51
+ // Only modify content if all directives have been set.
52
+ $content = $p->get_updated_html();
53
+ }
54
+ }
55
+ }
56
+
57
+ return $content;
58
+ }
59
+
60
+ /**
61
+ * Registers the `core/accordion-content` block on server.
62
+ *
63
+ * @since 6.6.0
64
+ */
65
+ function register_block_core_accordion_content() {
66
+ register_block_type_from_metadata(
67
+ __DIR__ . '/accordion-content',
68
+ array(
69
+ 'render_callback' => 'block_core_accordion_content_render',
70
+ )
71
+ );
72
+ }
73
+ add_action( 'init', 'register_block_core_accordion_content' );
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { init } from './';
5
+
6
+ export default init();
@@ -0,0 +1,25 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import clsx from 'clsx';
9
+
10
+ export default function save( { attributes } ) {
11
+ const { openByDefault } = attributes;
12
+ const blockProps = useBlockProps.save();
13
+ const className = clsx(
14
+ {
15
+ 'is-open': openByDefault,
16
+ },
17
+ blockProps.className
18
+ );
19
+ const innerBlocksProps = useInnerBlocksProps.save( {
20
+ ...blockProps,
21
+ className,
22
+ } );
23
+
24
+ return <div { ...innerBlocksProps } />;
25
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "$schema": "https://schemas.wp.org/trunk/block.json",
3
+ "apiVersion": 3,
4
+ "name": "core/accordion-header",
5
+ "version": "0.1.0",
6
+ "title": "Accordion Header",
7
+ "category": "design",
8
+ "description": "Displays an accordion header.",
9
+ "example": {},
10
+ "__experimental": true,
11
+ "parent": [ "core/accordion-content" ],
12
+ "usesContext": [
13
+ "core/accordion-icon-position",
14
+ "core/accordion-show-icon"
15
+ ],
16
+ "supports": {
17
+ "anchor": true,
18
+ "color": {
19
+ "background": true,
20
+ "gradient": true
21
+ },
22
+ "align": false,
23
+ "border": true,
24
+ "interactivity": true,
25
+ "spacing": {
26
+ "padding": true,
27
+ "margin": [ "top", "bottom" ],
28
+ "__experimentalDefaultControls": {
29
+ "padding": true,
30
+ "margin": true
31
+ }
32
+ },
33
+ "__experimentalBorder": {
34
+ "color": true,
35
+ "radius": true,
36
+ "style": true,
37
+ "width": true,
38
+ "__experimentalDefaultControls": {
39
+ "color": true,
40
+ "radius": true,
41
+ "style": true,
42
+ "width": true
43
+ }
44
+ },
45
+ "typography": {
46
+ "textAlign": true,
47
+ "fontSize": true,
48
+ "__experimentalFontFamily": true,
49
+ "__experimentalFontWeight": true,
50
+ "__experimentalFontStyle": true,
51
+ "__experimentalTextTransform": true,
52
+ "__experimentalTextDecoration": true,
53
+ "__experimentalLetterSpacing": true,
54
+ "__experimentalDefaultControls": {
55
+ "fontSize": true,
56
+ "fontFamily": true
57
+ }
58
+ },
59
+ "shadow": true
60
+ },
61
+ "attributes": {
62
+ "openByDefault": {
63
+ "type": "boolean",
64
+ "default": false
65
+ },
66
+ "title": {
67
+ "type": "rich-text",
68
+ "source": "rich-text",
69
+ "selector": "span"
70
+ },
71
+ "level": {
72
+ "type": "number",
73
+ "default": 3
74
+ },
75
+ "levelOptions": {
76
+ "type": "array"
77
+ },
78
+ "textAlignment": {
79
+ "type": "string",
80
+ "default": "left"
81
+ },
82
+ "iconPosition": {
83
+ "type": "string",
84
+ "enum": [ "left", "right" ],
85
+ "default": "right"
86
+ },
87
+ "showIcon": {
88
+ "type": "boolean",
89
+ "default": true
90
+ }
91
+ },
92
+ "textdomain": "default"
93
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+ import { __ } from '@wordpress/i18n';
9
+ import { useEffect } from '@wordpress/element';
10
+ import {
11
+ useBlockProps,
12
+ __experimentalUseBorderProps as useBorderProps,
13
+ __experimentalUseColorProps as useColorProps,
14
+ __experimentalGetSpacingClassesAndStyles as useSpacingProps,
15
+ __experimentalGetShadowClassesAndStyles as useShadowProps,
16
+ BlockControls,
17
+ HeadingLevelDropdown,
18
+ RichText,
19
+ } from '@wordpress/block-editor';
20
+ import { ToolbarGroup } from '@wordpress/components';
21
+ /**
22
+ * Internal dependencies
23
+ */
24
+ import { plus } from '../accordion-content/icons';
25
+
26
+ const ICONS = {
27
+ plus,
28
+ };
29
+
30
+ export default function Edit( { attributes, setAttributes, context } ) {
31
+ const { level, title, textAlign, levelOptions } = attributes;
32
+ const {
33
+ 'core/accordion-icon-position': iconPosition,
34
+ 'core/accordion-show-icon': showIcon,
35
+ } = context;
36
+ const TagName = 'h' + level;
37
+
38
+ // Set icon attributes.
39
+ useEffect( () => {
40
+ if ( iconPosition !== undefined && showIcon !== undefined ) {
41
+ setAttributes( {
42
+ iconPosition,
43
+ showIcon,
44
+ } );
45
+ }
46
+ }, [ iconPosition, showIcon, setAttributes ] );
47
+
48
+ const blockProps = useBlockProps();
49
+ const borderProps = useBorderProps( attributes );
50
+ const colorProps = useColorProps( attributes );
51
+ const spacingProps = useSpacingProps( attributes );
52
+ const shadowProps = useShadowProps( attributes );
53
+
54
+ const Icon = ICONS.plus;
55
+ const shouldShowIcon = showIcon && Icon;
56
+
57
+ return (
58
+ <>
59
+ <BlockControls>
60
+ <ToolbarGroup>
61
+ <HeadingLevelDropdown
62
+ value={ level }
63
+ options={ levelOptions }
64
+ onChange={ ( newLevel ) =>
65
+ setAttributes( { level: newLevel } )
66
+ }
67
+ />
68
+ </ToolbarGroup>
69
+ </BlockControls>
70
+ <TagName
71
+ { ...blockProps }
72
+ className={ clsx(
73
+ blockProps.className,
74
+ colorProps.className,
75
+ borderProps.className,
76
+ 'accordion-content__heading',
77
+ {
78
+ [ `has-custom-font-size` ]: blockProps.style.fontSize,
79
+ [ `icon-position-left` ]: iconPosition === 'left',
80
+ [ `has-text-align-${ textAlign }` ]: textAlign,
81
+ }
82
+ ) }
83
+ style={ {
84
+ ...borderProps.style,
85
+ ...colorProps.style,
86
+ ...shadowProps.style,
87
+ } }
88
+ >
89
+ <button
90
+ className={ clsx( 'accordion-content__toggle' ) }
91
+ style={ {
92
+ ...spacingProps.style,
93
+ } }
94
+ >
95
+ <RichText
96
+ allowedFormats={ [
97
+ 'core/bold',
98
+ 'core/italic',
99
+ 'core/image',
100
+ 'core/strikethrough',
101
+ ] }
102
+ disableLineBreaks
103
+ tagName="span"
104
+ value={ title }
105
+ onChange={ ( newTitle ) =>
106
+ setAttributes( { title: newTitle } )
107
+ }
108
+ placeholder={ __( 'Accordion title' ) }
109
+ />
110
+ { shouldShowIcon && (
111
+ <span
112
+ className={ clsx(
113
+ `accordion-content__toggle-icon`,
114
+ {
115
+ 'has-icon-plus': true,
116
+ }
117
+ ) }
118
+ style={ {
119
+ // TO-DO: make this configurable
120
+ width: `1.2em`,
121
+ height: `1.2em`,
122
+ } }
123
+ >
124
+ { Icon && <Icon width="1.2em" height="1.2em" /> }
125
+ </span>
126
+ ) }
127
+ </button>
128
+ </TagName>
129
+ </>
130
+ );
131
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { SVG, Path } from '@wordpress/primitives';
5
+
6
+ export default (
7
+ <SVG xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
8
+ <Path
9
+ fillRule="evenodd"
10
+ clipRule="evenodd"
11
+ d="M19.5 12.75L9.5 12.75L9.5 11.25L19.5 11.25L19.5 12.75Z"
12
+ fill="currentColor"
13
+ />
14
+ <Path d="M4.5 9.5L8.5 12L4.5 14.5L4.5 9.5Z" fill="currentColor" />
15
+ </SVG>
16
+ );
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import edit from './edit';
5
+ import save from './save';
6
+ import metadata from './block.json';
7
+ import initBlock from '../utils/init-block';
8
+ import icon from './icon';
9
+
10
+ const { name } = metadata;
11
+
12
+ export { metadata, name };
13
+
14
+ export const settings = {
15
+ icon,
16
+ example: {},
17
+ edit,
18
+ save,
19
+ };
20
+
21
+ export const init = () => initBlock( { name, metadata, settings } );
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { init } from './';
5
+
6
+ export default init();
@@ -0,0 +1,79 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import clsx from 'clsx';
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+ import {
9
+ useBlockProps,
10
+ __experimentalGetBorderClassesAndStyles as getBorderClassesAndStyles,
11
+ __experimentalGetColorClassesAndStyles as getColorClassesAndStyles,
12
+ __experimentalGetSpacingClassesAndStyles as getSpacingClassesAndStyles,
13
+ __experimentalGetShadowClassesAndStyles as getShadowClassesAndStyles,
14
+ RichText,
15
+ } from '@wordpress/block-editor';
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import { plus } from '../accordion-content/icons';
20
+
21
+ const ICONS = {
22
+ plus,
23
+ };
24
+
25
+ export default function save( { attributes } ) {
26
+ const { level, title, iconPosition, textAlign, showIcon } = attributes;
27
+ const TagName = 'h' + level;
28
+
29
+ const blockProps = useBlockProps.save();
30
+ const borderProps = getBorderClassesAndStyles( attributes );
31
+ const colorProps = getColorClassesAndStyles( attributes );
32
+ const spacingProps = getSpacingClassesAndStyles( attributes );
33
+ const shadowProps = getShadowClassesAndStyles( attributes );
34
+
35
+ const Icon = ICONS.plus;
36
+
37
+ return (
38
+ <TagName
39
+ { ...blockProps }
40
+ className={ clsx(
41
+ blockProps.className,
42
+ colorProps.className,
43
+ borderProps.className,
44
+ 'accordion-content__heading',
45
+ {
46
+ [ `has-custom-font-size` ]: blockProps?.style?.fontSize,
47
+ [ `icon-position-left` ]: iconPosition === 'left',
48
+ [ `has-text-align-${ textAlign }` ]: textAlign,
49
+ }
50
+ ) }
51
+ style={ {
52
+ ...borderProps.style,
53
+ ...colorProps.style,
54
+ ...shadowProps.style,
55
+ } }
56
+ >
57
+ <button
58
+ className={ clsx( 'accordion-content__toggle' ) }
59
+ style={ {
60
+ ...spacingProps.style,
61
+ } }
62
+ >
63
+ <RichText.Content tagName="span" value={ title } />
64
+ <span
65
+ className={ clsx( `accordion-content__toggle-icon`, {
66
+ 'has-icon-plus': showIcon,
67
+ } ) }
68
+ style={ {
69
+ // TO-DO: make this configurable
70
+ width: `1.2em`,
71
+ height: `1.2em`,
72
+ } }
73
+ >
74
+ { showIcon && <Icon width="1.2em" height="1.2em" /> }
75
+ </span>
76
+ </button>
77
+ </TagName>
78
+ );
79
+ }