@wordpress/block-library 9.35.1-next.16d95556a.0 → 9.36.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 (311) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/accordion/view.js +46 -4
  3. package/build/accordion/view.js.map +2 -2
  4. package/build/accordion-heading/block.json +1 -1
  5. package/build/accordion-heading/deprecated.js +1 -1
  6. package/build/accordion-heading/deprecated.js.map +2 -2
  7. package/build/accordion-panel/block.json +1 -1
  8. package/build/audio/index.js +29 -0
  9. package/build/audio/index.js.map +3 -3
  10. package/build/breadcrumbs/edit.js +1 -1
  11. package/build/breadcrumbs/edit.js.map +2 -2
  12. package/build/button/index.js +25 -0
  13. package/build/button/index.js.map +3 -3
  14. package/build/code/index.js +15 -0
  15. package/build/code/index.js.map +3 -3
  16. package/build/cover/edit/block-controls.js +37 -3
  17. package/build/cover/edit/block-controls.js.map +3 -3
  18. package/build/cover/edit/cover-placeholder.js +0 -1
  19. package/build/cover/edit/cover-placeholder.js.map +2 -2
  20. package/build/cover/edit/embed-video-url-input.js +83 -0
  21. package/build/cover/edit/embed-video-url-input.js.map +7 -0
  22. package/build/cover/edit/index.js +60 -0
  23. package/build/cover/edit/index.js.map +2 -2
  24. package/build/cover/embed-video-utils.js +151 -0
  25. package/build/cover/embed-video-utils.js.map +7 -0
  26. package/build/cover/index.js +28 -0
  27. package/build/cover/index.js.map +3 -3
  28. package/build/cover/save.js +12 -0
  29. package/build/cover/save.js.map +2 -2
  30. package/build/cover/shared.js +3 -0
  31. package/build/cover/shared.js.map +2 -2
  32. package/build/details/index.js +15 -0
  33. package/build/details/index.js.map +3 -3
  34. package/build/file/index.js +33 -0
  35. package/build/file/index.js.map +3 -3
  36. package/build/freeform/block.json +1 -1
  37. package/build/gallery/edit.js +0 -2
  38. package/build/gallery/edit.js.map +2 -2
  39. package/build/heading/index.js +15 -0
  40. package/build/heading/index.js.map +3 -3
  41. package/build/html/modal.js +139 -148
  42. package/build/html/modal.js.map +3 -3
  43. package/build/image/edit.js +0 -1
  44. package/build/image/edit.js.map +2 -2
  45. package/build/image/image.js +0 -1
  46. package/build/image/image.js.map +2 -2
  47. package/build/image/index.js +46 -0
  48. package/build/image/index.js.map +3 -3
  49. package/build/list-item/index.js +15 -0
  50. package/build/list-item/index.js.map +3 -3
  51. package/build/math/block.json +28 -1
  52. package/build/math/edit.js +4 -1
  53. package/build/math/edit.js.map +2 -2
  54. package/build/media-text/index.js +35 -0
  55. package/build/media-text/index.js.map +3 -3
  56. package/build/media-text/media-container.js +0 -2
  57. package/build/media-text/media-container.js.map +2 -2
  58. package/build/missing/block.json +1 -1
  59. package/build/missing/edit.js +2 -2
  60. package/build/missing/edit.js.map +1 -1
  61. package/build/more/index.js +16 -0
  62. package/build/more/index.js.map +3 -3
  63. package/build/navigation/block.json +2 -2
  64. package/build/navigation-link/block.json +2 -1
  65. package/build/navigation-link/edit.js +42 -11
  66. package/build/navigation-link/edit.js.map +2 -2
  67. package/build/navigation-link/index.js +25 -0
  68. package/build/navigation-link/index.js.map +3 -3
  69. package/build/navigation-link/shared/controls.js +15 -19
  70. package/build/navigation-link/shared/controls.js.map +2 -2
  71. package/build/navigation-link/shared/index.js +4 -0
  72. package/build/navigation-link/shared/index.js.map +2 -2
  73. package/build/navigation-link/shared/use-entity-binding.js +3 -2
  74. package/build/navigation-link/shared/use-entity-binding.js.map +2 -2
  75. package/build/navigation-submenu/block.json +2 -1
  76. package/build/navigation-submenu/index.js +25 -0
  77. package/build/navigation-submenu/index.js.map +3 -3
  78. package/build/paragraph/deprecated-attributes.js +68 -0
  79. package/build/paragraph/deprecated-attributes.js.map +7 -0
  80. package/build/paragraph/edit.js +2 -0
  81. package/build/paragraph/edit.js.map +3 -3
  82. package/build/paragraph/index.js +15 -0
  83. package/build/paragraph/index.js.map +3 -3
  84. package/build/pattern/block.json +1 -1
  85. package/build/post-comments-count/edit.js +1 -2
  86. package/build/post-comments-count/edit.js.map +2 -2
  87. package/build/post-comments-link/edit.js +10 -7
  88. package/build/post-comments-link/edit.js.map +2 -2
  89. package/build/preformatted/index.js +15 -0
  90. package/build/preformatted/index.js.map +3 -3
  91. package/build/pullquote/index.js +20 -0
  92. package/build/pullquote/index.js.map +3 -3
  93. package/build/search/index.js +26 -0
  94. package/build/search/index.js.map +3 -3
  95. package/build/social-link/index.js +25 -0
  96. package/build/social-link/index.js.map +3 -3
  97. package/build/social-links/edit.js +1 -1
  98. package/build/social-links/edit.js.map +1 -1
  99. package/build/tabs/view.js +17 -4
  100. package/build/tabs/view.js.map +2 -2
  101. package/build/template-part/edit/index.js +37 -7
  102. package/build/template-part/edit/index.js.map +2 -2
  103. package/build/template-part/edit/utils/hooks.js +2 -3
  104. package/build/template-part/edit/utils/hooks.js.map +2 -2
  105. package/build/term-count/index.js +1 -0
  106. package/build/term-count/index.js.map +2 -2
  107. package/build/term-name/index.js +1 -0
  108. package/build/term-name/index.js.map +2 -2
  109. package/build/verse/index.js +15 -0
  110. package/build/verse/index.js.map +3 -3
  111. package/build/video/index.js +30 -0
  112. package/build/video/index.js.map +3 -3
  113. package/build-module/accordion/view.js +46 -4
  114. package/build-module/accordion/view.js.map +2 -2
  115. package/build-module/accordion-heading/block.json +1 -1
  116. package/build-module/accordion-heading/deprecated.js +1 -1
  117. package/build-module/accordion-heading/deprecated.js.map +2 -2
  118. package/build-module/accordion-panel/block.json +1 -1
  119. package/build-module/audio/index.js +29 -0
  120. package/build-module/audio/index.js.map +2 -2
  121. package/build-module/breadcrumbs/edit.js +1 -1
  122. package/build-module/breadcrumbs/edit.js.map +2 -2
  123. package/build-module/button/index.js +25 -0
  124. package/build-module/button/index.js.map +2 -2
  125. package/build-module/code/index.js +15 -0
  126. package/build-module/code/index.js.map +2 -2
  127. package/build-module/cover/edit/block-controls.js +27 -3
  128. package/build-module/cover/edit/block-controls.js.map +2 -2
  129. package/build-module/cover/edit/cover-placeholder.js +0 -1
  130. package/build-module/cover/edit/cover-placeholder.js.map +2 -2
  131. package/build-module/cover/edit/embed-video-url-input.js +67 -0
  132. package/build-module/cover/edit/embed-video-url-input.js.map +7 -0
  133. package/build-module/cover/edit/index.js +61 -0
  134. package/build-module/cover/edit/index.js.map +2 -2
  135. package/build-module/cover/embed-video-utils.js +122 -0
  136. package/build-module/cover/embed-video-utils.js.map +7 -0
  137. package/build-module/cover/index.js +28 -0
  138. package/build-module/cover/index.js.map +2 -2
  139. package/build-module/cover/save.js +13 -0
  140. package/build-module/cover/save.js.map +2 -2
  141. package/build-module/cover/shared.js +2 -0
  142. package/build-module/cover/shared.js.map +2 -2
  143. package/build-module/details/index.js +15 -0
  144. package/build-module/details/index.js.map +2 -2
  145. package/build-module/file/index.js +34 -1
  146. package/build-module/file/index.js.map +2 -2
  147. package/build-module/freeform/block.json +1 -1
  148. package/build-module/gallery/edit.js +0 -2
  149. package/build-module/gallery/edit.js.map +2 -2
  150. package/build-module/heading/index.js +15 -0
  151. package/build-module/heading/index.js.map +2 -2
  152. package/build-module/html/modal.js +141 -150
  153. package/build-module/html/modal.js.map +2 -2
  154. package/build-module/image/edit.js +0 -1
  155. package/build-module/image/edit.js.map +2 -2
  156. package/build-module/image/image.js +0 -1
  157. package/build-module/image/image.js.map +2 -2
  158. package/build-module/image/index.js +46 -0
  159. package/build-module/image/index.js.map +2 -2
  160. package/build-module/list-item/index.js +15 -0
  161. package/build-module/list-item/index.js.map +2 -2
  162. package/build-module/math/block.json +28 -1
  163. package/build-module/math/edit.js +4 -1
  164. package/build-module/math/edit.js.map +2 -2
  165. package/build-module/media-text/index.js +35 -0
  166. package/build-module/media-text/index.js.map +2 -2
  167. package/build-module/media-text/media-container.js +0 -2
  168. package/build-module/media-text/media-container.js.map +2 -2
  169. package/build-module/missing/block.json +1 -1
  170. package/build-module/missing/edit.js +2 -2
  171. package/build-module/missing/edit.js.map +1 -1
  172. package/build-module/more/index.js +16 -0
  173. package/build-module/more/index.js.map +2 -2
  174. package/build-module/navigation/block.json +2 -2
  175. package/build-module/navigation-link/block.json +2 -1
  176. package/build-module/navigation-link/edit.js +56 -15
  177. package/build-module/navigation-link/edit.js.map +2 -2
  178. package/build-module/navigation-link/index.js +26 -1
  179. package/build-module/navigation-link/index.js.map +2 -2
  180. package/build-module/navigation-link/shared/controls.js +12 -18
  181. package/build-module/navigation-link/shared/controls.js.map +2 -2
  182. package/build-module/navigation-link/shared/index.js +3 -1
  183. package/build-module/navigation-link/shared/index.js.map +2 -2
  184. package/build-module/navigation-link/shared/use-entity-binding.js +3 -2
  185. package/build-module/navigation-link/shared/use-entity-binding.js.map +2 -2
  186. package/build-module/navigation-submenu/block.json +2 -1
  187. package/build-module/navigation-submenu/index.js +26 -1
  188. package/build-module/navigation-submenu/index.js.map +2 -2
  189. package/build-module/paragraph/deprecated-attributes.js +37 -0
  190. package/build-module/paragraph/deprecated-attributes.js.map +7 -0
  191. package/build-module/paragraph/edit.js +2 -0
  192. package/build-module/paragraph/edit.js.map +2 -2
  193. package/build-module/paragraph/index.js +15 -0
  194. package/build-module/paragraph/index.js.map +2 -2
  195. package/build-module/pattern/block.json +1 -1
  196. package/build-module/post-comments-count/edit.js +1 -3
  197. package/build-module/post-comments-count/edit.js.map +2 -2
  198. package/build-module/post-comments-link/edit.js +10 -8
  199. package/build-module/post-comments-link/edit.js.map +2 -2
  200. package/build-module/preformatted/index.js +15 -0
  201. package/build-module/preformatted/index.js.map +2 -2
  202. package/build-module/pullquote/index.js +20 -0
  203. package/build-module/pullquote/index.js.map +2 -2
  204. package/build-module/search/index.js +26 -0
  205. package/build-module/search/index.js.map +2 -2
  206. package/build-module/social-link/index.js +25 -0
  207. package/build-module/social-link/index.js.map +2 -2
  208. package/build-module/social-links/edit.js +1 -1
  209. package/build-module/social-links/edit.js.map +1 -1
  210. package/build-module/tabs/view.js +17 -4
  211. package/build-module/tabs/view.js.map +2 -2
  212. package/build-module/template-part/edit/index.js +37 -7
  213. package/build-module/template-part/edit/index.js.map +2 -2
  214. package/build-module/template-part/edit/utils/hooks.js +2 -3
  215. package/build-module/template-part/edit/utils/hooks.js.map +2 -2
  216. package/build-module/term-count/index.js +1 -0
  217. package/build-module/term-count/index.js.map +2 -2
  218. package/build-module/term-name/index.js +1 -0
  219. package/build-module/term-name/index.js.map +2 -2
  220. package/build-module/verse/index.js +15 -0
  221. package/build-module/verse/index.js.map +2 -2
  222. package/build-module/video/index.js +30 -0
  223. package/build-module/video/index.js.map +2 -2
  224. package/build-style/accordion/style-rtl.css +3 -0
  225. package/build-style/accordion/style.css +3 -0
  226. package/build-style/accordion-heading/style-rtl.css +1 -2
  227. package/build-style/accordion-heading/style.css +1 -2
  228. package/build-style/accordion-item/style-rtl.css +0 -7
  229. package/build-style/accordion-item/style.css +0 -7
  230. package/build-style/accordion-panel/style-rtl.css +1 -4
  231. package/build-style/accordion-panel/style.css +1 -4
  232. package/build-style/cover/style-rtl.css +47 -0
  233. package/build-style/cover/style.css +47 -0
  234. package/build-style/editor-rtl.css +11 -13
  235. package/build-style/editor.css +11 -13
  236. package/build-style/html/editor-rtl.css +11 -13
  237. package/build-style/html/editor.css +11 -13
  238. package/build-style/style-rtl.css +52 -12
  239. package/build-style/style.css +52 -12
  240. package/package.json +37 -37
  241. package/src/accordion/style.scss +4 -0
  242. package/src/accordion/view.js +60 -3
  243. package/src/accordion-heading/block.json +1 -1
  244. package/src/accordion-heading/deprecated.js +1 -1
  245. package/src/accordion-heading/style.scss +1 -9
  246. package/src/accordion-item/index.php +1 -0
  247. package/src/accordion-item/style.scss +2 -9
  248. package/src/accordion-panel/block.json +1 -1
  249. package/src/accordion-panel/style.scss +1 -5
  250. package/src/audio/index.js +31 -0
  251. package/src/breadcrumbs/edit.js +4 -2
  252. package/src/breadcrumbs/index.php +171 -100
  253. package/src/button/index.js +27 -0
  254. package/src/code/index.js +17 -0
  255. package/src/cover/edit/block-controls.js +26 -2
  256. package/src/cover/edit/cover-placeholder.js +0 -1
  257. package/src/cover/edit/embed-video-url-input.js +74 -0
  258. package/src/cover/edit/index.js +81 -0
  259. package/src/cover/embed-video-utils.js +196 -0
  260. package/src/cover/index.js +30 -0
  261. package/src/cover/index.php +106 -0
  262. package/src/cover/save.js +14 -0
  263. package/src/cover/shared.js +1 -0
  264. package/src/cover/style.scss +47 -0
  265. package/src/details/index.js +17 -0
  266. package/src/file/index.js +36 -1
  267. package/src/freeform/block.json +1 -1
  268. package/src/gallery/edit.js +0 -2
  269. package/src/heading/index.js +17 -0
  270. package/src/html/editor.scss +10 -15
  271. package/src/html/modal.js +23 -38
  272. package/src/image/edit.js +0 -1
  273. package/src/image/image.js +0 -1
  274. package/src/image/index.js +48 -0
  275. package/src/image/index.php +1 -0
  276. package/src/list-item/index.js +17 -0
  277. package/src/math/block.json +28 -1
  278. package/src/math/edit.js +4 -1
  279. package/src/media-text/index.js +37 -0
  280. package/src/media-text/media-container.js +0 -2
  281. package/src/missing/block.json +1 -1
  282. package/src/missing/edit.js +2 -2
  283. package/src/more/index.js +18 -0
  284. package/src/navigation/block.json +2 -2
  285. package/src/navigation-link/block.json +2 -1
  286. package/src/navigation-link/edit.js +98 -29
  287. package/src/navigation-link/index.js +28 -1
  288. package/src/navigation-link/shared/controls.js +13 -17
  289. package/src/navigation-link/shared/index.js +1 -1
  290. package/src/navigation-link/shared/use-entity-binding.js +5 -2
  291. package/src/navigation-submenu/block.json +2 -1
  292. package/src/navigation-submenu/index.js +28 -1
  293. package/src/paragraph/deprecated-attributes.js +45 -0
  294. package/src/paragraph/edit.js +2 -0
  295. package/src/paragraph/index.js +17 -0
  296. package/src/pattern/block.json +1 -1
  297. package/src/post-comments-count/edit.js +1 -9
  298. package/src/post-comments-link/edit.js +8 -18
  299. package/src/preformatted/index.js +17 -0
  300. package/src/pullquote/index.js +22 -0
  301. package/src/search/index.js +28 -0
  302. package/src/social-link/index.js +27 -0
  303. package/src/social-links/edit.js +1 -1
  304. package/src/style.scss +1 -0
  305. package/src/tabs/view.js +19 -4
  306. package/src/template-part/edit/index.js +44 -6
  307. package/src/template-part/edit/utils/hooks.js +2 -4
  308. package/src/term-count/index.js +1 -0
  309. package/src/term-name/index.js +1 -0
  310. package/src/verse/index.js +17 -0
  311. package/src/video/index.js +32 -0
