@wordpress/block-library 9.28.0 → 9.28.1-next.0f6f9d12c.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 (163) hide show
  1. package/build/accordion-header/edit.js +118 -0
  2. package/build/accordion-header/edit.js.map +1 -0
  3. package/build/accordion-header/index.js +124 -0
  4. package/build/accordion-header/index.js.map +1 -0
  5. package/build/accordion-header/init.js +12 -0
  6. package/build/accordion-header/init.js.map +1 -0
  7. package/build/accordion-header/save.js +81 -0
  8. package/build/accordion-header/save.js.map +1 -0
  9. package/build/accordion-item/edit.js +129 -0
  10. package/build/accordion-item/edit.js.map +1 -0
  11. package/build/accordion-item/icons.js +30 -0
  12. package/build/accordion-item/icons.js.map +1 -0
  13. package/build/accordion-item/index.js +79 -0
  14. package/build/accordion-item/index.js.map +1 -0
  15. package/build/accordion-item/init.js +12 -0
  16. package/build/accordion-item/init.js.map +1 -0
  17. package/build/accordion-item/save.js +37 -0
  18. package/build/accordion-item/save.js.map +1 -0
  19. package/build/accordion-panel/edit.js +59 -0
  20. package/build/accordion-panel/edit.js.map +1 -0
  21. package/build/accordion-panel/index.js +108 -0
  22. package/build/accordion-panel/index.js.map +1 -0
  23. package/build/accordion-panel/init.js +12 -0
  24. package/build/accordion-panel/init.js.map +1 -0
  25. package/build/accordion-panel/save.js +46 -0
  26. package/build/accordion-panel/save.js.map +1 -0
  27. package/build/accordions/edit.js +123 -0
  28. package/build/accordions/edit.js.map +1 -0
  29. package/build/accordions/index.js +103 -0
  30. package/build/accordions/index.js.map +1 -0
  31. package/build/accordions/init.js +12 -0
  32. package/build/accordions/init.js.map +1 -0
  33. package/build/accordions/save.js +36 -0
  34. package/build/accordions/save.js.map +1 -0
  35. package/build/accordions/view.js +49 -0
  36. package/build/accordions/view.js.map +1 -0
  37. package/build/cover/index.js +2 -1
  38. package/build/cover/index.js.map +1 -1
  39. package/build/freeform/edit.js +6 -0
  40. package/build/freeform/edit.js.map +1 -1
  41. package/build/index.js +10 -0
  42. package/build/index.js.map +1 -1
  43. package/build/media-text/media-container.js +2 -1
  44. package/build/media-text/media-container.js.map +1 -1
  45. package/build/media-text/transforms.js +7 -3
  46. package/build/media-text/transforms.js.map +1 -1
  47. package/build/query-title/edit.js +52 -2
  48. package/build/query-title/edit.js.map +1 -1
  49. package/build/query-title/index.js +1 -0
  50. package/build/query-title/index.js.map +1 -1
  51. package/build/query-title/use-post-type-label.js +42 -0
  52. package/build/query-title/use-post-type-label.js.map +1 -0
  53. package/build/query-title/variations.js +10 -0
  54. package/build/query-title/variations.js.map +1 -1
  55. package/build/site-logo/edit.js +56 -41
  56. package/build/site-logo/edit.js.map +1 -1
  57. package/build/site-title/edit.js +9 -3
  58. package/build/site-title/edit.js.map +1 -1
  59. package/build-module/accordion-header/edit.js +108 -0
  60. package/build-module/accordion-header/edit.js.map +1 -0
  61. package/build-module/accordion-header/index.js +116 -0
  62. package/build-module/accordion-header/index.js.map +1 -0
  63. package/build-module/accordion-header/init.js +6 -0
  64. package/build-module/accordion-header/init.js.map +1 -0
  65. package/build-module/accordion-header/save.js +71 -0
  66. package/build-module/accordion-header/save.js.map +1 -0
  67. package/build-module/accordion-item/edit.js +120 -0
  68. package/build-module/accordion-item/edit.js.map +1 -0
  69. package/build-module/accordion-item/icons.js +22 -0
  70. package/build-module/accordion-item/icons.js.map +1 -0
  71. package/build-module/accordion-item/index.js +71 -0
  72. package/build-module/accordion-item/index.js.map +1 -0
  73. package/build-module/accordion-item/init.js +6 -0
  74. package/build-module/accordion-item/init.js.map +1 -0
  75. package/build-module/accordion-item/save.js +28 -0
  76. package/build-module/accordion-item/save.js.map +1 -0
  77. package/build-module/accordion-panel/edit.js +50 -0
  78. package/build-module/accordion-panel/edit.js.map +1 -0
  79. package/build-module/accordion-panel/index.js +100 -0
  80. package/build-module/accordion-panel/index.js.map +1 -0
  81. package/build-module/accordion-panel/init.js +6 -0
  82. package/build-module/accordion-panel/init.js.map +1 -0
  83. package/build-module/accordion-panel/save.js +37 -0
  84. package/build-module/accordion-panel/save.js.map +1 -0
  85. package/build-module/accordions/edit.js +116 -0
  86. package/build-module/accordions/edit.js.map +1 -0
  87. package/build-module/accordions/index.js +95 -0
  88. package/build-module/accordions/index.js.map +1 -0
  89. package/build-module/accordions/init.js +6 -0
  90. package/build-module/accordions/init.js.map +1 -0
  91. package/build-module/accordions/save.js +27 -0
  92. package/build-module/accordions/save.js.map +1 -0
  93. package/build-module/accordions/view.js +46 -0
  94. package/build-module/accordions/view.js.map +1 -0
  95. package/build-module/cover/index.js +2 -1
  96. package/build-module/cover/index.js.map +1 -1
  97. package/build-module/freeform/edit.js +6 -0
  98. package/build-module/freeform/edit.js.map +1 -1
  99. package/build-module/index.js +10 -0
  100. package/build-module/index.js.map +1 -1
  101. package/build-module/media-text/media-container.js +2 -1
  102. package/build-module/media-text/media-container.js.map +1 -1
  103. package/build-module/media-text/transforms.js +7 -3
  104. package/build-module/media-text/transforms.js.map +1 -1
  105. package/build-module/query-title/edit.js +52 -2
  106. package/build-module/query-title/edit.js.map +1 -1
  107. package/build-module/query-title/index.js +1 -0
  108. package/build-module/query-title/index.js.map +1 -1
  109. package/build-module/query-title/use-post-type-label.js +36 -0
  110. package/build-module/query-title/use-post-type-label.js.map +1 -0
  111. package/build-module/query-title/variations.js +10 -0
  112. package/build-module/query-title/variations.js.map +1 -1
  113. package/build-module/site-logo/edit.js +57 -42
  114. package/build-module/site-logo/edit.js.map +1 -1
  115. package/build-module/site-title/edit.js +10 -4
  116. package/build-module/site-title/edit.js.map +1 -1
  117. package/build-style/accordions/style-rtl.css +223 -0
  118. package/build-style/accordions/style.css +223 -0
  119. package/build-style/style-rtl.css +88 -0
  120. package/build-style/style.css +88 -0
  121. package/package.json +36 -35
  122. package/src/accordion-header/block.json +93 -0
  123. package/src/accordion-header/edit.js +128 -0
  124. package/src/accordion-header/index.js +24 -0
  125. package/src/accordion-header/init.js +6 -0
  126. package/src/accordion-header/save.js +79 -0
  127. package/src/accordion-item/block.json +45 -0
  128. package/src/accordion-item/edit.js +149 -0
  129. package/src/accordion-item/icons.js +23 -0
  130. package/src/accordion-item/index.js +24 -0
  131. package/src/accordion-item/index.php +73 -0
  132. package/src/accordion-item/init.js +6 -0
  133. package/src/accordion-item/save.js +25 -0
  134. package/src/accordion-panel/block.json +74 -0
  135. package/src/accordion-panel/edit.js +61 -0
  136. package/src/accordion-panel/index.js +24 -0
  137. package/src/accordion-panel/init.js +6 -0
  138. package/src/accordion-panel/save.js +51 -0
  139. package/src/accordions/block.json +69 -0
  140. package/src/accordions/edit.js +133 -0
  141. package/src/accordions/index.js +24 -0
  142. package/src/accordions/index.php +61 -0
  143. package/src/accordions/init.js +6 -0
  144. package/src/accordions/save.js +23 -0
  145. package/src/accordions/style.scss +91 -0
  146. package/src/accordions/view.js +38 -0
  147. package/src/block/index.php +16 -14
  148. package/src/cover/block.json +2 -1
  149. package/src/file/index.php +28 -22
  150. package/src/freeform/edit.js +7 -0
  151. package/src/index.js +12 -0
  152. package/src/media-text/media-container.js +1 -0
  153. package/src/media-text/transforms.js +5 -1
  154. package/src/post-excerpt/index.php +16 -12
  155. package/src/query-title/block.json +1 -0
  156. package/src/query-title/edit.js +58 -1
  157. package/src/query-title/index.php +30 -5
  158. package/src/query-title/use-post-type-label.js +34 -0
  159. package/src/query-title/variations.js +13 -0
  160. package/src/site-logo/edit.js +33 -12
  161. package/src/site-title/edit.js +24 -16
  162. package/src/social-link/index.php +1 -1
  163. package/src/style.scss +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/block-library",
