@wordpress/editor 14.43.0 → 14.44.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 (151) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +8 -0
  3. package/build/components/autocompleters/index.cjs +3 -0
  4. package/build/components/autocompleters/index.cjs.map +2 -2
  5. package/build/components/autocompleters/link.cjs +71 -0
  6. package/build/components/autocompleters/link.cjs.map +7 -0
  7. package/build/components/collab-sidebar/index.cjs.map +2 -2
  8. package/build/components/collaborators-overlay/cursor-dom-utils.cjs +1 -1
  9. package/build/components/collaborators-overlay/cursor-dom-utils.cjs.map +2 -2
  10. package/build/components/collaborators-overlay/timing-utils.cjs +1 -1
  11. package/build/components/collaborators-overlay/timing-utils.cjs.map +2 -2
  12. package/build/components/collaborators-overlay/use-render-cursors.cjs.map +2 -2
  13. package/build/components/error-boundary/index.cjs +1 -1
  14. package/build/components/error-boundary/index.cjs.map +2 -2
  15. package/build/components/post-revisions-panel/index.cjs +44 -42
  16. package/build/components/post-revisions-panel/index.cjs.map +2 -2
  17. package/build/components/post-revisions-preview/revisions-slider.cjs +9 -17
  18. package/build/components/post-revisions-preview/revisions-slider.cjs.map +2 -2
  19. package/build/components/post-title/index.cjs +2 -2
  20. package/build/components/post-title/index.cjs.map +2 -2
  21. package/build/components/sidebar/index.cjs +7 -1
  22. package/build/components/sidebar/index.cjs.map +2 -2
  23. package/build/components/sidebar/post-revision-summary.cjs +11 -2
  24. package/build/components/sidebar/post-revision-summary.cjs.map +2 -2
  25. package/build/components/sidebar/post-summary.cjs +0 -18
  26. package/build/components/sidebar/post-summary.cjs.map +2 -2
  27. package/build/components/style-book/categories.cjs.map +2 -2
  28. package/build/components/style-book/examples.cjs +1 -1
  29. package/build/components/style-book/examples.cjs.map +2 -2
  30. package/build/components/style-book/types.cjs.map +1 -1
  31. package/build/components/styles-canvas/revisions.cjs +2 -2
  32. package/build/components/styles-canvas/revisions.cjs.map +1 -1
  33. package/build/components/sync-connection-error-modal/index.cjs +66 -74
  34. package/build/components/sync-connection-error-modal/index.cjs.map +3 -3
  35. package/build/components/sync-connection-error-modal/use-retry-countdown.cjs +32 -9
  36. package/build/components/sync-connection-error-modal/use-retry-countdown.cjs.map +2 -2
  37. package/build/hooks/default-autocompleters.cjs +1 -1
  38. package/build/hooks/default-autocompleters.cjs.map +2 -2
  39. package/build/store/private-actions.cjs +1 -6
  40. package/build/store/private-actions.cjs.map +2 -2
  41. package/build/store/private-selectors.cjs +4 -6
  42. package/build/store/private-selectors.cjs.map +2 -2
  43. package/build/store/reducer.cjs +1 -1
  44. package/build/store/reducer.cjs.map +2 -2
  45. package/build-module/components/autocompleters/index.mjs +4 -2
  46. package/build-module/components/autocompleters/index.mjs.map +2 -2
  47. package/build-module/components/autocompleters/link.mjs +40 -0
  48. package/build-module/components/autocompleters/link.mjs.map +7 -0
  49. package/build-module/components/collab-sidebar/index.mjs.map +2 -2
  50. package/build-module/components/collaborators-overlay/cursor-dom-utils.mjs +1 -1
  51. package/build-module/components/collaborators-overlay/cursor-dom-utils.mjs.map +2 -2
  52. package/build-module/components/collaborators-overlay/timing-utils.mjs +1 -1
  53. package/build-module/components/collaborators-overlay/timing-utils.mjs.map +2 -2
  54. package/build-module/components/collaborators-overlay/use-render-cursors.mjs.map +2 -2
  55. package/build-module/components/error-boundary/index.mjs +1 -1
  56. package/build-module/components/error-boundary/index.mjs.map +2 -2
  57. package/build-module/components/post-revisions-panel/index.mjs +44 -42
  58. package/build-module/components/post-revisions-panel/index.mjs.map +2 -2
  59. package/build-module/components/post-revisions-preview/revisions-slider.mjs +9 -17
  60. package/build-module/components/post-revisions-preview/revisions-slider.mjs.map +2 -2
  61. package/build-module/components/post-title/index.mjs +2 -2
  62. package/build-module/components/post-title/index.mjs.map +2 -2
  63. package/build-module/components/sidebar/index.mjs +7 -1
  64. package/build-module/components/sidebar/index.mjs.map +2 -2
  65. package/build-module/components/sidebar/post-revision-summary.mjs +15 -3
  66. package/build-module/components/sidebar/post-revision-summary.mjs.map +2 -2
  67. package/build-module/components/sidebar/post-summary.mjs +1 -18
  68. package/build-module/components/sidebar/post-summary.mjs.map +2 -2
  69. package/build-module/components/style-book/categories.mjs.map +2 -2
  70. package/build-module/components/style-book/examples.mjs +1 -1
  71. package/build-module/components/style-book/examples.mjs.map +2 -2
  72. package/build-module/components/styles-canvas/revisions.mjs +2 -2
  73. package/build-module/components/styles-canvas/revisions.mjs.map +1 -1
  74. package/build-module/components/sync-connection-error-modal/index.mjs +66 -75
  75. package/build-module/components/sync-connection-error-modal/index.mjs.map +2 -2
  76. package/build-module/components/sync-connection-error-modal/use-retry-countdown.mjs +33 -10
  77. package/build-module/components/sync-connection-error-modal/use-retry-countdown.mjs.map +2 -2
  78. package/build-module/hooks/default-autocompleters.mjs +2 -2
  79. package/build-module/hooks/default-autocompleters.mjs.map +2 -2
  80. package/build-module/store/private-actions.mjs +1 -6
  81. package/build-module/store/private-actions.mjs.map +2 -2
  82. package/build-module/store/private-selectors.mjs +4 -6
  83. package/build-module/store/private-selectors.mjs.map +2 -2
  84. package/build-module/store/reducer.mjs +1 -1
  85. package/build-module/store/reducer.mjs.map +2 -2
  86. package/build-style/style-rtl.css +40 -30
  87. package/build-style/style.css +40 -30
  88. package/build-types/bindings/post-data.d.ts +3 -3
  89. package/build-types/bindings/term-data.d.ts +14 -14
  90. package/build-types/components/autocompleters/index.d.ts +1 -0
  91. package/build-types/components/autocompleters/link.d.ts +12 -0
  92. package/build-types/components/autocompleters/link.d.ts.map +1 -0
  93. package/build-types/components/collab-sidebar/index.d.ts.map +1 -1
  94. package/build-types/components/collaborators-overlay/use-render-cursors.d.ts.map +1 -1
  95. package/build-types/components/keyboard-shortcut-help-modal/config.d.ts +11 -11
  96. package/build-types/components/post-actions/set-as-homepage.d.ts +1 -1
  97. package/build-types/components/post-actions/set-as-posts-page.d.ts +1 -1
  98. package/build-types/components/post-format/index.d.ts +10 -10
  99. package/build-types/components/post-locked-modal/index.d.ts +2 -2
  100. package/build-types/components/post-revisions-panel/index.d.ts.map +1 -1
  101. package/build-types/components/post-revisions-preview/revisions-slider.d.ts.map +1 -1
  102. package/build-types/components/post-status/index.d.ts +10 -10
  103. package/build-types/components/post-visibility/utils.d.ts +6 -6
  104. package/build-types/components/sidebar/index.d.ts.map +1 -1
  105. package/build-types/components/sidebar/post-revision-summary.d.ts.map +1 -1
  106. package/build-types/components/sidebar/post-summary.d.ts +0 -3
  107. package/build-types/components/sidebar/post-summary.d.ts.map +1 -1
  108. package/build-types/components/style-book/categories.d.ts.map +1 -1
  109. package/build-types/components/style-book/examples.d.ts.map +1 -1
  110. package/build-types/components/style-book/types.d.ts +1 -13
  111. package/build-types/components/style-book/types.d.ts.map +1 -1
  112. package/build-types/components/sync-connection-error-modal/index.d.ts +0 -14
  113. package/build-types/components/sync-connection-error-modal/index.d.ts.map +1 -1
  114. package/build-types/components/sync-connection-error-modal/use-retry-countdown.d.ts.map +1 -1
  115. package/build-types/hooks/custom-sources-backwards-compatibility.d.ts +1 -1
  116. package/build-types/hooks/custom-sources-backwards-compatibility.d.ts.map +1 -1
  117. package/build-types/hooks/pattern-overrides.d.ts +1 -1
  118. package/build-types/hooks/pattern-overrides.d.ts.map +1 -1
  119. package/build-types/store/private-actions.d.ts.map +1 -1
  120. package/build-types/store/private-selectors.d.ts.map +1 -1
  121. package/build-types/store/reducer.d.ts +10 -10
  122. package/build-types/store/reducer.d.ts.map +1 -1
  123. package/build-types/utils/pageTypeBadge.d.ts +1 -1
  124. package/build-types/utils/pageTypeBadge.d.ts.map +1 -1
  125. package/package.json +45 -45
  126. package/src/components/autocompleters/index.js +1 -0
  127. package/src/components/autocompleters/link.js +47 -0
  128. package/src/components/autocompleters/style.scss +6 -0
  129. package/src/components/collab-sidebar/index.js +1 -0
  130. package/src/components/collaborators-overlay/cursor-dom-utils.ts +1 -1
  131. package/src/components/collaborators-overlay/timing-utils.ts +1 -1
  132. package/src/components/collaborators-overlay/use-render-cursors.ts +4 -2
  133. package/src/components/error-boundary/index.js +1 -1
  134. package/src/components/error-boundary/index.native.js +1 -1
  135. package/src/components/post-revisions-panel/index.js +46 -44
  136. package/src/components/post-revisions-preview/revisions-slider.js +9 -27
  137. package/src/components/post-title/index.js +3 -3
  138. package/src/components/sidebar/index.js +7 -1
  139. package/src/components/sidebar/post-revision-summary.js +13 -3
  140. package/src/components/sidebar/post-summary.js +1 -18
  141. package/src/components/style-book/categories.ts +0 -1
  142. package/src/components/style-book/examples.tsx +6 -12
  143. package/src/components/style-book/types.ts +1 -18
  144. package/src/components/styles-canvas/revisions.js +2 -2
  145. package/src/components/sync-connection-error-modal/index.tsx +151 -163
  146. package/src/components/sync-connection-error-modal/use-retry-countdown.ts +46 -10
  147. package/src/hooks/default-autocompleters.js +2 -2
  148. package/src/hooks/test/default-autocompleters.js +2 -2
  149. package/src/store/private-actions.js +1 -6
  150. package/src/store/private-selectors.js +4 -13
  151. package/src/store/reducer.js +9 -8
