@wordpress/block-library 8.28.5 → 8.30.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 (289) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/audio/edit.js +7 -17
  3. package/build/audio/edit.js.map +1 -1
  4. package/build/audio/edit.native.js.map +1 -1
  5. package/build/avatar/edit.js.map +1 -1
  6. package/build/button/edit.js +1 -1
  7. package/build/button/edit.js.map +1 -1
  8. package/build/buttons/edit.js +1 -6
  9. package/build/buttons/edit.js.map +1 -1
  10. package/build/buttons/edit.native.js +1 -7
  11. package/build/buttons/edit.native.js.map +1 -1
  12. package/build/columns/edit.js +8 -2
  13. package/build/columns/edit.js.map +1 -1
  14. package/build/comment-author-avatar/edit.js +1 -1
  15. package/build/comment-author-avatar/edit.js.map +1 -1
  16. package/build/cover/edit/index.js.map +1 -1
  17. package/build/cover/edit/inspector-controls.js.map +1 -1
  18. package/build/cover/edit/resizable-cover-popover.js +0 -6
  19. package/build/cover/edit/resizable-cover-popover.js.map +1 -1
  20. package/build/cover/edit.native.js.map +1 -1
  21. package/build/details/index.js +1 -0
  22. package/build/details/index.js.map +1 -1
  23. package/build/file/deprecated.js.map +1 -1
  24. package/build/file/edit.js +6 -13
  25. package/build/file/edit.js.map +1 -1
  26. package/build/file/edit.native.js.map +1 -1
  27. package/build/file/save.js.map +1 -1
  28. package/build/form-input/edit.js +1 -1
  29. package/build/form-input/edit.js.map +1 -1
  30. package/build/gallery/edit.js +5 -5
  31. package/build/gallery/edit.js.map +1 -1
  32. package/build/gallery/gallery.native.js.map +1 -1
  33. package/build/gallery/v1/edit.js.map +1 -1
  34. package/build/gallery/v1/gallery.native.js.map +1 -1
  35. package/build/group/variations.js +12 -15
  36. package/build/group/variations.js.map +1 -1
  37. package/build/image/edit.js.map +1 -1
  38. package/build/image/edit.native.js.map +1 -1
  39. package/build/image/image.js.map +1 -1
  40. package/build/latest-posts/edit.native.js.map +1 -1
  41. package/build/list/edit.js +5 -0
  42. package/build/list/edit.js.map +1 -1
  43. package/build/list/ordered-list-settings.js +1 -1
  44. package/build/list/ordered-list-settings.js.map +1 -1
  45. package/build/list-item/edit.native.js.map +1 -1
  46. package/build/list-item/hooks/use-indent-list-item.js +1 -0
  47. package/build/list-item/hooks/use-indent-list-item.js.map +1 -1
  48. package/build/list-item/hooks/use-outdent-list-item.js +1 -0
  49. package/build/list-item/hooks/use-outdent-list-item.js.map +1 -1
  50. package/build/list-item/hooks/use-space.js +16 -7
  51. package/build/list-item/hooks/use-space.js.map +1 -1
  52. package/build/media-text/media-container.native.js +1 -1
  53. package/build/media-text/media-container.native.js.map +1 -1
  54. package/build/navigation/edit/index.js.map +1 -1
  55. package/build/navigation-link/link-ui.js.map +1 -1
  56. package/build/paragraph/edit.native.js.map +1 -1
  57. package/build/pattern/edit.js +23 -9
  58. package/build/pattern/edit.js.map +1 -1
  59. package/build/post-excerpt/edit.js.map +1 -1
  60. package/build/post-featured-image/dimension-controls.js.map +1 -1
  61. package/build/post-featured-image/edit.js.map +1 -1
  62. package/build/post-navigation-link/edit.js.map +1 -1
  63. package/build/query/edit/pattern-selection-modal.js.map +1 -1
  64. package/build/query/utils.js +7 -5
  65. package/build/query/utils.js.map +1 -1
  66. package/build/query-pagination-next/edit.js.map +1 -1
  67. package/build/query-pagination-previous/edit.js.map +1 -1
  68. package/build/quote/deprecated.js +111 -12
  69. package/build/quote/deprecated.js.map +1 -1
  70. package/build/quote/edit.js +5 -5
  71. package/build/quote/edit.js.map +1 -1
  72. package/build/quote/index.js +1 -1
  73. package/build/quote/index.js.map +1 -1
  74. package/build/quote/save.js +2 -2
  75. package/build/quote/save.js.map +1 -1
  76. package/build/read-more/edit.js.map +1 -1
  77. package/build/search/edit.js +1 -1
  78. package/build/search/edit.js.map +1 -1
  79. package/build/search/edit.native.js.map +1 -1
  80. package/build/site-logo/edit.js.map +1 -1
  81. package/build/site-title/{edit/index.js → edit.js} +1 -1
  82. package/build/site-title/edit.js.map +1 -0
  83. package/build/social-link/edit.js.map +1 -1
  84. package/build/social-links/edit.native.js.map +1 -1
  85. package/build/spacer/edit.js.map +1 -1
  86. package/build/table-of-contents/edit.js.map +1 -1
  87. package/build/template-part/edit/index.js +53 -1
  88. package/build/template-part/edit/index.js.map +1 -1
  89. package/build/template-part/edit/selection-modal.js +2 -8
  90. package/build/template-part/edit/selection-modal.js.map +1 -1
  91. package/build/template-part/edit/utils/map-template-part-to-block-pattern.js +30 -0
  92. package/build/template-part/edit/utils/map-template-part-to-block-pattern.js.map +1 -0
  93. package/build/utils/hooks.js +55 -4
  94. package/build/utils/hooks.js.map +1 -1
  95. package/build/video/edit-common-settings.js.map +1 -1
  96. package/build/video/edit.js +7 -16
  97. package/build/video/edit.js.map +1 -1
  98. package/build/video/edit.native.js +2 -7
  99. package/build/video/edit.native.js.map +1 -1
  100. package/build-module/audio/edit.js +10 -20
  101. package/build-module/audio/edit.js.map +1 -1
  102. package/build-module/audio/edit.native.js.map +1 -1
  103. package/build-module/avatar/edit.js.map +1 -1
  104. package/build-module/button/edit.js +1 -1
  105. package/build-module/button/edit.js.map +1 -1
  106. package/build-module/buttons/edit.js +2 -7
  107. package/build-module/buttons/edit.js.map +1 -1
  108. package/build-module/buttons/edit.native.js +1 -7
  109. package/build-module/buttons/edit.native.js.map +1 -1
  110. package/build-module/columns/edit.js +8 -2
  111. package/build-module/columns/edit.js.map +1 -1
  112. package/build-module/comment-author-avatar/edit.js +1 -1
  113. package/build-module/comment-author-avatar/edit.js.map +1 -1
  114. package/build-module/cover/edit/index.js.map +1 -1
  115. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  116. package/build-module/cover/edit/resizable-cover-popover.js +1 -7
  117. package/build-module/cover/edit/resizable-cover-popover.js.map +1 -1
  118. package/build-module/cover/edit.native.js.map +1 -1
  119. package/build-module/details/index.js +1 -0
  120. package/build-module/details/index.js.map +1 -1
  121. package/build-module/file/deprecated.js.map +1 -1
  122. package/build-module/file/edit.js +7 -14
  123. package/build-module/file/edit.js.map +1 -1
  124. package/build-module/file/edit.native.js.map +1 -1
  125. package/build-module/file/save.js.map +1 -1
  126. package/build-module/form-input/edit.js +1 -1
  127. package/build-module/form-input/edit.js.map +1 -1
  128. package/build-module/gallery/edit.js +5 -5
  129. package/build-module/gallery/edit.js.map +1 -1
  130. package/build-module/gallery/gallery.native.js.map +1 -1
  131. package/build-module/gallery/v1/edit.js.map +1 -1
  132. package/build-module/gallery/v1/gallery.native.js.map +1 -1
  133. package/build-module/group/variations.js +12 -15
  134. package/build-module/group/variations.js.map +1 -1
  135. package/build-module/image/edit.js.map +1 -1
  136. package/build-module/image/edit.native.js.map +1 -1
  137. package/build-module/image/image.js.map +1 -1
  138. package/build-module/latest-posts/edit.native.js.map +1 -1
  139. package/build-module/list/edit.js +5 -0
  140. package/build-module/list/edit.js.map +1 -1
  141. package/build-module/list/ordered-list-settings.js +1 -1
  142. package/build-module/list/ordered-list-settings.js.map +1 -1
  143. package/build-module/list-item/edit.native.js.map +1 -1
  144. package/build-module/list-item/hooks/use-indent-list-item.js +1 -0
  145. package/build-module/list-item/hooks/use-indent-list-item.js.map +1 -1
  146. package/build-module/list-item/hooks/use-outdent-list-item.js +1 -0
  147. package/build-module/list-item/hooks/use-outdent-list-item.js.map +1 -1
  148. package/build-module/list-item/hooks/use-space.js +17 -8
  149. package/build-module/list-item/hooks/use-space.js.map +1 -1
  150. package/build-module/media-text/media-container.native.js +1 -1
  151. package/build-module/media-text/media-container.native.js.map +1 -1
  152. package/build-module/navigation/edit/index.js.map +1 -1
  153. package/build-module/navigation-link/link-ui.js.map +1 -1
  154. package/build-module/paragraph/edit.native.js.map +1 -1
  155. package/build-module/pattern/edit.js +24 -10
  156. package/build-module/pattern/edit.js.map +1 -1
  157. package/build-module/post-excerpt/edit.js.map +1 -1
  158. package/build-module/post-featured-image/dimension-controls.js.map +1 -1
  159. package/build-module/post-featured-image/edit.js.map +1 -1
  160. package/build-module/post-navigation-link/edit.js.map +1 -1
  161. package/build-module/query/edit/pattern-selection-modal.js.map +1 -1
  162. package/build-module/query/utils.js +7 -5
  163. package/build-module/query/utils.js.map +1 -1
  164. package/build-module/query-pagination-next/edit.js.map +1 -1
  165. package/build-module/query-pagination-previous/edit.js.map +1 -1
  166. package/build-module/quote/deprecated.js +112 -13
  167. package/build-module/quote/deprecated.js.map +1 -1
  168. package/build-module/quote/edit.js +5 -5
  169. package/build-module/quote/edit.js.map +1 -1
  170. package/build-module/quote/index.js +1 -1
  171. package/build-module/quote/index.js.map +1 -1
  172. package/build-module/quote/save.js +2 -2
  173. package/build-module/quote/save.js.map +1 -1
  174. package/build-module/read-more/edit.js.map +1 -1
  175. package/build-module/search/edit.js +1 -1
  176. package/build-module/search/edit.js.map +1 -1
  177. package/build-module/search/edit.native.js.map +1 -1
  178. package/build-module/site-logo/edit.js.map +1 -1
  179. package/build-module/site-title/{edit/index.js → edit.js} +1 -1
  180. package/build-module/site-title/edit.js.map +1 -0
  181. package/build-module/social-link/edit.js.map +1 -1
  182. package/build-module/social-links/edit.native.js.map +1 -1
  183. package/build-module/spacer/edit.js.map +1 -1
  184. package/build-module/table-of-contents/edit.js.map +1 -1
  185. package/build-module/template-part/edit/index.js +57 -5
  186. package/build-module/template-part/edit/index.js.map +1 -1
  187. package/build-module/template-part/edit/selection-modal.js +2 -8
  188. package/build-module/template-part/edit/selection-modal.js.map +1 -1
  189. package/build-module/template-part/edit/utils/map-template-part-to-block-pattern.js +24 -0
  190. package/build-module/template-part/edit/utils/map-template-part-to-block-pattern.js.map +1 -0
  191. package/build-module/utils/hooks.js +54 -3
  192. package/build-module/utils/hooks.js.map +1 -1
  193. package/build-module/video/edit-common-settings.js.map +1 -1
  194. package/build-module/video/edit.js +10 -19
  195. package/build-module/video/edit.js.map +1 -1
  196. package/build-module/video/edit.native.js +2 -7
  197. package/build-module/video/edit.native.js.map +1 -1
  198. package/build-style/editor-rtl.css +4 -1
  199. package/build-style/editor.css +4 -1
  200. package/build-style/group/editor-rtl.css +1 -1
  201. package/build-style/group/editor.css +1 -1
  202. package/build-style/image/editor-rtl.css +3 -0
  203. package/build-style/image/editor.css +3 -0
  204. package/package.json +34 -34
  205. package/src/audio/edit.js +9 -19
  206. package/src/audio/edit.native.js +3 -3
  207. package/src/avatar/edit.js +1 -1
  208. package/src/avatar/index.php +12 -1
  209. package/src/block/index.php +2 -0
  210. package/src/button/edit.js +2 -2
  211. package/src/buttons/edit.js +3 -16
  212. package/src/buttons/edit.native.js +2 -18
  213. package/src/calendar/index.php +5 -0
  214. package/src/columns/edit.js +9 -2
  215. package/src/comment-author-avatar/edit.js +1 -1
  216. package/src/comments/index.php +2 -0
  217. package/src/cover/edit/index.js +2 -2
  218. package/src/cover/edit/inspector-controls.js +1 -1
  219. package/src/cover/edit/resizable-cover-popover.js +1 -6
  220. package/src/cover/edit.native.js +1 -1
  221. package/src/details/block.json +1 -0
  222. package/src/file/deprecated.js +3 -3
  223. package/src/file/edit.js +8 -15
  224. package/src/file/edit.native.js +4 -4
  225. package/src/file/save.js +1 -1
  226. package/src/form-input/edit.js +1 -1
  227. package/src/gallery/edit.js +6 -12
  228. package/src/gallery/gallery.native.js +1 -1
  229. package/src/gallery/test/index.native.js +1 -1
  230. package/src/gallery/v1/edit.js +2 -2
  231. package/src/gallery/v1/gallery.native.js +1 -1
  232. package/src/group/editor.scss +1 -1
  233. package/src/group/variations.js +3 -6
  234. package/src/image/edit.js +1 -1
  235. package/src/image/edit.native.js +1 -1
  236. package/src/image/editor.scss +6 -0
  237. package/src/image/image.js +2 -2
  238. package/src/latest-posts/edit.native.js +1 -1
  239. package/src/list/edit.js +5 -0
  240. package/src/list/ordered-list-settings.js +1 -1
  241. package/src/list-item/edit.native.js +1 -1
  242. package/src/list-item/hooks/use-indent-list-item.js +2 -0
  243. package/src/list-item/hooks/use-outdent-list-item.js +2 -0
  244. package/src/list-item/hooks/use-space.js +16 -9
  245. package/src/media-text/media-container.native.js +5 -3
  246. package/src/media-text/test/edit.native.js +58 -0
  247. package/src/missing/test/edit-integration.native.js +2 -1
  248. package/src/navigation/edit/index.js +1 -1
  249. package/src/navigation/edit/test/navigation-menu-selector.js +3 -3
  250. package/src/navigation/index.php +18 -13
  251. package/src/navigation-link/link-ui.js +2 -2
  252. package/src/paragraph/edit.native.js +1 -1
  253. package/src/paragraph/test/edit.native.js +36 -0
  254. package/src/pattern/edit.js +27 -10
  255. package/src/post-author-biography/index.php +4 -3
  256. package/src/post-author-name/index.php +4 -3
  257. package/src/post-excerpt/edit.js +1 -1
  258. package/src/post-featured-image/dimension-controls.js +4 -4
  259. package/src/post-featured-image/edit.js +1 -1
  260. package/src/post-navigation-link/edit.js +1 -1
  261. package/src/post-template/index.php +2 -0
  262. package/src/query/edit/pattern-selection-modal.js +1 -1
  263. package/src/query/utils.js +6 -4
  264. package/src/query-pagination-next/edit.js +1 -1
  265. package/src/query-pagination-previous/edit.js +1 -1
  266. package/src/quote/block.json +1 -1
  267. package/src/quote/deprecated.js +110 -15
  268. package/src/quote/edit.js +5 -5
  269. package/src/quote/save.js +2 -2
  270. package/src/quote/test/__snapshots__/transforms.native.js.snap +2 -2
  271. package/src/read-more/edit.js +1 -1
  272. package/src/search/edit.js +1 -1
  273. package/src/search/edit.native.js +4 -4
  274. package/src/site-logo/edit.js +1 -1
  275. package/src/social-link/edit.js +1 -1
  276. package/src/social-links/edit.native.js +1 -1
  277. package/src/spacer/edit.js +1 -1
  278. package/src/table-of-contents/edit.js +1 -1
  279. package/src/template-part/edit/index.js +91 -4
  280. package/src/template-part/edit/selection-modal.js +4 -8
  281. package/src/template-part/edit/utils/map-template-part-to-block-pattern.js +23 -0
  282. package/src/utils/hooks.js +53 -3
  283. package/src/video/edit-common-settings.js +1 -1
  284. package/src/video/edit.js +10 -18
  285. package/src/video/edit.native.js +5 -8
  286. package/src/video/test/edit.native.js +0 -14
  287. package/build/site-title/edit/index.js.map +0 -1
  288. package/build-module/site-title/edit/index.js.map +0 -1
  289. /package/src/site-title/{edit/index.js → edit.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useSelect } from '@wordpress/data';