3
- "version": "9.28.0",
3
+ "version": "9.28.1-next.0f6f9d12c.0",
4
4
  "description": "Block library for the WordPress editor.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -27,6 +27,7 @@
27
27
  "react-native": "src/index",
28
28
  "wpScript": true,
29
29
  "wpScriptModuleExports": {
30
+ "./accordions/view": "./build-module/accordions/view.js",
30
31
  "./file/view": "./build-module/file/view.js",
31
32
  "./form/view": "./build-module/form/view.js",
32
33
  "./image/view": "./build-module/image/view.js",
@@ -41,39 +42,39 @@
41
42
  ],
42
43
  "dependencies": {
43
44
  "@babel/runtime": "7.25.7",
44
- "@wordpress/a11y": "^4.28.0",
45
- "@wordpress/api-fetch": "^7.28.0",
46
- "@wordpress/autop": "^4.28.0",
47
- "@wordpress/blob": "^4.28.0",
48
- "@wordpress/block-editor": "^15.1.0",
49
- "@wordpress/blocks": "^15.1.0",
50
- "@wordpress/components": "^30.1.0",
51
- "@wordpress/compose": "^7.28.0",
52
- "@wordpress/core-data": "^7.28.0",
53
- "@wordpress/data": "^10.28.0",
54
- "@wordpress/date": "^5.28.0",
55
- "@wordpress/deprecated": "^4.28.0",
56
- "@wordpress/dom": "^4.28.0",
57
- "@wordpress/element": "^6.28.0",
58
- "@wordpress/escape-html": "^3.28.0",
59
- "@wordpress/hooks": "^4.28.0",
60
- "@wordpress/html-entities": "^4.28.0",
61
- "@wordpress/i18n": "^6.1.0",
62
- "@wordpress/icons": "^10.28.0",
63
- "@wordpress/interactivity": "^6.28.0",
64
- "@wordpress/interactivity-router": "^2.28.0",
65
- "@wordpress/keyboard-shortcuts": "^5.28.0",
66
- "@wordpress/keycodes": "^4.28.0",
67
- "@wordpress/notices": "^5.28.0",
68
- "@wordpress/patterns": "^2.28.0",
69
- "@wordpress/primitives": "^4.28.0",
70
- "@wordpress/private-apis": "^1.28.0",
71
- "@wordpress/reusable-blocks": "^5.28.0",
72
- "@wordpress/rich-text": "^7.28.0",
73
- "@wordpress/server-side-render": "^6.4.0",
74
- "@wordpress/url": "^4.28.0",
75
- "@wordpress/viewport": "^6.28.0",
76
- "@wordpress/wordcount": "^4.28.0",
45
+ "@wordpress/a11y": "^4.28.1-next.0f6f9d12c.0",
46
+ "@wordpress/api-fetch": "^7.28.1-next.0f6f9d12c.0",
47
+ "@wordpress/autop": "^4.28.1-next.0f6f9d12c.0",
48
+ "@wordpress/blob": "^4.28.1-next.0f6f9d12c.0",
49
+ "@wordpress/block-editor": "^15.1.1-next.0f6f9d12c.0",
50
+ "@wordpress/blocks": "^15.1.1-next.0f6f9d12c.0",
51
+ "@wordpress/components": "^30.2.1-next.0f6f9d12c.0",
52
+ "@wordpress/compose": "^7.28.1-next.0f6f9d12c.0",
53
+ "@wordpress/core-data": "^7.28.1-next.0f6f9d12c.0",
54
+ "@wordpress/data": "^10.28.1-next.0f6f9d12c.0",
55
+ "@wordpress/date": "^5.28.1-next.0f6f9d12c.0",
56
+ "@wordpress/deprecated": "^4.28.1-next.0f6f9d12c.0",
57
+ "@wordpress/dom": "^4.28.1-next.0f6f9d12c.0",
58
+ "@wordpress/element": "^6.28.1-next.0f6f9d12c.0",
59
+ "@wordpress/escape-html": "^3.28.1-next.0f6f9d12c.0",
60
+ "@wordpress/hooks": "^4.28.1-next.0f6f9d12c.0",
61
+ "@wordpress/html-entities": "^4.28.1-next.0f6f9d12c.0",
62
+ "@wordpress/i18n": "^6.1.1-next.0f6f9d12c.0",
63
+ "@wordpress/icons": "^10.28.2-next.0f6f9d12c.0",
64
+ "@wordpress/interactivity": "^6.28.1-next.0f6f9d12c.0",
65
+ "@wordpress/interactivity-router": "^2.28.1-next.0f6f9d12c.0",
66
+ "@wordpress/keyboard-shortcuts": "^5.28.1-next.0f6f9d12c.0",
67
+ "@wordpress/keycodes": "^4.28.1-next.0f6f9d12c.0",
68
+ "@wordpress/notices": "^5.28.1-next.0f6f9d12c.0",
69
+ "@wordpress/patterns": "^2.28.1-next.0f6f9d12c.0",
70
+ "@wordpress/primitives": "^4.28.1-next.0f6f9d12c.0",
71
+ "@wordpress/private-apis": "^1.28.1-next.0f6f9d12c.0",
72
+ "@wordpress/reusable-blocks": "^5.28.1-next.0f6f9d12c.0",
73
+ "@wordpress/rich-text": "^7.28.1-next.0f6f9d12c.0",
74
+ "@wordpress/server-side-render": "^6.4.1-next.0f6f9d12c.0",
75
+ "@wordpress/url": "^4.28.1-next.0f6f9d12c.0",
76
+ "@wordpress/viewport": "^6.28.1-next.0f6f9d12c.0",
77
+ "@wordpress/wordcount": "^4.28.1-next.0f6f9d12c.0",
77
78
  "change-case": "^4.1.2",
78
79
  "clsx": "^2.1.1",
79
80
  "colord": "^2.7.0",
@@ -91,5 +92,5 @@
91
92
  "publishConfig": {
92
93
  "access": "public"
93
94
  },
94
- "gitHead": "28cc2098f5ee28f89096b638533796538f495f72"
95
+ "gitHead": "7d4f4367e2f76deddf4a09b540e6b2f9f4c3fe9f"
95
96
  }