@@ -170,7 +170,7 @@ function getExamples(colors) {
170
170
  blocks: getBlockFromExample(blockType.name, {
171
171
  ...blockType.example,
172
172
  attributes: {
173
- ...blockType.example.attributes,
173
+ ...blockType.example?.attributes,
174
174
  style: void 0
175
175
  }
176
176
  })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/style-book/examples.tsx"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport {\n\tgetBlockType,\n\tgetBlockTypes,\n\tgetBlockFromExample,\n\tcreateBlock,\n\t// @wordpress/blocks imports are not typed.\n\t// @ts-expect-error\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport type {\n\tBlockExample,\n\tColorOrigin,\n\tMultiOriginPalettes,\n\tBlockType,\n} from './types';\nimport ColorExamples from './color-examples';\nimport DuotoneExamples from './duotone-examples';\nimport { STYLE_BOOK_COLOR_GROUPS } from './constants';\n\n/**\n * Returns examples color examples for each origin\n * e.g. Core (Default), Theme, and User.\n *\n * @param {MultiOriginPalettes} colors Global Styles color palettes per origin.\n * @return {BlockExample[]} An array of color block examples.\n */\nfunction getColorExamples( colors: MultiOriginPalettes ): BlockExample[] {\n\tif ( ! colors ) {\n\t\treturn [];\n\t}\n\n\tconst examples: BlockExample[] = [];\n\n\tSTYLE_BOOK_COLOR_GROUPS.forEach( ( group ) => {\n\t\tconst palette = colors[ group.type as keyof MultiOriginPalettes ];\n\t\tconst paletteFiltered = Array.isArray( palette )\n\t\t\t? palette.find(\n\t\t\t\t\t( origin: ColorOrigin ) => origin.slug === group.origin\n\t\t\t )\n\t\t\t: undefined;\n\n\t\tif ( paletteFiltered?.[ group.type ] ) {\n\t\t\tconst example: BlockExample = {\n\t\t\t\tname: group.slug,\n\t\t\t\ttitle: group.title,\n\t\t\t\tcategory: 'colors',\n\t\t\t};\n\t\t\tif ( group.type === 'duotones' ) {\n\t\t\t\texample.content = (\n\t\t\t\t\t<DuotoneExamples\n\t\t\t\t\t\tduotones={ paletteFiltered[ group.type ] }\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t\texamples.push( example );\n\t\t\t} else {\n\t\t\t\texample.content = (\n\t\t\t\t\t<ColorExamples\n\t\t\t\t\t\tcolors={ paletteFiltered[ group.type ] }\n\t\t\t\t\t\ttype={ group.type }\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t\texamples.push( example );\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn examples;\n}\n\n/**\n * Returns examples for the overview page.\n *\n * @param {MultiOriginPalettes} colors Global Styles color palettes per origin.\n * @return {BlockExample[]} An array of block examples.\n */\nfunction getOverviewBlockExamples(\n\tcolors: MultiOriginPalettes\n): BlockExample[] {\n\tconst examples: BlockExample[] = [];\n\n\t// Get theme palette from colors if they exist.\n\tconst themePalette = Array.isArray( colors?.colors )\n\t\t? colors.colors.find(\n\t\t\t\t( origin: ColorOrigin ) => origin.slug === 'theme'\n\t\t )\n\t\t: undefined;\n\n\tif ( themePalette ) {\n\t\tconst themeColorexample: BlockExample = {\n\t\t\tname: 'theme-colors',\n\t\t\ttitle: __( 'Colors' ),\n\t\t\tcategory: 'overview',\n\t\t\tcontent: (\n\t\t\t\t<ColorExamples\n\t\t\t\t\tcolors={ themePalette.colors }\n\t\t\t\t\ttype=\"colors\"\n\t\t\t\t\ttemplateColumns=\"repeat(auto-fill, minmax( 200px, 1fr ))\"\n\t\t\t\t\titemHeight=\"32px\"\n\t\t\t\t/>\n\t\t\t),\n\t\t};\n\n\t\texamples.push( themeColorexample );\n\t}\n\n\t// Get examples for typography blocks.\n\tconst typographyBlockExamples: BlockType[] = [];\n\n\tif ( getBlockType( 'core/heading' ) ) {\n\t\tconst headingBlock = createBlock( 'core/heading', {\n\t\t\t// translators: Typography example. Your local alphabet, numbers and some common special characters.\n\t\t\tcontent: __(\n\t\t\t\t`AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789X{(\u2026)},.-<>?!*&:/A@HELFO\u2122\u00A9`\n\t\t\t),\n\t\t\tlevel: 1,\n\t\t} );\n\t\ttypographyBlockExamples.push( headingBlock );\n\t}\n\n\tif ( getBlockType( 'core/paragraph' ) ) {\n\t\tconst firstParagraphBlock = createBlock( 'core/paragraph', {\n\t\t\tcontent: __(\n\t\t\t\t`A paragraph in a website refers to a distinct block of text that is used to present and organize information. It is a fundamental unit of content in web design and is typically composed of a group of related sentences or thoughts focused on a particular topic or idea. Paragraphs play a crucial role in improving the readability and user experience of a website. They break down the text into smaller, manageable chunks, allowing readers to scan the content more easily.`\n\t\t\t),\n\t\t} );\n\t\tconst secondParagraphBlock = createBlock( 'core/paragraph', {\n\t\t\tcontent: __(\n\t\t\t\t`Additionally, paragraphs help structure the flow of information and provide logical breaks between different concepts or pieces of information. In terms of formatting, paragraphs in websites are commonly denoted by a vertical gap or indentation between each block of text. This visual separation helps visually distinguish one paragraph from another, creating a clear and organized layout that guides the reader through the content smoothly.`\n\t\t\t),\n\t\t} );\n\n\t\tif ( getBlockType( 'core/group' ) ) {\n\t\t\tconst groupBlock = createBlock(\n\t\t\t\t'core/group',\n\t\t\t\t{\n\t\t\t\t\tlayout: {\n\t\t\t\t\t\ttype: 'grid',\n\t\t\t\t\t\tcolumnCount: 2,\n\t\t\t\t\t\tminimumColumnWidth: '12rem',\n\t\t\t\t\t},\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tspacing: {\n\t\t\t\t\t\t\tblockGap: '1.5rem',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[ firstParagraphBlock, secondParagraphBlock ]\n\t\t\t);\n\t\t\ttypographyBlockExamples.push( groupBlock );\n\t\t} else {\n\t\t\ttypographyBlockExamples.push( firstParagraphBlock );\n\t\t}\n\t}\n\n\tif ( !! typographyBlockExamples.length ) {\n\t\texamples.push( {\n\t\t\tname: 'typography',\n\t\t\ttitle: __( 'Typography' ),\n\t\t\tcategory: 'overview',\n\t\t\tblocks: typographyBlockExamples,\n\t\t} );\n\t}\n\n\tconst otherBlockExamples = [\n\t\t'core/image',\n\t\t'core/separator',\n\t\t'core/buttons',\n\t\t'core/pullquote',\n\t\t'core/search',\n\t];\n\n\t// Get examples for other blocks and put them in order of above array.\n\totherBlockExamples.forEach( ( blockName ) => {\n\t\tconst blockType = getBlockType( blockName );\n\t\tif ( blockType && blockType.example ) {\n\t\t\tconst blockExample: BlockExample = {\n\t\t\t\tname: blockName,\n\t\t\t\ttitle: blockType.title,\n\t\t\t\tcategory: 'overview',\n\t\t\t\t/*\n\t\t\t\t * CSS generated from style attributes will take precedence over global styles CSS,\n\t\t\t\t * so remove the style attribute from the example to ensure the example\n\t\t\t\t * demonstrates changes to global styles.\n\t\t\t\t */\n\t\t\t\tblocks: getBlockFromExample( blockName, {\n\t\t\t\t\t...blockType.example,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t...blockType.example.attributes,\n\t\t\t\t\t\tstyle: undefined,\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t};\n\t\t\texamples.push( blockExample );\n\t\t}\n\t} );\n\n\treturn examples;\n}\n\n/**\n * Returns a list of examples for registered block types.\n *\n * @param {MultiOriginPalettes} colors Global styles colors grouped by origin e.g. Core, Theme, and User.\n * @return {BlockExample[]} An array of block examples.\n */\nexport function getExamples( colors: MultiOriginPalettes ): BlockExample[] {\n\tconst nonHeadingBlockExamples = getBlockTypes()\n\t\t.filter( ( blockType: BlockType ) => {\n\t\t\tconst { name, example, supports } = blockType;\n\t\t\treturn (\n\t\t\t\tname !== 'core/heading' &&\n\t\t\t\t!! example &&\n\t\t\t\tsupports?.inserter !== false\n\t\t\t);\n\t\t} )\n\t\t.map( ( blockType: BlockType ) => ( {\n\t\t\tname: blockType.name,\n\t\t\ttitle: blockType.title,\n\t\t\tcategory: blockType.category,\n\t\t\t/*\n\t\t\t * CSS generated from style attributes will take precedence over global styles CSS,\n\t\t\t * so remove the style attribute from the example to ensure the example\n\t\t\t * demonstrates changes to global styles.\n\t\t\t */\n\t\t\tblocks: getBlockFromExample( blockType.name, {\n\t\t\t\t...blockType.example,\n\t\t\t\tattributes: {\n\t\t\t\t\t...blockType.example.attributes,\n\t\t\t\t\tstyle: undefined,\n\t\t\t\t},\n\t\t\t} ),\n\t\t} ) );\n\tconst isHeadingBlockRegistered = !! getBlockType( 'core/heading' );\n\n\tif ( ! isHeadingBlockRegistered ) {\n\t\treturn nonHeadingBlockExamples;\n\t}\n\n\t// Use our own example for the Heading block so that we can show multiple\n\t// heading levels.\n\tconst headingsExample = {\n\t\tname: 'core/heading',\n\t\ttitle: __( 'Headings' ),\n\t\tcategory: 'text',\n\t\tblocks: [ 1, 2, 3, 4, 5, 6 ].map( ( level ) => {\n\t\t\treturn createBlock( 'core/heading', {\n\t\t\t\tcontent: sprintf(\n\t\t\t\t\t// translators: %d: heading level e.g: \"1\", \"2\", \"3\"\n\t\t\t\t\t__( 'Heading %d' ),\n\t\t\t\t\tlevel\n\t\t\t\t),\n\t\t\t\tlevel,\n\t\t\t} );\n\t\t} ),\n\t};\n\tconst colorExamples = getColorExamples( colors );\n\n\tconst overviewBlockExamples = getOverviewBlockExamples( colors );\n\n\treturn [\n\t\theadingsExample,\n\t\t...colorExamples,\n\t\t...nonHeadingBlockExamples,\n\t\t...overviewBlockExamples,\n\t];\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport type { Block } from '@wordpress/blocks';\nimport {\n\tgetBlockType,\n\tgetBlockTypes,\n\tgetBlockFromExample,\n\tcreateBlock,\n} from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport type { BlockExample, ColorOrigin, MultiOriginPalettes } from './types';\nimport ColorExamples from './color-examples';\nimport DuotoneExamples from './duotone-examples';\nimport { STYLE_BOOK_COLOR_GROUPS } from './constants';\n\n/**\n * Returns examples color examples for each origin\n * e.g. Core (Default), Theme, and User.\n *\n * @param {MultiOriginPalettes} colors Global Styles color palettes per origin.\n * @return {BlockExample[]} An array of color block examples.\n */\nfunction getColorExamples( colors: MultiOriginPalettes ): BlockExample[] {\n\tif ( ! colors ) {\n\t\treturn [];\n\t}\n\n\tconst examples: BlockExample[] = [];\n\n\tSTYLE_BOOK_COLOR_GROUPS.forEach( ( group ) => {\n\t\tconst palette = colors[ group.type as keyof MultiOriginPalettes ];\n\t\tconst paletteFiltered = Array.isArray( palette )\n\t\t\t? palette.find(\n\t\t\t\t\t( origin: ColorOrigin ) => origin.slug === group.origin\n\t\t\t )\n\t\t\t: undefined;\n\n\t\tif ( paletteFiltered?.[ group.type ] ) {\n\t\t\tconst example: BlockExample = {\n\t\t\t\tname: group.slug,\n\t\t\t\ttitle: group.title,\n\t\t\t\tcategory: 'colors',\n\t\t\t};\n\t\t\tif ( group.type === 'duotones' ) {\n\t\t\t\texample.content = (\n\t\t\t\t\t<DuotoneExamples\n\t\t\t\t\t\tduotones={ paletteFiltered[ group.type ] }\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t\texamples.push( example );\n\t\t\t} else {\n\t\t\t\texample.content = (\n\t\t\t\t\t<ColorExamples\n\t\t\t\t\t\tcolors={ paletteFiltered[ group.type ] }\n\t\t\t\t\t\ttype={ group.type }\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t\texamples.push( example );\n\t\t\t}\n\t\t}\n\t} );\n\n\treturn examples;\n}\n\n/**\n * Returns examples for the overview page.\n *\n * @param {MultiOriginPalettes} colors Global Styles color palettes per origin.\n * @return {BlockExample[]} An array of block examples.\n */\nfunction getOverviewBlockExamples(\n\tcolors: MultiOriginPalettes\n): BlockExample[] {\n\tconst examples: BlockExample[] = [];\n\n\t// Get theme palette from colors if they exist.\n\tconst themePalette = Array.isArray( colors?.colors )\n\t\t? colors.colors.find(\n\t\t\t\t( origin: ColorOrigin ) => origin.slug === 'theme'\n\t\t )\n\t\t: undefined;\n\n\tif ( themePalette ) {\n\t\tconst themeColorexample: BlockExample = {\n\t\t\tname: 'theme-colors',\n\t\t\ttitle: __( 'Colors' ),\n\t\t\tcategory: 'overview',\n\t\t\tcontent: (\n\t\t\t\t<ColorExamples\n\t\t\t\t\tcolors={ themePalette.colors }\n\t\t\t\t\ttype=\"colors\"\n\t\t\t\t\ttemplateColumns=\"repeat(auto-fill, minmax( 200px, 1fr ))\"\n\t\t\t\t\titemHeight=\"32px\"\n\t\t\t\t/>\n\t\t\t),\n\t\t};\n\n\t\texamples.push( themeColorexample );\n\t}\n\n\t// Get examples for typography blocks.\n\tconst typographyBlockExamples: Block[] = [];\n\n\tif ( getBlockType( 'core/heading' ) ) {\n\t\tconst headingBlock = createBlock( 'core/heading', {\n\t\t\t// translators: Typography example. Your local alphabet, numbers and some common special characters.\n\t\t\tcontent: __(\n\t\t\t\t`AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789X{(\u2026)},.-<>?!*&:/A@HELFO\u2122\u00A9`\n\t\t\t),\n\t\t\tlevel: 1,\n\t\t} );\n\t\ttypographyBlockExamples.push( headingBlock );\n\t}\n\n\tif ( getBlockType( 'core/paragraph' ) ) {\n\t\tconst firstParagraphBlock = createBlock( 'core/paragraph', {\n\t\t\tcontent: __(\n\t\t\t\t`A paragraph in a website refers to a distinct block of text that is used to present and organize information. It is a fundamental unit of content in web design and is typically composed of a group of related sentences or thoughts focused on a particular topic or idea. Paragraphs play a crucial role in improving the readability and user experience of a website. They break down the text into smaller, manageable chunks, allowing readers to scan the content more easily.`\n\t\t\t),\n\t\t} );\n\t\tconst secondParagraphBlock = createBlock( 'core/paragraph', {\n\t\t\tcontent: __(\n\t\t\t\t`Additionally, paragraphs help structure the flow of information and provide logical breaks between different concepts or pieces of information. In terms of formatting, paragraphs in websites are commonly denoted by a vertical gap or indentation between each block of text. This visual separation helps visually distinguish one paragraph from another, creating a clear and organized layout that guides the reader through the content smoothly.`\n\t\t\t),\n\t\t} );\n\n\t\tif ( getBlockType( 'core/group' ) ) {\n\t\t\tconst groupBlock = createBlock(\n\t\t\t\t'core/group',\n\t\t\t\t{\n\t\t\t\t\tlayout: {\n\t\t\t\t\t\ttype: 'grid',\n\t\t\t\t\t\tcolumnCount: 2,\n\t\t\t\t\t\tminimumColumnWidth: '12rem',\n\t\t\t\t\t},\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tspacing: {\n\t\t\t\t\t\t\tblockGap: '1.5rem',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[ firstParagraphBlock, secondParagraphBlock ]\n\t\t\t);\n\t\t\ttypographyBlockExamples.push( groupBlock );\n\t\t} else {\n\t\t\ttypographyBlockExamples.push( firstParagraphBlock );\n\t\t}\n\t}\n\n\tif ( !! typographyBlockExamples.length ) {\n\t\texamples.push( {\n\t\t\tname: 'typography',\n\t\t\ttitle: __( 'Typography' ),\n\t\t\tcategory: 'overview',\n\t\t\tblocks: typographyBlockExamples,\n\t\t} );\n\t}\n\n\tconst otherBlockExamples = [\n\t\t'core/image',\n\t\t'core/separator',\n\t\t'core/buttons',\n\t\t'core/pullquote',\n\t\t'core/search',\n\t];\n\n\t// Get examples for other blocks and put them in order of above array.\n\totherBlockExamples.forEach( ( blockName ) => {\n\t\tconst blockType = getBlockType( blockName );\n\t\tif ( blockType && blockType.example ) {\n\t\t\tconst blockExample: BlockExample = {\n\t\t\t\tname: blockName,\n\t\t\t\ttitle: blockType.title,\n\t\t\t\tcategory: 'overview',\n\t\t\t\t/*\n\t\t\t\t * CSS generated from style attributes will take precedence over global styles CSS,\n\t\t\t\t * so remove the style attribute from the example to ensure the example\n\t\t\t\t * demonstrates changes to global styles.\n\t\t\t\t */\n\t\t\t\tblocks: getBlockFromExample( blockName, {\n\t\t\t\t\t...blockType.example,\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t...blockType.example.attributes,\n\t\t\t\t\t\tstyle: undefined,\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t};\n\t\t\texamples.push( blockExample );\n\t\t}\n\t} );\n\n\treturn examples;\n}\n\n/**\n * Returns a list of examples for registered block types.\n *\n * @param {MultiOriginPalettes} colors Global styles colors grouped by origin e.g. Core, Theme, and User.\n * @return {BlockExample[]} An array of block examples.\n */\nexport function getExamples( colors: MultiOriginPalettes ): BlockExample[] {\n\tconst nonHeadingBlockExamples = getBlockTypes()\n\t\t.filter( ( blockType ) => {\n\t\t\tconst { name, example, supports } = blockType;\n\t\t\treturn (\n\t\t\t\tname !== 'core/heading' &&\n\t\t\t\t!! example &&\n\t\t\t\tsupports?.inserter !== false\n\t\t\t);\n\t\t} )\n\t\t.map( ( blockType ) => ( {\n\t\t\tname: blockType.name,\n\t\t\ttitle: blockType.title,\n\t\t\tcategory: blockType.category,\n\t\t\t/*\n\t\t\t * CSS generated from style attributes will take precedence over global styles CSS,\n\t\t\t * so remove the style attribute from the example to ensure the example\n\t\t\t * demonstrates changes to global styles.\n\t\t\t */\n\t\t\tblocks: getBlockFromExample( blockType.name, {\n\t\t\t\t...blockType.example,\n\t\t\t\tattributes: {\n\t\t\t\t\t...blockType.example?.attributes,\n\t\t\t\t\tstyle: undefined,\n\t\t\t\t},\n\t\t\t} ),\n\t\t} ) );\n\tconst isHeadingBlockRegistered = !! getBlockType( 'core/heading' );\n\n\tif ( ! isHeadingBlockRegistered ) {\n\t\treturn nonHeadingBlockExamples;\n\t}\n\n\t// Use our own example for the Heading block so that we can show multiple\n\t// heading levels.\n\tconst headingsExample = {\n\t\tname: 'core/heading',\n\t\ttitle: __( 'Headings' ),\n\t\tcategory: 'text',\n\t\tblocks: [ 1, 2, 3, 4, 5, 6 ].map( ( level ) => {\n\t\t\treturn createBlock( 'core/heading', {\n\t\t\t\tcontent: sprintf(\n\t\t\t\t\t// translators: %d: heading level e.g: \"1\", \"2\", \"3\"\n\t\t\t\t\t__( 'Heading %d' ),\n\t\t\t\t\tlevel\n\t\t\t\t),\n\t\t\t\tlevel,\n\t\t\t} );\n\t\t} ),\n\t};\n\tconst colorExamples = getColorExamples( colors );\n\n\tconst overviewBlockExamples = getOverviewBlockExamples( colors );\n\n\treturn [\n\t\theadingsExample,\n\t\t...colorExamples,\n\t\t...nonHeadingBlockExamples,\n\t\t...overviewBlockExamples,\n\t];\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -17,7 +17,7 @@ import { unlock } from "../../lock-unlock.mjs";
17
17
  import { jsx, jsxs } from "react/jsx-runtime";
18
18
  var {
19
19
  ExperimentalBlockEditorProvider,
20
- __unstableBlockStyleVariationOverridesWithConfig
20
+ BlockStyleVariationOverridesWithConfig
21
21
  } = unlock(blockEditorPrivateApis);
22
22
  function isObjectEmpty(object) {
23
23
  return !object || Object.keys(object).length === 0;
@@ -89,7 +89,7 @@ function StylesCanvasRevisions({ path }, ref) {
89
89
  /* @__PURE__ */ jsx(BlockList, { renderAppender: false }),
90
90
  /* @__PURE__ */ jsx(EditorStyles, { styles: editorStyles }),
91
91
  /* @__PURE__ */ jsx(
92
- __unstableBlockStyleVariationOverridesWithConfig,
92
+ BlockStyleVariationOverridesWithConfig,
93
93
  {
94
94
  config: mergedConfig
95
95
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/styles-canvas/revisions.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { Disabled } from '@wordpress/components';\nimport {\n\tBlockList,\n\tprivateApis as blockEditorPrivateApis,\n\tstore as blockEditorStore,\n\t__unstableEditorStyles as EditorStyles,\n\t__unstableIframe as Iframe,\n} from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { useMemo, forwardRef } from '@wordpress/element';\nimport { useGlobalStylesRevisions } from '@wordpress/global-styles-ui';\nimport { mergeGlobalStyles } from '@wordpress/global-styles-engine';\n\n/**\n * Internal dependencies\n */\nimport { useGlobalStyles } from '../global-styles/hooks';\nimport { useGlobalStylesOutputWithConfig } from '../../hooks/use-global-styles-output';\nimport { unlock } from '../../lock-unlock';\n\nconst {\n\tExperimentalBlockEditorProvider,\n\t__unstableBlockStyleVariationOverridesWithConfig,\n} = unlock( blockEditorPrivateApis );\n\nfunction isObjectEmpty( object ) {\n\treturn ! object || Object.keys( object ).length === 0;\n}\n\n/**\n * Revisions content component for global styles.\n * Coordinates with ScreenRevisions through the path parameter to display\n * the currently selected revision.\n *\n * @param {Object} props Component props.\n * @param {string} props.path Current path in global styles.\n * @param {React.ForwardedRef} ref Ref to the Revisions component.\n * @return {React.JSX.Element} The Revisions component or null if loading.\n */\nfunction StylesCanvasRevisions( { path }, ref ) {\n\tconst blocks = useSelect( ( select ) => {\n\t\t// This is not ideal: it's like a loop (reading from block-editor to render it).\n\t\treturn select( blockEditorStore ).getBlocks();\n\t}, [] );\n\tconst { user: userConfig, base: baseConfig } = useGlobalStyles();\n\n\t// Fetch all revisions (includes unsaved, parent, and enriched with authors)\n\tconst { revisions, isLoading } = useGlobalStylesRevisions();\n\n\t// Parse revision ID from path (e.g., \"/revisions/123\" -> \"123\")\n\tconst revisionId = useMemo( () => {\n\t\tconst match = path?.match( /^\\/revisions\\/(.+)$/ );\n\t\treturn match ? match[ 1 ] : null;\n\t}, [ path ] );\n\n\t// Find the selected revision from the fetched list\n\tconst selectedRevision = useMemo( () => {\n\t\tif ( ! revisionId || ! revisions.length ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn revisions.find(\n\t\t\t( rev ) => String( rev.id ) === String( revisionId )\n\t\t);\n\t}, [ revisionId, revisions ] );\n\n\t// Use the selected revision's config if available, otherwise use current user config\n\tconst displayConfig = selectedRevision || userConfig;\n\n\t// Merge the display config with the base config\n\tconst mergedConfig = useMemo( () => {\n\t\tif (\n\t\t\t! isObjectEmpty( displayConfig ) &&\n\t\t\t! isObjectEmpty( baseConfig )\n\t\t) {\n\t\t\treturn mergeGlobalStyles( baseConfig, displayConfig );\n\t\t}\n\t\treturn {};\n\t}, [ baseConfig, displayConfig ] );\n\n\tconst renderedBlocksArray = useMemo(\n\t\t() => ( Array.isArray( blocks ) ? blocks : [ blocks ] ),\n\t\t[ blocks ]\n\t);\n\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\tisPreviewMode: true,\n\t\t} ),\n\t\t[ originalSettings ]\n\t);\n\n\tconst [ globalStyles ] = useGlobalStylesOutputWithConfig( mergedConfig );\n\n\tconst editorStyles =\n\t\t! isObjectEmpty( globalStyles ) && ! isObjectEmpty( displayConfig )\n\t\t\t? globalStyles\n\t\t\t: settings.styles;\n\n\tif ( isLoading ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Iframe\n\t\t\tref={ ref }\n\t\t\tclassName=\"editor-revisions__iframe\"\n\t\t\tname=\"revisions\"\n\t\t\ttabIndex={ 0 }\n\t\t>\n\t\t\t<style>\n\t\t\t\t{\n\t\t\t\t\t// Forming a \"block formatting context\" to prevent margin collapsing.\n\t\t\t\t\t// @see https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context\n\t\t\t\t\t`.is-root-container { display: flow-root; }`\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t<Disabled className=\"editor-revisions__example-preview__content\">\n\t\t\t\t<ExperimentalBlockEditorProvider\n\t\t\t\t\tvalue={ renderedBlocksArray }\n\t\t\t\t\tsettings={ settings }\n\t\t\t\t>\n\t\t\t\t\t<BlockList renderAppender={ false } />\n\t\t\t\t\t{ /*\n\t\t\t\t\t * Styles are printed inside the block editor provider,\n\t\t\t\t\t * so they can access any registered style overrides.\n\t\t\t\t\t */ }\n\t\t\t\t\t<EditorStyles styles={ editorStyles } />\n\t\t\t\t\t<__unstableBlockStyleVariationOverridesWithConfig\n\t\t\t\t\t\tconfig={ mergedConfig }\n\t\t\t\t\t/>\n\t\t\t\t</ExperimentalBlockEditorProvider>\n\t\t\t</Disabled>\n\t\t</Iframe>\n\t);\n}\nexport default forwardRef( StylesCanvasRevisions );\n"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { Disabled } from '@wordpress/components';\nimport {\n\tBlockList,\n\tprivateApis as blockEditorPrivateApis,\n\tstore as blockEditorStore,\n\t__unstableEditorStyles as EditorStyles,\n\t__unstableIframe as Iframe,\n} from '@wordpress/block-editor';\nimport { useSelect } from '@wordpress/data';\nimport { useMemo, forwardRef } from '@wordpress/element';\nimport { useGlobalStylesRevisions } from '@wordpress/global-styles-ui';\nimport { mergeGlobalStyles } from '@wordpress/global-styles-engine';\n\n/**\n * Internal dependencies\n */\nimport { useGlobalStyles } from '../global-styles/hooks';\nimport { useGlobalStylesOutputWithConfig } from '../../hooks/use-global-styles-output';\nimport { unlock } from '../../lock-unlock';\n\nconst {\n\tExperimentalBlockEditorProvider,\n\tBlockStyleVariationOverridesWithConfig,\n} = unlock( blockEditorPrivateApis );\n\nfunction isObjectEmpty( object ) {\n\treturn ! object || Object.keys( object ).length === 0;\n}\n\n/**\n * Revisions content component for global styles.\n * Coordinates with ScreenRevisions through the path parameter to display\n * the currently selected revision.\n *\n * @param {Object} props Component props.\n * @param {string} props.path Current path in global styles.\n * @param {React.ForwardedRef} ref Ref to the Revisions component.\n * @return {React.JSX.Element} The Revisions component or null if loading.\n */\nfunction StylesCanvasRevisions( { path }, ref ) {\n\tconst blocks = useSelect( ( select ) => {\n\t\t// This is not ideal: it's like a loop (reading from block-editor to render it).\n\t\treturn select( blockEditorStore ).getBlocks();\n\t}, [] );\n\tconst { user: userConfig, base: baseConfig } = useGlobalStyles();\n\n\t// Fetch all revisions (includes unsaved, parent, and enriched with authors)\n\tconst { revisions, isLoading } = useGlobalStylesRevisions();\n\n\t// Parse revision ID from path (e.g., \"/revisions/123\" -> \"123\")\n\tconst revisionId = useMemo( () => {\n\t\tconst match = path?.match( /^\\/revisions\\/(.+)$/ );\n\t\treturn match ? match[ 1 ] : null;\n\t}, [ path ] );\n\n\t// Find the selected revision from the fetched list\n\tconst selectedRevision = useMemo( () => {\n\t\tif ( ! revisionId || ! revisions.length ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn revisions.find(\n\t\t\t( rev ) => String( rev.id ) === String( revisionId )\n\t\t);\n\t}, [ revisionId, revisions ] );\n\n\t// Use the selected revision's config if available, otherwise use current user config\n\tconst displayConfig = selectedRevision || userConfig;\n\n\t// Merge the display config with the base config\n\tconst mergedConfig = useMemo( () => {\n\t\tif (\n\t\t\t! isObjectEmpty( displayConfig ) &&\n\t\t\t! isObjectEmpty( baseConfig )\n\t\t) {\n\t\t\treturn mergeGlobalStyles( baseConfig, displayConfig );\n\t\t}\n\t\treturn {};\n\t}, [ baseConfig, displayConfig ] );\n\n\tconst renderedBlocksArray = useMemo(\n\t\t() => ( Array.isArray( blocks ) ? blocks : [ blocks ] ),\n\t\t[ blocks ]\n\t);\n\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\tisPreviewMode: true,\n\t\t} ),\n\t\t[ originalSettings ]\n\t);\n\n\tconst [ globalStyles ] = useGlobalStylesOutputWithConfig( mergedConfig );\n\n\tconst editorStyles =\n\t\t! isObjectEmpty( globalStyles ) && ! isObjectEmpty( displayConfig )\n\t\t\t? globalStyles\n\t\t\t: settings.styles;\n\n\tif ( isLoading ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Iframe\n\t\t\tref={ ref }\n\t\t\tclassName=\"editor-revisions__iframe\"\n\t\t\tname=\"revisions\"\n\t\t\ttabIndex={ 0 }\n\t\t>\n\t\t\t<style>\n\t\t\t\t{\n\t\t\t\t\t// Forming a \"block formatting context\" to prevent margin collapsing.\n\t\t\t\t\t// @see https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context\n\t\t\t\t\t`.is-root-container { display: flow-root; }`\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t<Disabled className=\"editor-revisions__example-preview__content\">\n\t\t\t\t<ExperimentalBlockEditorProvider\n\t\t\t\t\tvalue={ renderedBlocksArray }\n\t\t\t\t\tsettings={ settings }\n\t\t\t\t>\n\t\t\t\t\t<BlockList renderAppender={ false } />\n\t\t\t\t\t{ /*\n\t\t\t\t\t * Styles are printed inside the block editor provider,\n\t\t\t\t\t * so they can access any registered style overrides.\n\t\t\t\t\t */ }\n\t\t\t\t\t<EditorStyles styles={ editorStyles } />\n\t\t\t\t\t<BlockStyleVariationOverridesWithConfig\n\t\t\t\t\t\tconfig={ mergedConfig }\n\t\t\t\t\t/>\n\t\t\t\t</ExperimentalBlockEditorProvider>\n\t\t\t</Disabled>\n\t\t</Iframe>\n\t);\n}\nexport default forwardRef( StylesCanvasRevisions );\n"],
5
5
  "mappings": ";AAGA,SAAS,gBAAgB;AACzB;AAAA,EACC;AAAA,EACA,eAAe;AAAA,EACf,SAAS;AAAA,EACT,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,OACd;AACP,SAAS,iBAAiB;AAC1B,SAAS,SAAS,kBAAkB;AACpC,SAAS,gCAAgC;AACzC,SAAS,yBAAyB;AAKlC,SAAS,uBAAuB;AAChC,SAAS,uCAAuC;AAChD,SAAS,cAAc;AAgGpB,cAQC,YARD;AA9FH,IAAM;AAAA,EACL;AAAA,EACA;AACD,IAAI,OAAQ,sBAAuB;AAEnC,SAAS,cAAe,QAAS;AAChC,SAAO,CAAE,UAAU,OAAO,KAAM,MAAO,EAAE,WAAW;AACrD;AAYA,SAAS,sBAAuB,EAAE,KAAK,GAAG,KAAM;AAC/C,QAAM,SAAS,UAAW,CAAE,WAAY;AAEvC,WAAO,OAAQ,gBAAiB,EAAE,UAAU;AAAA,EAC7C,GAAG,CAAC,CAAE;AACN,QAAM,EAAE,MAAM,YAAY,MAAM,WAAW,IAAI,gBAAgB;AAG/D,QAAM,EAAE,WAAW,UAAU,IAAI,yBAAyB;AAG1D,QAAM,aAAa,QAAS,MAAM;AACjC,UAAM,QAAQ,MAAM,MAAO,qBAAsB;AACjD,WAAO,QAAQ,MAAO,CAAE,IAAI;AAAA,EAC7B,GAAG,CAAE,IAAK,CAAE;AAGZ,QAAM,mBAAmB,QAAS,MAAM;AACvC,QAAK,CAAE,cAAc,CAAE,UAAU,QAAS;AACzC,aAAO;AAAA,IACR;AACA,WAAO,UAAU;AAAA,MAChB,CAAE,QAAS,OAAQ,IAAI,EAAG,MAAM,OAAQ,UAAW;AAAA,IACpD;AAAA,EACD,GAAG,CAAE,YAAY,SAAU,CAAE;AAG7B,QAAM,gBAAgB,oBAAoB;AAG1C,QAAM,eAAe,QAAS,MAAM;AACnC,QACC,CAAE,cAAe,aAAc,KAC/B,CAAE,cAAe,UAAW,GAC3B;AACD,aAAO,kBAAmB,YAAY,aAAc;AAAA,IACrD;AACA,WAAO,CAAC;AAAA,EACT,GAAG,CAAE,YAAY,aAAc,CAAE;AAEjC,QAAM,sBAAsB;AAAA,IAC3B,MAAQ,MAAM,QAAS,MAAO,IAAI,SAAS,CAAE,MAAO;AAAA,IACpD,CAAE,MAAO;AAAA,EACV;AAEA,QAAM,mBAAmB;AAAA,IACxB,CAAE,WAAY,OAAQ,gBAAiB,EAAE,YAAY;AAAA,IACrD,CAAC;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IAChB,OAAQ;AAAA,MACP,GAAG;AAAA,MACH,eAAe;AAAA,IAChB;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,CAAE,YAAa,IAAI,gCAAiC,YAAa;AAEvE,QAAM,eACL,CAAE,cAAe,YAAa,KAAK,CAAE,cAAe,aAAc,IAC/D,eACA,SAAS;AAEb,MAAK,WAAY;AAChB,WAAO;AAAA,EACR;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,WAAU;AAAA,MACV,MAAK;AAAA,MACL,UAAW;AAAA,MAEX;AAAA,4BAAC;AAAA;AAAA;AAAA,UAIC;AAAA,SAEF;AAAA,QACA,oBAAC,YAAS,WAAU,8CACnB;AAAA,UAAC;AAAA;AAAA,YACA,OAAQ;AAAA,YACR;AAAA,YAEA;AAAA,kCAAC,aAAU,gBAAiB,OAAQ;AAAA,cAKpC,oBAAC,gBAAa,QAAS,cAAe;AAAA,cACtC;AAAA,gBAAC;AAAA;AAAA,kBACA,QAAS;AAAA;AAAA,cACV;AAAA;AAAA;AAAA,QACD,GACD;AAAA;AAAA;AAAA,EACD;AAEF;AACA,IAAO,oBAAQ,WAAY,qBAAsB;",
6
6
  "names": []
7
7
  }
@@ -10,10 +10,10 @@ import { privateApis, store as blockEditorStore } from "@wordpress/block-editor"
10
10
  import {
11
11
  Button,
12
12
  Modal,
13
- withFilters,
14
13
  __experimentalHStack as HStack,
15
14
  __experimentalVStack as VStack
16
15
  } from "@wordpress/components";
16
+ import { applyFilters } from "@wordpress/hooks";
17
17
  import { useState, useEffect } from "@wordpress/element";
18
18
  import { __, sprintf, _n } from "@wordpress/i18n";
19
19
  import { getSyncErrorMessages } from "../../utils/sync-error-messages.mjs";
@@ -24,32 +24,81 @@ import { jsx, jsxs } from "react/jsx-runtime";
24
24
  var { BlockCanvasCover } = unlock(privateApis);
25
25
  var { retrySyncConnection } = unlock(coreDataPrivateApis);
26
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;
27
+ function SyncConnectionErrorModal() {
28
+ const [hasInitialized, setHasInitialized] = useState(false);
29
+ const [showModal, setShowModal] = useState(false);
30
+ const [isManualRetryAvailable, setIsManualRetryAvailable] = useState(false);
31
+ const { connectionStatus, isCollaborationEnabled, postType } = useSelect(
32
+ (selectFn) => {
33
+ const currentPostType = selectFn(editorStore).getCurrentPostType();
34
+ return {
35
+ connectionStatus: selectFn(coreDataStore).getSyncConnectionStatus() || null,
36
+ isCollaborationEnabled: selectFn(
37
+ editorStore
38
+ ).isCollaborationEnabledForCurrentPost(),
39
+ postType: currentPostType ? selectFn(coreDataStore).getPostType(currentPostType) : null
40
+ };
41
+ },
42
+ []
43
+ );
44
+ const { onManualRetry, secondsRemaining } = useRetryCountdown(connectionStatus);
36
45
  const copyButtonRef = useCopyToClipboard(() => {
37
46
  const blocks = select(blockEditorStore).getBlocks();
38
47
  return serialize(blocks);
39
48
  });
49
+ useEffect(() => {
50
+ const timeout = setTimeout(() => {
51
+ setHasInitialized(true);
52
+ }, INITIAL_DISCONNECTED_DEBOUNCE_MS);
53
+ return () => clearTimeout(timeout);
54
+ }, []);
55
+ useEffect(() => {
56
+ if ("connecting" === connectionStatus?.status) {
57
+ return;
58
+ }
59
+ setIsManualRetryAvailable(
60
+ connectionStatus !== null && "canManuallyRetry" in connectionStatus && connectionStatus.canManuallyRetry === true
61
+ );
62
+ }, [connectionStatus]);
63
+ const canRetry = connectionStatus && "disconnected" === connectionStatus.status && (connectionStatus.canManuallyRetry || connectionStatus.willAutoRetryInMs);
64
+ useEffect(() => {
65
+ if ("connected" === connectionStatus?.status) {
66
+ setShowModal(false);
67
+ return;
68
+ }
69
+ if (connectionStatus?.status && "connecting" !== connectionStatus.status && (!canRetry || connectionStatus.backgroundRetriesFailed)) {
70
+ setShowModal(true);
71
+ }
72
+ }, [connectionStatus, canRetry]);
73
+ if (!isCollaborationEnabled || !hasInitialized || !showModal) {
74
+ return null;
75
+ }
76
+ const error = connectionStatus && "error" in connectionStatus ? connectionStatus?.error : void 0;
77
+ if (!canRetry && applyFilters(
78
+ "editor.isSyncConnectionErrorHandled",
79
+ false,
80
+ error?.code
81
+ ) !== false) {
82
+ return null;
83
+ }
84
+ const manualRetry = isManualRetryAvailable ? () => {
85
+ onManualRetry();
86
+ retrySyncConnection();
87
+ } : void 0;
88
+ const messages = getSyncErrorMessages(error);
40
89
  let retryCountdownText = "";
41
90
  let isRetrying = false;
42
- if (secondsRemainingUntilAutoRetry && secondsRemainingUntilAutoRetry > 0) {
91
+ if (secondsRemaining && secondsRemaining > 0) {
43
92
  retryCountdownText = sprintf(
44
93
  /* translators: %d: number of seconds until retry */
45
94
  _n(
46
95
  "Retrying connection in %d second\u2026",
47
96
  "Retrying connection in %d seconds\u2026",
48
- secondsRemainingUntilAutoRetry
97
+ secondsRemaining
49
98
  ),
50
- secondsRemainingUntilAutoRetry
99
+ secondsRemaining
51
100
  );
52
- } else if (0 === secondsRemainingUntilAutoRetry) {
101
+ } else if (0 === secondsRemaining) {
53
102
  isRetrying = true;
54
103
  retryCountdownText = __("Retrying\u2026");
55
104
  }
@@ -57,7 +106,7 @@ function DefaultSyncConnectionErrorModal(props) {
57
106
  if (postType?.slug) {
58
107
  editPostHref = `edit.php?post_type=${postType.slug}`;
59
108
  }
60
- return /* @__PURE__ */ jsx(
109
+ return /* @__PURE__ */ jsx(BlockCanvasCover.Fill, { children: /* @__PURE__ */ jsx(
61
110
  Modal,
62
111
  {
63
112
  overlayClassName: "editor-sync-connection-error-modal",
@@ -67,9 +116,9 @@ function DefaultSyncConnectionErrorModal(props) {
67
116
  shouldCloseOnClickOutside: false,
68
117
  shouldCloseOnEsc: false,
69
118
  size: "medium",
70
- title,
119
+ title: messages.title,
71
120
  children: /* @__PURE__ */ jsxs(VStack, { spacing: 6, children: [
72
- /* @__PURE__ */ jsx("p", { children: description }),
121
+ /* @__PURE__ */ jsx("p", { children: messages.description }),
73
122
  retryCountdownText && /* @__PURE__ */ jsx("p", { className: "editor-sync-connection-error-modal__retry-countdown", children: retryCountdownText }),
74
123
  /* @__PURE__ */ jsxs(HStack, { justify: "right", children: [
75
124
  /* @__PURE__ */ jsx(
@@ -111,64 +160,6 @@ function DefaultSyncConnectionErrorModal(props) {
111
160
  ] })
112
161
  ] })
113
162
  }
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
163
  ) });
173
164
  }
174
165
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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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",
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} 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\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n} from '@wordpress/components';\nimport { applyFilters } from '@wordpress/hooks';\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/**\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\tconst [ isManualRetryAvailable, setIsManualRetryAvailable ] =\n\t\tuseState( 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 copyButtonRef = useCopyToClipboard( () => {\n\t\tconst blocks = select( blockEditorStore ).getBlocks();\n\t\treturn serialize( blocks );\n\t} );\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\t// Track retry availability separately from the raw connection status.\n\t// The polling manager briefly emits `{ status: 'connecting' }` without\n\t// `canManuallyRetry` when a retry is kicked off, which would otherwise\n\t// unmount the Retry button briefly.\n\tuseEffect( () => {\n\t\tif ( 'connecting' === connectionStatus?.status ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsManualRetryAvailable(\n\t\t\tconnectionStatus !== null &&\n\t\t\t\t'canManuallyRetry' in connectionStatus &&\n\t\t\t\tconnectionStatus.canManuallyRetry === true\n\t\t);\n\t}, [ connectionStatus ] );\n\n\t// Show the modal when disconnected and either retries are exhausted or\n\t// no retry is available (unrecoverable error). Hide on reconnect.\n\t// The 'connecting' state is ignored so the modal preserves its current\n\t// visibility during active retry attempts.\n\tconst canRetry =\n\t\tconnectionStatus &&\n\t\t'disconnected' === connectionStatus.status &&\n\t\t( connectionStatus.canManuallyRetry ||\n\t\t\tconnectionStatus.willAutoRetryInMs );\n\n\tuseEffect( () => {\n\t\tif ( 'connected' === connectionStatus?.status ) {\n\t\t\tsetShowModal( false );\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tconnectionStatus?.status &&\n\t\t\t'connecting' !== connectionStatus.status &&\n\t\t\t( ! canRetry || connectionStatus.backgroundRetriesFailed )\n\t\t) {\n\t\t\tsetShowModal( true );\n\t\t}\n\t}, [ connectionStatus, canRetry ] );\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\n\t// For unrecoverable errors (no retry available), allow plugins to handle\n\t// the error themselves. If a plugin returns a value other than false, it\n\t// signals that it has taken over error display and the default modal is\n\t// suppressed.\n\t//\n\t// @example\n\t// ```js\n\t// wp.hooks.addFilter(\n\t// 'editor.isSyncConnectionErrorHandled',\n\t// 'my-plugin/handle-sync-error',\n\t// ( isHandled, errorCode ) => {\n\t// if ( errorCode === 'connection-limit-exceeded' ) {\n\t// return true; // Plugin handles this error via its own UI.\n\t// }\n\t// return isHandled;\n\t// }\n\t// );\n\t// ```\n\tif (\n\t\t! canRetry &&\n\t\tapplyFilters(\n\t\t\t'editor.isSyncConnectionErrorHandled',\n\t\t\tfalse,\n\t\t\terror?.code\n\t\t) !== false\n\t) {\n\t\treturn null;\n\t}\n\n\tconst manualRetry = isManualRetryAvailable\n\t\t? () => {\n\t\t\t\tonManualRetry();\n\t\t\t\tretrySyncConnection();\n\t\t }\n\t\t: undefined;\n\n\tconst messages = getSyncErrorMessages( error );\n\n\tlet retryCountdownText: string = '';\n\tlet isRetrying = false;\n\tif ( secondsRemaining && secondsRemaining > 0 ) {\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\tsecondsRemaining\n\t\t\t),\n\t\t\tsecondsRemaining\n\t\t);\n\t} else if ( 0 === secondsRemaining ) {\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<BlockCanvasCover.Fill>\n\t\t\t<Modal\n\t\t\t\toverlayClassName=\"editor-sync-connection-error-modal\"\n\t\t\t\tisDismissible={ false }\n\t\t\t\tonRequestClose={ () => {} }\n\t\t\t\tshouldCloseOnClickOutside={ false }\n\t\t\t\tshouldCloseOnEsc={ false }\n\t\t\t\tsize=\"medium\"\n\t\t\t\ttitle={ messages.title }\n\t\t\t>\n\t\t\t\t<VStack spacing={ 6 }>\n\t\t\t\t\t<p>{ messages.description }</p>\n\t\t\t\t\t{ retryCountdownText && (\n\t\t\t\t\t\t<p className=\"editor-sync-connection-error-modal__retry-countdown\">\n\t\t\t\t\t\t\t{ retryCountdownText }\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) }\n\t\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\thref={ editPostHref }\n\t\t\t\t\t\t\tisDestructive\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ sprintf(\n\t\t\t\t\t\t\t\t/* translators: %s: Post type name (e.g., \"Posts\", \"Pages\"). */\n\t\t\t\t\t\t\t\t__( 'Back to %s' ),\n\t\t\t\t\t\t\t\tpostType?.labels?.name ?? __( 'Posts' )\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tref={ copyButtonRef }\n\t\t\t\t\t\t\tvariant={ manualRetry ? 'secondary' : 'primary' }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Copy Post Content' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{ manualRetry && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\t\taria-disabled={ isRetrying }\n\t\t\t\t\t\t\t\tdisabled={ isRetrying }\n\t\t\t\t\t\t\t\tisBusy={ isRetrying }\n\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\tonClick={ manualRetry }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'Retry' ) }\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</HStack>\n\t\t\t\t</VStack>\n\t\t\t</Modal>\n\t\t</BlockCanvasCover.Fill>\n\t);\n}\n"],
5
+ "mappings": ";AAGA,SAAS,WAAW,cAAc;AAClC,SAAS,0BAA0B;AAEnC,SAAS,iBAAiB;AAC1B;AAAA,EACC,SAAS;AAAA,EACT,eAAe;AAAA,OACT;AAGP,SAAS,aAAa,SAAS,wBAAwB;AACvD;AAAA,EACC;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,OAClB;AACP,SAAS,oBAAoB;AAC7B,SAAS,UAAU,iBAAiB;AACpC,SAAS,IAAI,SAAS,UAAU;AAKhC,SAAS,4BAA4B;AACrC,SAAS,SAAS,mBAAmB;AACrC,SAAS,cAAc;AACvB,SAAS,yBAAyB;AAkL7B,cAMA,YANA;AAhLL,IAAM,EAAE,iBAAiB,IAAI,OAAQ,WAAY;AACjD,IAAM,EAAE,oBAAoB,IAAI,OAAQ,mBAAoB;AAG5D,IAAM,mCAAmC;AAQlC,SAAS,2BAA2B;AAC1C,QAAM,CAAE,gBAAgB,iBAAkB,IAAI,SAAU,KAAM;AAC9D,QAAM,CAAE,WAAW,YAAa,IAAI,SAAU,KAAM;AACpD,QAAM,CAAE,wBAAwB,yBAA0B,IACzD,SAAU,KAAM;AAEjB,QAAM,EAAE,kBAAkB,wBAAwB,SAAS,IAAI;AAAA,IAC9D,CAAE,aAAc;AACf,YAAM,kBACL,SAAU,WAAY,EAAE,mBAAmB;AAC5C,aAAO;AAAA,QACN,kBACC,SAAU,aAAc,EAAE,wBAAwB,KAAK;AAAA,QACxD,wBACC;AAAA,UACC;AAAA,QACD,EAAE,qCAAqC;AAAA,QACxC,UAAU,kBACP,SAAU,aAAc,EAAE,YAAa,eAAgB,IACvD;AAAA,MACJ;AAAA,IACD;AAAA,IACA,CAAC;AAAA,EACF;AAEA,QAAM,EAAE,eAAe,iBAAiB,IACvC,kBAAmB,gBAAiB;AAErC,QAAM,gBAAgB,mBAAoB,MAAM;AAC/C,UAAM,SAAS,OAAQ,gBAAiB,EAAE,UAAU;AACpD,WAAO,UAAW,MAAO;AAAA,EAC1B,CAAE;AAGF,YAAW,MAAM;AAChB,UAAM,UAAU,WAAY,MAAM;AACjC,wBAAmB,IAAK;AAAA,IACzB,GAAG,gCAAiC;AAEpC,WAAO,MAAM,aAAc,OAAQ;AAAA,EACpC,GAAG,CAAC,CAAE;AAMN,YAAW,MAAM;AAChB,QAAK,iBAAiB,kBAAkB,QAAS;AAChD;AAAA,IACD;AAEA;AAAA,MACC,qBAAqB,QACpB,sBAAsB,oBACtB,iBAAiB,qBAAqB;AAAA,IACxC;AAAA,EACD,GAAG,CAAE,gBAAiB,CAAE;AAMxB,QAAM,WACL,oBACA,mBAAmB,iBAAiB,WAClC,iBAAiB,oBAClB,iBAAiB;AAEnB,YAAW,MAAM;AAChB,QAAK,gBAAgB,kBAAkB,QAAS;AAC/C,mBAAc,KAAM;AACpB;AAAA,IACD;AAEA,QACC,kBAAkB,UAClB,iBAAiB,iBAAiB,WAChC,CAAE,YAAY,iBAAiB,0BAChC;AACD,mBAAc,IAAK;AAAA,IACpB;AAAA,EACD,GAAG,CAAE,kBAAkB,QAAS,CAAE;AAElC,MAAK,CAAE,0BAA0B,CAAE,kBAAkB,CAAE,WAAY;AAClE,WAAO;AAAA,EACR;AAEA,QAAM,QACL,oBAAoB,WAAW,mBAC5B,kBAAkB,QAClB;AAoBJ,MACC,CAAE,YACF;AAAA,IACC;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACR,MAAM,OACL;AACD,WAAO;AAAA,EACR;AAEA,QAAM,cAAc,yBACjB,MAAM;AACN,kBAAc;AACd,wBAAoB;AAAA,EACpB,IACA;AAEH,QAAM,WAAW,qBAAsB,KAAM;AAE7C,MAAI,qBAA6B;AACjC,MAAI,aAAa;AACjB,MAAK,oBAAoB,mBAAmB,GAAI;AAC/C,yBAAqB;AAAA;AAAA,MAEpB;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACA;AAAA,IACD;AAAA,EACD,WAAY,MAAM,kBAAmB;AACpC,iBAAa;AACb,yBAAqB,GAAI,gBAAiB;AAAA,EAC3C;AAEA,MAAI,eAAe;AACnB,MAAK,UAAU,MAAO;AACrB,mBAAe,sBAAuB,SAAS,IAAK;AAAA,EACrD;AAEA,SACC,oBAAC,iBAAiB,MAAjB,EACA;AAAA,IAAC;AAAA;AAAA,MACA,kBAAiB;AAAA,MACjB,eAAgB;AAAA,MAChB,gBAAiB,MAAM;AAAA,MAAC;AAAA,MACxB,2BAA4B;AAAA,MAC5B,kBAAmB;AAAA,MACnB,MAAK;AAAA,MACL,OAAQ,SAAS;AAAA,MAEjB,+BAAC,UAAO,SAAU,GACjB;AAAA,4BAAC,OAAI,mBAAS,aAAa;AAAA,QACzB,sBACD,oBAAC,OAAE,WAAU,uDACV,8BACH;AAAA,QAED,qBAAC,UAAO,SAAQ,SACf;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,uBAAqB;AAAA,cACrB,MAAO;AAAA,cACP,eAAa;AAAA,cACb,SAAQ;AAAA,cAEN;AAAA;AAAA,gBAED,GAAI,YAAa;AAAA,gBACjB,UAAU,QAAQ,QAAQ,GAAI,OAAQ;AAAA,cACvC;AAAA;AAAA,UACD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACA,uBAAqB;AAAA,cACrB,KAAM;AAAA,cACN,SAAU,cAAc,cAAc;AAAA,cAEpC,aAAI,mBAAoB;AAAA;AAAA,UAC3B;AAAA,UACE,eACD;AAAA,YAAC;AAAA;AAAA,cACA,uBAAqB;AAAA,cACrB,wBAAsB;AAAA,cACtB,iBAAgB;AAAA,cAChB,UAAW;AAAA,cACX,QAAS;AAAA,cACT,SAAQ;AAAA,cACR,SAAU;AAAA,cAER,aAAI,OAAQ;AAAA;AAAA,UACf;AAAA,WAEF;AAAA,SACD;AAAA;AAAA,EACD,GACD;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,13 +1,15 @@
1
1
  // packages/editor/src/components/sync-connection-error-modal/use-retry-countdown.ts
2
- import { useState, useEffect } from "@wordpress/element";
2
+ import { useState, useEffect, useRef } from "@wordpress/element";
3
3
  function useRetryCountdown(connectionStatus) {
4
4
  const [secondsRemaining, setSecondsRemaining] = useState();
5
+ const hasRetriedRef = useRef(false);
5
6
  useEffect(() => {
6
7
  if (!connectionStatus) {
7
8
  return;
8
9
  }
9
10
  if ("connected" === connectionStatus.status) {
10
11
  setSecondsRemaining(void 0);
12
+ hasRetriedRef.current = false;
11
13
  return;
12
14
  }
13
15
  if ("disconnected" !== connectionStatus.status || !connectionStatus.willAutoRetryInMs) {
@@ -15,18 +17,39 @@ function useRetryCountdown(connectionStatus) {
15
17
  }
16
18
  const { willAutoRetryInMs: retryInMs } = connectionStatus;
17
19
  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);
20
+ const hasRetried = hasRetriedRef.current;
21
+ hasRetriedRef.current = true;
22
+ if (hasRetried) {
23
+ setSecondsRemaining(0);
24
+ }
25
+ let countdownIntervalId = null;
26
+ const startCountdown = () => {
27
+ setSecondsRemaining(Math.ceil((retryAt - Date.now()) / 1e3));
28
+ countdownIntervalId = setInterval(() => {
29
+ const remaining = Math.ceil((retryAt - Date.now()) / 1e3);
30
+ setSecondsRemaining(Math.max(0, remaining));
31
+ if (remaining <= 0 && countdownIntervalId) {
32
+ clearInterval(countdownIntervalId);
33
+ }
34
+ }, 1e3);
35
+ };
36
+ const retryingDelayId = hasRetried ? setTimeout(startCountdown, 500) : null;
37
+ if (!retryingDelayId) {
38
+ startCountdown();
39
+ }
40
+ return () => {
41
+ if (retryingDelayId) {
42
+ clearTimeout(retryingDelayId);
43
+ }
44
+ if (countdownIntervalId) {
45
+ clearInterval(countdownIntervalId);
24
46
  }
25
- }, 1e3);
26
- return () => clearInterval(intervalId);
47
+ };
27
48
  }, [connectionStatus]);
28
49
  return {
29
- onManualRetry: () => setSecondsRemaining(0),
50
+ onManualRetry: () => {
51
+ setSecondsRemaining(0);
52
+ },
30
53
  secondsRemaining
31
54
  };
32
55
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport type { ConnectionStatus } from '@wordpress/core-data';\nimport { useState, useEffect, useRef } 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\tconst hasRetriedRef = useRef( false );\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\thasRetriedRef.current = false;\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\n\t\t// After a retry attempt (manual or automatic), show \"Retrying...\"\n\t\t// for 500ms before starting the next countdown. Skip the delay on\n\t\t// the very first disconnect so the countdown starts immediately.\n\t\tconst hasRetried = hasRetriedRef.current;\n\t\thasRetriedRef.current = true;\n\n\t\tif ( hasRetried ) {\n\t\t\tsetSecondsRemaining( 0 );\n\t\t}\n\n\t\tlet countdownIntervalId: ReturnType< typeof setInterval > | null = null;\n\n\t\tconst startCountdown = () => {\n\t\t\tsetSecondsRemaining( Math.ceil( ( retryAt - Date.now() ) / 1000 ) );\n\n\t\t\tcountdownIntervalId = setInterval( () => {\n\t\t\t\tconst remaining = Math.ceil( ( retryAt - Date.now() ) / 1000 );\n\t\t\t\tsetSecondsRemaining( Math.max( 0, remaining ) );\n\n\t\t\t\tif ( remaining <= 0 && countdownIntervalId ) {\n\t\t\t\t\tclearInterval( countdownIntervalId );\n\t\t\t\t}\n\t\t\t}, 1000 );\n\t\t};\n\n\t\tconst retryingDelayId = hasRetried\n\t\t\t? setTimeout( startCountdown, 500 )\n\t\t\t: null;\n\n\t\tif ( ! retryingDelayId ) {\n\t\t\tstartCountdown();\n\t\t}\n\n\t\treturn () => {\n\t\t\tif ( retryingDelayId ) {\n\t\t\t\tclearTimeout( retryingDelayId );\n\t\t\t}\n\n\t\t\tif ( countdownIntervalId ) {\n\t\t\t\tclearInterval( countdownIntervalId );\n\t\t\t}\n\t\t};\n\t}, [ connectionStatus ] );\n\n\treturn {\n\t\tonManualRetry: () => {\n\t\t\tsetSecondsRemaining( 0 );\n\t\t},\n\t\tsecondsRemaining,\n\t};\n}\n"],
5
+ "mappings": ";AAIA,SAAS,UAAU,WAAW,cAAc;AAOrC,SAAS,kBACf,kBAC0B;AAC1B,QAAM,CAAE,kBAAkB,mBAAoB,IAAI,SAAmB;AACrE,QAAM,gBAAgB,OAAQ,KAAM;AAEpC,YAAW,MAAM;AAChB,QAAK,CAAE,kBAAmB;AACzB;AAAA,IACD;AAGA,QAAK,gBAAgB,iBAAiB,QAAS;AAC9C,0BAAqB,MAAU;AAC/B,oBAAc,UAAU;AACxB;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;AAK7B,UAAM,aAAa,cAAc;AACjC,kBAAc,UAAU;AAExB,QAAK,YAAa;AACjB,0BAAqB,CAAE;AAAA,IACxB;AAEA,QAAI,sBAA+D;AAEnE,UAAM,iBAAiB,MAAM;AAC5B,0BAAqB,KAAK,MAAQ,UAAU,KAAK,IAAI,KAAM,GAAK,CAAE;AAElE,4BAAsB,YAAa,MAAM;AACxC,cAAM,YAAY,KAAK,MAAQ,UAAU,KAAK,IAAI,KAAM,GAAK;AAC7D,4BAAqB,KAAK,IAAK,GAAG,SAAU,CAAE;AAE9C,YAAK,aAAa,KAAK,qBAAsB;AAC5C,wBAAe,mBAAoB;AAAA,QACpC;AAAA,MACD,GAAG,GAAK;AAAA,IACT;AAEA,UAAM,kBAAkB,aACrB,WAAY,gBAAgB,GAAI,IAChC;AAEH,QAAK,CAAE,iBAAkB;AACxB,qBAAe;AAAA,IAChB;AAEA,WAAO,MAAM;AACZ,UAAK,iBAAkB;AACtB,qBAAc,eAAgB;AAAA,MAC/B;AAEA,UAAK,qBAAsB;AAC1B,sBAAe,mBAAoB;AAAA,MACpC;AAAA,IACD;AAAA,EACD,GAAG,CAAE,gBAAiB,CAAE;AAExB,SAAO;AAAA,IACN,eAAe,MAAM;AACpB,0BAAqB,CAAE;AAAA,IACxB;AAAA,IACA;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }
@@ -1,8 +1,8 @@
1
1
  // packages/editor/src/hooks/default-autocompleters.js
2
2
  import { addFilter } from "@wordpress/hooks";
3
- import { userAutocompleter } from "../components/index.mjs";
3
+ import { linkAutocompleter, userAutocompleter } from "../components/index.mjs";
4
4
  function setDefaultCompleters(completers = []) {
5
- completers.push({ ...userAutocompleter });
5
+ completers.push({ ...linkAutocompleter }, { ...userAutocompleter });
6
6
  return completers;
7
7
  }
8
8
  addFilter(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/default-autocompleters.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { addFilter } from '@wordpress/hooks';\n\n/**\n * Internal dependencies\n */\nimport { userAutocompleter } from '../components';\n\nfunction setDefaultCompleters( completers = [] ) {\n\t// Provide copies so filters may directly modify them.\n\tcompleters.push( { ...userAutocompleter } );\n\n\treturn completers;\n}\n\naddFilter(\n\t'editor.Autocomplete.completers',\n\t'editor/autocompleters/set-default-completers',\n\tsetDefaultCompleters\n);\n"],
5
- "mappings": ";AAGA,SAAS,iBAAiB;AAK1B,SAAS,yBAAyB;AAElC,SAAS,qBAAsB,aAAa,CAAC,GAAI;AAEhD,aAAW,KAAM,EAAE,GAAG,kBAAkB,CAAE;AAE1C,SAAO;AACR;AAEA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACD;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { addFilter } from '@wordpress/hooks';\n\n/**\n * Internal dependencies\n */\nimport { linkAutocompleter, userAutocompleter } from '../components';\n\nfunction setDefaultCompleters( completers = [] ) {\n\t// Provide copies so filters may directly modify them.\n\tcompleters.push( { ...linkAutocompleter }, { ...userAutocompleter } );\n\n\treturn completers;\n}\n\naddFilter(\n\t'editor.Autocomplete.completers',\n\t'editor/autocompleters/set-default-completers',\n\tsetDefaultCompleters\n);\n"],
5
+ "mappings": ";AAGA,SAAS,iBAAiB;AAK1B,SAAS,mBAAmB,yBAAyB;AAErD,SAAS,qBAAsB,aAAa,CAAC,GAAI;AAEhD,aAAW,KAAM,EAAE,GAAG,kBAAkB,GAAG,EAAE,GAAG,kBAAkB,CAAE;AAEpE,SAAO;AACR;AAEA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACD;",
6
6
  "names": []
7
7
  }
@@ -418,12 +418,7 @@ var restoreRevision = (revisionId) => async ({ select, dispatch, registry }) =>
418
418
  sprintf(
419
419
  /* translators: %s: Date and time of the revision. */
420
420
  __("Restored to revision from %s."),
421
- dateI18n(
422
- getDateSettings().formats.datetime,
423
- // Template revisions use the template REST API format, which
424
- // exposes 'modified' instead of 'date'.
425
- revisionKey === "wp_id" ? revision.modified : revision.date
426
- )
421
+ dateI18n(getDateSettings().formats.datetime, revision.date)
427
422
  ),
428
423
  {
429
424
  type: "snackbar",