4
+ import { useSelect, useDispatch } from '@wordpress/data';
5
5
  import {
6
6
  BlockSettingsMenuControls,
7
7
  useBlockProps,
@@ -10,11 +10,14 @@ import {
10
10
  RecursionProvider,
11
11
  useHasRecursion,
12
12
  InspectorControls,
13
+ __experimentalBlockPatternsList as BlockPatternsList,
13
14
  } from '@wordpress/block-editor';
14
- import { Spinner, Modal, MenuItem } from '@wordpress/components';
15
+ import { PanelBody, Spinner, Modal, MenuItem } from '@wordpress/components';
16
+ import { useAsyncList } from '@wordpress/compose';
15
17
  import { __, sprintf } from '@wordpress/i18n';
16
18
  import { store as coreStore } from '@wordpress/core-data';
17
19
  import { useState } from '@wordpress/element';
20
+ import { store as noticesStore } from '@wordpress/notices';
18
21
 
19
22
  /**
20
23
  * Internal dependencies
@@ -24,10 +27,12 @@ import TemplatePartSelectionModal from './selection-modal';
24
27
  import { TemplatePartAdvancedControls } from './advanced-controls';
25
28
  import TemplatePartInnerBlocks from './inner-blocks';
26
29
  import { createTemplatePartId } from './utils/create-template-part-id';
30
+ import { mapTemplatePartToBlockPattern } from './utils/map-template-part-to-block-pattern';
27
31
  import {
28
32
  useAlternativeBlockPatterns,
29
33
  useAlternativeTemplateParts,
30
34
  useTemplatePartArea,
35
+ useCreateTemplatePartFromBlocks,
31
36
  } from './utils/hooks';
32
37
 
33
38
  function ReplaceButton( {
@@ -43,7 +48,6 @@ function ReplaceButton( {
43
48
  templatePartId
44
49
  );
45
50
  const blockPatterns = useAlternativeBlockPatterns( area, clientId );
46
-
47
51
  const hasReplacements = !! templateParts.length || !! blockPatterns.length;
48
52
  const canReplace =
49
53
  isEntityAvailable &&
@@ -67,11 +71,29 @@ function ReplaceButton( {
67
71
  );
68
72
  }
69
73
 
74
+ function TemplatesList( { availableTemplates, onSelect } ) {
75
+ const shownTemplates = useAsyncList( availableTemplates );
76
+
77
+ if ( ! availableTemplates ) {
78
+ return null;
79
+ }
80
+
81
+ return (
82
+ <BlockPatternsList
83
+ label={ __( 'Templates' ) }
84
+ blockPatterns={ availableTemplates }
85
+ shownPatterns={ shownTemplates }
86
+ onClickPattern={ onSelect }
87
+ />
88
+ );
89
+ }
90
+
70
91
  export default function TemplatePartEdit( {
71
92
  attributes,
72
93
  setAttributes,
73
94
  clientId,
74
95
  } ) {
96
+ const { createSuccessNotice } = useDispatch( noticesStore );
75
97
  const currentTheme = useSelect(
76
98
  ( select ) => select( coreStore ).getCurrentTheme()?.stylesheet,
77
99
  []
@@ -117,12 +139,28 @@ export default function TemplatePartEdit( {
117
139
  [ templatePartId, attributes.area, clientId ]
118
140
  );
119
141
 
142
+ const { templateParts } = useAlternativeTemplateParts(
143
+ area,
144
+ templatePartId
145
+ );
146
+ const blockPatterns = useAlternativeBlockPatterns( area, clientId );
147
+ const hasReplacements = !! templateParts.length || !! blockPatterns.length;
120
148
  const areaObject = useTemplatePartArea( area );
121
149
  const blockProps = useBlockProps();
122
150
  const isPlaceholder = ! slug;
123
151
  const isEntityAvailable = ! isPlaceholder && ! isMissing && isResolved;
124
152
  const TagName = tagName || areaObject.tagName;
125
153
 
154
+ const canReplace =
155
+ isEntityAvailable &&
156
+ hasReplacements &&
157
+ ( area === 'header' || area === 'footer' );
158
+
159
+ const createFromBlocks = useCreateTemplatePartFromBlocks(
160
+ area,
161
+ setAttributes
162
+ );
163
+
126
164
  // We don't want to render a missing state if we have any inner blocks.
127
165
  // A new template part is automatically created if we have any inner blocks but no entity.
128
166
  if (
@@ -154,6 +192,28 @@ export default function TemplatePartEdit( {
154
192
  );
155
193
  }
156
194
 
195
+ const partsAsPatterns = templateParts.map( ( templatePart ) =>
196
+ mapTemplatePartToBlockPattern( templatePart )
197
+ );
198
+
199
+ const onTemplatePartSelect = ( templatePart ) => {
200
+ setAttributes( {
201
+ slug: templatePart.slug,
202
+ theme: templatePart.theme,
203
+ area: undefined,
204
+ } );
205
+ createSuccessNotice(
206
+ sprintf(
207
+ /* translators: %s: template part title. */
208
+ __( 'Template Part "%s" replaceed.' ),
209
+ templatePart.title?.rendered || templatePart.slug
210
+ ),
211
+ {
212
+ type: 'snackbar',
213
+ }
214
+ );
215
+ };
216
+
157
217
  return (
158
218
  <>
159
219
  <RecursionProvider uniqueId={ templatePartId }>
@@ -207,6 +267,33 @@ export default function TemplatePartEdit( {
207
267
  );
208
268
  } }