@@ -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": "Accordion header.",
9
+ "example": {},
10
+ "__experimental": true,
11
+ "parent": [ "core/accordion-item" ],
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,128 @@
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-item/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-item__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-item__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( `accordion-item__toggle-icon`, {
113
+ 'has-icon-plus': true,
114
+ } ) }
115
+ style={ {
116
+ // TO-DO: make this configurable
117
+ width: `1.2em`,
118
+ height: `1.2em`,
119
+ } }
120
+ >
121
+ { Icon && <Icon width="1.2em" height="1.2em" /> }
122
+ </span>
123
+ ) }
124
+ </button>
125
+ </TagName>
126
+ </>
127
+ );
128
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { accordionHeader } from '@wordpress/icons';
5
+ /**
6
+ * Internal dependencies
7
+ */
8
+ import edit from './edit';
9
+ import save from './save';
10
+ import metadata from './block.json';
11
+ import initBlock from '../utils/init-block';
12
+
13
+ const { name } = metadata;
14
+
15
+ export { metadata, name };
16
+
17
+ export const settings = {
18
+ icon: accordionHeader,
19
+ example: {},
20
+ edit,
21
+ save,
22
+ };
23
+
24
+ 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-item/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-item__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-item__toggle' ) }
59
+ style={ {
60
+ ...spacingProps.style,
61
+ } }
62
+ >
63
+ <RichText.Content tagName="span" value={ title } />
64
+ <span
65
+ className={ clsx( `accordion-item__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
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://schemas.wp.org/trunk/block.json",
3
+ "apiVersion": 3,
4
+ "name": "core/accordion-item",
5
+ "version": "0.1.0",
6
+ "title": "Accordion",
7
+ "category": "design",
8
+ "description": "A single accordion that displays a header and expandable content.",
9
+ "example": {},
10
+ "__experimental": true,
11
+ "parent": [ "core/accordions" ],
12
+ "allowedBlocks": [ "core/accordion-header", "core/accordion-panel" ],
13
+ "supports": {
14
+ "align": [ "wide", "full" ],
15
+ "color": {
16
+ "background": true,
17
+ "gradient": true
18
+ },
19
+ "interactivity": true,
20
+ "spacing": {
21
+ "margin": [ "top", "bottom" ],
22
+ "blockGap": true
23
+ },
24
+ "__experimentalBorder": {
25
+ "color": true,
26
+ "radius": true,
27
+ "style": true,
28
+ "width": true,
29
+ "__experimentalDefaultControls": {
30
+ "color": true,
31
+ "radius": true,
32
+ "style": true,
33
+ "width": true
34
+ }
35
+ },
36
+ "shadow": true
37
+ },
38
+ "attributes": {
39
+ "openByDefault": {
40
+ "type": "boolean",
41
+ "default": false
42
+ }
43
+ },
44
+ "textdomain": "default"
45
+ }
@@ -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,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,24 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { accordionItem } from '@wordpress/icons';
5
+ /**
6
+ * Internal dependencies
7
+ */
8
+ import edit from './edit';
9
+ import save from './save';
10
+ import metadata from './block.json';
11
+ import initBlock from '../utils/init-block';
12
+
13
+ const { name } = metadata;
14
+
15
+ export { metadata, name };
16
+
17
+ export const settings = {
18
+ icon: accordionItem,
19
+ example: {},
20
+ edit,
21
+ save,
22
+ };
23
+
24
+ export const init = () => initBlock( { name, metadata, settings } );