@@ -163,7 +163,7 @@ function Controls({ attributes, setAttributes, clientId }) {
163
163
  });
164
164
  },
165
165
  help: hasUrlBinding && !isBoundEntityAvailable ? /* @__PURE__ */ jsx(
166
- MissingEntityHelpText,
166
+ MissingEntityHelp,
167
167
  {
168
168
  id: helpTextId,
169
169
  type: attributes.type,
@@ -273,26 +273,20 @@ function BindingHelpText({ type, kind }) {
273
273
  entityType
274
274
  );
275
275
  }
276
- function MissingEntityHelpText({ id, type, kind }) {
276
+ function MissingEntityHelpText({ type, kind }) {
277
277
  const entityType = getEntityTypeName(type, kind);
278
- return /* @__PURE__ */ jsx(
279
- "span",
280
- {
281
- id,
282
- className: "navigation-link-control__error-text",
283
- role: "alert",
284
- "aria-live": "polite",
285
- children: sprintf(
286
- /* translators: %s is the entity type (e.g., "page", "post", "category") */
287
- __(
288
- "Synced %s is missing. Please update or remove this link."
289
- ),
290
- entityType
291
- )
292
- }
278
+ return sprintf(
279
+ /* translators: %s is the entity type (e.g., "page", "post", "category") */
280
+ __("Synced %s is missing. Please update or remove this link."),
281
+ entityType
293
282
  );
294
283
  }
284
+ function MissingEntityHelp({ id, type, kind }) {
285
+ return /* @__PURE__ */ jsx("span", { id, className: "navigation-link-control__error-text", children: /* @__PURE__ */ jsx(MissingEntityHelpText, { type, kind }) });
286
+ }
295
287
  export {
296
- Controls
288
+ BindingHelpText,
289
+ Controls,
290
+ MissingEntityHelpText
297
291
  };
298
292
  //# sourceMappingURL=controls.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation-link/shared/controls.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalInputControl as InputControl,\n\tButton,\n\tCheckboxControl,\n\tTextControl,\n\tTextareaControl,\n} from '@wordpress/components';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { useRef, useEffect, useState } from '@wordpress/element';\nimport { useInstanceId } from '@wordpress/compose';\nimport { safeDecodeURI } from '@wordpress/url';\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport { linkOff as unlinkIcon } from '@wordpress/icons';\nimport { useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport { useToolsPanelDropdownMenuProps } from '../../utils/hooks';\nimport { updateAttributes } from './update-attributes';\nimport { useEntityBinding } from './use-entity-binding';\n\n/**\n * Get a human-readable entity type name.\n *\n * @param {string} type - The entity type\n * @param {string} kind - The entity kind\n * @return {string} Human-readable entity type name\n */\nfunction getEntityTypeName( type, kind ) {\n\tif ( kind === 'post-type' ) {\n\t\tswitch ( type ) {\n\t\t\tcase 'post':\n\t\t\t\treturn __( 'post' );\n\t\t\tcase 'page':\n\t\t\t\treturn __( 'page' );\n\t\t\tdefault:\n\t\t\t\treturn type || __( 'post' );\n\t\t}\n\t}\n\tif ( kind === 'taxonomy' ) {\n\t\tswitch ( type ) {\n\t\t\tcase 'category':\n\t\t\t\treturn __( 'category' );\n\t\t\tcase 'tag':\n\t\t\t\treturn __( 'tag' );\n\t\t\tdefault:\n\t\t\t\treturn type || __( 'term' );\n\t\t}\n\t}\n\treturn type || __( 'item' );\n}\n\n/**\n * Shared Controls component for Navigation Link and Navigation Submenu blocks.\n *\n * This component provides the inspector controls (ToolsPanel) that are identical\n * between both navigation blocks.\n *\n * @param {Object} props - Component props\n * @param {Object} props.attributes - Block attributes\n * @param {Function} props.setAttributes - Function to update block attributes\n * @param {string} props.clientId - Block client ID\n */\nexport function Controls( { attributes, setAttributes, clientId } ) {\n\tconst { label, url, description, rel, opensInNewTab } = attributes;\n\tconst lastURLRef = useRef( url );\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\tconst urlInputRef = useRef();\n\tconst shouldFocusURLInputRef = useRef( false );\n\tconst inputId = useInstanceId( Controls, 'link-input' );\n\tconst helpTextId = `${ inputId }__help`;\n\n\t// Local state to control the input value\n\tconst [ inputValue, setInputValue ] = useState( url );\n\n\t// Sync local state when url prop changes (e.g., from undo/redo or external updates)\n\tuseEffect( () => {\n\t\tsetInputValue( url );\n\t\tlastURLRef.current = url;\n\t}, [ url ] );\n\n\t// Use the entity binding hook internally\n\tconst { hasUrlBinding, isBoundEntityAvailable, clearBinding } =\n\t\tuseEntityBinding( {\n\t\t\tclientId,\n\t\t\tattributes,\n\t\t} );\n\n\t// Get direct store dispatch to bypass setBoundAttributes wrapper\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\tconst unsyncBoundLink = () => {\n\t\t// Clear the binding first\n\t\tclearBinding();\n\n\t\t// Use direct store dispatch to bypass block bindings safeguards\n\t\t// which prevent updates to bound attributes when calling setAttributes.\n\t\t// setAttributes is actually setBoundAttributes, a wrapper function that\n\t\t// processes attributes through the binding system.\n\t\t// See: packages/block-editor/src/components/block-edit/edit.js\n\t\tupdateBlockAttributes( clientId, {\n\t\t\turl: lastURLRef.current, // set the lastURLRef as the new editable value so we avoid bugs from empty link states\n\t\t\tid: undefined,\n\t\t} );\n\t};\n\n\tuseEffect( () => {\n\t\t// Only want to focus the input if the url is not bound to an entity.\n\t\tif ( ! hasUrlBinding && shouldFocusURLInputRef.current ) {\n\t\t\t// focuses and highlights the url input value, giving the user\n\t\t\t// the ability to delete the value quickly or edit it.\n\t\t\turlInputRef.current?.select();\n\t\t}\n\t\tshouldFocusURLInputRef.current = false;\n\t}, [ hasUrlBinding ] );\n\n\treturn (\n\t\t<ToolsPanel\n\t\t\tlabel={ __( 'Settings' ) }\n\t\t\tresetAll={ () => {\n\t\t\t\tsetAttributes( {\n\t\t\t\t\tlabel: '',\n\t\t\t\t\turl: '',\n\t\t\t\t\tdescription: '',\n\t\t\t\t\trel: '',\n\t\t\t\t\topensInNewTab: false,\n\t\t\t\t} );\n\t\t\t} }\n\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t>\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! label }\n\t\t\t\tlabel={ __( 'Text' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { label: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\tlabel={ __( 'Text' ) }\n\t\t\t\t\tvalue={ label ? stripHTML( label ) : '' }\n\t\t\t\t\tonChange={ ( labelValue ) => {\n\t\t\t\t\t\tsetAttributes( { label: labelValue } );\n\t\t\t\t\t} }\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! url }\n\t\t\t\tlabel={ __( 'Link' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { url: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<InputControl\n\t\t\t\t\tref={ urlInputRef }\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\tid={ inputId }\n\t\t\t\t\tlabel={ __( 'Link' ) }\n\t\t\t\t\tvalue={ ( () => {\n\t\t\t\t\t\tif ( hasUrlBinding && ! isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn inputValue ? safeDecodeURI( inputValue ) : '';\n\t\t\t\t\t} )() }\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\ttype=\"url\"\n\t\t\t\t\tdisabled={ hasUrlBinding }\n\t\t\t\t\taria-invalid={\n\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable\n\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\taria-describedby={ helpTextId }\n\t\t\t\t\tclassName={\n\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable\n\t\t\t\t\t\t\t? 'navigation-link-control__input-with-error-suffix'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tonChange={ ( newValue ) => {\n\t\t\t\t\t\tif ( isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Defer updating the url attribute until onBlur to prevent the canvas from\n\t\t\t\t\t\t// treating a temporary empty value as a committed value, which replaces the\n\t\t\t\t\t\t// label with placeholder text.\n\t\t\t\t\t\tsetInputValue( newValue );\n\t\t\t\t\t} }\n\t\t\t\t\tonFocus={ () => {\n\t\t\t\t\t\tif ( isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastURLRef.current = url;\n\t\t\t\t\t} }\n\t\t\t\t\tonBlur={ () => {\n\t\t\t\t\t\tif ( isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst finalValue = ! inputValue\n\t\t\t\t\t\t\t? lastURLRef.current\n\t\t\t\t\t\t\t: inputValue;\n\n\t\t\t\t\t\t// Update local state immediately so input reflects the reverted value if the value was cleared\n\t\t\t\t\t\tsetInputValue( finalValue );\n\n\t\t\t\t\t\t// Defer the updateAttributes call to ensure entity connection isn't severed by accident.\n\t\t\t\t\t\tupdateAttributes( { url: finalValue }, setAttributes, {\n\t\t\t\t\t\t\t...attributes,\n\t\t\t\t\t\t\turl: lastURLRef.current,\n\t\t\t\t\t\t} );\n\t\t\t\t\t} }\n\t\t\t\t\thelp={\n\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable ? (\n\t\t\t\t\t\t\t<MissingEntityHelpText\n\t\t\t\t\t\t\t\tid={ helpTextId }\n\t\t\t\t\t\t\t\ttype={ attributes.type }\n\t\t\t\t\t\t\t\tkind={ attributes.kind }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tisBoundEntityAvailable && (\n\t\t\t\t\t\t\t\t<BindingHelpText\n\t\t\t\t\t\t\t\t\ttype={ attributes.type }\n\t\t\t\t\t\t\t\t\tkind={ attributes.kind }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tsuffix={\n\t\t\t\t\t\thasUrlBinding && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ticon={ unlinkIcon }\n\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\tunsyncBoundLink();\n\t\t\t\t\t\t\t\t\t// Focus management to send focus to the URL input\n\t\t\t\t\t\t\t\t\t// on next render after disabled state is removed.\n\t\t\t\t\t\t\t\t\tshouldFocusURLInputRef.current = true;\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\taria-describedby={ helpTextId }\n\t\t\t\t\t\t\t\tshowTooltip\n\t\t\t\t\t\t\t\tlabel={ __( 'Unsync and edit' ) }\n\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable\n\t\t\t\t\t\t\t\t\t\t? 'navigation-link-control__error-suffix-button'\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! opensInNewTab }\n\t\t\t\tlabel={ __( 'Open in new tab' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { opensInNewTab: false } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<CheckboxControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Open in new tab' ) }\n\t\t\t\t\tchecked={ opensInNewTab }\n\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\tsetAttributes( { opensInNewTab: value } )\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! description }\n\t\t\t\tlabel={ __( 'Description' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { description: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<TextareaControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Description' ) }\n\t\t\t\t\tvalue={ description || '' }\n\t\t\t\t\tonChange={ ( descriptionValue ) => {\n\t\t\t\t\t\tsetAttributes( { description: descriptionValue } );\n\t\t\t\t\t} }\n\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t'The description will be displayed in the menu if the current theme supports it.'\n\t\t\t\t\t) }\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! rel }\n\t\t\t\tlabel={ __( 'Rel attribute' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { rel: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\tlabel={ __( 'Rel attribute' ) }\n\t\t\t\t\tvalue={ rel || '' }\n\t\t\t\t\tonChange={ ( relValue ) => {\n\t\t\t\t\t\tsetAttributes( { rel: relValue } );\n\t\t\t\t\t} }\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t'The relationship of the linked URL as space-separated link types.'\n\t\t\t\t\t) }\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t</ToolsPanel>\n\t);\n}\n\n/**\n * Component to display help text for bound URL attributes.\n *\n * @param {Object} props - Component props\n * @param {string} props.type - The entity type\n * @param {string} props.kind - The entity kind\n * @return {string} Help text for the bound URL\n */\nfunction BindingHelpText( { type, kind } ) {\n\tconst entityType = getEntityTypeName( type, kind );\n\treturn sprintf(\n\t\t/* translators: %s is the entity type (e.g., \"page\", \"post\", \"category\") */\n\t\t__( 'Synced with the selected %s.' ),\n\t\tentityType\n\t);\n}\n\n/**\n * Component to display error help text for missing entity bindings.\n *\n * @param {Object} props - Component props\n * @param {string} props.id - ID for the help text element (for aria-describedby)\n * @param {string} props.type - The entity type\n * @param {string} props.kind - The entity kind\n * @return {JSX.Element} Error help text component\n */\nfunction MissingEntityHelpText( { id, type, kind } ) {\n\tconst entityType = getEntityTypeName( type, kind );\n\treturn (\n\t\t<span\n\t\t\tid={ id }\n\t\t\tclassName=\"navigation-link-control__error-text\"\n\t\t\trole=\"alert\"\n\t\t\taria-live=\"polite\"\n\t\t>\n\t\t\t{ sprintf(\n\t\t\t\t/* translators: %s is the entity type (e.g., \"page\", \"post\", \"category\") */\n\t\t\t\t__(\n\t\t\t\t\t'Synced %s is missing. Please update or remove this link.'\n\t\t\t\t),\n\t\t\t\tentityType\n\t\t\t) }\n\t\t</span>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalInputControl as InputControl,\n\tButton,\n\tCheckboxControl,\n\tTextControl,\n\tTextareaControl,\n} from '@wordpress/components';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { useRef, useEffect, useState } from '@wordpress/element';\nimport { useInstanceId } from '@wordpress/compose';\nimport { safeDecodeURI } from '@wordpress/url';\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport { linkOff as unlinkIcon } from '@wordpress/icons';\nimport { useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport { useToolsPanelDropdownMenuProps } from '../../utils/hooks';\nimport { updateAttributes } from './update-attributes';\nimport { useEntityBinding } from './use-entity-binding';\n\n/**\n * Get a human-readable entity type name.\n *\n * @param {string} type - The entity type\n * @param {string} kind - The entity kind\n * @return {string} Human-readable entity type name\n */\nfunction getEntityTypeName( type, kind ) {\n\tif ( kind === 'post-type' ) {\n\t\tswitch ( type ) {\n\t\t\tcase 'post':\n\t\t\t\treturn __( 'post' );\n\t\t\tcase 'page':\n\t\t\t\treturn __( 'page' );\n\t\t\tdefault:\n\t\t\t\treturn type || __( 'post' );\n\t\t}\n\t}\n\tif ( kind === 'taxonomy' ) {\n\t\tswitch ( type ) {\n\t\t\tcase 'category':\n\t\t\t\treturn __( 'category' );\n\t\t\tcase 'tag':\n\t\t\t\treturn __( 'tag' );\n\t\t\tdefault:\n\t\t\t\treturn type || __( 'term' );\n\t\t}\n\t}\n\treturn type || __( 'item' );\n}\n\n/**\n * Shared Controls component for Navigation Link and Navigation Submenu blocks.\n *\n * This component provides the inspector controls (ToolsPanel) that are identical\n * between both navigation blocks.\n *\n * @param {Object} props - Component props\n * @param {Object} props.attributes - Block attributes\n * @param {Function} props.setAttributes - Function to update block attributes\n * @param {string} props.clientId - Block client ID\n */\nexport function Controls( { attributes, setAttributes, clientId } ) {\n\tconst { label, url, description, rel, opensInNewTab } = attributes;\n\tconst lastURLRef = useRef( url );\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\tconst urlInputRef = useRef();\n\tconst shouldFocusURLInputRef = useRef( false );\n\tconst inputId = useInstanceId( Controls, 'link-input' );\n\tconst helpTextId = `${ inputId }__help`;\n\n\t// Local state to control the input value\n\tconst [ inputValue, setInputValue ] = useState( url );\n\n\t// Sync local state when url prop changes (e.g., from undo/redo or external updates)\n\tuseEffect( () => {\n\t\tsetInputValue( url );\n\t\tlastURLRef.current = url;\n\t}, [ url ] );\n\n\t// Use the entity binding hook internally\n\tconst { hasUrlBinding, isBoundEntityAvailable, clearBinding } =\n\t\tuseEntityBinding( {\n\t\t\tclientId,\n\t\t\tattributes,\n\t\t} );\n\n\t// Get direct store dispatch to bypass setBoundAttributes wrapper\n\tconst { updateBlockAttributes } = useDispatch( blockEditorStore );\n\n\tconst unsyncBoundLink = () => {\n\t\t// Clear the binding first\n\t\tclearBinding();\n\n\t\t// Use direct store dispatch to bypass block bindings safeguards\n\t\t// which prevent updates to bound attributes when calling setAttributes.\n\t\t// setAttributes is actually setBoundAttributes, a wrapper function that\n\t\t// processes attributes through the binding system.\n\t\t// See: packages/block-editor/src/components/block-edit/edit.js\n\t\tupdateBlockAttributes( clientId, {\n\t\t\turl: lastURLRef.current, // set the lastURLRef as the new editable value so we avoid bugs from empty link states\n\t\t\tid: undefined,\n\t\t} );\n\t};\n\n\tuseEffect( () => {\n\t\t// Only want to focus the input if the url is not bound to an entity.\n\t\tif ( ! hasUrlBinding && shouldFocusURLInputRef.current ) {\n\t\t\t// focuses and highlights the url input value, giving the user\n\t\t\t// the ability to delete the value quickly or edit it.\n\t\t\turlInputRef.current?.select();\n\t\t}\n\t\tshouldFocusURLInputRef.current = false;\n\t}, [ hasUrlBinding ] );\n\n\treturn (\n\t\t<ToolsPanel\n\t\t\tlabel={ __( 'Settings' ) }\n\t\t\tresetAll={ () => {\n\t\t\t\tsetAttributes( {\n\t\t\t\t\tlabel: '',\n\t\t\t\t\turl: '',\n\t\t\t\t\tdescription: '',\n\t\t\t\t\trel: '',\n\t\t\t\t\topensInNewTab: false,\n\t\t\t\t} );\n\t\t\t} }\n\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t>\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! label }\n\t\t\t\tlabel={ __( 'Text' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { label: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\tlabel={ __( 'Text' ) }\n\t\t\t\t\tvalue={ label ? stripHTML( label ) : '' }\n\t\t\t\t\tonChange={ ( labelValue ) => {\n\t\t\t\t\t\tsetAttributes( { label: labelValue } );\n\t\t\t\t\t} }\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! url }\n\t\t\t\tlabel={ __( 'Link' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { url: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<InputControl\n\t\t\t\t\tref={ urlInputRef }\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\tid={ inputId }\n\t\t\t\t\tlabel={ __( 'Link' ) }\n\t\t\t\t\tvalue={ ( () => {\n\t\t\t\t\t\tif ( hasUrlBinding && ! isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn inputValue ? safeDecodeURI( inputValue ) : '';\n\t\t\t\t\t} )() }\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\ttype=\"url\"\n\t\t\t\t\tdisabled={ hasUrlBinding }\n\t\t\t\t\taria-invalid={\n\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable\n\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\taria-describedby={ helpTextId }\n\t\t\t\t\tclassName={\n\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable\n\t\t\t\t\t\t\t? 'navigation-link-control__input-with-error-suffix'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tonChange={ ( newValue ) => {\n\t\t\t\t\t\tif ( isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Defer updating the url attribute until onBlur to prevent the canvas from\n\t\t\t\t\t\t// treating a temporary empty value as a committed value, which replaces the\n\t\t\t\t\t\t// label with placeholder text.\n\t\t\t\t\t\tsetInputValue( newValue );\n\t\t\t\t\t} }\n\t\t\t\t\tonFocus={ () => {\n\t\t\t\t\t\tif ( isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastURLRef.current = url;\n\t\t\t\t\t} }\n\t\t\t\t\tonBlur={ () => {\n\t\t\t\t\t\tif ( isBoundEntityAvailable ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst finalValue = ! inputValue\n\t\t\t\t\t\t\t? lastURLRef.current\n\t\t\t\t\t\t\t: inputValue;\n\n\t\t\t\t\t\t// Update local state immediately so input reflects the reverted value if the value was cleared\n\t\t\t\t\t\tsetInputValue( finalValue );\n\n\t\t\t\t\t\t// Defer the updateAttributes call to ensure entity connection isn't severed by accident.\n\t\t\t\t\t\tupdateAttributes( { url: finalValue }, setAttributes, {\n\t\t\t\t\t\t\t...attributes,\n\t\t\t\t\t\t\turl: lastURLRef.current,\n\t\t\t\t\t\t} );\n\t\t\t\t\t} }\n\t\t\t\t\thelp={\n\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable ? (\n\t\t\t\t\t\t\t<MissingEntityHelp\n\t\t\t\t\t\t\t\tid={ helpTextId }\n\t\t\t\t\t\t\t\ttype={ attributes.type }\n\t\t\t\t\t\t\t\tkind={ attributes.kind }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tisBoundEntityAvailable && (\n\t\t\t\t\t\t\t\t<BindingHelpText\n\t\t\t\t\t\t\t\t\ttype={ attributes.type }\n\t\t\t\t\t\t\t\t\tkind={ attributes.kind }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tsuffix={\n\t\t\t\t\t\thasUrlBinding && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ticon={ unlinkIcon }\n\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\tunsyncBoundLink();\n\t\t\t\t\t\t\t\t\t// Focus management to send focus to the URL input\n\t\t\t\t\t\t\t\t\t// on next render after disabled state is removed.\n\t\t\t\t\t\t\t\t\tshouldFocusURLInputRef.current = true;\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\taria-describedby={ helpTextId }\n\t\t\t\t\t\t\t\tshowTooltip\n\t\t\t\t\t\t\t\tlabel={ __( 'Unsync and edit' ) }\n\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\thasUrlBinding && ! isBoundEntityAvailable\n\t\t\t\t\t\t\t\t\t\t? 'navigation-link-control__error-suffix-button'\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! opensInNewTab }\n\t\t\t\tlabel={ __( 'Open in new tab' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { opensInNewTab: false } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<CheckboxControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Open in new tab' ) }\n\t\t\t\t\tchecked={ opensInNewTab }\n\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\tsetAttributes( { opensInNewTab: value } )\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! description }\n\t\t\t\tlabel={ __( 'Description' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { description: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<TextareaControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Description' ) }\n\t\t\t\t\tvalue={ description || '' }\n\t\t\t\t\tonChange={ ( descriptionValue ) => {\n\t\t\t\t\t\tsetAttributes( { description: descriptionValue } );\n\t\t\t\t\t} }\n\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t'The description will be displayed in the menu if the current theme supports it.'\n\t\t\t\t\t) }\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! rel }\n\t\t\t\tlabel={ __( 'Rel attribute' ) }\n\t\t\t\tonDeselect={ () => setAttributes( { rel: '' } ) }\n\t\t\t\tisShownByDefault\n\t\t\t>\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\tlabel={ __( 'Rel attribute' ) }\n\t\t\t\t\tvalue={ rel || '' }\n\t\t\t\t\tonChange={ ( relValue ) => {\n\t\t\t\t\t\tsetAttributes( { rel: relValue } );\n\t\t\t\t\t} }\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t'The relationship of the linked URL as space-separated link types.'\n\t\t\t\t\t) }\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t</ToolsPanel>\n\t);\n}\n\n/**\n * Component to display help text for bound URL attributes.\n *\n * @param {Object} props - Component props\n * @param {string} props.type - The entity type\n * @param {string} props.kind - The entity kind\n * @return {string} Help text for the bound URL\n */\nexport function BindingHelpText( { type, kind } ) {\n\tconst entityType = getEntityTypeName( type, kind );\n\treturn sprintf(\n\t\t/* translators: %s is the entity type (e.g., \"page\", \"post\", \"category\") */\n\t\t__( 'Synced with the selected %s.' ),\n\t\tentityType\n\t);\n}\n\n/**\n * Component to display error help text for missing entity bindings.\n *\n * @param {Object} props - Component props\n * @param {string} props.type - The entity type\n * @param {string} props.kind - The entity kind\n * @return {JSX.Element} Error help text component\n */\nexport function MissingEntityHelpText( { type, kind } ) {\n\tconst entityType = getEntityTypeName( type, kind );\n\treturn sprintf(\n\t\t/* translators: %s is the entity type (e.g., \"page\", \"post\", \"category\") */\n\t\t__( 'Synced %s is missing. Please update or remove this link.' ),\n\t\tentityType\n\t);\n}\n\nfunction MissingEntityHelp( { id, type, kind } ) {\n\treturn (\n\t\t<span id={ id } className=\"navigation-link-control__error-text\">\n\t\t\t<MissingEntityHelpText type={ type } kind={ kind } />\n\t\t</span>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  // packages/block-library/src/navigation-link/shared/index.js
2
- import { Controls } from "./controls";
2
+ import { Controls, BindingHelpText, MissingEntityHelpText } from "./controls";
3
3
  import { updateAttributes } from "./update-attributes";
4
4
  import {
5
5
  useEntityBinding,
@@ -7,8 +7,10 @@ import {
7
7
  } from "./use-entity-binding";
8
8
  import { LinkUI } from "../link-ui";
9
9
  export {
10
+ BindingHelpText,
10
11
  Controls,
11
12
  LinkUI,
13
+ MissingEntityHelpText,
12
14
  buildNavigationLinkEntityBinding,
13
15
  updateAttributes,
14
16
  useEntityBinding
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation-link/shared/index.js"],
4
- "sourcesContent": ["/**\n * Shared components for Navigation Link and Navigation Submenu blocks.\n *\n * This module provides common functionality that can be used by both blocks\n * to reduce code duplication and ensure consistent behavior.\n */\n\nexport { Controls } from './controls';\nexport { updateAttributes } from './update-attributes';\nexport {\n\tuseEntityBinding,\n\tbuildNavigationLinkEntityBinding,\n} from './use-entity-binding';\nexport { LinkUI } from '../link-ui';\n"],
5
- "mappings": ";AAOA,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AACjC;AAAA,EACC;AAAA,EACA;AAAA,OACM;AACP,SAAS,cAAc;",
4
+ "sourcesContent": ["/**\n * Shared components for Navigation Link and Navigation Submenu blocks.\n *\n * This module provides common functionality that can be used by both blocks\n * to reduce code duplication and ensure consistent behavior.\n */\n\nexport { Controls, BindingHelpText, MissingEntityHelpText } from './controls';\nexport { updateAttributes } from './update-attributes';\nexport {\n\tuseEntityBinding,\n\tbuildNavigationLinkEntityBinding,\n} from './use-entity-binding';\nexport { LinkUI } from '../link-ui';\n"],
5
+ "mappings": ";AAOA,SAAS,UAAU,iBAAiB,6BAA6B;AACjE,SAAS,wBAAwB;AACjC;AAAA,EACC;AAAA,EACA;AAAA,OACM;AACP,SAAS,cAAc;",
6
6
  "names": []
7
7
  }
@@ -49,10 +49,11 @@ function useEntityBinding({ clientId, attributes }) {
49
49
  }
50
50
  const { getEntityRecord, hasFinishedResolution } = select(coreStore);
51
51
  const entityType = isTaxonomy ? "taxonomy" : "postType";
52
- const entityRecord = getEntityRecord(entityType, type, id);
52
+ const typeForAPI = type === "tag" ? "post_tag" : type;
53
+ const entityRecord = getEntityRecord(entityType, typeForAPI, id);
53
54
  const hasResolved = hasFinishedResolution("getEntityRecord", [
54
55
  entityType,
55
- type,
56
+ typeForAPI,
56
57
  id
57
58
  ]);
58
59
  return hasResolved ? entityRecord !== void 0 : true;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation-link/shared/use-entity-binding.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback } from '@wordpress/element';\nimport {\n\tuseBlockBindingsUtils,\n\tuseBlockEditingMode,\n} from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Builds entity binding configuration for navigation link URLs.\n * This function generates the structure used to bind navigation link URLs to their entity sources.\n *\n * Using a function instead of a constant allows for future enhancements where the binding\n * might need dynamic data (e.g., entity ID, context-specific arguments).\n *\n * @param {('post-type'|'taxonomy')} kind - The kind of entity. Only 'post-type' and 'taxonomy' are supported.\n * @return {Object} Entity binding configuration object\n * @throws {Error} If kind is not 'post-type' or 'taxonomy'\n */\nexport function buildNavigationLinkEntityBinding( kind ) {\n\t// Validate kind parameter exists.\n\tif ( kind === undefined ) {\n\t\tthrow new Error(\n\t\t\t'buildNavigationLinkEntityBinding requires a kind parameter. ' +\n\t\t\t\t'Only \"post-type\" and \"taxonomy\" are supported.'\n\t\t);\n\t}\n\n\t// Validate kind parameter value.\n\tif ( kind !== 'post-type' && kind !== 'taxonomy' ) {\n\t\tthrow new Error(\n\t\t\t`Invalid kind \"${ kind }\" provided to buildNavigationLinkEntityBinding. ` +\n\t\t\t\t`Only 'post-type' and 'taxonomy' are supported.`\n\t\t);\n\t}\n\n\tconst source = kind === 'taxonomy' ? 'core/term-data' : 'core/post-data';\n\n\treturn {\n\t\turl: {\n\t\t\tsource,\n\t\t\targs: {\n\t\t\t\tfield: 'link',\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Shared hook for entity binding functionality in Navigation blocks.\n *\n * This hook provides common entity binding logic that can be used by both\n * Navigation Link and Navigation Submenu blocks to maintain feature parity.\n *\n * @param {Object} props - Hook parameters\n * @param {string} props.clientId - Block client ID\n * @param {Object} props.attributes - Block attributes\n * @return {Object} Hook return value\n */\nexport function useEntityBinding( { clientId, attributes } ) {\n\tconst { updateBlockBindings } = useBlockBindingsUtils( clientId );\n\tconst { metadata, id, kind, type } = attributes;\n\tconst blockEditingMode = useBlockEditingMode();\n\n\tconst hasUrlBinding = !! metadata?.bindings?.url && !! id;\n\tconst expectedSource =\n\t\tkind === 'post-type' ? 'core/post-data' : 'core/term-data';\n\tconst hasCorrectBinding =\n\t\thasUrlBinding && metadata?.bindings?.url?.source === expectedSource;\n\n\t// Check if the bound entity is available (not deleted).\n\tconst isBoundEntityAvailable = useSelect(\n\t\t( select ) => {\n\t\t\t// First check: metadata/binding must exist\n\t\t\tif ( ! hasCorrectBinding || ! id ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst isPostType = kind === 'post-type';\n\t\t\tconst isTaxonomy = kind === 'taxonomy';\n\n\t\t\t// Only check entity availability for post types and taxonomies.\n\t\t\tif ( ! isPostType && ! isTaxonomy ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Skip check in disabled contexts to avoid unnecessary requests.\n\t\t\tif ( blockEditingMode === 'disabled' ) {\n\t\t\t\treturn true; // Assume available in disabled contexts.\n\t\t\t}\n\n\t\t\t// Second check: entity must exist\n\t\t\tconst { getEntityRecord, hasFinishedResolution } =\n\t\t\t\tselect( coreStore );\n\n\t\t\t// Use the correct entity type based on kind.\n\t\t\tconst entityType = isTaxonomy ? 'taxonomy' : 'postType';\n\t\t\tconst entityRecord = getEntityRecord( entityType, type, id );\n\t\t\tconst hasResolved = hasFinishedResolution( 'getEntityRecord', [\n\t\t\t\tentityType,\n\t\t\t\ttype,\n\t\t\t\tid,\n\t\t\t] );\n\n\t\t\t// If resolution has finished and entityRecord is undefined, the entity was deleted.\n\t\t\t// Return true if entity exists, false if deleted.\n\t\t\treturn hasResolved ? entityRecord !== undefined : true;\n\t\t},\n\t\t[ kind, type, id, hasCorrectBinding, blockEditingMode ]\n\t);\n\n\tconst clearBinding = useCallback( () => {\n\t\tif ( hasUrlBinding ) {\n\t\t\tupdateBlockBindings( { url: undefined } );\n\t\t}\n\t}, [ updateBlockBindings, hasUrlBinding ] );\n\n\tconst createBinding = useCallback(\n\t\t( updatedAttributes ) => {\n\t\t\t// Use updated attributes if provided, otherwise fall back to closure attributes.\n\t\t\t// updatedAttributes needed to access the most up-to-date data when called synchronously.\n\t\t\tconst kindToUse = updatedAttributes?.kind ?? kind;\n\n\t\t\t// Avoid creating binding if no kind is provided.\n\t\t\tif ( ! kindToUse ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst binding = buildNavigationLinkEntityBinding( kindToUse );\n\t\t\t\tupdateBlockBindings( binding );\n\t\t\t} catch ( error ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Failed to create entity binding:',\n\t\t\t\t\terror.message\n\t\t\t\t);\n\t\t\t\t// Don't create binding if validation fails.\n\t\t\t}\n\t\t},\n\t\t[ updateBlockBindings, kind ]\n\t);\n\n\treturn {\n\t\thasUrlBinding: hasCorrectBinding,\n\t\tisBoundEntityAvailable,\n\t\tclearBinding,\n\t\tcreateBinding,\n\t};\n}\n"],
5
- "mappings": ";AAGA,SAAS,mBAAmB;AAC5B;AAAA,EACC;AAAA,EACA;AAAA,OACM;AACP,SAAS,iBAAiB;AAC1B,SAAS,SAAS,iBAAiB;AAa5B,SAAS,iCAAkC,MAAO;AAExD,MAAK,SAAS,QAAY;AACzB,UAAM,IAAI;AAAA,MACT;AAAA,IAED;AAAA,EACD;AAGA,MAAK,SAAS,eAAe,SAAS,YAAa;AAClD,UAAM,IAAI;AAAA,MACT,iBAAkB,IAAK;AAAA,IAExB;AAAA,EACD;AAEA,QAAM,SAAS,SAAS,aAAa,mBAAmB;AAExD,SAAO;AAAA,IACN,KAAK;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACL,OAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AACD;AAaO,SAAS,iBAAkB,EAAE,UAAU,WAAW,GAAI;AAC5D,QAAM,EAAE,oBAAoB,IAAI,sBAAuB,QAAS;AAChE,QAAM,EAAE,UAAU,IAAI,MAAM,KAAK,IAAI;AACrC,QAAM,mBAAmB,oBAAoB;AAE7C,QAAM,gBAAgB,CAAC,CAAE,UAAU,UAAU,OAAO,CAAC,CAAE;AACvD,QAAM,iBACL,SAAS,cAAc,mBAAmB;AAC3C,QAAM,oBACL,iBAAiB,UAAU,UAAU,KAAK,WAAW;AAGtD,QAAM,yBAAyB;AAAA,IAC9B,CAAE,WAAY;AAEb,UAAK,CAAE,qBAAqB,CAAE,IAAK;AAClC,eAAO;AAAA,MACR;AAEA,YAAM,aAAa,SAAS;AAC5B,YAAM,aAAa,SAAS;AAG5B,UAAK,CAAE,cAAc,CAAE,YAAa;AACnC,eAAO;AAAA,MACR;AAGA,UAAK,qBAAqB,YAAa;AACtC,eAAO;AAAA,MACR;AAGA,YAAM,EAAE,iBAAiB,sBAAsB,IAC9C,OAAQ,SAAU;AAGnB,YAAM,aAAa,aAAa,aAAa;AAC7C,YAAM,eAAe,gBAAiB,YAAY,MAAM,EAAG;AAC3D,YAAM,cAAc,sBAAuB,mBAAmB;AAAA,QAC7D;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAE;AAIF,aAAO,cAAc,iBAAiB,SAAY;AAAA,IACnD;AAAA,IACA,CAAE,MAAM,MAAM,IAAI,mBAAmB,gBAAiB;AAAA,EACvD;AAEA,QAAM,eAAe,YAAa,MAAM;AACvC,QAAK,eAAgB;AACpB,0BAAqB,EAAE,KAAK,OAAU,CAAE;AAAA,IACzC;AAAA,EACD,GAAG,CAAE,qBAAqB,aAAc,CAAE;AAE1C,QAAM,gBAAgB;AAAA,IACrB,CAAE,sBAAuB;AAGxB,YAAM,YAAY,mBAAmB,QAAQ;AAG7C,UAAK,CAAE,WAAY;AAClB;AAAA,MACD;AAEA,UAAI;AACH,cAAM,UAAU,iCAAkC,SAAU;AAC5D,4BAAqB,OAAQ;AAAA,MAC9B,SAAU,OAAQ;AAEjB,gBAAQ;AAAA,UACP;AAAA,UACA,MAAM;AAAA,QACP;AAAA,MAED;AAAA,IACD;AAAA,IACA,CAAE,qBAAqB,IAAK;AAAA,EAC7B;AAEA,SAAO;AAAA,IACN,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback } from '@wordpress/element';\nimport {\n\tuseBlockBindingsUtils,\n\tuseBlockEditingMode,\n} from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Builds entity binding configuration for navigation link URLs.\n * This function generates the structure used to bind navigation link URLs to their entity sources.\n *\n * Using a function instead of a constant allows for future enhancements where the binding\n * might need dynamic data (e.g., entity ID, context-specific arguments).\n *\n * @param {('post-type'|'taxonomy')} kind - The kind of entity. Only 'post-type' and 'taxonomy' are supported.\n * @return {Object} Entity binding configuration object\n * @throws {Error} If kind is not 'post-type' or 'taxonomy'\n */\nexport function buildNavigationLinkEntityBinding( kind ) {\n\t// Validate kind parameter exists.\n\tif ( kind === undefined ) {\n\t\tthrow new Error(\n\t\t\t'buildNavigationLinkEntityBinding requires a kind parameter. ' +\n\t\t\t\t'Only \"post-type\" and \"taxonomy\" are supported.'\n\t\t);\n\t}\n\n\t// Validate kind parameter value.\n\tif ( kind !== 'post-type' && kind !== 'taxonomy' ) {\n\t\tthrow new Error(\n\t\t\t`Invalid kind \"${ kind }\" provided to buildNavigationLinkEntityBinding. ` +\n\t\t\t\t`Only 'post-type' and 'taxonomy' are supported.`\n\t\t);\n\t}\n\n\tconst source = kind === 'taxonomy' ? 'core/term-data' : 'core/post-data';\n\n\treturn {\n\t\turl: {\n\t\t\tsource,\n\t\t\targs: {\n\t\t\t\tfield: 'link',\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Shared hook for entity binding functionality in Navigation blocks.\n *\n * This hook provides common entity binding logic that can be used by both\n * Navigation Link and Navigation Submenu blocks to maintain feature parity.\n *\n * @param {Object} props - Hook parameters\n * @param {string} props.clientId - Block client ID\n * @param {Object} props.attributes - Block attributes\n * @return {Object} Hook return value\n */\nexport function useEntityBinding( { clientId, attributes } ) {\n\tconst { updateBlockBindings } = useBlockBindingsUtils( clientId );\n\tconst { metadata, id, kind, type } = attributes;\n\tconst blockEditingMode = useBlockEditingMode();\n\n\tconst hasUrlBinding = !! metadata?.bindings?.url && !! id;\n\tconst expectedSource =\n\t\tkind === 'post-type' ? 'core/post-data' : 'core/term-data';\n\tconst hasCorrectBinding =\n\t\thasUrlBinding && metadata?.bindings?.url?.source === expectedSource;\n\n\t// Check if the bound entity is available (not deleted).\n\tconst isBoundEntityAvailable = useSelect(\n\t\t( select ) => {\n\t\t\t// First check: metadata/binding must exist\n\t\t\tif ( ! hasCorrectBinding || ! id ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst isPostType = kind === 'post-type';\n\t\t\tconst isTaxonomy = kind === 'taxonomy';\n\n\t\t\t// Only check entity availability for post types and taxonomies.\n\t\t\tif ( ! isPostType && ! isTaxonomy ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Skip check in disabled contexts to avoid unnecessary requests.\n\t\t\tif ( blockEditingMode === 'disabled' ) {\n\t\t\t\treturn true; // Assume available in disabled contexts.\n\t\t\t}\n\n\t\t\t// Second check: entity must exist\n\t\t\tconst { getEntityRecord, hasFinishedResolution } =\n\t\t\t\tselect( coreStore );\n\n\t\t\t// Use the correct entity type based on kind.\n\t\t\tconst entityType = isTaxonomy ? 'taxonomy' : 'postType';\n\t\t\t// Convert 'tag' back to 'post_tag' for the API call\n\t\t\t// (it was converted from 'post_tag' to 'tag' for storage in updateAttributes)\n\t\t\tconst typeForAPI = type === 'tag' ? 'post_tag' : type;\n\t\t\tconst entityRecord = getEntityRecord( entityType, typeForAPI, id );\n\t\t\tconst hasResolved = hasFinishedResolution( 'getEntityRecord', [\n\t\t\t\tentityType,\n\t\t\t\ttypeForAPI,\n\t\t\t\tid,\n\t\t\t] );\n\n\t\t\t// If resolution has finished and entityRecord is undefined, the entity was deleted.\n\t\t\t// Return true if entity exists, false if deleted.\n\t\t\treturn hasResolved ? entityRecord !== undefined : true;\n\t\t},\n\t\t[ kind, type, id, hasCorrectBinding, blockEditingMode ]\n\t);\n\n\tconst clearBinding = useCallback( () => {\n\t\tif ( hasUrlBinding ) {\n\t\t\tupdateBlockBindings( { url: undefined } );\n\t\t}\n\t}, [ updateBlockBindings, hasUrlBinding ] );\n\n\tconst createBinding = useCallback(\n\t\t( updatedAttributes ) => {\n\t\t\t// Use updated attributes if provided, otherwise fall back to closure attributes.\n\t\t\t// updatedAttributes needed to access the most up-to-date data when called synchronously.\n\t\t\tconst kindToUse = updatedAttributes?.kind ?? kind;\n\n\t\t\t// Avoid creating binding if no kind is provided.\n\t\t\tif ( ! kindToUse ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst binding = buildNavigationLinkEntityBinding( kindToUse );\n\t\t\t\tupdateBlockBindings( binding );\n\t\t\t} catch ( error ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Failed to create entity binding:',\n\t\t\t\t\terror.message\n\t\t\t\t);\n\t\t\t\t// Don't create binding if validation fails.\n\t\t\t}\n\t\t},\n\t\t[ updateBlockBindings, kind ]\n\t);\n\n\treturn {\n\t\thasUrlBinding: hasCorrectBinding,\n\t\tisBoundEntityAvailable,\n\t\tclearBinding,\n\t\tcreateBinding,\n\t};\n}\n"],
5
+ "mappings": ";AAGA,SAAS,mBAAmB;AAC5B;AAAA,EACC;AAAA,EACA;AAAA,OACM;AACP,SAAS,iBAAiB;AAC1B,SAAS,SAAS,iBAAiB;AAa5B,SAAS,iCAAkC,MAAO;AAExD,MAAK,SAAS,QAAY;AACzB,UAAM,IAAI;AAAA,MACT;AAAA,IAED;AAAA,EACD;AAGA,MAAK,SAAS,eAAe,SAAS,YAAa;AAClD,UAAM,IAAI;AAAA,MACT,iBAAkB,IAAK;AAAA,IAExB;AAAA,EACD;AAEA,QAAM,SAAS,SAAS,aAAa,mBAAmB;AAExD,SAAO;AAAA,IACN,KAAK;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACL,OAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AACD;AAaO,SAAS,iBAAkB,EAAE,UAAU,WAAW,GAAI;AAC5D,QAAM,EAAE,oBAAoB,IAAI,sBAAuB,QAAS;AAChE,QAAM,EAAE,UAAU,IAAI,MAAM,KAAK,IAAI;AACrC,QAAM,mBAAmB,oBAAoB;AAE7C,QAAM,gBAAgB,CAAC,CAAE,UAAU,UAAU,OAAO,CAAC,CAAE;AACvD,QAAM,iBACL,SAAS,cAAc,mBAAmB;AAC3C,QAAM,oBACL,iBAAiB,UAAU,UAAU,KAAK,WAAW;AAGtD,QAAM,yBAAyB;AAAA,IAC9B,CAAE,WAAY;AAEb,UAAK,CAAE,qBAAqB,CAAE,IAAK;AAClC,eAAO;AAAA,MACR;AAEA,YAAM,aAAa,SAAS;AAC5B,YAAM,aAAa,SAAS;AAG5B,UAAK,CAAE,cAAc,CAAE,YAAa;AACnC,eAAO;AAAA,MACR;AAGA,UAAK,qBAAqB,YAAa;AACtC,eAAO;AAAA,MACR;AAGA,YAAM,EAAE,iBAAiB,sBAAsB,IAC9C,OAAQ,SAAU;AAGnB,YAAM,aAAa,aAAa,aAAa;AAG7C,YAAM,aAAa,SAAS,QAAQ,aAAa;AACjD,YAAM,eAAe,gBAAiB,YAAY,YAAY,EAAG;AACjE,YAAM,cAAc,sBAAuB,mBAAmB;AAAA,QAC7D;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAE;AAIF,aAAO,cAAc,iBAAiB,SAAY;AAAA,IACnD;AAAA,IACA,CAAE,MAAM,MAAM,IAAI,mBAAmB,gBAAiB;AAAA,EACvD;AAEA,QAAM,eAAe,YAAa,MAAM;AACvC,QAAK,eAAgB;AACpB,0BAAqB,EAAE,KAAK,OAAU,CAAE;AAAA,IACzC;AAAA,EACD,GAAG,CAAE,qBAAqB,aAAc,CAAE;AAE1C,QAAM,gBAAgB;AAAA,IACrB,CAAE,sBAAuB;AAGxB,YAAM,YAAY,mBAAmB,QAAQ;AAG7C,UAAK,CAAE,WAAY;AAClB;AAAA,MACD;AAEA,UAAI;AACH,cAAM,UAAU,iCAAkC,SAAU;AAC5D,4BAAqB,OAAQ;AAAA,MAC9B,SAAU,OAAQ;AAEjB,gBAAQ;AAAA,UACP;AAAA,UACA,MAAM;AAAA,QACP;AAAA,MAED;AAAA,IACD;AAAA,IACA,CAAE,qBAAqB,IAAK;AAAA,EAC7B;AAEA,SAAO;AAAA,IACN,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }
@@ -29,7 +29,8 @@
29
29
  "default": false
30
30
  },
31
31
  "url": {
32
- "type": "string"
32
+ "type": "string",
33
+ "role": "content"
33
34
  },
34
35
  "title": {
35
36
  "type": "string"
@@ -1,11 +1,14 @@
1
1
  // packages/block-library/src/navigation-submenu/index.js
2
2
  import { page, addSubmenu } from "@wordpress/icons";
3
- import { _x } from "@wordpress/i18n";
3
+ import { _x, __ } from "@wordpress/i18n";
4
+ import { privateApis as blocksPrivateApis } from "@wordpress/blocks";
4
5
  import initBlock from "../utils/init-block";
5
6
  import metadata from "./block.json";
6
7
  import edit from "./edit";
7
8
  import save from "./save";
8
9
  import transforms from "./transforms";
10
+ import { unlock } from "../lock-unlock";
11
+ var { fieldsKey, formKey } = unlock(blocksPrivateApis);
9
12
  var { name } = metadata;
10
13
  var settings = {
11
14
  icon: ({ context }) => {
@@ -32,6 +35,28 @@ var settings = {
32
35
  save,
33
36
  transforms
34
37
  };
38
+ if (window.__experimentalContentOnlyPatternInsertion) {
39
+ settings[fieldsKey] = [
40
+ {
41
+ id: "label",
42
+ label: __("Label"),
43
+ type: "richtext"
44
+ },
45
+ {
46
+ id: "link",
47
+ label: __("Link"),
48
+ type: "link",
49
+ mapping: {
50
+ href: "url",
51
+ rel: "rel"
52
+ // TODO - opens in new tab? id?
53
+ }
54
+ }
55
+ ];
56
+ settings[formKey] = {
57
+ fields: ["label"]
58
+ };
59
+ }
35
60
  var init = () => initBlock({ name, metadata, settings });
36
61
  export {
37
62
  init,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/navigation-submenu/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { page, addSubmenu } from '@wordpress/icons';\nimport { _x } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport metadata from './block.json';\nimport edit from './edit';\nimport save from './save';\nimport transforms from './transforms';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon: ( { context } ) => {\n\t\tif ( context === 'list-view' ) {\n\t\t\treturn page;\n\t\t}\n\t\treturn addSubmenu;\n\t},\n\t__experimentalLabel( attributes, { context } ) {\n\t\tconst { label } = attributes;\n\n\t\tconst customName = attributes?.metadata?.name;\n\n\t\t// In the list view, use the block's menu label as the label.\n\t\t// If the menu label is empty, fall back to the default label.\n\t\tif ( context === 'list-view' && ( customName || label ) ) {\n\t\t\treturn attributes?.metadata?.name || label;\n\t\t}\n\n\t\treturn label;\n\t},\n\tedit,\n\texample: {\n\t\tattributes: {\n\t\t\tlabel: _x( 'About', 'Example link text for Navigation Submenu' ),\n\t\t\ttype: 'page',\n\t\t},\n\t},\n\tsave,\n\ttransforms,\n};\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"],
5
- "mappings": ";AAGA,SAAS,MAAM,kBAAkB;AACjC,SAAS,UAAU;AAKnB,OAAO,eAAe;AACtB,OAAO,cAAc;AACrB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,gBAAgB;AAEvB,IAAM,EAAE,KAAK,IAAI;AAIV,IAAM,WAAW;AAAA,EACvB,MAAM,CAAE,EAAE,QAAQ,MAAO;AACxB,QAAK,YAAY,aAAc;AAC9B,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR;AAAA,EACA,oBAAqB,YAAY,EAAE,QAAQ,GAAI;AAC9C,UAAM,EAAE,MAAM,IAAI;AAElB,UAAM,aAAa,YAAY,UAAU;AAIzC,QAAK,YAAY,gBAAiB,cAAc,QAAU;AACzD,aAAO,YAAY,UAAU,QAAQ;AAAA,IACtC;AAEA,WAAO;AAAA,EACR;AAAA,EACA;AAAA,EACA,SAAS;AAAA,IACR,YAAY;AAAA,MACX,OAAO,GAAI,SAAS,0CAA2C;AAAA,MAC/D,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAM,OAAO,MAAM,UAAW,EAAE,MAAM,UAAU,SAAS,CAAE;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { page, addSubmenu } from '@wordpress/icons';\nimport { _x, __ } from '@wordpress/i18n';\nimport { privateApis as blocksPrivateApis } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport metadata from './block.json';\nimport edit from './edit';\nimport save from './save';\nimport transforms from './transforms';\nimport { unlock } from '../lock-unlock';\n\nconst { fieldsKey, formKey } = unlock( blocksPrivateApis );\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon: ( { context } ) => {\n\t\tif ( context === 'list-view' ) {\n\t\t\treturn page;\n\t\t}\n\t\treturn addSubmenu;\n\t},\n\t__experimentalLabel( attributes, { context } ) {\n\t\tconst { label } = attributes;\n\n\t\tconst customName = attributes?.metadata?.name;\n\n\t\t// In the list view, use the block's menu label as the label.\n\t\t// If the menu label is empty, fall back to the default label.\n\t\tif ( context === 'list-view' && ( customName || label ) ) {\n\t\t\treturn attributes?.metadata?.name || label;\n\t\t}\n\n\t\treturn label;\n\t},\n\tedit,\n\texample: {\n\t\tattributes: {\n\t\t\tlabel: _x( 'About', 'Example link text for Navigation Submenu' ),\n\t\t\ttype: 'page',\n\t\t},\n\t},\n\tsave,\n\ttransforms,\n};\n\nif ( window.__experimentalContentOnlyPatternInsertion ) {\n\tsettings[ fieldsKey ] = [\n\t\t{\n\t\t\tid: 'label',\n\t\t\tlabel: __( 'Label' ),\n\t\t\ttype: 'richtext',\n\t\t},\n\t\t{\n\t\t\tid: 'link',\n\t\t\tlabel: __( 'Link' ),\n\t\t\ttype: 'link',\n\t\t\tmapping: {\n\t\t\t\thref: 'url',\n\t\t\t\trel: 'rel',\n\t\t\t\t// TODO - opens in new tab? id?\n\t\t\t},\n\t\t},\n\t];\n\tsettings[ formKey ] = {\n\t\tfields: [ 'label' ],\n\t};\n}\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"],
5
+ "mappings": ";AAGA,SAAS,MAAM,kBAAkB;AACjC,SAAS,IAAI,UAAU;AACvB,SAAS,eAAe,yBAAyB;AAKjD,OAAO,eAAe;AACtB,OAAO,cAAc;AACrB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,gBAAgB;AACvB,SAAS,cAAc;AAEvB,IAAM,EAAE,WAAW,QAAQ,IAAI,OAAQ,iBAAkB;AAEzD,IAAM,EAAE,KAAK,IAAI;AAIV,IAAM,WAAW;AAAA,EACvB,MAAM,CAAE,EAAE,QAAQ,MAAO;AACxB,QAAK,YAAY,aAAc;AAC9B,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR;AAAA,EACA,oBAAqB,YAAY,EAAE,QAAQ,GAAI;AAC9C,UAAM,EAAE,MAAM,IAAI;AAElB,UAAM,aAAa,YAAY,UAAU;AAIzC,QAAK,YAAY,gBAAiB,cAAc,QAAU;AACzD,aAAO,YAAY,UAAU,QAAQ;AAAA,IACtC;AAEA,WAAO;AAAA,EACR;AAAA,EACA;AAAA,EACA,SAAS;AAAA,IACR,YAAY;AAAA,MACX,OAAO,GAAI,SAAS,0CAA2C;AAAA,MAC/D,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAK,OAAO,2CAA4C;AACvD,WAAU,SAAU,IAAI;AAAA,IACvB;AAAA,MACC,IAAI;AAAA,MACJ,OAAO,GAAI,OAAQ;AAAA,MACnB,MAAM;AAAA,IACP;AAAA,IACA;AAAA,MACC,IAAI;AAAA,MACJ,OAAO,GAAI,MAAO;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,QACR,MAAM;AAAA,QACN,KAAK;AAAA;AAAA,MAEN;AAAA,IACD;AAAA,EACD;AACA,WAAU,OAAQ,IAAI;AAAA,IACrB,QAAQ,CAAE,OAAQ;AAAA,EACnB;AACD;AAEO,IAAM,OAAO,MAAM,UAAW,EAAE,MAAM,UAAU,SAAS,CAAE;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,37 @@
1
+ // packages/block-library/src/paragraph/deprecated-attributes.js
2
+ import { useEvent } from "@wordpress/compose";
3
+ import { useEffect, useRef } from "@wordpress/element";
4
+ import deprecated from "@wordpress/deprecated";
5
+ import { useDispatch } from "@wordpress/data";
6
+ import { store as blockEditorStore } from "@wordpress/block-editor";
7
+ function useDeprecatedAlign(align, style, setAttributes) {
8
+ const { __unstableMarkNextChangeAsNotPersistent } = useDispatch(blockEditorStore);
9
+ const updateStyleWithAlign = useEvent(() => {
10
+ deprecated("align attribute in paragraph block", {
11
+ alternative: "style.typography.textAlign",
12
+ since: "7.0"
13
+ });
14
+ __unstableMarkNextChangeAsNotPersistent();
15
+ setAttributes({
16
+ style: {
17
+ ...style,
18
+ typography: {
19
+ ...style?.typography,
20
+ textAlign: align
21
+ }
22
+ }
23
+ });
24
+ });
25
+ const lastUpdatedAlignRef = useRef();
26
+ useEffect(() => {
27
+ if (align === lastUpdatedAlignRef.current) {
28
+ return;
29
+ }
30
+ lastUpdatedAlignRef.current = align;
31
+ updateStyleWithAlign();
32
+ }, [align, updateStyleWithAlign]);
33
+ }
34
+ export {
35
+ useDeprecatedAlign as default
36
+ };
37
+ //# sourceMappingURL=deprecated-attributes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/paragraph/deprecated-attributes.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useEvent } from '@wordpress/compose';\nimport { useEffect, useRef } from '@wordpress/element';\nimport deprecated from '@wordpress/deprecated';\nimport { useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\n\n/**\n * If a plugin is still using the old align attribute, we need to migrate its value\n * to the new style.typography.textAlign attribute.\n *\n * @param {string?} align Align attribute value.\n * @param {Object?} style Style attribute value.\n * @param {(Object) => void} setAttributes Updater function for block attributes.\n */\nexport default function useDeprecatedAlign( align, style, setAttributes ) {\n\tconst { __unstableMarkNextChangeAsNotPersistent } =\n\t\tuseDispatch( blockEditorStore );\n\tconst updateStyleWithAlign = useEvent( () => {\n\t\tdeprecated( 'align attribute in paragraph block', {\n\t\t\talternative: 'style.typography.textAlign',\n\t\t\tsince: '7.0',\n\t\t} );\n\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\tsetAttributes( {\n\t\t\tstyle: {\n\t\t\t\t...style,\n\t\t\t\ttypography: {\n\t\t\t\t\t...style?.typography,\n\t\t\t\t\ttextAlign: align,\n\t\t\t\t},\n\t\t\t},\n\t\t} );\n\t} );\n\tconst lastUpdatedAlignRef = useRef();\n\tuseEffect( () => {\n\t\tif ( align === lastUpdatedAlignRef.current ) {\n\t\t\treturn;\n\t\t}\n\t\tlastUpdatedAlignRef.current = align;\n\t\tupdateStyleWithAlign();\n\t}, [ align, updateStyleWithAlign ] );\n}\n"],
5
+ "mappings": ";AAGA,SAAS,gBAAgB;AACzB,SAAS,WAAW,cAAc;AAClC,OAAO,gBAAgB;AACvB,SAAS,mBAAmB;AAC5B,SAAS,SAAS,wBAAwB;AAU3B,SAAR,mBAAqC,OAAO,OAAO,eAAgB;AACzE,QAAM,EAAE,wCAAwC,IAC/C,YAAa,gBAAiB;AAC/B,QAAM,uBAAuB,SAAU,MAAM;AAC5C,eAAY,sCAAsC;AAAA,MACjD,aAAa;AAAA,MACb,OAAO;AAAA,IACR,CAAE;AACF,4CAAwC;AACxC,kBAAe;AAAA,MACd,OAAO;AAAA,QACN,GAAG;AAAA,QACH,YAAY;AAAA,UACX,GAAG,OAAO;AAAA,UACV,WAAW;AAAA,QACZ;AAAA,MACD;AAAA,IACD,CAAE;AAAA,EACH,CAAE;AACF,QAAM,sBAAsB,OAAO;AACnC,YAAW,MAAM;AAChB,QAAK,UAAU,oBAAoB,SAAU;AAC5C;AAAA,IACD;AACA,wBAAoB,UAAU;AAC9B,yBAAqB;AAAA,EACtB,GAAG,CAAE,OAAO,oBAAqB,CAAE;AACpC;",
6
+ "names": []
7
+ }
@@ -17,6 +17,7 @@ import {
17
17
  import { getBlockSupport } from "@wordpress/blocks";
18
18
  import { formatLtr } from "@wordpress/icons";
19
19
  import { useOnEnter } from "./use-enter";
20
+ import useDeprecatedAlign from "./deprecated-attributes";
20
21
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
21
22
  function ParagraphRTLControl({ direction, setDirection }) {
22
23
  return isRTL() && /* @__PURE__ */ jsx(
@@ -89,6 +90,7 @@ function ParagraphBlock({
89
90
  }) {
90
91
  const { content, direction, dropCap, placeholder, style } = attributes;
91
92
  const textAlign = style?.typography?.textAlign;
93
+ useDeprecatedAlign(attributes.align, style, setAttributes);
92
94
  const blockProps = useBlockProps({
93
95
  ref: useOnEnter({ clientId, content }),
94
96
  className: clsx({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/paragraph/edit.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __, _x, isRTL } from '@wordpress/i18n';\nimport {\n\tToolbarButton,\n\tToggleControl,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\tuseBlockProps,\n\tuseSettings,\n\tuseBlockEditingMode,\n} from '@wordpress/block-editor';\nimport { getBlockSupport } from '@wordpress/blocks';\nimport { formatLtr } from '@wordpress/icons';\n/**\n * Internal dependencies\n */\nimport { useOnEnter } from './use-enter';\n\nfunction ParagraphRTLControl( { direction, setDirection } ) {\n\treturn (\n\t\tisRTL() && (\n\t\t\t<ToolbarButton\n\t\t\t\ticon={ formatLtr }\n\t\t\t\ttitle={ _x( 'Left to right', 'editor button' ) }\n\t\t\t\tisActive={ direction === 'ltr' }\n\t\t\t\tonClick={ () => {\n\t\t\t\t\tsetDirection( direction === 'ltr' ? undefined : 'ltr' );\n\t\t\t\t} }\n\t\t\t/>\n\t\t)\n\t);\n}\n\nfunction hasDropCapDisabled( align ) {\n\treturn align === ( isRTL() ? 'left' : 'right' ) || align === 'center';\n}\n\nfunction DropCapControl( { clientId, attributes, setAttributes, name } ) {\n\t// Please do not add a useSelect call to the paragraph block unconditionally.\n\t// Every useSelect added to a (frequently used) block will degrade load\n\t// and type performance. By moving it within InspectorControls, the subscription is\n\t// now only added for the selected block(s).\n\tconst [ isDropCapFeatureEnabled ] = useSettings( 'typography.dropCap' );\n\n\tif ( ! isDropCapFeatureEnabled ) {\n\t\treturn null;\n\t}\n\n\tconst { style, dropCap } = attributes;\n\tconst textAlign = style?.typography?.textAlign;\n\n\tlet helpText;\n\tif ( hasDropCapDisabled( textAlign ) ) {\n\t\thelpText = __( 'Not available for aligned text.' );\n\t} else if ( dropCap ) {\n\t\thelpText = __( 'Showing large initial letter.' );\n\t} else {\n\t\thelpText = __( 'Show a large initial letter.' );\n\t}\n\n\tconst isDropCapControlEnabledByDefault = getBlockSupport(\n\t\tname,\n\t\t'typography.defaultControls.dropCap',\n\t\tfalse\n\t);\n\n\treturn (\n\t\t<InspectorControls group=\"typography\">\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! dropCap }\n\t\t\t\tlabel={ __( 'Drop cap' ) }\n\t\t\t\tisShownByDefault={ isDropCapControlEnabledByDefault }\n\t\t\t\tonDeselect={ () => setAttributes( { dropCap: false } ) }\n\t\t\t\tresetAllFilter={ () => ( { dropCap: false } ) }\n\t\t\t\tpanelId={ clientId }\n\t\t\t>\n\t\t\t\t<ToggleControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Drop cap' ) }\n\t\t\t\t\tchecked={ !! dropCap }\n\t\t\t\t\tonChange={ () => setAttributes( { dropCap: ! dropCap } ) }\n\t\t\t\t\thelp={ helpText }\n\t\t\t\t\tdisabled={ hasDropCapDisabled( textAlign ) }\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t</InspectorControls>\n\t);\n}\n\nfunction ParagraphBlock( {\n\tattributes,\n\tmergeBlocks,\n\tonReplace,\n\tonRemove,\n\tsetAttributes,\n\tclientId,\n\tisSelected: isSingleSelected,\n\tname,\n} ) {\n\tconst { content, direction, dropCap, placeholder, style } = attributes;\n\tconst textAlign = style?.typography?.textAlign;\n\tconst blockProps = useBlockProps( {\n\t\tref: useOnEnter( { clientId, content } ),\n\t\tclassName: clsx( {\n\t\t\t'has-drop-cap': hasDropCapDisabled( textAlign ) ? false : dropCap,\n\t\t} ),\n\t\tstyle: { direction },\n\t} );\n\tconst blockEditingMode = useBlockEditingMode();\n\n\treturn (\n\t\t<>\n\t\t\t{ blockEditingMode === 'default' && (\n\t\t\t\t<BlockControls group=\"block\">\n\t\t\t\t\t<ParagraphRTLControl\n\t\t\t\t\t\tdirection={ direction }\n\t\t\t\t\t\tsetDirection={ ( newDirection ) =>\n\t\t\t\t\t\t\tsetAttributes( { direction: newDirection } )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ isSingleSelected && (\n\t\t\t\t<DropCapControl\n\t\t\t\t\tname={ name }\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t<RichText\n\t\t\t\tidentifier=\"content\"\n\t\t\t\ttagName=\"p\"\n\t\t\t\t{ ...blockProps }\n\t\t\t\tvalue={ content }\n\t\t\t\tonChange={ ( newContent ) =>\n\t\t\t\t\tsetAttributes( { content: newContent } )\n\t\t\t\t}\n\t\t\t\tonMerge={ mergeBlocks }\n\t\t\t\tonReplace={ onReplace }\n\t\t\t\tonRemove={ onRemove }\n\t\t\t\taria-label={\n\t\t\t\t\tRichText.isEmpty( content )\n\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t'Empty block; start writing or type forward slash to choose a block'\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: __( 'Block: Paragraph' )\n\t\t\t\t}\n\t\t\t\tdata-empty={ RichText.isEmpty( content ) }\n\t\t\t\tplaceholder={ placeholder || __( 'Type / to choose a block' ) }\n\t\t\t\tdata-custom-placeholder={ placeholder ? true : undefined }\n\t\t\t\t__unstableEmbedURLOnPaste\n\t\t\t\t__unstableAllowPrefixTransformations\n\t\t\t/>\n\t\t</>\n\t);\n}\n\nexport default ParagraphBlock;\n"],
5
- "mappings": ";AAGA,OAAO,UAAU;AAKjB,SAAS,IAAI,IAAI,aAAa;AAC9B;AAAA,EACC;AAAA,EACA;AAAA,EACA,gCAAgC;AAAA,OAC1B;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,uBAAuB;AAChC,SAAS,iBAAiB;AAI1B,SAAS,kBAAkB;AAKxB,SA0FD,UA1FC,KA0FD,YA1FC;AAHH,SAAS,oBAAqB,EAAE,WAAW,aAAa,GAAI;AAC3D,SACC,MAAM,KACL;AAAA,IAAC;AAAA;AAAA,MACA,MAAO;AAAA,MACP,OAAQ,GAAI,iBAAiB,eAAgB;AAAA,MAC7C,UAAW,cAAc;AAAA,MACzB,SAAU,MAAM;AACf,qBAAc,cAAc,QAAQ,SAAY,KAAM;AAAA,MACvD;AAAA;AAAA,EACD;AAGH;AAEA,SAAS,mBAAoB,OAAQ;AACpC,SAAO,WAAY,MAAM,IAAI,SAAS,YAAa,UAAU;AAC9D;AAEA,SAAS,eAAgB,EAAE,UAAU,YAAY,eAAe,KAAK,GAAI;AAKxE,QAAM,CAAE,uBAAwB,IAAI,YAAa,oBAAqB;AAEtE,MAAK,CAAE,yBAA0B;AAChC,WAAO;AAAA,EACR;AAEA,QAAM,EAAE,OAAO,QAAQ,IAAI;AAC3B,QAAM,YAAY,OAAO,YAAY;AAErC,MAAI;AACJ,MAAK,mBAAoB,SAAU,GAAI;AACtC,eAAW,GAAI,iCAAkC;AAAA,EAClD,WAAY,SAAU;AACrB,eAAW,GAAI,+BAAgC;AAAA,EAChD,OAAO;AACN,eAAW,GAAI,8BAA+B;AAAA,EAC/C;AAEA,QAAM,mCAAmC;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,SACC,oBAAC,qBAAkB,OAAM,cACxB;AAAA,IAAC;AAAA;AAAA,MACA,UAAW,MAAM,CAAC,CAAE;AAAA,MACpB,OAAQ,GAAI,UAAW;AAAA,MACvB,kBAAmB;AAAA,MACnB,YAAa,MAAM,cAAe,EAAE,SAAS,MAAM,CAAE;AAAA,MACrD,gBAAiB,OAAQ,EAAE,SAAS,MAAM;AAAA,MAC1C,SAAU;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACA,yBAAuB;AAAA,UACvB,OAAQ,GAAI,UAAW;AAAA,UACvB,SAAU,CAAC,CAAE;AAAA,UACb,UAAW,MAAM,cAAe,EAAE,SAAS,CAAE,QAAQ,CAAE;AAAA,UACvD,MAAO;AAAA,UACP,UAAW,mBAAoB,SAAU;AAAA;AAAA,MAC1C;AAAA;AAAA,EACD,GACD;AAEF;AAEA,SAAS,eAAgB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACD,GAAI;AACH,QAAM,EAAE,SAAS,WAAW,SAAS,aAAa,MAAM,IAAI;AAC5D,QAAM,YAAY,OAAO,YAAY;AACrC,QAAM,aAAa,cAAe;AAAA,IACjC,KAAK,WAAY,EAAE,UAAU,QAAQ,CAAE;AAAA,IACvC,WAAW,KAAM;AAAA,MAChB,gBAAgB,mBAAoB,SAAU,IAAI,QAAQ;AAAA,IAC3D,CAAE;AAAA,IACF,OAAO,EAAE,UAAU;AAAA,EACpB,CAAE;AACF,QAAM,mBAAmB,oBAAoB;AAE7C,SACC,iCACG;AAAA,yBAAqB,aACtB,oBAAC,iBAAc,OAAM,SACpB;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA,cAAe,CAAE,iBAChB,cAAe,EAAE,WAAW,aAAa,CAAE;AAAA;AAAA,IAE7C,GACD;AAAA,IAEC,oBACD;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACD;AAAA,IAED;AAAA,MAAC;AAAA;AAAA,QACA,YAAW;AAAA,QACX,SAAQ;AAAA,QACN,GAAG;AAAA,QACL,OAAQ;AAAA,QACR,UAAW,CAAE,eACZ,cAAe,EAAE,SAAS,WAAW,CAAE;AAAA,QAExC,SAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,cACC,SAAS,QAAS,OAAQ,IACvB;AAAA,UACA;AAAA,QACA,IACA,GAAI,kBAAmB;AAAA,QAE3B,cAAa,SAAS,QAAS,OAAQ;AAAA,QACvC,aAAc,eAAe,GAAI,0BAA2B;AAAA,QAC5D,2BAA0B,cAAc,OAAO;AAAA,QAC/C,2BAAyB;AAAA,QACzB,sCAAoC;AAAA;AAAA,IACrC;AAAA,KACD;AAEF;AAEA,IAAO,eAAQ;",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __, _x, isRTL } from '@wordpress/i18n';\nimport {\n\tToolbarButton,\n\tToggleControl,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\tuseBlockProps,\n\tuseSettings,\n\tuseBlockEditingMode,\n} from '@wordpress/block-editor';\nimport { getBlockSupport } from '@wordpress/blocks';\nimport { formatLtr } from '@wordpress/icons';\n/**\n * Internal dependencies\n */\nimport { useOnEnter } from './use-enter';\nimport useDeprecatedAlign from './deprecated-attributes';\n\nfunction ParagraphRTLControl( { direction, setDirection } ) {\n\treturn (\n\t\tisRTL() && (\n\t\t\t<ToolbarButton\n\t\t\t\ticon={ formatLtr }\n\t\t\t\ttitle={ _x( 'Left to right', 'editor button' ) }\n\t\t\t\tisActive={ direction === 'ltr' }\n\t\t\t\tonClick={ () => {\n\t\t\t\t\tsetDirection( direction === 'ltr' ? undefined : 'ltr' );\n\t\t\t\t} }\n\t\t\t/>\n\t\t)\n\t);\n}\n\nfunction hasDropCapDisabled( align ) {\n\treturn align === ( isRTL() ? 'left' : 'right' ) || align === 'center';\n}\n\nfunction DropCapControl( { clientId, attributes, setAttributes, name } ) {\n\t// Please do not add a useSelect call to the paragraph block unconditionally.\n\t// Every useSelect added to a (frequently used) block will degrade load\n\t// and type performance. By moving it within InspectorControls, the subscription is\n\t// now only added for the selected block(s).\n\tconst [ isDropCapFeatureEnabled ] = useSettings( 'typography.dropCap' );\n\n\tif ( ! isDropCapFeatureEnabled ) {\n\t\treturn null;\n\t}\n\n\tconst { style, dropCap } = attributes;\n\tconst textAlign = style?.typography?.textAlign;\n\n\tlet helpText;\n\tif ( hasDropCapDisabled( textAlign ) ) {\n\t\thelpText = __( 'Not available for aligned text.' );\n\t} else if ( dropCap ) {\n\t\thelpText = __( 'Showing large initial letter.' );\n\t} else {\n\t\thelpText = __( 'Show a large initial letter.' );\n\t}\n\n\tconst isDropCapControlEnabledByDefault = getBlockSupport(\n\t\tname,\n\t\t'typography.defaultControls.dropCap',\n\t\tfalse\n\t);\n\n\treturn (\n\t\t<InspectorControls group=\"typography\">\n\t\t\t<ToolsPanelItem\n\t\t\t\thasValue={ () => !! dropCap }\n\t\t\t\tlabel={ __( 'Drop cap' ) }\n\t\t\t\tisShownByDefault={ isDropCapControlEnabledByDefault }\n\t\t\t\tonDeselect={ () => setAttributes( { dropCap: false } ) }\n\t\t\t\tresetAllFilter={ () => ( { dropCap: false } ) }\n\t\t\t\tpanelId={ clientId }\n\t\t\t>\n\t\t\t\t<ToggleControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Drop cap' ) }\n\t\t\t\t\tchecked={ !! dropCap }\n\t\t\t\t\tonChange={ () => setAttributes( { dropCap: ! dropCap } ) }\n\t\t\t\t\thelp={ helpText }\n\t\t\t\t\tdisabled={ hasDropCapDisabled( textAlign ) }\n\t\t\t\t/>\n\t\t\t</ToolsPanelItem>\n\t\t</InspectorControls>\n\t);\n}\n\nfunction ParagraphBlock( {\n\tattributes,\n\tmergeBlocks,\n\tonReplace,\n\tonRemove,\n\tsetAttributes,\n\tclientId,\n\tisSelected: isSingleSelected,\n\tname,\n} ) {\n\tconst { content, direction, dropCap, placeholder, style } = attributes;\n\tconst textAlign = style?.typography?.textAlign;\n\tuseDeprecatedAlign( attributes.align, style, setAttributes );\n\tconst blockProps = useBlockProps( {\n\t\tref: useOnEnter( { clientId, content } ),\n\t\tclassName: clsx( {\n\t\t\t'has-drop-cap': hasDropCapDisabled( textAlign ) ? false : dropCap,\n\t\t} ),\n\t\tstyle: { direction },\n\t} );\n\tconst blockEditingMode = useBlockEditingMode();\n\n\treturn (\n\t\t<>\n\t\t\t{ blockEditingMode === 'default' && (\n\t\t\t\t<BlockControls group=\"block\">\n\t\t\t\t\t<ParagraphRTLControl\n\t\t\t\t\t\tdirection={ direction }\n\t\t\t\t\t\tsetDirection={ ( newDirection ) =>\n\t\t\t\t\t\t\tsetAttributes( { direction: newDirection } )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ isSingleSelected && (\n\t\t\t\t<DropCapControl\n\t\t\t\t\tname={ name }\n\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t<RichText\n\t\t\t\tidentifier=\"content\"\n\t\t\t\ttagName=\"p\"\n\t\t\t\t{ ...blockProps }\n\t\t\t\tvalue={ content }\n\t\t\t\tonChange={ ( newContent ) =>\n\t\t\t\t\tsetAttributes( { content: newContent } )\n\t\t\t\t}\n\t\t\t\tonMerge={ mergeBlocks }\n\t\t\t\tonReplace={ onReplace }\n\t\t\t\tonRemove={ onRemove }\n\t\t\t\taria-label={\n\t\t\t\t\tRichText.isEmpty( content )\n\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t'Empty block; start writing or type forward slash to choose a block'\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: __( 'Block: Paragraph' )\n\t\t\t\t}\n\t\t\t\tdata-empty={ RichText.isEmpty( content ) }\n\t\t\t\tplaceholder={ placeholder || __( 'Type / to choose a block' ) }\n\t\t\t\tdata-custom-placeholder={ placeholder ? true : undefined }\n\t\t\t\t__unstableEmbedURLOnPaste\n\t\t\t\t__unstableAllowPrefixTransformations\n\t\t\t/>\n\t\t</>\n\t);\n}\n\nexport default ParagraphBlock;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  // packages/block-library/src/paragraph/index.js
2
2
  import { __ } from "@wordpress/i18n";
3
3
  import { paragraph as icon } from "@wordpress/icons";
4
+ import { privateApis as blocksPrivateApis } from "@wordpress/blocks";
4
5
  import initBlock from "../utils/init-block";
5
6
  import deprecated from "./deprecated";
6
7
  import edit from "./edit";
@@ -8,6 +9,8 @@ import metadata from "./block.json";
8
9
  import save from "./save";
9
10
  import transforms from "./transforms";
10
11
  import variations from "./variations";
12
+ import { unlock } from "../lock-unlock";
13
+ var { fieldsKey, formKey } = unlock(blocksPrivateApis);
11
14
  var { name } = metadata;
12
15
  var settings = {
13
16
  icon,
@@ -42,6 +45,18 @@ var settings = {
42
45
  save,
43
46
  variations
44
47
  };
48
+ if (window.__experimentalContentOnlyPatternInsertion) {
49
+ settings[fieldsKey] = [
50
+ {
51
+ id: "content",
52
+ label: __("Content"),
53
+ type: "richtext"
54
+ }
55
+ ];
56
+ settings[formKey] = {
57
+ fields: ["content"]
58
+ };
59
+ }
45
60
  var init = () => initBlock({ name, metadata, settings });
46
61
  export {
47
62
  init,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/paragraph/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { paragraph as icon } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport deprecated from './deprecated';\nimport edit from './edit';\nimport metadata from './block.json';\nimport save from './save';\nimport transforms from './transforms';\nimport variations from './variations';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\texample: {\n\t\tattributes: {\n\t\t\tcontent: __(\n\t\t\t\t'In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing.'\n\t\t\t),\n\t\t},\n\t},\n\t__experimentalLabel( attributes, { context } ) {\n\t\tconst customName = attributes?.metadata?.name;\n\n\t\tif ( context === 'list-view' && customName ) {\n\t\t\treturn customName;\n\t\t}\n\n\t\tif ( context === 'accessibility' ) {\n\t\t\tif ( customName ) {\n\t\t\t\treturn customName;\n\t\t\t}\n\n\t\t\tconst { content } = attributes;\n\t\t\treturn ! content || content.length === 0 ? __( 'Empty' ) : content;\n\t\t}\n\t},\n\ttransforms,\n\tdeprecated,\n\tmerge( attributes, attributesToMerge ) {\n\t\treturn {\n\t\t\tcontent:\n\t\t\t\t( attributes.content || '' ) +\n\t\t\t\t( attributesToMerge.content || '' ),\n\t\t};\n\t},\n\tedit,\n\tsave,\n\tvariations,\n};\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"],
5
- "mappings": ";AAGA,SAAS,UAAU;AACnB,SAAS,aAAa,YAAY;AAKlC,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,UAAU;AACjB,OAAO,cAAc;AACrB,OAAO,UAAU;AACjB,OAAO,gBAAgB;AACvB,OAAO,gBAAgB;AAEvB,IAAM,EAAE,KAAK,IAAI;AAIV,IAAM,WAAW;AAAA,EACvB;AAAA,EACA,SAAS;AAAA,IACR,YAAY;AAAA,MACX,SAAS;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACA,oBAAqB,YAAY,EAAE,QAAQ,GAAI;AAC9C,UAAM,aAAa,YAAY,UAAU;AAEzC,QAAK,YAAY,eAAe,YAAa;AAC5C,aAAO;AAAA,IACR;AAEA,QAAK,YAAY,iBAAkB;AAClC,UAAK,YAAa;AACjB,eAAO;AAAA,MACR;AAEA,YAAM,EAAE,QAAQ,IAAI;AACpB,aAAO,CAAE,WAAW,QAAQ,WAAW,IAAI,GAAI,OAAQ,IAAI;AAAA,IAC5D;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAO,YAAY,mBAAoB;AACtC,WAAO;AAAA,MACN,UACG,WAAW,WAAW,OACtB,kBAAkB,WAAW;AAAA,IACjC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAM,OAAO,MAAM,UAAW,EAAE,MAAM,UAAU,SAAS,CAAE;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { paragraph as icon } from '@wordpress/icons';\nimport { privateApis as blocksPrivateApis } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport deprecated from './deprecated';\nimport edit from './edit';\nimport metadata from './block.json';\nimport save from './save';\nimport transforms from './transforms';\nimport variations from './variations';\nimport { unlock } from '../lock-unlock';\n\nconst { fieldsKey, formKey } = unlock( blocksPrivateApis );\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\texample: {\n\t\tattributes: {\n\t\t\tcontent: __(\n\t\t\t\t'In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing.'\n\t\t\t),\n\t\t},\n\t},\n\t__experimentalLabel( attributes, { context } ) {\n\t\tconst customName = attributes?.metadata?.name;\n\n\t\tif ( context === 'list-view' && customName ) {\n\t\t\treturn customName;\n\t\t}\n\n\t\tif ( context === 'accessibility' ) {\n\t\t\tif ( customName ) {\n\t\t\t\treturn customName;\n\t\t\t}\n\n\t\t\tconst { content } = attributes;\n\t\t\treturn ! content || content.length === 0 ? __( 'Empty' ) : content;\n\t\t}\n\t},\n\ttransforms,\n\tdeprecated,\n\tmerge( attributes, attributesToMerge ) {\n\t\treturn {\n\t\t\tcontent:\n\t\t\t\t( attributes.content || '' ) +\n\t\t\t\t( attributesToMerge.content || '' ),\n\t\t};\n\t},\n\tedit,\n\tsave,\n\tvariations,\n};\n\nif ( window.__experimentalContentOnlyPatternInsertion ) {\n\tsettings[ fieldsKey ] = [\n\t\t{\n\t\t\tid: 'content',\n\t\t\tlabel: __( 'Content' ),\n\t\t\ttype: 'richtext',\n\t\t},\n\t];\n\tsettings[ formKey ] = {\n\t\tfields: [ 'content' ],\n\t};\n}\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"],
5
+ "mappings": ";AAGA,SAAS,UAAU;AACnB,SAAS,aAAa,YAAY;AAClC,SAAS,eAAe,yBAAyB;AAKjD,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,UAAU;AACjB,OAAO,cAAc;AACrB,OAAO,UAAU;AACjB,OAAO,gBAAgB;AACvB,OAAO,gBAAgB;AACvB,SAAS,cAAc;AAEvB,IAAM,EAAE,WAAW,QAAQ,IAAI,OAAQ,iBAAkB;AAEzD,IAAM,EAAE,KAAK,IAAI;AAIV,IAAM,WAAW;AAAA,EACvB;AAAA,EACA,SAAS;AAAA,IACR,YAAY;AAAA,MACX,SAAS;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACA,oBAAqB,YAAY,EAAE,QAAQ,GAAI;AAC9C,UAAM,aAAa,YAAY,UAAU;AAEzC,QAAK,YAAY,eAAe,YAAa;AAC5C,aAAO;AAAA,IACR;AAEA,QAAK,YAAY,iBAAkB;AAClC,UAAK,YAAa;AACjB,eAAO;AAAA,MACR;AAEA,YAAM,EAAE,QAAQ,IAAI;AACpB,aAAO,CAAE,WAAW,QAAQ,WAAW,IAAI,GAAI,OAAQ,IAAI;AAAA,IAC5D;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAO,YAAY,mBAAoB;AACtC,WAAO;AAAA,MACN,UACG,WAAW,WAAW,OACtB,kBAAkB,WAAW;AAAA,IACjC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAK,OAAO,2CAA4C;AACvD,WAAU,SAAU,IAAI;AAAA,IACvB;AAAA,MACC,IAAI;AAAA,MACJ,OAAO,GAAI,SAAU;AAAA,MACrB,MAAM;AAAA,IACP;AAAA,EACD;AACA,WAAU,OAAQ,IAAI;AAAA,IACrB,QAAQ,CAAE,SAAU;AAAA,EACrB;AACD;AAEO,IAAM,OAAO,MAAM,UAAW,EAAE,MAAM,UAAU,SAAS,CAAE;",
6
6
  "names": []
7
7
  }
@@ -9,7 +9,7 @@
9
9
  "html": false,
10
10
  "inserter": false,
11
11
  "renaming": false,
12
- "blockVisibility": false,
12
+ "visibility": false,
13
13
  "interactivity": {
14
14
  "clientNavigation": true
15
15
  }
@@ -3,13 +3,11 @@ import clsx from "clsx";
3
3
  import {
4
4
  AlignmentControl,
5
5
  BlockControls,
6
- Warning,
7
6
  useBlockProps
8
7
  } from "@wordpress/block-editor";
9
8
  import { useState, useEffect } from "@wordpress/element";
10
9
  import apiFetch from "@wordpress/api-fetch";
11
10
  import { addQueryArgs } from "@wordpress/url";
12
- import { __ } from "@wordpress/i18n";
13
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
12
  function PostCommentsCountEdit({
15
13
  attributes,
@@ -55,7 +53,7 @@ function PostCommentsCountEdit({
55
53
  }
56
54
  }
57
55
  ) }),
58
- /* @__PURE__ */ jsx("div", { ...blockProps, style: blockStyles, children: hasPostAndComments ? commentsCount : /* @__PURE__ */ jsx(Warning, { children: __("Post Comments Count block: post not found.") }) })
56
+ /* @__PURE__ */ jsx("div", { ...blockProps, style: blockStyles, children: hasPostAndComments ? commentsCount : "0" })
59
57
  ] });
60
58
  }
61
59
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/post-comments-count/edit.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tAlignmentControl,\n\tBlockControls,\n\tWarning,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\nimport { useState, useEffect } from '@wordpress/element';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { __ } from '@wordpress/i18n';\n\nexport default function PostCommentsCountEdit( {\n\tattributes,\n\tcontext,\n\tsetAttributes,\n} ) {\n\tconst { textAlign } = attributes;\n\tconst { postId } = context;\n\tconst [ commentsCount, setCommentsCount ] = useState();\n\tconst blockProps = useBlockProps( {\n\t\tclassName: clsx( {\n\t\t\t[ `has-text-align-${ textAlign }` ]: textAlign,\n\t\t} ),\n\t} );\n\n\tuseEffect( () => {\n\t\tif ( ! postId ) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentPostId = postId;\n\t\tapiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/comments', {\n\t\t\t\tpost: postId,\n\t\t\t} ),\n\t\t\tparse: false,\n\t\t} ).then( ( res ) => {\n\t\t\t// Stale requests will have the `currentPostId` of an older closure.\n\t\t\tif ( currentPostId === postId ) {\n\t\t\t\tsetCommentsCount( res.headers.get( 'X-WP-Total' ) );\n\t\t\t}\n\t\t} );\n\t}, [ postId ] );\n\n\tconst hasPostAndComments = postId && commentsCount !== undefined;\n\tconst blockStyles = {\n\t\t...blockProps.style,\n\t\ttextDecoration: hasPostAndComments\n\t\t\t? blockProps.style?.textDecoration\n\t\t\t: undefined,\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\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<div { ...blockProps } style={ blockStyles }>\n\t\t\t\t{ hasPostAndComments ? (\n\t\t\t\t\tcommentsCount\n\t\t\t\t) : (\n\t\t\t\t\t<Warning>\n\t\t\t\t\t\t{ __( 'Post Comments Count block: post not found.' ) }\n\t\t\t\t\t</Warning>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</>\n\t);\n}\n"],
5
- "mappings": ";AAGA,OAAO,UAAU;AAKjB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,UAAU,iBAAiB;AACpC,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAC7B,SAAS,UAAU;AA2CjB,mBAEE,KAFF;AAzCa,SAAR,sBAAwC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAS;AACrD,QAAM,aAAa,cAAe;AAAA,IACjC,WAAW,KAAM;AAAA,MAChB,CAAE,kBAAmB,SAAU,EAAG,GAAG;AAAA,IACtC,CAAE;AAAA,EACH,CAAE;AAEF,YAAW,MAAM;AAChB,QAAK,CAAE,QAAS;AACf;AAAA,IACD;AACA,UAAM,gBAAgB;AACtB,aAAU;AAAA,MACT,MAAM,aAAc,mBAAmB;AAAA,QACtC,MAAM;AAAA,MACP,CAAE;AAAA,MACF,OAAO;AAAA,IACR,CAAE,EAAE,KAAM,CAAE,QAAS;AAEpB,UAAK,kBAAkB,QAAS;AAC/B,yBAAkB,IAAI,QAAQ,IAAK,YAAa,CAAE;AAAA,MACnD;AAAA,IACD,CAAE;AAAA,EACH,GAAG,CAAE,MAAO,CAAE;AAEd,QAAM,qBAAqB,UAAU,kBAAkB;AACvD,QAAM,cAAc;AAAA,IACnB,GAAG,WAAW;AAAA,IACd,gBAAgB,qBACb,WAAW,OAAO,iBAClB;AAAA,EACJ;AAEA,SACC,iCACC;AAAA,wBAAC,iBAAc,OAAM,SACpB;AAAA,MAAC;AAAA;AAAA,QACA,OAAQ;AAAA,QACR,UAAW,CAAE,cAAe;AAC3B,wBAAe,EAAE,WAAW,UAAU,CAAE;AAAA,QACzC;AAAA;AAAA,IACD,GACD;AAAA,IACA,oBAAC,SAAM,GAAG,YAAa,OAAQ,aAC5B,+BACD,gBAEA,oBAAC,WACE,aAAI,4CAA6C,GACpD,GAEF;AAAA,KACD;AAEF;",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tAlignmentControl,\n\tBlockControls,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\nimport { useState, useEffect } from '@wordpress/element';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\n\nexport default function PostCommentsCountEdit( {\n\tattributes,\n\tcontext,\n\tsetAttributes,\n} ) {\n\tconst { textAlign } = attributes;\n\tconst { postId } = context;\n\tconst [ commentsCount, setCommentsCount ] = useState();\n\tconst blockProps = useBlockProps( {\n\t\tclassName: clsx( {\n\t\t\t[ `has-text-align-${ textAlign }` ]: textAlign,\n\t\t} ),\n\t} );\n\n\tuseEffect( () => {\n\t\tif ( ! postId ) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentPostId = postId;\n\t\tapiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/comments', {\n\t\t\t\tpost: postId,\n\t\t\t} ),\n\t\t\tparse: false,\n\t\t} ).then( ( res ) => {\n\t\t\t// Stale requests will have the `currentPostId` of an older closure.\n\t\t\tif ( currentPostId === postId ) {\n\t\t\t\tsetCommentsCount( res.headers.get( 'X-WP-Total' ) );\n\t\t\t}\n\t\t} );\n\t}, [ postId ] );\n\n\tconst hasPostAndComments = postId && commentsCount !== undefined;\n\tconst blockStyles = {\n\t\t...blockProps.style,\n\t\ttextDecoration: hasPostAndComments\n\t\t\t? blockProps.style?.textDecoration\n\t\t\t: undefined,\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\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<div { ...blockProps } style={ blockStyles }>\n\t\t\t\t{ hasPostAndComments ? commentsCount : '0' }\n\t\t\t</div>\n\t\t</>\n\t);\n}\n"],
5
+ "mappings": ";AAGA,OAAO,UAAU;AAKjB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,UAAU,iBAAiB;AACpC,OAAO,cAAc;AACrB,SAAS,oBAAoB;AA2C3B,mBAEE,KAFF;AAzCa,SAAR,sBAAwC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACD,GAAI;AACH,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAS;AACrD,QAAM,aAAa,cAAe;AAAA,IACjC,WAAW,KAAM;AAAA,MAChB,CAAE,kBAAmB,SAAU,EAAG,GAAG;AAAA,IACtC,CAAE;AAAA,EACH,CAAE;AAEF,YAAW,MAAM;AAChB,QAAK,CAAE,QAAS;AACf;AAAA,IACD;AACA,UAAM,gBAAgB;AACtB,aAAU;AAAA,MACT,MAAM,aAAc,mBAAmB;AAAA,QACtC,MAAM;AAAA,MACP,CAAE;AAAA,MACF,OAAO;AAAA,IACR,CAAE,EAAE,KAAM,CAAE,QAAS;AAEpB,UAAK,kBAAkB,QAAS;AAC/B,yBAAkB,IAAI,QAAQ,IAAK,YAAa,CAAE;AAAA,MACnD;AAAA,IACD,CAAE;AAAA,EACH,GAAG,CAAE,MAAO,CAAE;AAEd,QAAM,qBAAqB,UAAU,kBAAkB;AACvD,QAAM,cAAc;AAAA,IACnB,GAAG,WAAW;AAAA,IACd,gBAAgB,qBACb,WAAW,OAAO,iBAClB;AAAA,EACJ;AAEA,SACC,iCACC;AAAA,wBAAC,iBAAc,OAAM,SACpB;AAAA,MAAC;AAAA;AAAA,QACA,OAAQ;AAAA,QACR,UAAW,CAAE,cAAe;AAC3B,wBAAe,EAAE,WAAW,UAAU,CAAE;AAAA,QACzC;AAAA;AAAA,IACD,GACD;AAAA,IACA,oBAAC,SAAM,GAAG,YAAa,OAAQ,aAC5B,+BAAqB,gBAAgB,KACxC;AAAA,KACD;AAEF;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,6 @@ import clsx from "clsx";
3
3
  import {
4
4
  AlignmentControl,
5
5
  BlockControls,
6
- Warning,
7
6
  useBlockProps
8
7
  } from "@wordpress/block-editor";
9
8
  import { useState, useEffect } from "@wordpress/element";
@@ -46,10 +45,6 @@ function PostCommentsLinkEdit({ context, attributes, setAttributes }) {
46
45
  ),
47
46
  [postType, postId]
48
47
  );
49
- if (!post) {
50
- return /* @__PURE__ */ jsx("div", { ...blockProps, children: /* @__PURE__ */ jsx(Warning, { children: __("Post Comments Link block: post not found.") }) });
51
- }
52
- const { link } = post;
53
48
  let commentsText;
54
49
  if (commentsCount !== void 0) {
55
50
  const commentsNumber = parseInt(commentsCount);
@@ -73,14 +68,21 @@ function PostCommentsLinkEdit({ context, attributes, setAttributes }) {
73
68
  }
74
69
  }
75
70
  ) }),
76
- /* @__PURE__ */ jsx("div", { ...blockProps, children: link && commentsText !== void 0 ? /* @__PURE__ */ jsx(
71
+ /* @__PURE__ */ jsx("div", { ...blockProps, children: post?.link && commentsText !== void 0 ? /* @__PURE__ */ jsx(
77
72
  "a",
78
73
  {
79
- href: link + "#comments",
74
+ href: post?.link + "#comments",
80
75
  onClick: (event) => event.preventDefault(),
81
76
  children: commentsText
82
77
  }
83
- ) : /* @__PURE__ */ jsx(Warning, { children: __("Post Comments Link block: post not found.") }) })
78
+ ) : /* @__PURE__ */ jsx(
79
+ "a",
80
+ {
81
+ href: "#post-comments-link-pseudo-link",
82
+ onClick: (event) => event.preventDefault(),
83
+ children: __("No comments")
84
+ }
85
+ ) })
84
86
  ] });
85
87
  }
86
88
  var edit_default = PostCommentsLinkEdit;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/post-comments-link/edit.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tAlignmentControl,\n\tBlockControls,\n\tWarning,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\nimport { useState, useEffect } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { store as coreStore } from '@wordpress/core-data';\n\nfunction PostCommentsLinkEdit( { context, attributes, setAttributes } ) {\n\tconst { textAlign } = attributes;\n\tconst { postType, postId } = context;\n\tconst [ commentsCount, setCommentsCount ] = useState();\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: clsx( {\n\t\t\t[ `has-text-align-${ textAlign }` ]: textAlign,\n\t\t} ),\n\t} );\n\n\tuseEffect( () => {\n\t\tif ( ! postId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentPostId = postId;\n\t\tapiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/comments', {\n\t\t\t\tpost: postId,\n\t\t\t} ),\n\t\t\tparse: false,\n\t\t} ).then( ( res ) => {\n\t\t\t// Stale requests will have the `currentPostId` of an older closure.\n\t\t\tif ( currentPostId === postId ) {\n\t\t\t\tsetCommentsCount( res.headers.get( 'X-WP-Total' ) );\n\t\t\t}\n\t\t} );\n\t}, [ postId ] );\n\n\tconst post = useSelect(\n\t\t( select ) =>\n\t\t\tselect( coreStore ).getEditedEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\tpostType,\n\t\t\t\tpostId\n\t\t\t),\n\t\t[ postType, postId ]\n\t);\n\n\tif ( ! post ) {\n\t\treturn (\n\t\t\t<div { ...blockProps }>\n\t\t\t\t<Warning>\n\t\t\t\t\t{ __( 'Post Comments Link block: post not found.' ) }\n\t\t\t\t</Warning>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst { link } = post;\n\n\tlet commentsText;\n\tif ( commentsCount !== undefined ) {\n\t\tconst commentsNumber = parseInt( commentsCount );\n\n\t\tif ( commentsNumber === 0 ) {\n\t\t\tcommentsText = __( 'No comments' );\n\t\t} else {\n\t\t\tcommentsText = sprintf(\n\t\t\t\t/* translators: %s: Number of comments */\n\t\t\t\t_n( '%s comment', '%s comments', commentsNumber ),\n\t\t\t\tcommentsNumber.toLocaleString()\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\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\n\t\t\t<div { ...blockProps }>\n\t\t\t\t{ link && commentsText !== undefined ? (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={ link + '#comments' }\n\t\t\t\t\t\tonClick={ ( event ) => event.preventDefault() }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ commentsText }\n\t\t\t\t\t</a>\n\t\t\t\t) : (\n\t\t\t\t\t<Warning>\n\t\t\t\t\t\t{ __( 'Post Comments Link block: post not found.' ) }\n\t\t\t\t\t</Warning>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nexport default PostCommentsLinkEdit;\n"],
5
- "mappings": ";AAGA,OAAO,UAAU;AAKjB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,UAAU,iBAAiB;AACpC,SAAS,iBAAiB;AAC1B,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAC7B,SAAS,IAAI,SAAS,UAAU;AAChC,SAAS,SAAS,iBAAiB;AA6C/B,SAyBF,UAzBE,KAyBF,YAzBE;AA3CJ,SAAS,qBAAsB,EAAE,SAAS,YAAY,cAAc,GAAI;AACvE,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,EAAE,UAAU,OAAO,IAAI;AAC7B,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAS;AAErD,QAAM,aAAa,cAAe;AAAA,IACjC,WAAW,KAAM;AAAA,MAChB,CAAE,kBAAmB,SAAU,EAAG,GAAG;AAAA,IACtC,CAAE;AAAA,EACH,CAAE;AAEF,YAAW,MAAM;AAChB,QAAK,CAAE,QAAS;AACf;AAAA,IACD;AAEA,UAAM,gBAAgB;AACtB,aAAU;AAAA,MACT,MAAM,aAAc,mBAAmB;AAAA,QACtC,MAAM;AAAA,MACP,CAAE;AAAA,MACF,OAAO;AAAA,IACR,CAAE,EAAE,KAAM,CAAE,QAAS;AAEpB,UAAK,kBAAkB,QAAS;AAC/B,yBAAkB,IAAI,QAAQ,IAAK,YAAa,CAAE;AAAA,MACnD;AAAA,IACD,CAAE;AAAA,EACH,GAAG,CAAE,MAAO,CAAE;AAEd,QAAM,OAAO;AAAA,IACZ,CAAE,WACD,OAAQ,SAAU,EAAE;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACD,CAAE,UAAU,MAAO;AAAA,EACpB;AAEA,MAAK,CAAE,MAAO;AACb,WACC,oBAAC,SAAM,GAAG,YACT,8BAAC,WACE,aAAI,2CAA4C,GACnD,GACD;AAAA,EAEF;AAEA,QAAM,EAAE,KAAK,IAAI;AAEjB,MAAI;AACJ,MAAK,kBAAkB,QAAY;AAClC,UAAM,iBAAiB,SAAU,aAAc;AAE/C,QAAK,mBAAmB,GAAI;AAC3B,qBAAe,GAAI,aAAc;AAAA,IAClC,OAAO;AACN,qBAAe;AAAA;AAAA,QAEd,GAAI,cAAc,eAAe,cAAe;AAAA,QAChD,eAAe,eAAe;AAAA,MAC/B;AAAA,IACD;AAAA,EACD;AAEA,SACC,iCACC;AAAA,wBAAC,iBAAc,OAAM,SACpB;AAAA,MAAC;AAAA;AAAA,QACA,OAAQ;AAAA,QACR,UAAW,CAAE,cAAe;AAC3B,wBAAe,EAAE,WAAW,UAAU,CAAE;AAAA,QACzC;AAAA;AAAA,IACD,GACD;AAAA,IAEA,oBAAC,SAAM,GAAG,YACP,kBAAQ,iBAAiB,SAC1B;AAAA,MAAC;AAAA;AAAA,QACA,MAAO,OAAO;AAAA,QACd,SAAU,CAAE,UAAW,MAAM,eAAe;AAAA,QAE1C;AAAA;AAAA,IACH,IAEA,oBAAC,WACE,aAAI,2CAA4C,GACnD,GAEF;AAAA,KACD;AAEF;AAEA,IAAO,eAAQ;",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tAlignmentControl,\n\tBlockControls,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\nimport { useState, useEffect } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { store as coreStore } from '@wordpress/core-data';\n\nfunction PostCommentsLinkEdit( { context, attributes, setAttributes } ) {\n\tconst { textAlign } = attributes;\n\tconst { postType, postId } = context;\n\tconst [ commentsCount, setCommentsCount ] = useState();\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: clsx( {\n\t\t\t[ `has-text-align-${ textAlign }` ]: textAlign,\n\t\t} ),\n\t} );\n\n\tuseEffect( () => {\n\t\tif ( ! postId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentPostId = postId;\n\t\tapiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/comments', {\n\t\t\t\tpost: postId,\n\t\t\t} ),\n\t\t\tparse: false,\n\t\t} ).then( ( res ) => {\n\t\t\t// Stale requests will have the `currentPostId` of an older closure.\n\t\t\tif ( currentPostId === postId ) {\n\t\t\t\tsetCommentsCount( res.headers.get( 'X-WP-Total' ) );\n\t\t\t}\n\t\t} );\n\t}, [ postId ] );\n\n\tconst post = useSelect(\n\t\t( select ) =>\n\t\t\tselect( coreStore ).getEditedEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\tpostType,\n\t\t\t\tpostId\n\t\t\t),\n\t\t[ postType, postId ]\n\t);\n\n\tlet commentsText;\n\tif ( commentsCount !== undefined ) {\n\t\tconst commentsNumber = parseInt( commentsCount );\n\n\t\tif ( commentsNumber === 0 ) {\n\t\t\tcommentsText = __( 'No comments' );\n\t\t} else {\n\t\t\tcommentsText = sprintf(\n\t\t\t\t/* translators: %s: Number of comments */\n\t\t\t\t_n( '%s comment', '%s comments', commentsNumber ),\n\t\t\t\tcommentsNumber.toLocaleString()\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\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\n\t\t\t<div { ...blockProps }>\n\t\t\t\t{ post?.link && commentsText !== undefined ? (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={ post?.link + '#comments' }\n\t\t\t\t\t\tonClick={ ( event ) => event.preventDefault() }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ commentsText }\n\t\t\t\t\t</a>\n\t\t\t\t) : (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"#post-comments-link-pseudo-link\"\n\t\t\t\t\t\tonClick={ ( event ) => event.preventDefault() }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'No comments' ) }\n\t\t\t\t\t</a>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nexport default PostCommentsLinkEdit;\n"],
5
+ "mappings": ";AAGA,OAAO,UAAU;AAKjB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,UAAU,iBAAiB;AACpC,SAAS,iBAAiB;AAC1B,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAC7B,SAAS,IAAI,SAAS,UAAU;AAChC,SAAS,SAAS,iBAAiB;AA0DjC,mBAEE,KAFF;AAxDF,SAAS,qBAAsB,EAAE,SAAS,YAAY,cAAc,GAAI;AACvE,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,EAAE,UAAU,OAAO,IAAI;AAC7B,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAS;AAErD,QAAM,aAAa,cAAe;AAAA,IACjC,WAAW,KAAM;AAAA,MAChB,CAAE,kBAAmB,SAAU,EAAG,GAAG;AAAA,IACtC,CAAE;AAAA,EACH,CAAE;AAEF,YAAW,MAAM;AAChB,QAAK,CAAE,QAAS;AACf;AAAA,IACD;AAEA,UAAM,gBAAgB;AACtB,aAAU;AAAA,MACT,MAAM,aAAc,mBAAmB;AAAA,QACtC,MAAM;AAAA,MACP,CAAE;AAAA,MACF,OAAO;AAAA,IACR,CAAE,EAAE,KAAM,CAAE,QAAS;AAEpB,UAAK,kBAAkB,QAAS;AAC/B,yBAAkB,IAAI,QAAQ,IAAK,YAAa,CAAE;AAAA,MACnD;AAAA,IACD,CAAE;AAAA,EACH,GAAG,CAAE,MAAO,CAAE;AAEd,QAAM,OAAO;AAAA,IACZ,CAAE,WACD,OAAQ,SAAU,EAAE;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACD,CAAE,UAAU,MAAO;AAAA,EACpB;AAEA,MAAI;AACJ,MAAK,kBAAkB,QAAY;AAClC,UAAM,iBAAiB,SAAU,aAAc;AAE/C,QAAK,mBAAmB,GAAI;AAC3B,qBAAe,GAAI,aAAc;AAAA,IAClC,OAAO;AACN,qBAAe;AAAA;AAAA,QAEd,GAAI,cAAc,eAAe,cAAe;AAAA,QAChD,eAAe,eAAe;AAAA,MAC/B;AAAA,IACD;AAAA,EACD;AAEA,SACC,iCACC;AAAA,wBAAC,iBAAc,OAAM,SACpB;AAAA,MAAC;AAAA;AAAA,QACA,OAAQ;AAAA,QACR,UAAW,CAAE,cAAe;AAC3B,wBAAe,EAAE,WAAW,UAAU,CAAE;AAAA,QACzC;AAAA;AAAA,IACD,GACD;AAAA,IAEA,oBAAC,SAAM,GAAG,YACP,gBAAM,QAAQ,iBAAiB,SAChC;AAAA,MAAC;AAAA;AAAA,QACA,MAAO,MAAM,OAAO;AAAA,QACpB,SAAU,CAAE,UAAW,MAAM,eAAe;AAAA,QAE1C;AAAA;AAAA,IACH,IAEA;AAAA,MAAC;AAAA;AAAA,QACA,MAAK;AAAA,QACL,SAAU,CAAE,UAAW,MAAM,eAAe;AAAA,QAE1C,aAAI,aAAc;AAAA;AAAA,IACrB,GAEF;AAAA,KACD;AAEF;AAEA,IAAO,eAAQ;",
6
6
  "names": []
7
7
  }