@wordpress/editor 14.41.2-next.v.202603161435.0 → 14.43.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 +3 -1
  2. package/build/components/collaborators-overlay/compute-selection.cjs +10 -10
  3. package/build/components/collaborators-overlay/compute-selection.cjs.map +2 -2
  4. package/build/components/collaborators-overlay/cursor-registry.cjs +86 -0
  5. package/build/components/collaborators-overlay/cursor-registry.cjs.map +7 -0
  6. package/build/components/collaborators-overlay/index.cjs +7 -2
  7. package/build/components/collaborators-overlay/index.cjs.map +2 -2
  8. package/build/components/collaborators-overlay/overlay-iframe-styles.cjs +1 -1
  9. package/build/components/collaborators-overlay/overlay-iframe-styles.cjs.map +2 -2
  10. package/build/components/collaborators-overlay/overlay.cjs +42 -1
  11. package/build/components/collaborators-overlay/overlay.cjs.map +2 -2
  12. package/build/components/collaborators-overlay/timing-utils.cjs +46 -0
  13. package/build/components/collaborators-overlay/timing-utils.cjs.map +7 -0
  14. package/build/components/collaborators-overlay/use-render-cursors.cjs +1 -1
  15. package/build/components/collaborators-overlay/use-render-cursors.cjs.map +2 -2
  16. package/build/components/collaborators-presence/index.cjs +14 -4
  17. package/build/components/collaborators-presence/index.cjs.map +2 -2
  18. package/build/components/collaborators-presence/list.cjs +20 -4
  19. package/build/components/collaborators-presence/list.cjs.map +2 -2
  20. package/build/components/post-card-panel/index.cjs +4 -15
  21. package/build/components/post-card-panel/index.cjs.map +2 -2
  22. package/build/components/post-content-information/index.cjs +10 -13
  23. package/build/components/post-content-information/index.cjs.map +2 -2
  24. package/build/components/post-locked-modal/index.cjs +16 -3
  25. package/build/components/post-locked-modal/index.cjs.map +2 -2
  26. package/build/components/post-revisions-panel/index.cjs +164 -0
  27. package/build/components/post-revisions-panel/index.cjs.map +7 -0
  28. package/build/components/post-revisions-preview/block-diff.cjs +39 -11
  29. package/build/components/post-revisions-preview/block-diff.cjs.map +2 -2
  30. package/build/components/post-revisions-preview/diff-markers.cjs +2 -2
  31. package/build/components/post-revisions-preview/diff-markers.cjs.map +2 -2
  32. package/build/components/post-revisions-preview/revisions-canvas.cjs +1 -1
  33. package/build/components/post-revisions-preview/revisions-canvas.cjs.map +2 -2
  34. package/build/components/post-revisions-preview/revisions-slider.cjs +24 -5
  35. package/build/components/post-revisions-preview/revisions-slider.cjs.map +2 -2
  36. package/build/components/post-template/block-theme.cjs +7 -4
  37. package/build/components/post-template/block-theme.cjs.map +2 -2
  38. package/build/components/post-template/create-new-template-modal.cjs +39 -46
  39. package/build/components/post-template/create-new-template-modal.cjs.map +2 -2
  40. package/build/components/post-template/hooks.cjs +91 -8
  41. package/build/components/post-template/hooks.cjs.map +2 -2
  42. package/build/components/post-template/panel.cjs +5 -42
  43. package/build/components/post-template/panel.cjs.map +3 -3
  44. package/build/components/post-template/swap-template-button.cjs +31 -20
  45. package/build/components/post-template/swap-template-button.cjs.map +2 -2
  46. package/build/components/preferences-modal/index.cjs +35 -27
  47. package/build/components/preferences-modal/index.cjs.map +2 -2
  48. package/build/components/provider/use-block-editor-settings.cjs +2 -0
  49. package/build/components/provider/use-block-editor-settings.cjs.map +3 -3
  50. package/build/components/revision-block-diff/index.cjs +61 -0
  51. package/build/components/revision-block-diff/index.cjs.map +7 -0
  52. package/build/components/revision-diff-panel/index.cjs +68 -0
  53. package/build/components/revision-diff-panel/index.cjs.map +7 -0
  54. package/build/components/revision-fields-diff/index.cjs +96 -0
  55. package/build/components/revision-fields-diff/index.cjs.map +7 -0
  56. package/build/components/sidebar/dataform-post-summary.cjs +25 -55
  57. package/build/components/sidebar/dataform-post-summary.cjs.map +2 -2
  58. package/build/components/sidebar/index.cjs +30 -23
  59. package/build/components/sidebar/index.cjs.map +3 -3
  60. package/build/components/sidebar/post-revision-summary.cjs +74 -0
  61. package/build/components/sidebar/post-revision-summary.cjs.map +7 -0
  62. package/build/components/sidebar/post-summary.cjs +35 -42
  63. package/build/components/sidebar/post-summary.cjs.map +3 -3
  64. package/build/components/style-book/index.cjs +4 -3
  65. package/build/components/style-book/index.cjs.map +2 -2
  66. package/build/components/{sync-connection-modal → sync-connection-error-modal}/index.cjs +89 -80
  67. package/build/components/sync-connection-error-modal/index.cjs.map +7 -0
  68. package/build/components/{sync-connection-modal → sync-connection-error-modal}/use-retry-countdown.cjs +14 -27
  69. package/build/components/sync-connection-error-modal/use-retry-countdown.cjs.map +7 -0
  70. package/build/components/template-actions-panel/block-theme-content.cjs +188 -0
  71. package/build/components/template-actions-panel/block-theme-content.cjs.map +7 -0
  72. package/build/components/template-actions-panel/classic-theme-content.cjs +159 -0
  73. package/build/components/template-actions-panel/classic-theme-content.cjs.map +7 -0
  74. package/build/components/template-actions-panel/index.cjs +59 -0
  75. package/build/components/template-actions-panel/index.cjs.map +7 -0
  76. package/build/components/visual-editor/index.cjs +2 -2
  77. package/build/components/visual-editor/index.cjs.map +2 -2
  78. package/build/dataviews/store/private-actions.cjs +2 -0
  79. package/build/dataviews/store/private-actions.cjs.map +2 -2
  80. package/build/store/actions.cjs +1 -3
  81. package/build/store/actions.cjs.map +2 -2
  82. package/build/store/private-actions.cjs +21 -2
  83. package/build/store/private-actions.cjs.map +2 -2
  84. package/build/store/private-selectors.cjs +40 -15
  85. package/build/store/private-selectors.cjs.map +2 -2
  86. package/build/utils/media-finalize/index.cjs +43 -0
  87. package/build/utils/media-finalize/index.cjs.map +7 -0
  88. package/build/utils/sync-error-messages.cjs +29 -16
  89. package/build/utils/sync-error-messages.cjs.map +3 -3
  90. package/build-module/components/collaborators-overlay/compute-selection.mjs +10 -10
  91. package/build-module/components/collaborators-overlay/compute-selection.mjs.map +2 -2
  92. package/build-module/components/collaborators-overlay/cursor-registry.mjs +61 -0
  93. package/build-module/components/collaborators-overlay/cursor-registry.mjs.map +7 -0
  94. package/build-module/components/collaborators-overlay/index.mjs +7 -2
  95. package/build-module/components/collaborators-overlay/index.mjs.map +2 -2
  96. package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs +1 -1
  97. package/build-module/components/collaborators-overlay/overlay-iframe-styles.mjs.map +2 -2
  98. package/build-module/components/collaborators-overlay/overlay.mjs +43 -2
  99. package/build-module/components/collaborators-overlay/overlay.mjs.map +2 -2
  100. package/build-module/components/collaborators-overlay/timing-utils.mjs +21 -0
  101. package/build-module/components/collaborators-overlay/timing-utils.mjs.map +7 -0
  102. package/build-module/components/collaborators-overlay/use-render-cursors.mjs +1 -1
  103. package/build-module/components/collaborators-overlay/use-render-cursors.mjs.map +2 -2
  104. package/build-module/components/collaborators-presence/index.mjs +14 -4
  105. package/build-module/components/collaborators-presence/index.mjs.map +2 -2
  106. package/build-module/components/collaborators-presence/list.mjs +20 -4
  107. package/build-module/components/collaborators-presence/list.mjs.map +2 -2
  108. package/build-module/components/post-card-panel/index.mjs +6 -17
  109. package/build-module/components/post-card-panel/index.mjs.map +2 -2
  110. package/build-module/components/post-content-information/index.mjs +6 -13
  111. package/build-module/components/post-content-information/index.mjs.map +2 -2
  112. package/build-module/components/post-locked-modal/index.mjs +16 -3
  113. package/build-module/components/post-locked-modal/index.mjs.map +2 -2
  114. package/build-module/components/post-revisions-panel/index.mjs +139 -0
  115. package/build-module/components/post-revisions-panel/index.mjs.map +7 -0
  116. package/build-module/components/post-revisions-preview/block-diff.mjs +39 -11
  117. package/build-module/components/post-revisions-preview/block-diff.mjs.map +2 -2
  118. package/build-module/components/post-revisions-preview/diff-markers.mjs +2 -2
  119. package/build-module/components/post-revisions-preview/diff-markers.mjs.map +2 -2
  120. package/build-module/components/post-revisions-preview/revisions-canvas.mjs +1 -1
  121. package/build-module/components/post-revisions-preview/revisions-canvas.mjs.map +2 -2
  122. package/build-module/components/post-revisions-preview/revisions-slider.mjs +24 -5
  123. package/build-module/components/post-revisions-preview/revisions-slider.mjs.map +2 -2
  124. package/build-module/components/post-template/block-theme.mjs +7 -4
  125. package/build-module/components/post-template/block-theme.mjs.map +2 -2
  126. package/build-module/components/post-template/create-new-template-modal.mjs +39 -46
  127. package/build-module/components/post-template/create-new-template-modal.mjs.map +2 -2
  128. package/build-module/components/post-template/hooks.mjs +90 -8
  129. package/build-module/components/post-template/hooks.mjs.map +2 -2
  130. package/build-module/components/post-template/panel.mjs +5 -42
  131. package/build-module/components/post-template/panel.mjs.map +2 -2
  132. package/build-module/components/post-template/swap-template-button.mjs +27 -20
  133. package/build-module/components/post-template/swap-template-button.mjs.map +2 -2
  134. package/build-module/components/preferences-modal/index.mjs +35 -27
  135. package/build-module/components/preferences-modal/index.mjs.map +2 -2
  136. package/build-module/components/provider/use-block-editor-settings.mjs +2 -0
  137. package/build-module/components/provider/use-block-editor-settings.mjs.map +2 -2
  138. package/build-module/components/revision-block-diff/index.mjs +30 -0
  139. package/build-module/components/revision-block-diff/index.mjs.map +7 -0
  140. package/build-module/components/revision-diff-panel/index.mjs +37 -0
  141. package/build-module/components/revision-diff-panel/index.mjs.map +7 -0
  142. package/build-module/components/revision-fields-diff/index.mjs +65 -0
  143. package/build-module/components/revision-fields-diff/index.mjs.map +7 -0
  144. package/build-module/components/sidebar/dataform-post-summary.mjs +25 -55
  145. package/build-module/components/sidebar/dataform-post-summary.mjs.map +2 -2
  146. package/build-module/components/sidebar/index.mjs +30 -23
  147. package/build-module/components/sidebar/index.mjs.map +2 -2
  148. package/build-module/components/sidebar/post-revision-summary.mjs +43 -0
  149. package/build-module/components/sidebar/post-revision-summary.mjs.map +7 -0
  150. package/build-module/components/sidebar/post-summary.mjs +31 -42
  151. package/build-module/components/sidebar/post-summary.mjs.map +2 -2
  152. package/build-module/components/style-book/index.mjs +4 -3
  153. package/build-module/components/style-book/index.mjs.map +2 -2
  154. package/build-module/components/sync-connection-error-modal/index.mjs +177 -0
  155. package/build-module/components/sync-connection-error-modal/index.mjs.map +7 -0
  156. package/build-module/components/sync-connection-error-modal/use-retry-countdown.mjs +36 -0
  157. package/build-module/components/sync-connection-error-modal/use-retry-countdown.mjs.map +7 -0
  158. package/build-module/components/template-actions-panel/block-theme-content.mjs +167 -0
  159. package/build-module/components/template-actions-panel/block-theme-content.mjs.map +7 -0
  160. package/build-module/components/template-actions-panel/classic-theme-content.mjs +138 -0
  161. package/build-module/components/template-actions-panel/classic-theme-content.mjs.map +7 -0
  162. package/build-module/components/template-actions-panel/index.mjs +28 -0
  163. package/build-module/components/template-actions-panel/index.mjs.map +7 -0
  164. package/build-module/components/visual-editor/index.mjs +2 -2
  165. package/build-module/components/visual-editor/index.mjs.map +2 -2
  166. package/build-module/dataviews/store/private-actions.mjs +5 -1
  167. package/build-module/dataviews/store/private-actions.mjs.map +2 -2
  168. package/build-module/store/actions.mjs +1 -3
  169. package/build-module/store/actions.mjs.map +2 -2
  170. package/build-module/store/private-actions.mjs +21 -2
  171. package/build-module/store/private-actions.mjs.map +2 -2
  172. package/build-module/store/private-selectors.mjs +40 -15
  173. package/build-module/store/private-selectors.mjs.map +2 -2
  174. package/build-module/utils/media-finalize/index.mjs +12 -0
  175. package/build-module/utils/media-finalize/index.mjs.map +7 -0
  176. package/build-module/utils/sync-error-messages.mjs +24 -16
  177. package/build-module/utils/sync-error-messages.mjs.map +3 -3
  178. package/build-style/style-rtl.css +135 -50
  179. package/build-style/style.css +135 -50
  180. package/build-types/components/collaborators-overlay/cursor-registry.d.ts +36 -0
  181. package/build-types/components/collaborators-overlay/cursor-registry.d.ts.map +1 -0
  182. package/build-types/components/collaborators-overlay/index.d.ts +7 -4
  183. package/build-types/components/collaborators-overlay/index.d.ts.map +1 -1
  184. package/build-types/components/collaborators-overlay/overlay-iframe-styles.d.ts +1 -1
  185. package/build-types/components/collaborators-overlay/overlay-iframe-styles.d.ts.map +1 -1
  186. package/build-types/components/collaborators-overlay/overlay.d.ts +4 -1
  187. package/build-types/components/collaborators-overlay/overlay.d.ts.map +1 -1
  188. package/build-types/components/collaborators-overlay/timing-utils.d.ts +11 -0
  189. package/build-types/components/collaborators-overlay/timing-utils.d.ts.map +1 -0
  190. package/build-types/components/collaborators-presence/index.d.ts.map +1 -1
  191. package/build-types/components/collaborators-presence/list.d.ts +4 -1
  192. package/build-types/components/collaborators-presence/list.d.ts.map +1 -1
  193. package/build-types/components/post-card-panel/index.d.ts.map +1 -1
  194. package/build-types/components/post-content-information/index.d.ts +4 -1
  195. package/build-types/components/post-content-information/index.d.ts.map +1 -1
  196. package/build-types/components/post-locked-modal/index.d.ts +2 -2
  197. package/build-types/components/post-locked-modal/index.d.ts.map +1 -1
  198. package/build-types/components/post-revisions-panel/index.d.ts +2 -0
  199. package/build-types/components/post-revisions-panel/index.d.ts.map +1 -0
  200. package/build-types/components/post-revisions-preview/block-diff.d.ts.map +1 -1
  201. package/build-types/components/post-revisions-preview/revisions-slider.d.ts.map +1 -1
  202. package/build-types/components/post-template/block-theme.d.ts +1 -3
  203. package/build-types/components/post-template/block-theme.d.ts.map +1 -1
  204. package/build-types/components/post-template/create-new-template-modal.d.ts.map +1 -1
  205. package/build-types/components/post-template/hooks.d.ts +2 -1
  206. package/build-types/components/post-template/hooks.d.ts.map +1 -1
  207. package/build-types/components/post-template/panel.d.ts.map +1 -1
  208. package/build-types/components/post-template/swap-template-button.d.ts +4 -0
  209. package/build-types/components/post-template/swap-template-button.d.ts.map +1 -1
  210. package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
  211. package/build-types/components/revision-block-diff/index.d.ts +6 -0
  212. package/build-types/components/revision-block-diff/index.d.ts.map +1 -0
  213. package/build-types/components/revision-diff-panel/index.d.ts +14 -0
  214. package/build-types/components/revision-diff-panel/index.d.ts.map +1 -0
  215. package/build-types/components/revision-fields-diff/index.d.ts +6 -0
  216. package/build-types/components/revision-fields-diff/index.d.ts.map +1 -0
  217. package/build-types/components/sidebar/dataform-post-summary.d.ts.map +1 -1
  218. package/build-types/components/sidebar/index.d.ts.map +1 -1
  219. package/build-types/components/sidebar/post-revision-summary.d.ts +2 -0
  220. package/build-types/components/sidebar/post-revision-summary.d.ts.map +1 -0
  221. package/build-types/components/sidebar/post-summary.d.ts +3 -0
  222. package/build-types/components/sidebar/post-summary.d.ts.map +1 -1
  223. package/build-types/components/style-book/index.d.ts +2 -1
  224. package/build-types/components/style-book/index.d.ts.map +1 -1
  225. package/build-types/components/sync-connection-error-modal/index.d.ts +22 -0
  226. package/build-types/components/sync-connection-error-modal/index.d.ts.map +1 -0
  227. package/build-types/components/sync-connection-error-modal/use-retry-countdown.d.ts +11 -0
  228. package/build-types/components/sync-connection-error-modal/use-retry-countdown.d.ts.map +1 -0
  229. package/build-types/components/template-actions-panel/block-theme-content.d.ts +2 -0
  230. package/build-types/components/template-actions-panel/block-theme-content.d.ts.map +1 -0
  231. package/build-types/components/template-actions-panel/classic-theme-content.d.ts +2 -0
  232. package/build-types/components/template-actions-panel/classic-theme-content.d.ts.map +1 -0
  233. package/build-types/components/template-actions-panel/index.d.ts +2 -0
  234. package/build-types/components/template-actions-panel/index.d.ts.map +1 -0
  235. package/build-types/dataviews/store/private-actions.d.ts.map +1 -1
  236. package/build-types/store/actions.d.ts.map +1 -1
  237. package/build-types/store/private-actions.d.ts.map +1 -1
  238. package/build-types/store/private-selectors.d.ts.map +1 -1
  239. package/build-types/utils/media-finalize/index.d.ts +2 -0
  240. package/build-types/utils/media-finalize/index.d.ts.map +1 -0
  241. package/build-types/utils/sync-error-messages.d.ts +17 -3
  242. package/build-types/utils/sync-error-messages.d.ts.map +1 -1
  243. package/package.json +45 -44
  244. package/src/components/collaborators-overlay/compute-selection.ts +13 -13
  245. package/src/components/collaborators-overlay/cursor-registry.ts +96 -0
  246. package/src/components/collaborators-overlay/index.tsx +12 -4
  247. package/src/components/collaborators-overlay/overlay-iframe-styles.ts +1 -1
  248. package/src/components/collaborators-overlay/overlay.tsx +64 -1
  249. package/src/components/collaborators-overlay/timing-utils.ts +30 -0
  250. package/src/components/collaborators-overlay/use-render-cursors.ts +1 -1
  251. package/src/components/collaborators-presence/index.tsx +9 -1
  252. package/src/components/collaborators-presence/list.tsx +25 -1
  253. package/src/components/post-card-panel/index.js +7 -21
  254. package/src/components/post-content-information/index.js +5 -16
  255. package/src/components/post-locked-modal/index.js +21 -3
  256. package/src/components/post-revisions-panel/index.js +151 -0
  257. package/src/components/post-revisions-panel/style.scss +16 -0
  258. package/src/components/post-revisions-preview/block-diff.js +59 -20
  259. package/src/components/post-revisions-preview/diff-markers.js +2 -2
  260. package/src/components/post-revisions-preview/revisions-canvas.js +1 -1
  261. package/src/components/post-revisions-preview/revisions-slider.js +29 -7
  262. package/src/components/post-revisions-preview/test/block-diff.js +69 -31
  263. package/src/components/post-template/block-theme.js +4 -1
  264. package/src/components/post-template/create-new-template-modal.js +1 -4
  265. package/src/components/post-template/hooks.js +107 -9
  266. package/src/components/post-template/panel.js +5 -59
  267. package/src/components/post-template/style.scss +0 -6
  268. package/src/components/post-template/swap-template-button.js +30 -21
  269. package/src/components/preferences-modal/index.js +37 -25
  270. package/src/components/provider/use-block-editor-settings.js +2 -0
  271. package/src/components/revision-block-diff/index.js +39 -0
  272. package/src/components/revision-diff-panel/index.js +59 -0
  273. package/src/components/revision-diff-panel/style.scss +13 -0
  274. package/src/components/revision-fields-diff/index.js +91 -0
  275. package/src/components/sidebar/dataform-post-summary.js +45 -68
  276. package/src/components/sidebar/index.js +35 -22
  277. package/src/components/sidebar/post-revision-summary.js +50 -0
  278. package/src/components/sidebar/post-summary.js +22 -40
  279. package/src/components/sidebar/style.scss +7 -0
  280. package/src/components/style-book/index.js +4 -2
  281. package/src/components/sync-connection-error-modal/index.tsx +265 -0
  282. package/src/components/sync-connection-error-modal/style.scss +14 -0
  283. package/src/components/sync-connection-error-modal/use-retry-countdown.ts +57 -0
  284. package/src/components/template-actions-panel/block-theme-content.js +196 -0
  285. package/src/components/template-actions-panel/classic-theme-content.js +170 -0
  286. package/src/components/template-actions-panel/index.js +32 -0
  287. package/src/components/template-actions-panel/style.scss +39 -0
  288. package/src/components/visual-editor/index.js +2 -2
  289. package/src/dataviews/store/private-actions.ts +6 -0
  290. package/src/store/actions.js +1 -4
  291. package/src/store/private-actions.js +24 -3
  292. package/src/store/private-selectors.js +46 -16
  293. package/src/style.scss +4 -1
  294. package/src/utils/media-finalize/index.js +11 -0
  295. package/src/utils/media-finalize/test/index.js +34 -0
  296. package/src/utils/sync-error-messages.ts +72 -0
  297. package/src/utils/test/sync-error-messages.js +9 -32
  298. package/build/components/sync-connection-modal/index.cjs.map +0 -7
  299. package/build/components/sync-connection-modal/use-retry-countdown.cjs.map +0 -7
  300. package/build-module/components/sync-connection-modal/index.mjs +0 -170
  301. package/build-module/components/sync-connection-modal/index.mjs.map +0 -7
  302. package/build-module/components/sync-connection-modal/use-retry-countdown.mjs +0 -49
  303. package/build-module/components/sync-connection-modal/use-retry-countdown.mjs.map +0 -7
  304. package/build-types/components/sync-connection-modal/index.d.ts +0 -8
  305. package/build-types/components/sync-connection-modal/index.d.ts.map +0 -1
  306. package/build-types/components/sync-connection-modal/use-retry-countdown.d.ts +0 -9
  307. package/build-types/components/sync-connection-modal/use-retry-countdown.d.ts.map +0 -1
  308. package/src/components/sync-connection-modal/index.js +0 -206
  309. package/src/components/sync-connection-modal/style.scss +0 -14
  310. package/src/components/sync-connection-modal/use-retry-countdown.js +0 -70
  311. package/src/utils/sync-error-messages.js +0 -58