209
269
  </BlockSettingsMenuControls>
270
+
271
+ { canReplace &&
272
+ ( partsAsPatterns.length > 0 ||
273
+ blockPatterns.length > 0 ) && (
274
+ <InspectorControls>
275
+ <PanelBody title={ __( 'Replace' ) }>
276
+ <TemplatesList
277
+ availableTemplates={ partsAsPatterns }
278
+ onSelect={ ( pattern ) => {
279
+ onTemplatePartSelect(
280
+ pattern.templatePart
281
+ );
282
+ } }
283
+ />
284
+ <TemplatesList
285
+ availableTemplates={ blockPatterns }
286
+ onSelect={ ( pattern, blocks ) => {
287
+ createFromBlocks(
288
+ blocks,
289
+ pattern.title
290
+ );
291
+ } }
292
+ />
293
+ </PanelBody>
294
+ </InspectorControls>
295
+ ) }
296
+
210
297
  { isEntityAvailable && (
211
298
  <TemplatePartInnerBlocks
212
299
  tagName={ TagName }
@@ -233,7 +320,7 @@ export default function TemplatePartEdit( {
233
320
  onRequestClose={ () =>
234
321
  setIsTemplatePartSelectionOpen( false )
235
322
  }
236
- isFullScreen={ true }
323
+ isFullScreen
237
324
  >
238
325
  <TemplatePartSelectionModal
239
326
  templatePartId={ templatePartId }
@@ -5,7 +5,6 @@ import { useMemo, useState } from '@wordpress/element';
5
5
  import { __, sprintf } from '@wordpress/i18n';
6
6
  import { store as noticesStore } from '@wordpress/notices';
7
7
  import { useDispatch } from '@wordpress/data';
8
- import { parse } from '@wordpress/blocks';
9
8
  import { useAsyncList } from '@wordpress/compose';
10
9
  import { __experimentalBlockPatternsList as BlockPatternsList } from '@wordpress/block-editor';
11
10
  import {
@@ -21,7 +20,7 @@ import {
21
20
  useAlternativeTemplateParts,
22
21
  useCreateTemplatePartFromBlocks,
23
22
  } from './utils/hooks';
24
- import { createTemplatePartId } from './utils/create-template-part-id';
23
+ import { mapTemplatePartToBlockPattern } from './utils/map-template-part-to-block-pattern';
25
24
  import { searchPatterns } from '../../utils/search-patterns';
26
25
 
27
26
  export default function TemplatePartSelectionModal( {
@@ -39,12 +38,9 @@ export default function TemplatePartSelectionModal( {
39
38
  );
40
39
  // We can map template parts to block patters to reuse the BlockPatternsList UI
41
40
  const filteredTemplateParts = useMemo( () => {
42
- const partsAsPatterns = templateParts.map( ( templatePart ) => ( {
43
- name: createTemplatePartId( templatePart.theme, templatePart.slug ),
44
- title: templatePart.title.rendered,
45
- blocks: parse( templatePart.content.raw ),
46
- templatePart,
47
- } ) );
41
+ const partsAsPatterns = templateParts.map( ( templatePart ) =>
42
+ mapTemplatePartToBlockPattern( templatePart )
43
+ );
48
44
 
49
45
  return searchPatterns( partsAsPatterns, searchValue );
50
46
  }, [ templateParts, searchValue ] );
@@ -0,0 +1,23 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { parse } from '@wordpress/blocks';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { createTemplatePartId } from './create-template-part-id';
10
+
11
+ /**
12
+ * This maps the properties of a template part to those of a block pattern.
13
+ * @param {Object} templatePart
14
+ * @return {Object} The template part in the shape of block pattern.
15
+ */
16
+ export function mapTemplatePartToBlockPattern( templatePart ) {
17
+ return {
18
+ name: createTemplatePartId( templatePart.theme, templatePart.slug ),
19
+ title: templatePart.title.rendered,
20
+ blocks: parse( templatePart.content.raw ),
21
+ templatePart,
22
+ };
23
+ }
@@ -2,6 +2,9 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useSelect } from '@wordpress/data';
5
+ import { useLayoutEffect, useEffect, useRef } from '@wordpress/element';
6
+ import { getBlobByURL, isBlobURL, revokeBlobURL } from '@wordpress/blob';
7
+ import { store as blockEditorStore } from '@wordpress/block-editor';
5
8
  import { store as coreStore } from '@wordpress/core-data';
6
9
 
7
10
  /**
@@ -19,6 +22,53 @@ export function useCanEditEntity( kind, name, recordId ) {
19
22
  );
20
23
  }
21
24
 
22
- export default {
23
- useCanEditEntity,
24
- };
25
+ /**
26
+ * Handles uploading a media file from a blob URL on mount.
27
+ *
28
+ * @param {Object} args Upload media arguments.
29
+ * @param {string} args.url Blob URL.
30
+ * @param {?Array} args.allowedTypes Array of allowed media types.
31
+ * @param {Function} args.onChange Function called when the media is uploaded.
32
+ * @param {Function} args.onError Function called when an error happens.
33
+ */
34
+ export function useUploadMediaFromBlobURL( args = {} ) {
35
+ const latestArgs = useRef( args );
36
+ const { getSettings } = useSelect( blockEditorStore );
37
+
38
+ useLayoutEffect( () => {
39
+ latestArgs.current = args;
40
+ } );
41
+
42
+ useEffect( () => {
43
+ if (
44
+ ! latestArgs.current.url ||
45
+ ! isBlobURL( latestArgs.current.url )
46
+ ) {
47
+ return;
48
+ }
49
+
50
+ const file = getBlobByURL( latestArgs.current.url );
51
+ if ( ! file ) {
52
+ return;
53
+ }
54
+
55
+ const { url, allowedTypes, onChange, onError } = latestArgs.current;
56
+ const { mediaUpload } = getSettings();
57
+
58
+ mediaUpload( {
59
+ filesList: [ file ],
60
+ allowedTypes,
61
+ onFileChange: ( [ media ] ) => {
62
+ if ( isBlobURL( media?.url ) ) {
63
+ return;
64
+ }
65
+
66
+ revokeBlobURL( url );
67
+ onChange( media );
68
+ },
69
+ onError: ( message ) => {
70
+ onError( message );
71
+ },
72
+ } );
73
+ }, [ getSettings ] );
74
+ }
@@ -84,7 +84,7 @@ const VideoSettings = ( { setAttributes, attributes } ) => {
84
84
  value={ preload }
85
85
  onChange={ onChangePreload }
86
86
  options={ options }
87
- hideCancelButton={ true }
87
+ hideCancelButton
88
88
  />
89
89
  </>
90
90
  );
package/src/video/edit.js CHANGED
@@ -6,7 +6,7 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { getBlobByURL, isBlobURL } from '@wordpress/blob';
9
+ import { isBlobURL } from '@wordpress/blob';
10
10
  import {
11
11
  BaseControl,
12
12
  Button,
@@ -24,12 +24,11 @@ import {
24
24
  MediaUploadCheck,
25
25
  MediaReplaceFlow,
26
26
  useBlockProps,
27
- store as blockEditorStore,
28
27
  } from '@wordpress/block-editor';
29
28
  import { useRef, useEffect } from '@wordpress/element';
30
29
  import { __, sprintf } from '@wordpress/i18n';
31
30
  import { useInstanceId } from '@wordpress/compose';
32
- import { useDispatch, useSelect } from '@wordpress/data';
31
+ import { useDispatch } from '@wordpress/data';
33
32
  import { video as icon } from '@wordpress/icons';
34
33
  import { store as noticesStore } from '@wordpress/notices';
35
34
 
@@ -37,6 +36,7 @@ import { store as noticesStore } from '@wordpress/notices';
37
36
  * Internal dependencies
38
37
  */
39
38
  import { createUpgradedEmbedBlock } from '../embed/util';
39
+ import { useUploadMediaFromBlobURL } from '../utils/hooks';
40
40
  import VideoCommonSettings from './edit-common-settings';
41
41
  import TracksEditor from './tracks-editor';
42
42
  import Tracks from './tracks';
@@ -47,7 +47,7 @@ const placeholder = ( content ) => {
47
47
  return (
48
48
  <Placeholder
49
49
  className="block-editor-media-placeholder"
50
- withIllustration={ true }
50
+ withIllustration
51
51
  icon={ icon }
52
52
  label={ __( 'Video' ) }
53
53
  instructions={ __(
@@ -75,21 +75,13 @@ function VideoEdit( {
75
75
  const posterImageButton = useRef();
76
76
  const { id, controls, poster, src, tracks } = attributes;
77
77
  const isTemporaryVideo = ! id && isBlobURL( src );
78
- const { getSettings } = useSelect( blockEditorStore );
79
78
 
80
- useEffect( () => {
81
- if ( ! id && isBlobURL( src ) ) {
82
- const file = getBlobByURL( src );
83
- if ( file ) {
84
- getSettings().mediaUpload( {
85
- filesList: [ file ],
86
- onFileChange: ( [ media ] ) => onSelectVideo( media ),
87
- onError: onUploadError,
88
- allowedTypes: ALLOWED_MEDIA_TYPES,
89
- } );
90
- }
91
- }
92
- }, [] );
79
+ useUploadMediaFromBlobURL( {
80
+ url: src,
81
+ allowedTypes: ALLOWED_MEDIA_TYPES,
82
+ onChange: onSelectVideo,
83
+ onError: onUploadError,
84
+ } );
93
85
 
94
86
  useEffect( () => {
95
87
  // Placeholder may be rendered.
@@ -212,13 +212,13 @@ class VideoEdit extends Component {
212
212
  render() {
213
213
  const { setAttributes, attributes, isSelected, wasBlockJustInserted } =
214
214
  this.props;
215
- const { id, src, guid } = attributes;
215
+ const { id, src } = attributes;
216
216
  const { videoContainerHeight } = this.state;
217
217
 
218
218
  const toolbarEditButton = (
219
219
  <MediaUpload
220
220
  allowedTypes={ [ MEDIA_TYPE_VIDEO ] }
221
- isReplacingMedia={ true }
221
+ isReplacingMedia
222
222
  onSelect={ this.onSelectMediaUploadOption }
223
223
  onSelectURL={ this.onSelectURL }
224
224
  render={ ( { open, getMediaOptions } ) => {
@@ -236,10 +236,7 @@ class VideoEdit extends Component {
236
236
  ></MediaUpload>
237
237
  );
238
238
 
239
- // NOTE: `guid` is not part of the block's attribute definition. This case
240
- // handled here is a temporary fix until a we find a better approach.
241
- const isSourcePresent = src || ( guid && id );
242
- if ( ! isSourcePresent ) {
239
+ if ( ! src ) {
243
240
  return (
244
241
  <View style={ { flex: 1 } }>
245
242
  <MediaPlaceholder
@@ -335,7 +332,7 @@ class VideoEdit extends Component {
335
332
  }
336
333
  style={ videoStyle }
337
334
  source={ { uri: src } }
338
- paused={ true }
335
+ paused
339
336
  />
340
337
  </View>
341
338
  ) }
@@ -368,7 +365,7 @@ class VideoEdit extends Component {
368
365
  } }
369
366
  />
370
367
  <BlockCaption
371
- accessible={ true }
368
+ accessible
372
369
  accessibilityLabelCreator={ ( caption ) =>
373
370
  RichText.isEmpty( caption )
374
371
  ? /* translators: accessibility text. Empty video caption. */
@@ -44,20 +44,6 @@ describe( 'Video block', () => {
44
44
  initialHtml: `
45
45
  <!-- wp:video {"id":1234} -->
46
46
  <figure class="wp-block-video"><video controls src="https://VIDEO_URL.mp4"></video></figure>
47
- <!-- /wp:video -->
48
- `,
49
- } );
50
- const addVideoButton = screen.queryByText( 'Add video' );
51
- expect( addVideoButton ).toBeNull();
52
- } );
53
-
54
- it( `should not render empty state when 'guid' and 'id' attributes are present`, async () => {
55
- await initializeEditor( {
56
- initialHtml: `
57
- <!-- wp:video {"guid":"ABCD1234","id":1234 -->
58
- <figure class="wp-block-video wp-block-embed is-type-video is-provider-videopress"><div class="wp-block-embed__wrapper">
59
- https://videopress.com/<VIDEO_ID>
60
- </div></figure>
61
47
  <!-- /wp:video -->
62
48
  `,
63
49
  } );
@@ -1 +0,0 @@
1
- {"version":3,"names":["_classnames","_interopRequireDefault","require","_data","_coreData","_i18n","_blockEditor","_components","_blocks","_htmlEntities","HEADING_LEVELS","SiteTitleEdit","attributes","setAttributes","insertBlocksAfter","level","textAlign","isLink","linkTarget","canUserEdit","title","useSelect","select","canUser","getEntityRecord","getEditedEntityRecord","coreStore","canEdit","settings","readOnlySettings","name","editEntityRecord","useDispatch","setTitle","newTitle","undefined","TagName","blockProps","useBlockProps","className","classnames","siteTitleContent","_react","createElement","RichText","tagName","href","__","placeholder","value","onChange","allowedFormats","disableLineBreaks","__unstableOnSplitAtEnd","createBlock","getDefaultBlockName","onClick","event","preventDefault","decodeEntities","Fragment","BlockControls","group","HeadingLevelDropdown","options","newLevel","AlignmentControl","nextAlign","InspectorControls","PanelBody","ToggleControl","__nextHasNoMarginBottom","label","checked"],"sources":["@wordpress/block-library/src/site-title/edit/index.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tRichText,\n\tAlignmentControl,\n\tInspectorControls,\n\tBlockControls,\n\tuseBlockProps,\n\tHeadingLevelDropdown,\n} from '@wordpress/block-editor';\nimport { ToggleControl, PanelBody } from '@wordpress/components';\nimport { createBlock, getDefaultBlockName } from '@wordpress/blocks';\nimport { decodeEntities } from '@wordpress/html-entities';\n\nconst HEADING_LEVELS = [ 0, 1, 2, 3, 4, 5, 6 ];\n\nexport default function SiteTitleEdit( {\n\tattributes,\n\tsetAttributes,\n\tinsertBlocksAfter,\n} ) {\n\tconst { level, textAlign, isLink, linkTarget } = attributes;\n\tconst { canUserEdit, title } = useSelect( ( select ) => {\n\t\tconst { canUser, getEntityRecord, getEditedEntityRecord } =\n\t\t\tselect( coreStore );\n\t\tconst canEdit = canUser( 'update', 'settings' );\n\t\tconst settings = canEdit ? getEditedEntityRecord( 'root', 'site' ) : {};\n\t\tconst readOnlySettings = getEntityRecord( 'root', '__unstableBase' );\n\n\t\treturn {\n\t\t\tcanUserEdit: canEdit,\n\t\t\ttitle: canEdit ? settings?.title : readOnlySettings?.name,\n\t\t};\n\t}, [] );\n\tconst { editEntityRecord } = useDispatch( coreStore );\n\n\tfunction setTitle( newTitle ) {\n\t\teditEntityRecord( 'root', 'site', undefined, {\n\t\t\ttitle: newTitle,\n\t\t} );\n\t}\n\n\tconst TagName = level === 0 ? 'p' : `h${ level }`;\n\tconst blockProps = useBlockProps( {\n\t\tclassName: classnames( {\n\t\t\t[ `has-text-align-${ textAlign }` ]: textAlign,\n\t\t\t'wp-block-site-title__placeholder': ! canUserEdit && ! title,\n\t\t} ),\n\t} );\n\tconst siteTitleContent = canUserEdit ? (\n\t\t<TagName { ...blockProps }>\n\t\t\t<RichText\n\t\t\t\ttagName={ isLink ? 'a' : 'span' }\n\t\t\t\thref={ isLink ? '#site-title-pseudo-link' : undefined }\n\t\t\t\taria-label={ __( 'Site title text' ) }\n\t\t\t\tplaceholder={ __( 'Write site title…' ) }\n\t\t\t\tvalue={ title }\n\t\t\t\tonChange={ setTitle }\n\t\t\t\tallowedFormats={ [] }\n\t\t\t\tdisableLineBreaks\n\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\tinsertBlocksAfter( createBlock( getDefaultBlockName() ) )\n\t\t\t\t}\n\t\t\t/>\n\t\t</TagName>\n\t) : (\n\t\t<TagName { ...blockProps }>\n\t\t\t{ isLink ? (\n\t\t\t\t<a\n\t\t\t\t\thref=\"#site-title-pseudo-link\"\n\t\t\t\t\tonClick={ ( event ) => event.preventDefault() }\n\t\t\t\t>\n\t\t\t\t\t{ decodeEntities( title ) ||\n\t\t\t\t\t\t__( 'Site Title placeholder' ) }\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\t<span>\n\t\t\t\t\t{ decodeEntities( title ) ||\n\t\t\t\t\t\t__( 'Site Title placeholder' ) }\n\t\t\t\t</span>\n\t\t\t) }\n\t\t</TagName>\n\t);\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t<HeadingLevelDropdown\n\t\t\t\t\toptions={ HEADING_LEVELS }\n\t\t\t\t\tvalue={ level }\n\t\t\t\t\tonChange={ ( newLevel ) =>\n\t\t\t\t\t\tsetAttributes( { level: newLevel } )\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<AlignmentControl\n\t\t\t\t\tvalue={ textAlign }\n\t\t\t\t\tonChange={ ( nextAlign ) => {\n\t\t\t\t\t\tsetAttributes( { textAlign: nextAlign } );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</BlockControls>\n\t\t\t<InspectorControls>\n\t\t\t\t<PanelBody title={ __( 'Settings' ) }>\n\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\tlabel={ __( 'Make title link to home' ) }\n\t\t\t\t\t\tonChange={ () => setAttributes( { isLink: ! isLink } ) }\n\t\t\t\t\t\tchecked={ isLink }\n\t\t\t\t\t/>\n\t\t\t\t\t{ isLink && (\n\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\tlabel={ __( 'Open in new tab' ) }\n\t\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\t\t\tlinkTarget: value ? '_blank' : '_self',\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tchecked={ linkTarget === '_blank' }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</PanelBody>\n\t\t\t</InspectorControls>\n\t\t\t{ siteTitleContent }\n\t\t</>\n\t);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["classnames","useDispatch","useSelect","store","coreStore","__","RichText","AlignmentControl","InspectorControls","BlockControls","useBlockProps","HeadingLevelDropdown","ToggleControl","PanelBody","createBlock","getDefaultBlockName","decodeEntities","HEADING_LEVELS","SiteTitleEdit","attributes","setAttributes","insertBlocksAfter","level","textAlign","isLink","linkTarget","canUserEdit","title","select","canUser","getEntityRecord","getEditedEntityRecord","canEdit","settings","readOnlySettings","name","editEntityRecord","setTitle","newTitle","undefined","TagName","blockProps","className","siteTitleContent","createElement","tagName","href","placeholder","value","onChange","allowedFormats","disableLineBreaks","__unstableOnSplitAtEnd","onClick","event","preventDefault","Fragment","group","options","newLevel","nextAlign","__nextHasNoMarginBottom","label","checked"],"sources":["@wordpress/block-library/src/site-title/edit/index.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tRichText,\n\tAlignmentControl,\n\tInspectorControls,\n\tBlockControls,\n\tuseBlockProps,\n\tHeadingLevelDropdown,\n} from '@wordpress/block-editor';\nimport { ToggleControl, PanelBody } from '@wordpress/components';\nimport { createBlock, getDefaultBlockName } from '@wordpress/blocks';\nimport { decodeEntities } from '@wordpress/html-entities';\n\nconst HEADING_LEVELS = [ 0, 1, 2, 3, 4, 5, 6 ];\n\nexport default function SiteTitleEdit( {\n\tattributes,\n\tsetAttributes,\n\tinsertBlocksAfter,\n} ) {\n\tconst { level, textAlign, isLink, linkTarget } = attributes;\n\tconst { canUserEdit, title } = useSelect( ( select ) => {\n\t\tconst { canUser, getEntityRecord, getEditedEntityRecord } =\n\t\t\tselect( coreStore );\n\t\tconst canEdit = canUser( 'update', 'settings' );\n\t\tconst settings = canEdit ? getEditedEntityRecord( 'root', 'site' ) : {};\n\t\tconst readOnlySettings = getEntityRecord( 'root', '__unstableBase' );\n\n\t\treturn {\n\t\t\tcanUserEdit: canEdit,\n\t\t\ttitle: canEdit ? settings?.title : readOnlySettings?.name,\n\t\t};\n\t}, [] );\n\tconst { editEntityRecord } = useDispatch( coreStore );\n\n\tfunction setTitle( newTitle ) {\n\t\teditEntityRecord( 'root', 'site', undefined, {\n\t\t\ttitle: newTitle,\n\t\t} );\n\t}\n\n\tconst TagName = level === 0 ? 'p' : `h${ level }`;\n\tconst blockProps = useBlockProps( {\n\t\tclassName: classnames( {\n\t\t\t[ `has-text-align-${ textAlign }` ]: textAlign,\n\t\t\t'wp-block-site-title__placeholder': ! canUserEdit && ! title,\n\t\t} ),\n\t} );\n\tconst siteTitleContent = canUserEdit ? (\n\t\t<TagName { ...blockProps }>\n\t\t\t<RichText\n\t\t\t\ttagName={ isLink ? 'a' : 'span' }\n\t\t\t\thref={ isLink ? '#site-title-pseudo-link' : undefined }\n\t\t\t\taria-label={ __( 'Site title text' ) }\n\t\t\t\tplaceholder={ __( 'Write site title…' ) }\n\t\t\t\tvalue={ title }\n\t\t\t\tonChange={ setTitle }\n\t\t\t\tallowedFormats={ [] }\n\t\t\t\tdisableLineBreaks\n\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\tinsertBlocksAfter( createBlock( getDefaultBlockName() ) )\n\t\t\t\t}\n\t\t\t/>\n\t\t</TagName>\n\t) : (\n\t\t<TagName { ...blockProps }>\n\t\t\t{ isLink ? (\n\t\t\t\t<a\n\t\t\t\t\thref=\"#site-title-pseudo-link\"\n\t\t\t\t\tonClick={ ( event ) => event.preventDefault() }\n\t\t\t\t>\n\t\t\t\t\t{ decodeEntities( title ) ||\n\t\t\t\t\t\t__( 'Site Title placeholder' ) }\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\t<span>\n\t\t\t\t\t{ decodeEntities( title ) ||\n\t\t\t\t\t\t__( 'Site Title placeholder' ) }\n\t\t\t\t</span>\n\t\t\t) }\n\t\t</TagName>\n\t);\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t<HeadingLevelDropdown\n\t\t\t\t\toptions={ HEADING_LEVELS }\n\t\t\t\t\tvalue={ level }\n\t\t\t\t\tonChange={ ( newLevel ) =>\n\t\t\t\t\t\tsetAttributes( { level: newLevel } )\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<AlignmentControl\n\t\t\t\t\tvalue={ textAlign }\n\t\t\t\t\tonChange={ ( nextAlign ) => {\n\t\t\t\t\t\tsetAttributes( { textAlign: nextAlign } );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</BlockControls>\n\t\t\t<InspectorControls>\n\t\t\t\t<PanelBody title={ __( 'Settings' ) }>\n\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\tlabel={ __( 'Make title link to home' ) }\n\t\t\t\t\t\tonChange={ () => setAttributes( { isLink: ! isLink } ) }\n\t\t\t\t\t\tchecked={ isLink }\n\t\t\t\t\t/>\n\t\t\t\t\t{ isLink && (\n\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\tlabel={ __( 'Open in new tab' ) }\n\t\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\t\t\tlinkTarget: value ? '_blank' : '_self',\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tchecked={ linkTarget === '_blank' }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</PanelBody>\n\t\t\t</InspectorControls>\n\t\t\t{ siteTitleContent }\n\t\t</>\n\t);\n}\n"],"mappings":";AAAA;AACA;AACA;AACA,OAAOA,UAAU,MAAM,YAAY;;AAEnC;AACA;AACA;AACA,SAASC,WAAW,EAAEC,SAAS,QAAQ,iBAAiB;AACxD,SAASC,KAAK,IAAIC,SAAS,QAAQ,sBAAsB;AACzD,SAASC,EAAE,QAAQ,iBAAiB;AACpC,SACCC,QAAQ,EACRC,gBAAgB,EAChBC,iBAAiB,EACjBC,aAAa,EACbC,aAAa,EACbC,oBAAoB,QACd,yBAAyB;AAChC,SAASC,aAAa,EAAEC,SAAS,QAAQ,uBAAuB;AAChE,SAASC,WAAW,EAAEC,mBAAmB,QAAQ,mBAAmB;AACpE,SAASC,cAAc,QAAQ,0BAA0B;AAEzD,MAAMC,cAAc,GAAG,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;AAE9C,eAAe,SAASC,aAAaA,CAAE;EACtCC,UAAU;EACVC,aAAa;EACbC;AACD,CAAC,EAAG;EACH,MAAM;IAAEC,KAAK;IAAEC,SAAS;IAAEC,MAAM;IAAEC;EAAW,CAAC,GAAGN,UAAU;EAC3D,MAAM;IAAEO,WAAW;IAAEC;EAAM,CAAC,GAAGzB,SAAS,CAAI0B,MAAM,IAAM;IACvD,MAAM;MAAEC,OAAO;MAAEC,eAAe;MAAEC;IAAsB,CAAC,GACxDH,MAAM,CAAExB,SAAU,CAAC;IACpB,MAAM4B,OAAO,GAAGH,OAAO,CAAE,QAAQ,EAAE,UAAW,CAAC;IAC/C,MAAMI,QAAQ,GAAGD,OAAO,GAAGD,qBAAqB,CAAE,MAAM,EAAE,MAAO,CAAC,GAAG,CAAC,CAAC;IACvE,MAAMG,gBAAgB,GAAGJ,eAAe,CAAE,MAAM,EAAE,gBAAiB,CAAC;IAEpE,OAAO;MACNJ,WAAW,EAAEM,OAAO;MACpBL,KAAK,EAAEK,OAAO,GAAGC,QAAQ,EAAEN,KAAK,GAAGO,gBAAgB,EAAEC;IACtD,CAAC;EACF,CAAC,EAAE,EAAG,CAAC;EACP,MAAM;IAAEC;EAAiB,CAAC,GAAGnC,WAAW,CAAEG,SAAU,CAAC;EAErD,SAASiC,QAAQA,CAAEC,QAAQ,EAAG;IAC7BF,gBAAgB,CAAE,MAAM,EAAE,MAAM,EAAEG,SAAS,EAAE;MAC5CZ,KAAK,EAAEW;IACR,CAAE,CAAC;EACJ;EAEA,MAAME,OAAO,GAAGlB,KAAK,KAAK,CAAC,GAAG,GAAG,GAAI,IAAIA,KAAO,EAAC;EACjD,MAAMmB,UAAU,GAAG/B,aAAa,CAAE;IACjCgC,SAAS,EAAE1C,UAAU,CAAE;MACtB,CAAG,kBAAkBuB,SAAW,EAAC,GAAIA,SAAS;MAC9C,kCAAkC,EAAE,CAAEG,WAAW,IAAI,CAAEC;IACxD,CAAE;EACH,CAAE,CAAC;EACH,MAAMgB,gBAAgB,GAAGjB,WAAW,GACnCkB,aAAA,CAACJ,OAAO;IAAA,GAAMC;EAAU,GACvBG,aAAA,CAACtC,QAAQ;IACRuC,OAAO,EAAGrB,MAAM,GAAG,GAAG,GAAG,MAAQ;IACjCsB,IAAI,EAAGtB,MAAM,GAAG,yBAAyB,GAAGe,SAAW;IACvD,cAAalC,EAAE,CAAE,iBAAkB,CAAG;IACtC0C,WAAW,EAAG1C,EAAE,CAAE,mBAAoB,CAAG;IACzC2C,KAAK,EAAGrB,KAAO;IACfsB,QAAQ,EAAGZ,QAAU;IACrBa,cAAc,EAAG,EAAI;IACrBC,iBAAiB;IACjBC,sBAAsB,EAAGA,CAAA,KACxB/B,iBAAiB,CAAEP,WAAW,CAAEC,mBAAmB,CAAC,CAAE,CAAE;EACxD,CACD,CACO,CAAC,GAEV6B,aAAA,CAACJ,OAAO;IAAA,GAAMC;EAAU,GACrBjB,MAAM,GACPoB,aAAA;IACCE,IAAI,EAAC,yBAAyB;IAC9BO,OAAO,EAAKC,KAAK,IAAMA,KAAK,CAACC,cAAc,CAAC;EAAG,GAE7CvC,cAAc,CAAEW,KAAM,CAAC,IACxBtB,EAAE,CAAE,wBAAyB,CAC5B,CAAC,GAEJuC,aAAA,eACG5B,cAAc,CAAEW,KAAM,CAAC,IACxBtB,EAAE,CAAE,wBAAyB,CACzB,CAEC,CACT;EACD,OACCuC,aAAA,CAAAY,QAAA,QACCZ,aAAA,CAACnC,aAAa;IAACgD,KAAK,EAAC;EAAO,GAC3Bb,aAAA,CAACjC,oBAAoB;IACpB+C,OAAO,EAAGzC,cAAgB;IAC1B+B,KAAK,EAAG1B,KAAO;IACf2B,QAAQ,EAAKU,QAAQ,IACpBvC,aAAa,CAAE;MAAEE,KAAK,EAAEqC;IAAS,CAAE;EACnC,CACD,CAAC,EACFf,aAAA,CAACrC,gBAAgB;IAChByC,KAAK,EAAGzB,SAAW;IACnB0B,QAAQ,EAAKW,SAAS,IAAM;MAC3BxC,aAAa,CAAE;QAAEG,SAAS,EAAEqC;MAAU,CAAE,CAAC;IAC1C;EAAG,CACH,CACa,CAAC,EAChBhB,aAAA,CAACpC,iBAAiB,QACjBoC,aAAA,CAAC/B,SAAS;IAACc,KAAK,EAAGtB,EAAE,CAAE,UAAW;EAAG,GACpCuC,aAAA,CAAChC,aAAa;IACbiD,uBAAuB;IACvBC,KAAK,EAAGzD,EAAE,CAAE,yBAA0B,CAAG;IACzC4C,QAAQ,EAAGA,CAAA,KAAM7B,aAAa,CAAE;MAAEI,MAAM,EAAE,CAAEA;IAAO,CAAE,CAAG;IACxDuC,OAAO,EAAGvC;EAAQ,CAClB,CAAC,EACAA,MAAM,IACPoB,aAAA,CAAChC,aAAa;IACbiD,uBAAuB;IACvBC,KAAK,EAAGzD,EAAE,CAAE,iBAAkB,CAAG;IACjC4C,QAAQ,EAAKD,KAAK,IACjB5B,aAAa,CAAE;MACdK,UAAU,EAAEuB,KAAK,GAAG,QAAQ,GAAG;IAChC,CAAE,CACF;IACDe,OAAO,EAAGtC,UAAU,KAAK;EAAU,CACnC,CAEQ,CACO,CAAC,EAClBkB,gBACD,CAAC;AAEL"}
File without changes