@@ -272,11 +272,12 @@ var StyleBookPreview = ({
272
272
  userConfig = {},
273
273
  isStatic = false,
274
274
  path,
275
- onPathChange
275
+ onPathChange,
276
+ settings: settingsProp
276
277
  }) => {
277
278
  const editorSettings = useSelect(
278
- (select) => select(editorStore).getEditorSettings(),
279
- []
279
+ (select) => settingsProp ?? select(editorStore).getEditorSettings(),
280
+ [settingsProp]
280
281
  );
281
282
  const canUserUploadMedia = useSelect(
282
283
  (select) => select(coreStore).canUser("create", {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/style-book/index.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tDisabled,\n\tComposite,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { __, _x, sprintf } from '@wordpress/i18n';\nimport {\n\tBlockList,\n\tprivateApis as blockEditorPrivateApis,\n\tstore as blockEditorStore,\n\tuseSettings,\n\tBlockEditorProvider,\n\t__unstableEditorStyles as EditorStyles,\n\t__unstableIframe as Iframe,\n\t__experimentalUseMultipleOriginColorsAndGradients as useMultipleOriginColorsAndGradients,\n} from '@wordpress/block-editor';\nimport { useSelect, dispatch } from '@wordpress/data';\nimport { mergeGlobalStyles } from '@wordpress/global-styles-engine';\nimport {\n\tuseMemo,\n\tuseState,\n\tmemo,\n\tuseRef,\n\tuseLayoutEffect,\n\tuseEffect,\n\tforwardRef,\n} from '@wordpress/element';\nimport { ENTER, SPACE } from '@wordpress/keycodes';\nimport { uploadMedia } from '@wordpress/media-utils';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\nimport { STYLE_BOOK_IFRAME_STYLES } from './constants';\nimport {\n\tgetExamplesByCategory,\n\tgetTopLevelStyleBookCategories,\n} from './categories';\nimport { getExamples } from './examples';\nimport { GlobalStylesRenderer } from '../global-styles-renderer';\nimport {\n\tSTYLE_BOOK_COLOR_GROUPS,\n\tSTYLE_BOOK_PREVIEW_CATEGORIES,\n} from '../style-book/constants';\nimport { useGlobalStylesOutputWithConfig } from '../../hooks/use-global-styles-output';\nimport { useStyle, useGlobalStyles } from '../global-styles';\nimport { store as editorStore } from '../../store';\n\nconst { ExperimentalBlockEditorProvider } = unlock( blockEditorPrivateApis );\nconst { Tabs } = unlock( componentsPrivateApis );\n\nfunction isObjectEmpty( object ) {\n\treturn ! object || Object.keys( object ).length === 0;\n}\n\n/**\n * Scrolls to a section within an iframe.\n *\n * @param {string} anchorId The id of the element to scroll to.\n * @param {HTMLIFrameElement} iframe The target iframe.\n */\nconst scrollToSection = ( anchorId, iframe ) => {\n\tif ( ! anchorId || ! iframe || ! iframe?.contentDocument ) {\n\t\treturn;\n\t}\n\n\tconst element =\n\t\tanchorId === 'top'\n\t\t\t? iframe.contentDocument.body\n\t\t\t: iframe.contentDocument.getElementById( anchorId );\n\tif ( element ) {\n\t\telement.scrollIntoView( {\n\t\t\tbehavior: 'smooth',\n\t\t} );\n\t}\n};\n\n/**\n * Parses a Block Editor navigation path to build a style book navigation path.\n * The object can be extended to include a category, representing a style book tab/section.\n *\n * @param {string} path An internal Block Editor navigation path.\n * @return {null|{block: string}} An object containing the example to navigate to.\n */\nconst getStyleBookNavigationFromPath = ( path ) => {\n\tif ( path && typeof path === 'string' ) {\n\t\tif (\n\t\t\tpath === '/' ||\n\t\t\tpath.startsWith( '/typography' ) ||\n\t\t\tpath.startsWith( '/colors' ) ||\n\t\t\tpath.startsWith( '/blocks' )\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttop: true,\n\t\t\t};\n\t\t}\n\t}\n\treturn null;\n};\n\n/**\n * Retrieves colors, gradients, and duotone filters from Global Styles.\n * The inclusion of default (Core) palettes is controlled by the relevant\n * theme.json property e.g. defaultPalette, defaultGradients, defaultDuotone.\n *\n * @return {Object} Object containing properties for each type of palette.\n */\nfunction useMultiOriginPalettes() {\n\tconst { colors, gradients } = useMultipleOriginColorsAndGradients();\n\n\t// Add duotone filters to the palettes data.\n\tconst [\n\t\tshouldDisplayDefaultDuotones,\n\t\tcustomDuotones,\n\t\tthemeDuotones,\n\t\tdefaultDuotones,\n\t] = useSettings(\n\t\t'color.defaultDuotone',\n\t\t'color.duotone.custom',\n\t\t'color.duotone.theme',\n\t\t'color.duotone.default'\n\t);\n\n\tconst palettes = useMemo( () => {\n\t\tconst result = { colors, gradients, duotones: [] };\n\n\t\tif ( themeDuotones && themeDuotones.length ) {\n\t\t\tresult.duotones.push( {\n\t\t\t\tname: _x(\n\t\t\t\t\t'Theme',\n\t\t\t\t\t'Indicates these duotone filters come from the theme.'\n\t\t\t\t),\n\t\t\t\tslug: 'theme',\n\t\t\t\tduotones: themeDuotones,\n\t\t\t} );\n\t\t}\n\n\t\tif (\n\t\t\tshouldDisplayDefaultDuotones &&\n\t\t\tdefaultDuotones &&\n\t\t\tdefaultDuotones.length\n\t\t) {\n\t\t\tresult.duotones.push( {\n\t\t\t\tname: _x(\n\t\t\t\t\t'Default',\n\t\t\t\t\t'Indicates these duotone filters come from WordPress.'\n\t\t\t\t),\n\t\t\t\tslug: 'default',\n\t\t\t\tduotones: defaultDuotones,\n\t\t\t} );\n\t\t}\n\t\tif ( customDuotones && customDuotones.length ) {\n\t\t\tresult.duotones.push( {\n\t\t\t\tname: _x(\n\t\t\t\t\t'Custom',\n\t\t\t\t\t'Indicates these doutone filters are created by the user.'\n\t\t\t\t),\n\t\t\t\tslug: 'custom',\n\t\t\t\tduotones: customDuotones,\n\t\t\t} );\n\t\t}\n\n\t\treturn result;\n\t}, [\n\t\tcolors,\n\t\tgradients,\n\t\tcustomDuotones,\n\t\tthemeDuotones,\n\t\tdefaultDuotones,\n\t\tshouldDisplayDefaultDuotones,\n\t] );\n\n\treturn palettes;\n}\n\n/**\n * Get deduped examples for single page stylebook.\n * @param {Array} examples Array of examples.\n * @return {Array} Deduped examples.\n */\nexport function getExamplesForSinglePageUse( examples ) {\n\tconst examplesForSinglePageUse = [];\n\tconst overviewCategoryExamples = getExamplesByCategory(\n\t\t{ slug: 'overview' },\n\t\texamples\n\t);\n\texamplesForSinglePageUse.push( ...overviewCategoryExamples.examples );\n\tconst otherExamples = examples.filter( ( example ) => {\n\t\treturn (\n\t\t\texample.category !== 'overview' &&\n\t\t\t! overviewCategoryExamples.examples.find(\n\t\t\t\t( overviewExample ) => overviewExample.name === example.name\n\t\t\t)\n\t\t);\n\t} );\n\texamplesForSinglePageUse.push( ...otherExamples );\n\n\treturn examplesForSinglePageUse;\n}\n\n/**\n * Applies a block variation to each example by updating its attributes.\n *\n * @param {Array} examples Array of examples\n * @param {string} variation Block variation name.\n * @return {Array} Updated examples with variation applied.\n */\nfunction applyBlockVariationsToExamples( examples, variation ) {\n\tif ( ! variation ) {\n\t\treturn examples;\n\t}\n\treturn examples.map( ( example ) => {\n\t\treturn {\n\t\t\t...example,\n\t\t\tvariation,\n\t\t\tblocks: Array.isArray( example.blocks )\n\t\t\t\t? example.blocks.map( ( block ) => ( {\n\t\t\t\t\t\t...block,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t...block.attributes,\n\t\t\t\t\t\t\tstyle: undefined,\n\t\t\t\t\t\t\tclassName: `is-style-${ variation }`,\n\t\t\t\t\t\t},\n\t\t\t\t } ) )\n\t\t\t\t: {\n\t\t\t\t\t\t...example.blocks,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t...example.blocks.attributes,\n\t\t\t\t\t\t\tstyle: undefined,\n\t\t\t\t\t\t\tclassName: `is-style-${ variation }`,\n\t\t\t\t\t\t},\n\t\t\t\t },\n\t\t};\n\t} );\n}\n\nfunction StyleBook(\n\t{\n\t\tisSelected,\n\t\tonClick,\n\t\tonSelect,\n\t\tshowTabs = true,\n\t\tuserConfig = {},\n\t\tpath = '',\n\t},\n\tref\n) {\n\tconst textColor = useStyle( 'color.text' );\n\tconst backgroundColor = useStyle( 'color.background' );\n\tconst colors = useMultiOriginPalettes();\n\tconst examples = useMemo( () => getExamples( colors ), [ colors ] );\n\tconst tabs = useMemo(\n\t\t() =>\n\t\t\tgetTopLevelStyleBookCategories().filter( ( category ) =>\n\t\t\t\texamples.some(\n\t\t\t\t\t( example ) => example.category === category.slug\n\t\t\t\t)\n\t\t\t),\n\t\t[ examples ]\n\t);\n\n\tconst examplesForSinglePageUse = getExamplesForSinglePageUse( examples );\n\n\tconst { base: baseConfig } = useGlobalStyles();\n\tconst goTo = getStyleBookNavigationFromPath( path );\n\n\tconst mergedConfig = useMemo( () => {\n\t\tif ( ! isObjectEmpty( userConfig ) && ! isObjectEmpty( baseConfig ) ) {\n\t\t\treturn mergeGlobalStyles( baseConfig, userConfig );\n\t\t}\n\t\treturn {};\n\t}, [ baseConfig, userConfig ] );\n\n\tconst originalSettings = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSettings(),\n\t\t[]\n\t);\n\tconst [ globalStyles ] = useGlobalStylesOutputWithConfig( mergedConfig );\n\n\tconst settings = useMemo(\n\t\t() => ( {\n\t\t\t...originalSettings,\n\t\t\tstyles:\n\t\t\t\t! isObjectEmpty( globalStyles ) && ! isObjectEmpty( userConfig )\n\t\t\t\t\t? globalStyles\n\t\t\t\t\t: originalSettings.styles,\n\t\t\tisPreviewMode: true,\n\t\t} ),\n\t\t[ globalStyles, originalSettings, userConfig ]\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tref={ ref }\n\t\t\tclassName={ clsx( 'editor-style-book', {\n\t\t\t\t'is-button': !! onClick,\n\t\t\t} ) }\n\t\t\tstyle={ {\n\t\t\t\tcolor: textColor,\n\t\t\t\tbackground: backgroundColor,\n\t\t\t} }\n\t\t>\n\t\t\t{ showTabs ? (\n\t\t\t\t<Tabs>\n\t\t\t\t\t<div className=\"editor-style-book__tablist-container\">\n\t\t\t\t\t\t<Tabs.TabList>\n\t\t\t\t\t\t\t{ tabs.map( ( tab ) => (\n\t\t\t\t\t\t\t\t<Tabs.Tab tabId={ tab.slug } key={ tab.slug }>\n\t\t\t\t\t\t\t\t\t{ tab.title }\n\t\t\t\t\t\t\t\t</Tabs.Tab>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</Tabs.TabList>\n\t\t\t\t\t</div>\n\t\t\t\t\t{ tabs.map( ( tab ) => {\n\t\t\t\t\t\tconst categoryDefinition = tab.slug\n\t\t\t\t\t\t\t? getTopLevelStyleBookCategories().find(\n\t\t\t\t\t\t\t\t\t( _category ) => _category.slug === tab.slug\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\tconst filteredExamples = categoryDefinition\n\t\t\t\t\t\t\t? getExamplesByCategory(\n\t\t\t\t\t\t\t\t\tcategoryDefinition,\n\t\t\t\t\t\t\t\t\texamples\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: { examples };\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tabs.TabPanel\n\t\t\t\t\t\t\t\tkey={ tab.slug }\n\t\t\t\t\t\t\t\ttabId={ tab.slug }\n\t\t\t\t\t\t\t\tfocusable={ false }\n\t\t\t\t\t\t\t\tclassName=\"editor-style-book__tabpanel\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<StyleBookBody\n\t\t\t\t\t\t\t\t\tcategory={ tab.slug }\n\t\t\t\t\t\t\t\t\texamples={ filteredExamples }\n\t\t\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\t\t\t\t\tsettings={ settings }\n\t\t\t\t\t\t\t\t\ttitle={ tab.title }\n\t\t\t\t\t\t\t\t\tgoTo={ goTo }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Tabs.TabPanel>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</Tabs>\n\t\t\t) : (\n\t\t\t\t<StyleBookBody\n\t\t\t\t\texamples={ { examples: examplesForSinglePageUse } }\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\tonClick={ onClick }\n\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\tsettings={ settings }\n\t\t\t\t\tgoTo={ goTo }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</div>\n\t);\n}\n\n/**\n * Style Book Preview component renders the stylebook without the Editor dependency.\n *\n * @param {Object} props Component props.\n * @param {string} props.path Current path in global styles.\n * @param {Function} props.onPathChange Callback when the path changes.\n * @param {Object} props.userConfig User configuration.\n * @param {boolean} props.isStatic Whether the stylebook is static or clickable.\n * @return {Object} Style Book Preview component.\n */\nexport const StyleBookPreview = ( {\n\tuserConfig = {},\n\tisStatic = false,\n\tpath,\n\tonPathChange,\n} ) => {\n\tconst editorSettings = useSelect(\n\t\t( select ) => select( editorStore ).getEditorSettings(),\n\t\t[]\n\t);\n\n\tconst canUserUploadMedia = useSelect(\n\t\t( select ) =>\n\t\t\tselect( coreStore ).canUser( 'create', {\n\t\t\t\tkind: 'postType',\n\t\t\t\tname: 'attachment',\n\t\t\t} ),\n\t\t[]\n\t);\n\n\t// Update block editor settings because useMultipleOriginColorsAndGradients fetch colours from there.\n\tuseEffect( () => {\n\t\tdispatch( blockEditorStore ).updateSettings( {\n\t\t\t...editorSettings,\n\t\t\tmediaUpload: canUserUploadMedia ? uploadMedia : undefined,\n\t\t} );\n\t}, [ editorSettings, canUserUploadMedia ] );\n\n\tconst [ internalPath, setInternalPath ] = useState( '/' );\n\tconst section = path ?? internalPath;\n\tconst onChangeSection = onPathChange ?? setInternalPath;\n\n\tconst isSelected = ( blockName ) => {\n\t\t// Match '/blocks/core%2Fbutton' and\n\t\t// '/blocks/core%2Fbutton/typography', but not\n\t\t// '/blocks/core%2Fbuttons'.\n\t\treturn (\n\t\t\tsection === `/blocks/${ encodeURIComponent( blockName ) }` ||\n\t\t\tsection.startsWith(\n\t\t\t\t`/blocks/${ encodeURIComponent( blockName ) }/`\n\t\t\t)\n\t\t);\n\t};\n\n\tconst onSelect = ( blockName, isBlockVariation = false ) => {\n\t\tif (\n\t\t\tSTYLE_BOOK_COLOR_GROUPS.find(\n\t\t\t\t( group ) => group.slug === blockName\n\t\t\t)\n\t\t) {\n\t\t\t// Go to color palettes Global Styles.\n\t\t\tonChangeSection( '/colors/palette' );\n\t\t\treturn;\n\t\t}\n\t\tif ( blockName === 'typography' ) {\n\t\t\t// Go to typography Global Styles.\n\t\t\tonChangeSection( '/typography' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isBlockVariation ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Now go to the selected block.\n\t\tonChangeSection( `/blocks/${ encodeURIComponent( blockName ) }` );\n\t};\n\n\tconst colors = useMultiOriginPalettes();\n\tconst examples = getExamples( colors );\n\tconst examplesForSinglePageUse = getExamplesForSinglePageUse( examples );\n\n\tlet previewCategory = null;\n\tlet blockVariation = null;\n\tif ( section.includes( '/colors' ) ) {\n\t\tpreviewCategory = 'colors';\n\t} else if ( section.includes( '/typography' ) ) {\n\t\tpreviewCategory = 'text';\n\t} else if ( section.includes( '/blocks' ) ) {\n\t\tpreviewCategory = 'blocks';\n\t\tlet blockName = decodeURIComponent( section ).split( '/blocks/' )[ 1 ];\n\n\t\t// The blockName can contain variations, if so, extract the variation.\n\t\tif ( blockName?.includes( '/variations' ) ) {\n\t\t\t[ blockName, blockVariation ] = blockName.split( '/variations/' );\n\t\t}\n\n\t\tif (\n\t\t\tblockName &&\n\t\t\texamples.find( ( example ) => example.name === blockName )\n\t\t) {\n\t\t\tpreviewCategory = blockName;\n\t\t}\n\t} else if ( ! isStatic ) {\n\t\tpreviewCategory = 'overview';\n\t}\n\tconst categoryDefinition = STYLE_BOOK_PREVIEW_CATEGORIES.find(\n\t\t( category ) => category.slug === previewCategory\n\t);\n\n\tconst filteredExamples = useMemo( () => {\n\t\t// If there's no category definition there may be a single block.\n\t\tif ( ! categoryDefinition ) {\n\t\t\treturn {\n\t\t\t\texamples: [\n\t\t\t\t\texamples.find(\n\t\t\t\t\t\t( example ) => example.name === previewCategory\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\treturn getExamplesByCategory( categoryDefinition, examples );\n\t}, [ categoryDefinition, examples, previewCategory ] );\n\n\tconst displayedExamples = useMemo( () => {\n\t\t// If there's no preview category, show all examples.\n\t\tif ( ! previewCategory ) {\n\t\t\treturn { examples: examplesForSinglePageUse };\n\t\t}\n\n\t\tif ( blockVariation ) {\n\t\t\treturn {\n\t\t\t\texamples: applyBlockVariationsToExamples(\n\t\t\t\t\tfilteredExamples.examples,\n\t\t\t\t\tblockVariation\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\treturn filteredExamples;\n\t}, [\n\t\tpreviewCategory,\n\t\texamplesForSinglePageUse,\n\t\tblockVariation,\n\t\tfilteredExamples,\n\t] );\n\n\tconst { base: baseConfig } = useGlobalStyles();\n\tconst goTo = getStyleBookNavigationFromPath( section );\n\n\tconst mergedConfig = useMemo( () => {\n\t\tif ( ! isObjectEmpty( userConfig ) && ! isObjectEmpty( baseConfig ) ) {\n\t\t\treturn mergeGlobalStyles( baseConfig, userConfig );\n\t\t}\n\t\treturn {};\n\t}, [ baseConfig, userConfig ] );\n\n\tconst [ globalStyles ] = useGlobalStylesOutputWithConfig( mergedConfig );\n\n\tconst settings = useMemo(\n\t\t() => ( {\n\t\t\t...editorSettings,\n\t\t\tstyles:\n\t\t\t\t! isObjectEmpty( globalStyles ) && ! isObjectEmpty( userConfig )\n\t\t\t\t\t? globalStyles\n\t\t\t\t\t: editorSettings.styles,\n\t\t\tisPreviewMode: true,\n\t\t} ),\n\t\t[ globalStyles, editorSettings, userConfig ]\n\t);\n\n\treturn (\n\t\t<div className=\"editor-style-book\">\n\t\t\t<BlockEditorProvider settings={ settings }>\n\t\t\t\t<GlobalStylesRenderer disableRootPadding />\n\t\t\t\t<StyleBookBody\n\t\t\t\t\texamples={ displayedExamples }\n\t\t\t\t\tsettings={ settings }\n\t\t\t\t\tgoTo={ goTo }\n\t\t\t\t\tisSelected={ ! isStatic ? isSelected : null }\n\t\t\t\t\tonSelect={ ! isStatic ? onSelect : null }\n\t\t\t\t/>\n\t\t\t</BlockEditorProvider>\n\t\t</div>\n\t);\n};\n\nexport const StyleBookBody = ( {\n\texamples,\n\tisSelected,\n\tonClick,\n\tonSelect,\n\tsettings,\n\ttitle,\n\tgoTo,\n} ) => {\n\tconst [ isFocused, setIsFocused ] = useState( false );\n\tconst [ hasIframeLoaded, setHasIframeLoaded ] = useState( false );\n\tconst iframeRef = useRef( null );\n\t// The presence of an `onClick` prop indicates that the Style Book is being used as a button.\n\t// In this case, add additional props to the iframe to make it behave like a button.\n\tconst buttonModeProps = {\n\t\trole: 'button',\n\t\tonFocus: () => setIsFocused( true ),\n\t\tonBlur: () => setIsFocused( false ),\n\t\tonKeyDown: ( event ) => {\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { keyCode } = event;\n\t\t\tif ( onClick && ( keyCode === ENTER || keyCode === SPACE ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tonClick( event );\n\t\t\t}\n\t\t},\n\t\tonClick: ( event ) => {\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( onClick ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tonClick( event );\n\t\t\t}\n\t\t},\n\t\treadonly: true,\n\t};\n\n\tconst handleLoad = () => setHasIframeLoaded( true );\n\tuseLayoutEffect( () => {\n\t\tif ( hasIframeLoaded && iframeRef.current && goTo?.top ) {\n\t\t\tscrollToSection( 'top', iframeRef.current );\n\t\t}\n\t}, [ goTo?.top, hasIframeLoaded ] );\n\n\treturn (\n\t\t<Iframe\n\t\t\tonLoad={ handleLoad }\n\t\t\tref={ iframeRef }\n\t\t\tclassName={ clsx( 'editor-style-book__iframe', {\n\t\t\t\t'is-focused': isFocused && !! onClick,\n\t\t\t\t'is-button': !! onClick,\n\t\t\t} ) }\n\t\t\tname=\"style-book-canvas\"\n\t\t\ttabIndex={ 0 }\n\t\t\t{ ...( onClick ? buttonModeProps : {} ) }\n\t\t>\n\t\t\t<EditorStyles styles={ settings.styles } />\n\t\t\t<style>\n\t\t\t\t{ STYLE_BOOK_IFRAME_STYLES }\n\t\t\t\t{ !! onClick &&\n\t\t\t\t\t'body { cursor: pointer; } body * { pointer-events: none; }' }\n\t\t\t</style>\n\t\t\t<Examples\n\t\t\t\tclassName=\"editor-style-book__examples\"\n\t\t\t\tfilteredExamples={ examples }\n\t\t\t\tlabel={\n\t\t\t\t\ttitle\n\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t// translators: %s: Category of blocks, e.g. Text.\n\t\t\t\t\t\t\t\t__( 'Examples of blocks in the %s category' ),\n\t\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: __( 'Examples of blocks' )\n\t\t\t\t}\n\t\t\t\tisSelected={ isSelected }\n\t\t\t\tonSelect={ onSelect }\n\t\t\t\tkey={ title }\n\t\t\t/>\n\t\t</Iframe>\n\t);\n};\n\nconst Examples = memo(\n\t( { className, filteredExamples, label, isSelected, onSelect } ) => {\n\t\treturn (\n\t\t\t<Composite\n\t\t\t\torientation=\"vertical\"\n\t\t\t\tclassName={ className }\n\t\t\t\taria-label={ label }\n\t\t\t\trole=\"grid\"\n\t\t\t>\n\t\t\t\t{ !! filteredExamples?.examples?.length &&\n\t\t\t\t\tfilteredExamples.examples.map( ( example ) => (\n\t\t\t\t\t\t<Example\n\t\t\t\t\t\t\tkey={ example.name }\n\t\t\t\t\t\t\tid={ `example-${ example.name }` }\n\t\t\t\t\t\t\ttitle={ example.title }\n\t\t\t\t\t\t\tcontent={ example.content }\n\t\t\t\t\t\t\tblocks={ example.blocks }\n\t\t\t\t\t\t\tisSelected={ isSelected?.( example.name ) }\n\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t!! onSelect\n\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\tonSelect(\n\t\t\t\t\t\t\t\t\t\t\t\texample.name,\n\t\t\t\t\t\t\t\t\t\t\t\t!! example.variation\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\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{ !! filteredExamples?.subcategories?.length &&\n\t\t\t\t\tfilteredExamples.subcategories.map( ( subcategory ) => (\n\t\t\t\t\t\t<Composite.Group\n\t\t\t\t\t\t\tclassName=\"editor-style-book__subcategory\"\n\t\t\t\t\t\t\tkey={ `subcategory-${ subcategory.slug }` }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Composite.GroupLabel>\n\t\t\t\t\t\t\t\t<h2 className=\"editor-style-book__subcategory-title\">\n\t\t\t\t\t\t\t\t\t{ subcategory.title }\n\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t</Composite.GroupLabel>\n\t\t\t\t\t\t\t<Subcategory\n\t\t\t\t\t\t\t\texamples={ subcategory.examples }\n\t\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Composite.Group>\n\t\t\t\t\t) ) }\n\t\t\t</Composite>\n\t\t);\n\t}\n);\n\nconst Subcategory = ( { examples, isSelected, onSelect } ) => {\n\treturn (\n\t\t!! examples?.length &&\n\t\texamples.map( ( example ) => (\n\t\t\t<Example\n\t\t\t\tkey={ example.name }\n\t\t\t\tid={ `example-${ example.name }` }\n\t\t\t\ttitle={ example.title }\n\t\t\t\tcontent={ example.content }\n\t\t\t\tblocks={ example.blocks }\n\t\t\t\tisSelected={ isSelected?.( example.name ) }\n\t\t\t\tonClick={ !! onSelect ? () => onSelect( example.name ) : null }\n\t\t\t/>\n\t\t) )\n\t);\n};\n\nconst disabledExamples = [ 'example-duotones' ];\n\nconst Example = ( { id, title, blocks, isSelected, onClick, content } ) => {\n\tconst originalSettings = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSettings(),\n\t\t[]\n\t);\n\tconst settings = useMemo(\n\t\t() => ( {\n\t\t\t...originalSettings,\n\t\t\tfocusMode: false, // Disable \"Spotlight mode\".\n\t\t\tisPreviewMode: true,\n\t\t} ),\n\t\t[ originalSettings ]\n\t);\n\n\t// Cache the list of blocks to avoid additional processing when the component is re-rendered.\n\tconst renderedBlocks = useMemo(\n\t\t() => ( Array.isArray( blocks ) ? blocks : [ blocks ] ),\n\t\t[ blocks ]\n\t);\n\n\tconst disabledProps =\n\t\tdisabledExamples.includes( id ) || ! onClick\n\t\t\t? {\n\t\t\t\t\tdisabled: true,\n\t\t\t\t\taccessibleWhenDisabled: !! onClick,\n\t\t\t }\n\t\t\t: {};\n\n\treturn (\n\t\t<div role=\"row\">\n\t\t\t<div role=\"gridcell\">\n\t\t\t\t<Composite.Item\n\t\t\t\t\tclassName={ clsx( 'editor-style-book__example', {\n\t\t\t\t\t\t'is-selected': isSelected,\n\t\t\t\t\t\t'is-disabled-example': !! disabledProps?.disabled,\n\t\t\t\t\t} ) }\n\t\t\t\t\tid={ id }\n\t\t\t\t\taria-label={\n\t\t\t\t\t\t!! onClick\n\t\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t\t// translators: %s: Title of a block, e.g. Heading.\n\t\t\t\t\t\t\t\t\t__( 'Open %s styles in Styles panel' ),\n\t\t\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\trender={ <div /> }\n\t\t\t\t\trole={ !! onClick ? 'button' : null }\n\t\t\t\t\tonClick={ onClick }\n\t\t\t\t\t{ ...disabledProps }\n\t\t\t\t>\n\t\t\t\t\t<span className=\"editor-style-book__example-title\">\n\t\t\t\t\t\t{ title }\n\t\t\t\t\t</span>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"editor-style-book__example-preview\"\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t>\n\t\t\t\t\t\t<Disabled className=\"editor-style-book__example-preview__content\">\n\t\t\t\t\t\t\t{ content ? (\n\t\t\t\t\t\t\t\tcontent\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ExperimentalBlockEditorProvider\n\t\t\t\t\t\t\t\t\tvalue={ renderedBlocks }\n\t\t\t\t\t\t\t\t\tsettings={ settings }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EditorStyles />\n\t\t\t\t\t\t\t\t\t<BlockList renderAppender={ false } />\n\t\t\t\t\t\t\t\t</ExperimentalBlockEditorProvider>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Disabled>\n\t\t\t\t\t</div>\n\t\t\t\t</Composite.Item>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default forwardRef( StyleBook );\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tDisabled,\n\tComposite,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { __, _x, sprintf } from '@wordpress/i18n';\nimport {\n\tBlockList,\n\tprivateApis as blockEditorPrivateApis,\n\tstore as blockEditorStore,\n\tuseSettings,\n\tBlockEditorProvider,\n\t__unstableEditorStyles as EditorStyles,\n\t__unstableIframe as Iframe,\n\t__experimentalUseMultipleOriginColorsAndGradients as useMultipleOriginColorsAndGradients,\n} from '@wordpress/block-editor';\nimport { useSelect, dispatch } from '@wordpress/data';\nimport { mergeGlobalStyles } from '@wordpress/global-styles-engine';\nimport {\n\tuseMemo,\n\tuseState,\n\tmemo,\n\tuseRef,\n\tuseLayoutEffect,\n\tuseEffect,\n\tforwardRef,\n} from '@wordpress/element';\nimport { ENTER, SPACE } from '@wordpress/keycodes';\nimport { uploadMedia } from '@wordpress/media-utils';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../../lock-unlock';\nimport { STYLE_BOOK_IFRAME_STYLES } from './constants';\nimport {\n\tgetExamplesByCategory,\n\tgetTopLevelStyleBookCategories,\n} from './categories';\nimport { getExamples } from './examples';\nimport { GlobalStylesRenderer } from '../global-styles-renderer';\nimport {\n\tSTYLE_BOOK_COLOR_GROUPS,\n\tSTYLE_BOOK_PREVIEW_CATEGORIES,\n} from '../style-book/constants';\nimport { useGlobalStylesOutputWithConfig } from '../../hooks/use-global-styles-output';\nimport { useStyle, useGlobalStyles } from '../global-styles';\nimport { store as editorStore } from '../../store';\n\nconst { ExperimentalBlockEditorProvider } = unlock( blockEditorPrivateApis );\nconst { Tabs } = unlock( componentsPrivateApis );\n\nfunction isObjectEmpty( object ) {\n\treturn ! object || Object.keys( object ).length === 0;\n}\n\n/**\n * Scrolls to a section within an iframe.\n *\n * @param {string} anchorId The id of the element to scroll to.\n * @param {HTMLIFrameElement} iframe The target iframe.\n */\nconst scrollToSection = ( anchorId, iframe ) => {\n\tif ( ! anchorId || ! iframe || ! iframe?.contentDocument ) {\n\t\treturn;\n\t}\n\n\tconst element =\n\t\tanchorId === 'top'\n\t\t\t? iframe.contentDocument.body\n\t\t\t: iframe.contentDocument.getElementById( anchorId );\n\tif ( element ) {\n\t\telement.scrollIntoView( {\n\t\t\tbehavior: 'smooth',\n\t\t} );\n\t}\n};\n\n/**\n * Parses a Block Editor navigation path to build a style book navigation path.\n * The object can be extended to include a category, representing a style book tab/section.\n *\n * @param {string} path An internal Block Editor navigation path.\n * @return {null|{block: string}} An object containing the example to navigate to.\n */\nconst getStyleBookNavigationFromPath = ( path ) => {\n\tif ( path && typeof path === 'string' ) {\n\t\tif (\n\t\t\tpath === '/' ||\n\t\t\tpath.startsWith( '/typography' ) ||\n\t\t\tpath.startsWith( '/colors' ) ||\n\t\t\tpath.startsWith( '/blocks' )\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttop: true,\n\t\t\t};\n\t\t}\n\t}\n\treturn null;\n};\n\n/**\n * Retrieves colors, gradients, and duotone filters from Global Styles.\n * The inclusion of default (Core) palettes is controlled by the relevant\n * theme.json property e.g. defaultPalette, defaultGradients, defaultDuotone.\n *\n * @return {Object} Object containing properties for each type of palette.\n */\nfunction useMultiOriginPalettes() {\n\tconst { colors, gradients } = useMultipleOriginColorsAndGradients();\n\n\t// Add duotone filters to the palettes data.\n\tconst [\n\t\tshouldDisplayDefaultDuotones,\n\t\tcustomDuotones,\n\t\tthemeDuotones,\n\t\tdefaultDuotones,\n\t] = useSettings(\n\t\t'color.defaultDuotone',\n\t\t'color.duotone.custom',\n\t\t'color.duotone.theme',\n\t\t'color.duotone.default'\n\t);\n\n\tconst palettes = useMemo( () => {\n\t\tconst result = { colors, gradients, duotones: [] };\n\n\t\tif ( themeDuotones && themeDuotones.length ) {\n\t\t\tresult.duotones.push( {\n\t\t\t\tname: _x(\n\t\t\t\t\t'Theme',\n\t\t\t\t\t'Indicates these duotone filters come from the theme.'\n\t\t\t\t),\n\t\t\t\tslug: 'theme',\n\t\t\t\tduotones: themeDuotones,\n\t\t\t} );\n\t\t}\n\n\t\tif (\n\t\t\tshouldDisplayDefaultDuotones &&\n\t\t\tdefaultDuotones &&\n\t\t\tdefaultDuotones.length\n\t\t) {\n\t\t\tresult.duotones.push( {\n\t\t\t\tname: _x(\n\t\t\t\t\t'Default',\n\t\t\t\t\t'Indicates these duotone filters come from WordPress.'\n\t\t\t\t),\n\t\t\t\tslug: 'default',\n\t\t\t\tduotones: defaultDuotones,\n\t\t\t} );\n\t\t}\n\t\tif ( customDuotones && customDuotones.length ) {\n\t\t\tresult.duotones.push( {\n\t\t\t\tname: _x(\n\t\t\t\t\t'Custom',\n\t\t\t\t\t'Indicates these doutone filters are created by the user.'\n\t\t\t\t),\n\t\t\t\tslug: 'custom',\n\t\t\t\tduotones: customDuotones,\n\t\t\t} );\n\t\t}\n\n\t\treturn result;\n\t}, [\n\t\tcolors,\n\t\tgradients,\n\t\tcustomDuotones,\n\t\tthemeDuotones,\n\t\tdefaultDuotones,\n\t\tshouldDisplayDefaultDuotones,\n\t] );\n\n\treturn palettes;\n}\n\n/**\n * Get deduped examples for single page stylebook.\n * @param {Array} examples Array of examples.\n * @return {Array} Deduped examples.\n */\nexport function getExamplesForSinglePageUse( examples ) {\n\tconst examplesForSinglePageUse = [];\n\tconst overviewCategoryExamples = getExamplesByCategory(\n\t\t{ slug: 'overview' },\n\t\texamples\n\t);\n\texamplesForSinglePageUse.push( ...overviewCategoryExamples.examples );\n\tconst otherExamples = examples.filter( ( example ) => {\n\t\treturn (\n\t\t\texample.category !== 'overview' &&\n\t\t\t! overviewCategoryExamples.examples.find(\n\t\t\t\t( overviewExample ) => overviewExample.name === example.name\n\t\t\t)\n\t\t);\n\t} );\n\texamplesForSinglePageUse.push( ...otherExamples );\n\n\treturn examplesForSinglePageUse;\n}\n\n/**\n * Applies a block variation to each example by updating its attributes.\n *\n * @param {Array} examples Array of examples\n * @param {string} variation Block variation name.\n * @return {Array} Updated examples with variation applied.\n */\nfunction applyBlockVariationsToExamples( examples, variation ) {\n\tif ( ! variation ) {\n\t\treturn examples;\n\t}\n\treturn examples.map( ( example ) => {\n\t\treturn {\n\t\t\t...example,\n\t\t\tvariation,\n\t\t\tblocks: Array.isArray( example.blocks )\n\t\t\t\t? example.blocks.map( ( block ) => ( {\n\t\t\t\t\t\t...block,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t...block.attributes,\n\t\t\t\t\t\t\tstyle: undefined,\n\t\t\t\t\t\t\tclassName: `is-style-${ variation }`,\n\t\t\t\t\t\t},\n\t\t\t\t } ) )\n\t\t\t\t: {\n\t\t\t\t\t\t...example.blocks,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t...example.blocks.attributes,\n\t\t\t\t\t\t\tstyle: undefined,\n\t\t\t\t\t\t\tclassName: `is-style-${ variation }`,\n\t\t\t\t\t\t},\n\t\t\t\t },\n\t\t};\n\t} );\n}\n\nfunction StyleBook(\n\t{\n\t\tisSelected,\n\t\tonClick,\n\t\tonSelect,\n\t\tshowTabs = true,\n\t\tuserConfig = {},\n\t\tpath = '',\n\t},\n\tref\n) {\n\tconst textColor = useStyle( 'color.text' );\n\tconst backgroundColor = useStyle( 'color.background' );\n\tconst colors = useMultiOriginPalettes();\n\tconst examples = useMemo( () => getExamples( colors ), [ colors ] );\n\tconst tabs = useMemo(\n\t\t() =>\n\t\t\tgetTopLevelStyleBookCategories().filter( ( category ) =>\n\t\t\t\texamples.some(\n\t\t\t\t\t( example ) => example.category === category.slug\n\t\t\t\t)\n\t\t\t),\n\t\t[ examples ]\n\t);\n\n\tconst examplesForSinglePageUse = getExamplesForSinglePageUse( examples );\n\n\tconst { base: baseConfig } = useGlobalStyles();\n\tconst goTo = getStyleBookNavigationFromPath( path );\n\n\tconst mergedConfig = useMemo( () => {\n\t\tif ( ! isObjectEmpty( userConfig ) && ! isObjectEmpty( baseConfig ) ) {\n\t\t\treturn mergeGlobalStyles( baseConfig, userConfig );\n\t\t}\n\t\treturn {};\n\t}, [ baseConfig, userConfig ] );\n\n\tconst originalSettings = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSettings(),\n\t\t[]\n\t);\n\tconst [ globalStyles ] = useGlobalStylesOutputWithConfig( mergedConfig );\n\n\tconst settings = useMemo(\n\t\t() => ( {\n\t\t\t...originalSettings,\n\t\t\tstyles:\n\t\t\t\t! isObjectEmpty( globalStyles ) && ! isObjectEmpty( userConfig )\n\t\t\t\t\t? globalStyles\n\t\t\t\t\t: originalSettings.styles,\n\t\t\tisPreviewMode: true,\n\t\t} ),\n\t\t[ globalStyles, originalSettings, userConfig ]\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tref={ ref }\n\t\t\tclassName={ clsx( 'editor-style-book', {\n\t\t\t\t'is-button': !! onClick,\n\t\t\t} ) }\n\t\t\tstyle={ {\n\t\t\t\tcolor: textColor,\n\t\t\t\tbackground: backgroundColor,\n\t\t\t} }\n\t\t>\n\t\t\t{ showTabs ? (\n\t\t\t\t<Tabs>\n\t\t\t\t\t<div className=\"editor-style-book__tablist-container\">\n\t\t\t\t\t\t<Tabs.TabList>\n\t\t\t\t\t\t\t{ tabs.map( ( tab ) => (\n\t\t\t\t\t\t\t\t<Tabs.Tab tabId={ tab.slug } key={ tab.slug }>\n\t\t\t\t\t\t\t\t\t{ tab.title }\n\t\t\t\t\t\t\t\t</Tabs.Tab>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</Tabs.TabList>\n\t\t\t\t\t</div>\n\t\t\t\t\t{ tabs.map( ( tab ) => {\n\t\t\t\t\t\tconst categoryDefinition = tab.slug\n\t\t\t\t\t\t\t? getTopLevelStyleBookCategories().find(\n\t\t\t\t\t\t\t\t\t( _category ) => _category.slug === tab.slug\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\tconst filteredExamples = categoryDefinition\n\t\t\t\t\t\t\t? getExamplesByCategory(\n\t\t\t\t\t\t\t\t\tcategoryDefinition,\n\t\t\t\t\t\t\t\t\texamples\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: { examples };\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tabs.TabPanel\n\t\t\t\t\t\t\t\tkey={ tab.slug }\n\t\t\t\t\t\t\t\ttabId={ tab.slug }\n\t\t\t\t\t\t\t\tfocusable={ false }\n\t\t\t\t\t\t\t\tclassName=\"editor-style-book__tabpanel\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<StyleBookBody\n\t\t\t\t\t\t\t\t\tcategory={ tab.slug }\n\t\t\t\t\t\t\t\t\texamples={ filteredExamples }\n\t\t\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\t\t\t\t\tsettings={ settings }\n\t\t\t\t\t\t\t\t\ttitle={ tab.title }\n\t\t\t\t\t\t\t\t\tgoTo={ goTo }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Tabs.TabPanel>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</Tabs>\n\t\t\t) : (\n\t\t\t\t<StyleBookBody\n\t\t\t\t\texamples={ { examples: examplesForSinglePageUse } }\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\tonClick={ onClick }\n\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\tsettings={ settings }\n\t\t\t\t\tgoTo={ goTo }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</div>\n\t);\n}\n\n/**\n * Style Book Preview component renders the stylebook without the Editor dependency.\n *\n * @param {Object} props Component props.\n * @param {string} props.path Current path in global styles.\n * @param {Function} props.onPathChange Callback when the path changes.\n * @param {Object} props.userConfig User configuration.\n * @param {boolean} props.isStatic Whether the stylebook is static or clickable.\n * @param {Object} props.settings Optional editor settings to use instead of the editor store settings.\n * @return {Object} Style Book Preview component.\n */\nexport const StyleBookPreview = ( {\n\tuserConfig = {},\n\tisStatic = false,\n\tpath,\n\tonPathChange,\n\tsettings: settingsProp,\n} ) => {\n\tconst editorSettings = useSelect(\n\t\t( select ) => settingsProp ?? select( editorStore ).getEditorSettings(),\n\t\t[ settingsProp ]\n\t);\n\n\tconst canUserUploadMedia = useSelect(\n\t\t( select ) =>\n\t\t\tselect( coreStore ).canUser( 'create', {\n\t\t\t\tkind: 'postType',\n\t\t\t\tname: 'attachment',\n\t\t\t} ),\n\t\t[]\n\t);\n\n\t// Update block editor settings because useMultipleOriginColorsAndGradients fetch colours from there.\n\tuseEffect( () => {\n\t\tdispatch( blockEditorStore ).updateSettings( {\n\t\t\t...editorSettings,\n\t\t\tmediaUpload: canUserUploadMedia ? uploadMedia : undefined,\n\t\t} );\n\t}, [ editorSettings, canUserUploadMedia ] );\n\n\tconst [ internalPath, setInternalPath ] = useState( '/' );\n\tconst section = path ?? internalPath;\n\tconst onChangeSection = onPathChange ?? setInternalPath;\n\n\tconst isSelected = ( blockName ) => {\n\t\t// Match '/blocks/core%2Fbutton' and\n\t\t// '/blocks/core%2Fbutton/typography', but not\n\t\t// '/blocks/core%2Fbuttons'.\n\t\treturn (\n\t\t\tsection === `/blocks/${ encodeURIComponent( blockName ) }` ||\n\t\t\tsection.startsWith(\n\t\t\t\t`/blocks/${ encodeURIComponent( blockName ) }/`\n\t\t\t)\n\t\t);\n\t};\n\n\tconst onSelect = ( blockName, isBlockVariation = false ) => {\n\t\tif (\n\t\t\tSTYLE_BOOK_COLOR_GROUPS.find(\n\t\t\t\t( group ) => group.slug === blockName\n\t\t\t)\n\t\t) {\n\t\t\t// Go to color palettes Global Styles.\n\t\t\tonChangeSection( '/colors/palette' );\n\t\t\treturn;\n\t\t}\n\t\tif ( blockName === 'typography' ) {\n\t\t\t// Go to typography Global Styles.\n\t\t\tonChangeSection( '/typography' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isBlockVariation ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Now go to the selected block.\n\t\tonChangeSection( `/blocks/${ encodeURIComponent( blockName ) }` );\n\t};\n\n\tconst colors = useMultiOriginPalettes();\n\tconst examples = getExamples( colors );\n\tconst examplesForSinglePageUse = getExamplesForSinglePageUse( examples );\n\n\tlet previewCategory = null;\n\tlet blockVariation = null;\n\tif ( section.includes( '/colors' ) ) {\n\t\tpreviewCategory = 'colors';\n\t} else if ( section.includes( '/typography' ) ) {\n\t\tpreviewCategory = 'text';\n\t} else if ( section.includes( '/blocks' ) ) {\n\t\tpreviewCategory = 'blocks';\n\t\tlet blockName = decodeURIComponent( section ).split( '/blocks/' )[ 1 ];\n\n\t\t// The blockName can contain variations, if so, extract the variation.\n\t\tif ( blockName?.includes( '/variations' ) ) {\n\t\t\t[ blockName, blockVariation ] = blockName.split( '/variations/' );\n\t\t}\n\n\t\tif (\n\t\t\tblockName &&\n\t\t\texamples.find( ( example ) => example.name === blockName )\n\t\t) {\n\t\t\tpreviewCategory = blockName;\n\t\t}\n\t} else if ( ! isStatic ) {\n\t\tpreviewCategory = 'overview';\n\t}\n\tconst categoryDefinition = STYLE_BOOK_PREVIEW_CATEGORIES.find(\n\t\t( category ) => category.slug === previewCategory\n\t);\n\n\tconst filteredExamples = useMemo( () => {\n\t\t// If there's no category definition there may be a single block.\n\t\tif ( ! categoryDefinition ) {\n\t\t\treturn {\n\t\t\t\texamples: [\n\t\t\t\t\texamples.find(\n\t\t\t\t\t\t( example ) => example.name === previewCategory\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\treturn getExamplesByCategory( categoryDefinition, examples );\n\t}, [ categoryDefinition, examples, previewCategory ] );\n\n\tconst displayedExamples = useMemo( () => {\n\t\t// If there's no preview category, show all examples.\n\t\tif ( ! previewCategory ) {\n\t\t\treturn { examples: examplesForSinglePageUse };\n\t\t}\n\n\t\tif ( blockVariation ) {\n\t\t\treturn {\n\t\t\t\texamples: applyBlockVariationsToExamples(\n\t\t\t\t\tfilteredExamples.examples,\n\t\t\t\t\tblockVariation\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\treturn filteredExamples;\n\t}, [\n\t\tpreviewCategory,\n\t\texamplesForSinglePageUse,\n\t\tblockVariation,\n\t\tfilteredExamples,\n\t] );\n\n\tconst { base: baseConfig } = useGlobalStyles();\n\tconst goTo = getStyleBookNavigationFromPath( section );\n\n\tconst mergedConfig = useMemo( () => {\n\t\tif ( ! isObjectEmpty( userConfig ) && ! isObjectEmpty( baseConfig ) ) {\n\t\t\treturn mergeGlobalStyles( baseConfig, userConfig );\n\t\t}\n\t\treturn {};\n\t}, [ baseConfig, userConfig ] );\n\n\tconst [ globalStyles ] = useGlobalStylesOutputWithConfig( mergedConfig );\n\n\tconst settings = useMemo(\n\t\t() => ( {\n\t\t\t...editorSettings,\n\t\t\tstyles:\n\t\t\t\t! isObjectEmpty( globalStyles ) && ! isObjectEmpty( userConfig )\n\t\t\t\t\t? globalStyles\n\t\t\t\t\t: editorSettings.styles,\n\t\t\tisPreviewMode: true,\n\t\t} ),\n\t\t[ globalStyles, editorSettings, userConfig ]\n\t);\n\n\treturn (\n\t\t<div className=\"editor-style-book\">\n\t\t\t<BlockEditorProvider settings={ settings }>\n\t\t\t\t<GlobalStylesRenderer disableRootPadding />\n\t\t\t\t<StyleBookBody\n\t\t\t\t\texamples={ displayedExamples }\n\t\t\t\t\tsettings={ settings }\n\t\t\t\t\tgoTo={ goTo }\n\t\t\t\t\tisSelected={ ! isStatic ? isSelected : null }\n\t\t\t\t\tonSelect={ ! isStatic ? onSelect : null }\n\t\t\t\t/>\n\t\t\t</BlockEditorProvider>\n\t\t</div>\n\t);\n};\n\nexport const StyleBookBody = ( {\n\texamples,\n\tisSelected,\n\tonClick,\n\tonSelect,\n\tsettings,\n\ttitle,\n\tgoTo,\n} ) => {\n\tconst [ isFocused, setIsFocused ] = useState( false );\n\tconst [ hasIframeLoaded, setHasIframeLoaded ] = useState( false );\n\tconst iframeRef = useRef( null );\n\t// The presence of an `onClick` prop indicates that the Style Book is being used as a button.\n\t// In this case, add additional props to the iframe to make it behave like a button.\n\tconst buttonModeProps = {\n\t\trole: 'button',\n\t\tonFocus: () => setIsFocused( true ),\n\t\tonBlur: () => setIsFocused( false ),\n\t\tonKeyDown: ( event ) => {\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { keyCode } = event;\n\t\t\tif ( onClick && ( keyCode === ENTER || keyCode === SPACE ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tonClick( event );\n\t\t\t}\n\t\t},\n\t\tonClick: ( event ) => {\n\t\t\tif ( event.defaultPrevented ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( onClick ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tonClick( event );\n\t\t\t}\n\t\t},\n\t\treadonly: true,\n\t};\n\n\tconst handleLoad = () => setHasIframeLoaded( true );\n\tuseLayoutEffect( () => {\n\t\tif ( hasIframeLoaded && iframeRef.current && goTo?.top ) {\n\t\t\tscrollToSection( 'top', iframeRef.current );\n\t\t}\n\t}, [ goTo?.top, hasIframeLoaded ] );\n\n\treturn (\n\t\t<Iframe\n\t\t\tonLoad={ handleLoad }\n\t\t\tref={ iframeRef }\n\t\t\tclassName={ clsx( 'editor-style-book__iframe', {\n\t\t\t\t'is-focused': isFocused && !! onClick,\n\t\t\t\t'is-button': !! onClick,\n\t\t\t} ) }\n\t\t\tname=\"style-book-canvas\"\n\t\t\ttabIndex={ 0 }\n\t\t\t{ ...( onClick ? buttonModeProps : {} ) }\n\t\t>\n\t\t\t<EditorStyles styles={ settings.styles } />\n\t\t\t<style>\n\t\t\t\t{ STYLE_BOOK_IFRAME_STYLES }\n\t\t\t\t{ !! onClick &&\n\t\t\t\t\t'body { cursor: pointer; } body * { pointer-events: none; }' }\n\t\t\t</style>\n\t\t\t<Examples\n\t\t\t\tclassName=\"editor-style-book__examples\"\n\t\t\t\tfilteredExamples={ examples }\n\t\t\t\tlabel={\n\t\t\t\t\ttitle\n\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t// translators: %s: Category of blocks, e.g. Text.\n\t\t\t\t\t\t\t\t__( 'Examples of blocks in the %s category' ),\n\t\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: __( 'Examples of blocks' )\n\t\t\t\t}\n\t\t\t\tisSelected={ isSelected }\n\t\t\t\tonSelect={ onSelect }\n\t\t\t\tkey={ title }\n\t\t\t/>\n\t\t</Iframe>\n\t);\n};\n\nconst Examples = memo(\n\t( { className, filteredExamples, label, isSelected, onSelect } ) => {\n\t\treturn (\n\t\t\t<Composite\n\t\t\t\torientation=\"vertical\"\n\t\t\t\tclassName={ className }\n\t\t\t\taria-label={ label }\n\t\t\t\trole=\"grid\"\n\t\t\t>\n\t\t\t\t{ !! filteredExamples?.examples?.length &&\n\t\t\t\t\tfilteredExamples.examples.map( ( example ) => (\n\t\t\t\t\t\t<Example\n\t\t\t\t\t\t\tkey={ example.name }\n\t\t\t\t\t\t\tid={ `example-${ example.name }` }\n\t\t\t\t\t\t\ttitle={ example.title }\n\t\t\t\t\t\t\tcontent={ example.content }\n\t\t\t\t\t\t\tblocks={ example.blocks }\n\t\t\t\t\t\t\tisSelected={ isSelected?.( example.name ) }\n\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t!! onSelect\n\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\tonSelect(\n\t\t\t\t\t\t\t\t\t\t\t\texample.name,\n\t\t\t\t\t\t\t\t\t\t\t\t!! example.variation\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\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{ !! filteredExamples?.subcategories?.length &&\n\t\t\t\t\tfilteredExamples.subcategories.map( ( subcategory ) => (\n\t\t\t\t\t\t<Composite.Group\n\t\t\t\t\t\t\tclassName=\"editor-style-book__subcategory\"\n\t\t\t\t\t\t\tkey={ `subcategory-${ subcategory.slug }` }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Composite.GroupLabel>\n\t\t\t\t\t\t\t\t<h2 className=\"editor-style-book__subcategory-title\">\n\t\t\t\t\t\t\t\t\t{ subcategory.title }\n\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t</Composite.GroupLabel>\n\t\t\t\t\t\t\t<Subcategory\n\t\t\t\t\t\t\t\texamples={ subcategory.examples }\n\t\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\t\tonSelect={ onSelect }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Composite.Group>\n\t\t\t\t\t) ) }\n\t\t\t</Composite>\n\t\t);\n\t}\n);\n\nconst Subcategory = ( { examples, isSelected, onSelect } ) => {\n\treturn (\n\t\t!! examples?.length &&\n\t\texamples.map( ( example ) => (\n\t\t\t<Example\n\t\t\t\tkey={ example.name }\n\t\t\t\tid={ `example-${ example.name }` }\n\t\t\t\ttitle={ example.title }\n\t\t\t\tcontent={ example.content }\n\t\t\t\tblocks={ example.blocks }\n\t\t\t\tisSelected={ isSelected?.( example.name ) }\n\t\t\t\tonClick={ !! onSelect ? () => onSelect( example.name ) : null }\n\t\t\t/>\n\t\t) )\n\t);\n};\n\nconst disabledExamples = [ 'example-duotones' ];\n\nconst Example = ( { id, title, blocks, isSelected, onClick, content } ) => {\n\tconst originalSettings = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSettings(),\n\t\t[]\n\t);\n\tconst settings = useMemo(\n\t\t() => ( {\n\t\t\t...originalSettings,\n\t\t\tfocusMode: false, // Disable \"Spotlight mode\".\n\t\t\tisPreviewMode: true,\n\t\t} ),\n\t\t[ originalSettings ]\n\t);\n\n\t// Cache the list of blocks to avoid additional processing when the component is re-rendered.\n\tconst renderedBlocks = useMemo(\n\t\t() => ( Array.isArray( blocks ) ? blocks : [ blocks ] ),\n\t\t[ blocks ]\n\t);\n\n\tconst disabledProps =\n\t\tdisabledExamples.includes( id ) || ! onClick\n\t\t\t? {\n\t\t\t\t\tdisabled: true,\n\t\t\t\t\taccessibleWhenDisabled: !! onClick,\n\t\t\t }\n\t\t\t: {};\n\n\treturn (\n\t\t<div role=\"row\">\n\t\t\t<div role=\"gridcell\">\n\t\t\t\t<Composite.Item\n\t\t\t\t\tclassName={ clsx( 'editor-style-book__example', {\n\t\t\t\t\t\t'is-selected': isSelected,\n\t\t\t\t\t\t'is-disabled-example': !! disabledProps?.disabled,\n\t\t\t\t\t} ) }\n\t\t\t\t\tid={ id }\n\t\t\t\t\taria-label={\n\t\t\t\t\t\t!! onClick\n\t\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t\t// translators: %s: Title of a block, e.g. Heading.\n\t\t\t\t\t\t\t\t\t__( 'Open %s styles in Styles panel' ),\n\t\t\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\trender={ <div /> }\n\t\t\t\t\trole={ !! onClick ? 'button' : null }\n\t\t\t\t\tonClick={ onClick }\n\t\t\t\t\t{ ...disabledProps }\n\t\t\t\t>\n\t\t\t\t\t<span className=\"editor-style-book__example-title\">\n\t\t\t\t\t\t{ title }\n\t\t\t\t\t</span>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"editor-style-book__example-preview\"\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t>\n\t\t\t\t\t\t<Disabled className=\"editor-style-book__example-preview__content\">\n\t\t\t\t\t\t\t{ content ? (\n\t\t\t\t\t\t\t\tcontent\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ExperimentalBlockEditorProvider\n\t\t\t\t\t\t\t\t\tvalue={ renderedBlocks }\n\t\t\t\t\t\t\t\t\tsettings={ settings }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EditorStyles />\n\t\t\t\t\t\t\t\t\t<BlockList renderAppender={ false } />\n\t\t\t\t\t\t\t\t</ExperimentalBlockEditorProvider>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Disabled>\n\t\t\t\t\t</div>\n\t\t\t\t</Composite.Item>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default forwardRef( StyleBook );\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,177 @@
1
+ // packages/editor/src/components/sync-connection-error-modal/index.tsx
2
+ import { useSelect, select } from "@wordpress/data";
3
+ import { useCopyToClipboard } from "@wordpress/compose";
4
+ import { serialize } from "@wordpress/blocks";
5
+ import {
6
+ store as coreDataStore,
7
+ privateApis as coreDataPrivateApis
8
+ } from "@wordpress/core-data";
9
+ import { privateApis, store as blockEditorStore } from "@wordpress/block-editor";
10
+ import {
11
+ Button,
12
+ Modal,
13
+ withFilters,
14
+ __experimentalHStack as HStack,
15
+ __experimentalVStack as VStack
16
+ } from "@wordpress/components";
17
+ import { useState, useEffect } from "@wordpress/element";
18
+ import { __, sprintf, _n } from "@wordpress/i18n";
19
+ import { getSyncErrorMessages } from "../../utils/sync-error-messages.mjs";
20
+ import { store as editorStore } from "../../store/index.mjs";
21
+ import { unlock } from "../../lock-unlock.mjs";
22
+ import { useRetryCountdown } from "./use-retry-countdown.mjs";
23
+ import { jsx, jsxs } from "react/jsx-runtime";
24
+ var { BlockCanvasCover } = unlock(privateApis);
25
+ var { retrySyncConnection } = unlock(coreDataPrivateApis);
26
+ var INITIAL_DISCONNECTED_DEBOUNCE_MS = 2e4;
27
+ var DISCONNECTED_DEBOUNCE_MS = 8e3;
28
+ function DefaultSyncConnectionErrorModal(props) {
29
+ const {
30
+ description,
31
+ manualRetry,
32
+ postType,
33
+ secondsRemainingUntilAutoRetry,
34
+ title
35
+ } = props;
36
+ const copyButtonRef = useCopyToClipboard(() => {
37
+ const blocks = select(blockEditorStore).getBlocks();
38
+ return serialize(blocks);
39
+ });
40
+ let retryCountdownText = "";
41
+ let isRetrying = false;
42
+ if (secondsRemainingUntilAutoRetry && secondsRemainingUntilAutoRetry > 0) {
43
+ retryCountdownText = sprintf(
44
+ /* translators: %d: number of seconds until retry */
45
+ _n(
46
+ "Retrying connection in %d second\u2026",
47
+ "Retrying connection in %d seconds\u2026",
48
+ secondsRemainingUntilAutoRetry
49
+ ),
50
+ secondsRemainingUntilAutoRetry
51
+ );
52
+ } else if (0 === secondsRemainingUntilAutoRetry) {
53
+ isRetrying = true;
54
+ retryCountdownText = __("Retrying\u2026");
55
+ }
56
+ let editPostHref = "edit.php";
57
+ if (postType?.slug) {
58
+ editPostHref = `edit.php?post_type=${postType.slug}`;
59
+ }
60
+ return /* @__PURE__ */ jsx(
61
+ Modal,
62
+ {
63
+ overlayClassName: "editor-sync-connection-error-modal",
64
+ isDismissible: false,
65
+ onRequestClose: () => {
66
+ },
67
+ shouldCloseOnClickOutside: false,
68
+ shouldCloseOnEsc: false,
69
+ size: "medium",
70
+ title,
71
+ children: /* @__PURE__ */ jsxs(VStack, { spacing: 6, children: [
72
+ /* @__PURE__ */ jsx("p", { children: description }),
73
+ retryCountdownText && /* @__PURE__ */ jsx("p", { className: "editor-sync-connection-error-modal__retry-countdown", children: retryCountdownText }),
74
+ /* @__PURE__ */ jsxs(HStack, { justify: "right", children: [
75
+ /* @__PURE__ */ jsx(
76
+ Button,
77
+ {
78
+ __next40pxDefaultSize: true,
79
+ href: editPostHref,
80
+ isDestructive: true,
81
+ variant: "tertiary",
82
+ children: sprintf(
83
+ /* translators: %s: Post type name (e.g., "Posts", "Pages"). */
84
+ __("Back to %s"),
85
+ postType?.labels?.name ?? __("Posts")
86
+ )
87
+ }
88
+ ),
89
+ /* @__PURE__ */ jsx(
90
+ Button,
91
+ {
92
+ __next40pxDefaultSize: true,
93
+ ref: copyButtonRef,
94
+ variant: manualRetry ? "secondary" : "primary",
95
+ children: __("Copy Post Content")
96
+ }
97
+ ),
98
+ manualRetry && /* @__PURE__ */ jsx(
99
+ Button,
100
+ {
101
+ __next40pxDefaultSize: true,
102
+ accessibleWhenDisabled: true,
103
+ "aria-disabled": isRetrying,
104
+ disabled: isRetrying,
105
+ isBusy: isRetrying,
106
+ variant: "primary",
107
+ onClick: manualRetry,
108
+ children: __("Retry")
109
+ }
110
+ )
111
+ ] })
112
+ ] })
113
+ }
114
+ );
115
+ }
116
+ var FilteredSyncConnectionErrorModal = globalThis.IS_GUTENBERG_PLUGIN ? withFilters("editor.SyncConnectionErrorModal")(
117
+ DefaultSyncConnectionErrorModal
118
+ ) : DefaultSyncConnectionErrorModal;
119
+ function SyncConnectionErrorModal() {
120
+ const [hasInitialized, setHasInitialized] = useState(false);
121
+ const [showModal, setShowModal] = useState(false);
122
+ const { connectionStatus, isCollaborationEnabled, postType } = useSelect(
123
+ (selectFn) => {
124
+ const currentPostType = selectFn(editorStore).getCurrentPostType();
125
+ return {
126
+ connectionStatus: selectFn(coreDataStore).getSyncConnectionStatus() || null,
127
+ isCollaborationEnabled: selectFn(
128
+ editorStore
129
+ ).isCollaborationEnabledForCurrentPost(),
130
+ postType: currentPostType ? selectFn(coreDataStore).getPostType(currentPostType) : null
131
+ };
132
+ },
133
+ []
134
+ );
135
+ const { onManualRetry, secondsRemaining } = useRetryCountdown(connectionStatus);
136
+ const isConnected = "connected" === connectionStatus?.status;
137
+ useEffect(() => {
138
+ const timeout = setTimeout(() => {
139
+ setHasInitialized(true);
140
+ }, INITIAL_DISCONNECTED_DEBOUNCE_MS);
141
+ return () => clearTimeout(timeout);
142
+ }, []);
143
+ useEffect(() => {
144
+ if (isConnected) {
145
+ setShowModal(false);
146
+ return;
147
+ }
148
+ const timeout = setTimeout(() => {
149
+ setShowModal(true);
150
+ }, DISCONNECTED_DEBOUNCE_MS);
151
+ return () => clearTimeout(timeout);
152
+ }, [isConnected]);
153
+ if (!isCollaborationEnabled || !hasInitialized || !showModal) {
154
+ return null;
155
+ }
156
+ const error = connectionStatus && "error" in connectionStatus ? connectionStatus?.error : void 0;
157
+ const manualRetry = connectionStatus && "canManuallyRetry" in connectionStatus && connectionStatus.canManuallyRetry ? () => {
158
+ onManualRetry();
159
+ retrySyncConnection();
160
+ } : void 0;
161
+ const messages = getSyncErrorMessages(error);
162
+ return /* @__PURE__ */ jsx(BlockCanvasCover.Fill, { children: /* @__PURE__ */ jsx(
163
+ FilteredSyncConnectionErrorModal,
164
+ {
165
+ description: messages.description,
166
+ error,
167
+ manualRetry,
168
+ postType,
169
+ secondsRemainingUntilAutoRetry: secondsRemaining,
170
+ title: messages.title
171
+ }
172
+ ) });
173
+ }
174
+ export {
175
+ SyncConnectionErrorModal
176
+ };
177
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/sync-connection-error-modal/index.tsx"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useSelect, select } from '@wordpress/data';\nimport { useCopyToClipboard } from '@wordpress/compose';\n// @ts-ignore No exported types.\nimport { serialize } from '@wordpress/blocks';\nimport {\n\tstore as coreDataStore,\n\tprivateApis as coreDataPrivateApis,\n\ttype ConnectionError,\n} from '@wordpress/core-data';\n// @ts-expect-error - No type declarations available for @wordpress/block-editor\n// prettier-ignore\nimport { privateApis, store as blockEditorStore } from '@wordpress/block-editor';\nimport {\n\tButton,\n\tModal,\n\twithFilters,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n} from '@wordpress/components';\nimport { useState, useEffect } from '@wordpress/element';\nimport { __, sprintf, _n } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { getSyncErrorMessages } from '../../utils/sync-error-messages';\nimport { store as editorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\nimport { useRetryCountdown } from './use-retry-countdown';\n\nconst { BlockCanvasCover } = unlock( privateApis );\nconst { retrySyncConnection } = unlock( coreDataPrivateApis );\n\n// Debounce time for initial disconnected status to allow connection to establish.\nconst INITIAL_DISCONNECTED_DEBOUNCE_MS = 20000;\n\n// Debounce time for showing the disconnect dialog after the intial connection,\n// allowing brief network interruptions to resolve.\nconst DISCONNECTED_DEBOUNCE_MS = 8000;\n\nexport interface SyncConnectionErrorModalProps {\n\tdescription: string; // Modal description.\n\terror?: ConnectionError; // Error object with a `code` property.\n\tmanualRetry?: () => void; // Callback for when the retry button is clicked.\n\tpostType?: { slug?: string; labels?: { name?: string } } | null; // Current post type object.\n\tsecondsRemainingUntilAutoRetry?: number; // Seconds remaining until the next automatic retry attempt, if applicable.\n\ttitle: string; // Modal title.\n}\n\n/**\n * Default sync connection modal component.\n *\n * Can be replaced or wrapped via the `editor.SyncConnectionErrorModal` filter.\n *\n * @param props - SyncConnectionErrorModalProps.\n */\nfunction DefaultSyncConnectionErrorModal(\n\tprops: SyncConnectionErrorModalProps\n) {\n\tconst {\n\t\tdescription,\n\t\tmanualRetry,\n\t\tpostType,\n\t\tsecondsRemainingUntilAutoRetry,\n\t\ttitle,\n\t} = props;\n\tconst copyButtonRef = useCopyToClipboard( () => {\n\t\tconst blocks = select( blockEditorStore ).getBlocks();\n\t\treturn serialize( blocks );\n\t} );\n\n\tlet retryCountdownText: string = '';\n\tlet isRetrying = false;\n\tif (\n\t\tsecondsRemainingUntilAutoRetry &&\n\t\tsecondsRemainingUntilAutoRetry > 0\n\t) {\n\t\tretryCountdownText = sprintf(\n\t\t\t/* translators: %d: number of seconds until retry */\n\t\t\t_n(\n\t\t\t\t'Retrying connection in %d second\\u2026',\n\t\t\t\t'Retrying connection in %d seconds\\u2026',\n\t\t\t\tsecondsRemainingUntilAutoRetry\n\t\t\t),\n\t\t\tsecondsRemainingUntilAutoRetry\n\t\t);\n\t} else if ( 0 === secondsRemainingUntilAutoRetry ) {\n\t\tisRetrying = true;\n\t\tretryCountdownText = __( 'Retrying\\u2026' );\n\t}\n\n\tlet editPostHref = 'edit.php';\n\tif ( postType?.slug ) {\n\t\teditPostHref = `edit.php?post_type=${ postType.slug }`;\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\toverlayClassName=\"editor-sync-connection-error-modal\"\n\t\t\tisDismissible={ false }\n\t\t\tonRequestClose={ () => {} }\n\t\t\tshouldCloseOnClickOutside={ false }\n\t\t\tshouldCloseOnEsc={ false }\n\t\t\tsize=\"medium\"\n\t\t\ttitle={ title }\n\t\t>\n\t\t\t<VStack spacing={ 6 }>\n\t\t\t\t<p>{ description }</p>\n\t\t\t\t{ retryCountdownText && (\n\t\t\t\t\t<p className=\"editor-sync-connection-error-modal__retry-countdown\">\n\t\t\t\t\t\t{ retryCountdownText }\n\t\t\t\t\t</p>\n\t\t\t\t) }\n\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\thref={ editPostHref }\n\t\t\t\t\t\tisDestructive\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ sprintf(\n\t\t\t\t\t\t\t/* translators: %s: Post type name (e.g., \"Posts\", \"Pages\"). */\n\t\t\t\t\t\t\t__( 'Back to %s' ),\n\t\t\t\t\t\t\tpostType?.labels?.name ?? __( 'Posts' )\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tref={ copyButtonRef }\n\t\t\t\t\t\tvariant={ manualRetry ? 'secondary' : 'primary' }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Copy Post Content' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t\t{ manualRetry && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\taria-disabled={ isRetrying }\n\t\t\t\t\t\t\tdisabled={ isRetrying }\n\t\t\t\t\t\t\tisBusy={ isRetrying }\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\tonClick={ manualRetry }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Retry' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t) }\n\t\t\t\t</HStack>\n\t\t\t</VStack>\n\t\t</Modal>\n\t);\n}\n\n/**\n * Filtered version of the sync connection modal, allowing third-party\n * plugins to replace the default modal via:\n *\n * ```js\n * wp.hooks.addFilter(\n * 'editor.SyncConnectionErrorModal',\n * 'my-plugin/custom-sync-connection-error-modal',\n * ( OriginalComponent ) => ( props ) => {\n * // Return a custom component or wrap the original.\n * return <OriginalComponent { ...props } />;\n * }\n * );\n * ```\n */\n// @ts-ignore\nconst FilteredSyncConnectionErrorModal = globalThis.IS_GUTENBERG_PLUGIN\n\t? withFilters( 'editor.SyncConnectionErrorModal' )(\n\t\t\tDefaultSyncConnectionErrorModal\n\t )\n\t: DefaultSyncConnectionErrorModal;\n\n/**\n * Sync connection modal that displays when any entity reports a disconnection.\n * Uses BlockCanvasCover.Fill to render in the block canvas.\n *\n * @return The modal component or null if not disconnected.\n */\nexport function SyncConnectionErrorModal() {\n\tconst [ hasInitialized, setHasInitialized ] = useState( false );\n\tconst [ showModal, setShowModal ] = useState( false );\n\n\tconst { connectionStatus, isCollaborationEnabled, postType } = useSelect(\n\t\t( selectFn ) => {\n\t\t\tconst currentPostType =\n\t\t\t\tselectFn( editorStore ).getCurrentPostType();\n\t\t\treturn {\n\t\t\t\tconnectionStatus:\n\t\t\t\t\tselectFn( coreDataStore ).getSyncConnectionStatus() || null,\n\t\t\t\tisCollaborationEnabled:\n\t\t\t\t\tselectFn(\n\t\t\t\t\t\teditorStore\n\t\t\t\t\t).isCollaborationEnabledForCurrentPost(),\n\t\t\t\tpostType: currentPostType\n\t\t\t\t\t? selectFn( coreDataStore ).getPostType( currentPostType )\n\t\t\t\t\t: null,\n\t\t\t};\n\t\t},\n\t\t[]\n\t);\n\n\tconst { onManualRetry, secondsRemaining } =\n\t\tuseRetryCountdown( connectionStatus );\n\n\tconst isConnected = 'connected' === connectionStatus?.status;\n\n\t// Set hasInitialized after a debounce to give extra time on initial load.\n\tuseEffect( () => {\n\t\tconst timeout = setTimeout( () => {\n\t\t\tsetHasInitialized( true );\n\t\t}, INITIAL_DISCONNECTED_DEBOUNCE_MS );\n\n\t\treturn () => clearTimeout( timeout );\n\t}, [] );\n\n\tuseEffect( () => {\n\t\tif ( isConnected ) {\n\t\t\tsetShowModal( false );\n\t\t\treturn;\n\t\t}\n\n\t\tconst timeout = setTimeout( () => {\n\t\t\tsetShowModal( true );\n\t\t}, DISCONNECTED_DEBOUNCE_MS );\n\n\t\treturn () => clearTimeout( timeout );\n\t}, [ isConnected ] );\n\n\tif ( ! isCollaborationEnabled || ! hasInitialized || ! showModal ) {\n\t\treturn null;\n\t}\n\n\tconst error =\n\t\tconnectionStatus && 'error' in connectionStatus\n\t\t\t? connectionStatus?.error\n\t\t\t: undefined;\n\tconst manualRetry =\n\t\tconnectionStatus &&\n\t\t'canManuallyRetry' in connectionStatus &&\n\t\tconnectionStatus.canManuallyRetry\n\t\t\t? () => {\n\t\t\t\t\tonManualRetry();\n\t\t\t\t\tretrySyncConnection();\n\t\t\t }\n\t\t\t: undefined;\n\tconst messages = getSyncErrorMessages( error );\n\n\treturn (\n\t\t<BlockCanvasCover.Fill>\n\t\t\t<FilteredSyncConnectionErrorModal\n\t\t\t\tdescription={ messages.description }\n\t\t\t\terror={ error }\n\t\t\t\tmanualRetry={ manualRetry }\n\t\t\t\tpostType={ postType }\n\t\t\t\tsecondsRemainingUntilAutoRetry={ secondsRemaining }\n\t\t\t\ttitle={ messages.title }\n\t\t\t/>\n\t\t</BlockCanvasCover.Fill>\n\t);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ // packages/editor/src/components/sync-connection-error-modal/use-retry-countdown.ts
2
+ import { useState, useEffect } from "@wordpress/element";
3
+ function useRetryCountdown(connectionStatus) {
4
+ const [secondsRemaining, setSecondsRemaining] = useState();
5
+ useEffect(() => {
6
+ if (!connectionStatus) {
7
+ return;
8
+ }
9
+ if ("connected" === connectionStatus.status) {
10
+ setSecondsRemaining(void 0);
11
+ return;
12
+ }
13
+ if ("disconnected" !== connectionStatus.status || !connectionStatus.willAutoRetryInMs) {
14
+ return;
15
+ }
16
+ const { willAutoRetryInMs: retryInMs } = connectionStatus;
17
+ const retryAt = Date.now() + retryInMs;
18
+ setSecondsRemaining(Math.ceil(retryInMs / 1e3));
19
+ const intervalId = setInterval(() => {
20
+ const remaining = Math.ceil((retryAt - Date.now()) / 1e3);
21
+ setSecondsRemaining(Math.max(0, remaining));
22
+ if (remaining <= 0) {
23
+ clearInterval(intervalId);
24
+ }
25
+ }, 1e3);
26
+ return () => clearInterval(intervalId);
27
+ }, [connectionStatus]);
28
+ return {
29
+ onManualRetry: () => setSecondsRemaining(0),
30
+ secondsRemaining
31
+ };
32
+ }
33
+ export {
34
+ useRetryCountdown
35
+ };
36
+ //# sourceMappingURL=use-retry-countdown.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/sync-connection-error-modal/use-retry-countdown.ts"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport type { ConnectionStatus } from '@wordpress/core-data';\nimport { useState, useEffect } from '@wordpress/element';\n\ninterface UseRetryCountdownResult {\n\tonManualRetry: () => void;\n\tsecondsRemaining?: number;\n}\n\nexport function useRetryCountdown(\n\tconnectionStatus?: ConnectionStatus | null\n): UseRetryCountdownResult {\n\tconst [ secondsRemaining, setSecondsRemaining ] = useState< number >();\n\n\tuseEffect( () => {\n\t\tif ( ! connectionStatus ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Only clear countdown when explicitly connected.\n\t\tif ( 'connected' === connectionStatus.status ) {\n\t\t\tsetSecondsRemaining( undefined );\n\t\t\treturn;\n\t\t}\n\n\t\t// For transient states (e.g. 'connecting' during a retry attempt)\n\t\t// or when retryInMs is not yet available, keep the previous\n\t\t// countdown value to avoid a brief flash.\n\t\tif (\n\t\t\t'disconnected' !== connectionStatus.status ||\n\t\t\t! connectionStatus.willAutoRetryInMs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { willAutoRetryInMs: retryInMs } = connectionStatus;\n\t\tconst retryAt = Date.now() + retryInMs;\n\t\tsetSecondsRemaining( Math.ceil( retryInMs / 1000 ) );\n\n\t\tconst intervalId = setInterval( () => {\n\t\t\tconst remaining = Math.ceil( ( retryAt - Date.now() ) / 1000 );\n\t\t\tsetSecondsRemaining( Math.max( 0, remaining ) );\n\t\t\tif ( remaining <= 0 ) {\n\t\t\t\tclearInterval( intervalId );\n\t\t\t}\n\t\t}, 1000 );\n\n\t\treturn () => clearInterval( intervalId );\n\t}, [ connectionStatus ] );\n\n\treturn {\n\t\tonManualRetry: () => setSecondsRemaining( 0 ),\n\t\tsecondsRemaining,\n\t};\n}\n"],
5
+ "mappings": ";AAIA,SAAS,UAAU,iBAAiB;AAO7B,SAAS,kBACf,kBAC0B;AAC1B,QAAM,CAAE,kBAAkB,mBAAoB,IAAI,SAAmB;AAErE,YAAW,MAAM;AAChB,QAAK,CAAE,kBAAmB;AACzB;AAAA,IACD;AAGA,QAAK,gBAAgB,iBAAiB,QAAS;AAC9C,0BAAqB,MAAU;AAC/B;AAAA,IACD;AAKA,QACC,mBAAmB,iBAAiB,UACpC,CAAE,iBAAiB,mBAClB;AACD;AAAA,IACD;AAEA,UAAM,EAAE,mBAAmB,UAAU,IAAI;AACzC,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,wBAAqB,KAAK,KAAM,YAAY,GAAK,CAAE;AAEnD,UAAM,aAAa,YAAa,MAAM;AACrC,YAAM,YAAY,KAAK,MAAQ,UAAU,KAAK,IAAI,KAAM,GAAK;AAC7D,0BAAqB,KAAK,IAAK,GAAG,SAAU,CAAE;AAC9C,UAAK,aAAa,GAAI;AACrB,sBAAe,UAAW;AAAA,MAC3B;AAAA,IACD,GAAG,GAAK;AAER,WAAO,MAAM,cAAe,UAAW;AAAA,EACxC,GAAG,CAAE,gBAAiB,CAAE;AAExB,SAAO;AAAA,IACN,eAAe,MAAM,oBAAqB,CAAE;AAAA,IAC5C;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,167 @@
1
+ // packages/editor/src/components/template-actions-panel/block-theme-content.js
2
+ import { useSelect, useDispatch } from "@wordpress/data";
3
+ import {
4
+ useEntityRecord,
5
+ useEntityBlockEditor,
6
+ store as coreStore
7
+ } from "@wordpress/core-data";
8
+ import { BlockPreview } from "@wordpress/block-editor";
9
+ import {
10
+ PanelBody,
11
+ Button,
12
+ Tooltip,
13
+ __experimentalHStack as HStack,
14
+ __experimentalVStack as VStack
15
+ } from "@wordpress/components";
16
+ import { useState } from "@wordpress/element";
17
+ import { __, sprintf } from "@wordpress/i18n";
18
+ import { decodeEntities } from "@wordpress/html-entities";
19
+ import { store as noticesStore } from "@wordpress/notices";
20
+ import { store as preferencesStore } from "@wordpress/preferences";
21
+ import { store as editorStore } from "../../store/index.mjs";
22
+ import CreateNewTemplateModal from "../post-template/create-new-template-modal.mjs";
23
+ import { SwapTemplateModal } from "../post-template/swap-template-button.mjs";
24
+ import { useAvailableTemplates } from "../post-template/hooks.mjs";
25
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
26
+ function TemplateActionsPanelContent() {
27
+ const templateId = useSelect(
28
+ (select) => select(editorStore).getCurrentTemplateId(),
29
+ []
30
+ );
31
+ const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
32
+ const [isSwapModalOpen, setIsSwapModalOpen] = useState(false);
33
+ const availableTemplates = useAvailableTemplates();
34
+ const hasSwapTargets = !!availableTemplates?.length;
35
+ const {
36
+ onNavigateToEntityRecord,
37
+ canCreateTemplate,
38
+ hasGoBack,
39
+ getEditorSettings
40
+ } = useSelect((select) => {
41
+ const { getEditorSettings: _getEditorSettings } = select(editorStore);
42
+ const editorSettings = _getEditorSettings();
43
+ return {
44
+ onNavigateToEntityRecord: editorSettings.onNavigateToEntityRecord,
45
+ canCreateTemplate: !!select(coreStore).canUser("create", {
46
+ kind: "postType",
47
+ name: "wp_template"
48
+ }),
49
+ hasGoBack: editorSettings.hasOwnProperty(
50
+ "onNavigateToPreviousEntityRecord"
51
+ ),
52
+ getEditorSettings: _getEditorSettings
53
+ };
54
+ }, []);
55
+ const { get: getPreference } = useSelect(preferencesStore);
56
+ const { createSuccessNotice } = useDispatch(noticesStore);
57
+ const { editedRecord: template, hasResolved } = useEntityRecord(
58
+ "postType",
59
+ "wp_template",
60
+ templateId
61
+ );
62
+ const [blocks] = useEntityBlockEditor("postType", "wp_template", {
63
+ id: templateId
64
+ });
65
+ if (!hasResolved) {
66
+ return null;
67
+ }
68
+ const notificationAction = hasGoBack ? [
69
+ {
70
+ label: __("Go back"),
71
+ onClick: () => getEditorSettings().onNavigateToPreviousEntityRecord()
72
+ }
73
+ ] : void 0;
74
+ const mayShowTemplateEditNotice = () => {
75
+ if (!getPreference("core/edit-site", "welcomeGuideTemplate")) {
76
+ createSuccessNotice(
77
+ __(
78
+ "Editing template. Changes made here affect all posts and pages that use the template."
79
+ ),
80
+ { type: "snackbar", actions: notificationAction }
81
+ );
82
+ }
83
+ };
84
+ const templateName = decodeEntities(template.title);
85
+ const previewContent = !!blocks?.length && /* @__PURE__ */ jsx(BlockPreview.Async, { children: /* @__PURE__ */ jsx(BlockPreview, { blocks }) });
86
+ const renderPreview = () => {
87
+ if (!previewContent) {
88
+ return null;
89
+ }
90
+ if (hasSwapTargets) {
91
+ const tooltipText = __("Change template");
92
+ return /* @__PURE__ */ jsx(Tooltip, { text: tooltipText, children: /* @__PURE__ */ jsx(
93
+ "div",
94
+ {
95
+ className: "editor-template-actions-panel__preview",
96
+ role: "button",
97
+ tabIndex: 0,
98
+ "aria-label": tooltipText,
99
+ onClick: () => setIsSwapModalOpen(true),
100
+ onKeyPress: () => setIsSwapModalOpen(true),
101
+ children: previewContent
102
+ }
103
+ ) });
104
+ }
105
+ return /* @__PURE__ */ jsx("div", { className: "editor-template-actions-panel__preview", children: previewContent });
106
+ };
107
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
108
+ /* @__PURE__ */ jsx(
109
+ PanelBody,
110
+ {
111
+ title: sprintf(
112
+ /* translators: %s: template name */
113
+ __("Template: %s"),
114
+ templateName
115
+ ),
116
+ initialOpen: false,
117
+ children: /* @__PURE__ */ jsxs(VStack, { children: [
118
+ renderPreview(),
119
+ /* @__PURE__ */ jsxs(HStack, { children: [
120
+ onNavigateToEntityRecord && /* @__PURE__ */ jsx(
121
+ Button,
122
+ {
123
+ className: "editor-template-actions-panel__action",
124
+ __next40pxDefaultSize: true,
125
+ variant: "secondary",
126
+ onClick: () => {
127
+ onNavigateToEntityRecord({
128
+ postId: template.id,
129
+ postType: "wp_template"
130
+ });
131
+ mayShowTemplateEditNotice();
132
+ },
133
+ children: __("Edit")
134
+ }
135
+ ),
136
+ canCreateTemplate && /* @__PURE__ */ jsx(
137
+ Button,
138
+ {
139
+ className: "editor-template-actions-panel__action",
140
+ __next40pxDefaultSize: true,
141
+ variant: "secondary",
142
+ onClick: () => setIsCreateModalOpen(true),
143
+ children: __("Create new")
144
+ }
145
+ )
146
+ ] })
147
+ ] })
148
+ }
149
+ ),
150
+ isCreateModalOpen && /* @__PURE__ */ jsx(
151
+ CreateNewTemplateModal,
152
+ {
153
+ onClose: () => setIsCreateModalOpen(false)
154
+ }
155
+ ),
156
+ isSwapModalOpen && /* @__PURE__ */ jsx(
157
+ SwapTemplateModal,
158
+ {
159
+ onRequestClose: () => setIsSwapModalOpen(false)
160
+ }
161
+ )
162
+ ] });
163
+ }
164
+ export {
165
+ TemplateActionsPanelContent as default
166
+ };
167
+ //# sourceMappingURL=block-theme-content.mjs.map