@wordpress/block-library 9.34.1-next.2f1c7c01b.0 → 9.35.1-next.16d95556a.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 (172) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/block/edit.js +2 -2
  3. package/build/block/edit.js.map +2 -2
  4. package/build/block-keyboard-shortcuts/index.js +17 -7
  5. package/build/block-keyboard-shortcuts/index.js.map +2 -2
  6. package/build/cover/deprecated.js +15 -3
  7. package/build/cover/deprecated.js.map +2 -2
  8. package/build/cover/edit/inspector-controls.js +1 -1
  9. package/build/cover/edit/inspector-controls.js.map +2 -2
  10. package/build/cover/transforms.js +10 -2
  11. package/build/cover/transforms.js.map +2 -2
  12. package/build/embed/icons.js +2 -2
  13. package/build/embed/icons.js.map +2 -2
  14. package/build/embed/variations.js +3 -3
  15. package/build/embed/variations.js.map +2 -2
  16. package/build/heading/index.js +3 -1
  17. package/build/heading/index.js.map +3 -3
  18. package/build/heading/transforms.js +10 -3
  19. package/build/heading/transforms.js.map +2 -2
  20. package/build/heading/variations.js +55 -0
  21. package/build/heading/variations.js.map +7 -0
  22. package/build/html/edit.js +54 -44
  23. package/build/html/edit.js.map +3 -3
  24. package/build/html/modal.js +328 -0
  25. package/build/html/modal.js.map +7 -0
  26. package/build/html/utils.js +72 -0
  27. package/build/html/utils.js.map +7 -0
  28. package/build/navigation-link/edit.js +25 -10
  29. package/build/navigation-link/edit.js.map +2 -2
  30. package/build/navigation-link/link-ui/index.js +8 -3
  31. package/build/navigation-link/link-ui/index.js.map +2 -2
  32. package/build/navigation-link/shared/controls.js +42 -7
  33. package/build/navigation-link/shared/controls.js.map +2 -2
  34. package/build/navigation-link/shared/use-entity-binding.js +31 -2
  35. package/build/navigation-link/shared/use-entity-binding.js.map +3 -3
  36. package/build/paragraph/block.json +1 -3
  37. package/build/paragraph/deprecated.js +65 -12
  38. package/build/paragraph/deprecated.js.map +2 -2
  39. package/build/paragraph/edit.js +14 -25
  40. package/build/paragraph/edit.js.map +2 -2
  41. package/build/paragraph/index.js +3 -1
  42. package/build/paragraph/index.js.map +3 -3
  43. package/build/paragraph/save.js +3 -3
  44. package/build/paragraph/save.js.map +2 -2
  45. package/build/paragraph/transforms.js +7 -1
  46. package/build/paragraph/transforms.js.map +2 -2
  47. package/build/paragraph/variations.js +57 -0
  48. package/build/paragraph/variations.js.map +7 -0
  49. package/build/pullquote/block.json +3 -2
  50. package/build/pullquote/transforms.js +0 -31
  51. package/build/pullquote/transforms.js.map +2 -2
  52. package/build/quote/transforms.js +0 -20
  53. package/build/quote/transforms.js.map +2 -2
  54. package/build-module/block/edit.js +2 -2
  55. package/build-module/block/edit.js.map +2 -2
  56. package/build-module/block-keyboard-shortcuts/index.js +17 -7
  57. package/build-module/block-keyboard-shortcuts/index.js.map +2 -2
  58. package/build-module/cover/deprecated.js +15 -3
  59. package/build-module/cover/deprecated.js.map +2 -2
  60. package/build-module/cover/edit/inspector-controls.js +1 -1
  61. package/build-module/cover/edit/inspector-controls.js.map +2 -2
  62. package/build-module/cover/transforms.js +10 -2
  63. package/build-module/cover/transforms.js.map +2 -2
  64. package/build-module/embed/icons.js +2 -2
  65. package/build-module/embed/icons.js.map +2 -2
  66. package/build-module/embed/variations.js +3 -3
  67. package/build-module/embed/variations.js.map +2 -2
  68. package/build-module/heading/index.js +3 -1
  69. package/build-module/heading/index.js.map +2 -2
  70. package/build-module/heading/transforms.js +10 -3
  71. package/build-module/heading/transforms.js.map +2 -2
  72. package/build-module/heading/variations.js +34 -0
  73. package/build-module/heading/variations.js.map +7 -0
  74. package/build-module/html/edit.js +62 -51
  75. package/build-module/html/edit.js.map +2 -2
  76. package/build-module/html/modal.js +304 -0
  77. package/build-module/html/modal.js.map +7 -0
  78. package/build-module/html/utils.js +46 -0
  79. package/build-module/html/utils.js.map +7 -0
  80. package/build-module/navigation-link/edit.js +25 -10
  81. package/build-module/navigation-link/edit.js.map +2 -2
  82. package/build-module/navigation-link/link-ui/index.js +8 -3
  83. package/build-module/navigation-link/link-ui/index.js.map +2 -2
  84. package/build-module/navigation-link/shared/controls.js +42 -7
  85. package/build-module/navigation-link/shared/controls.js.map +2 -2
  86. package/build-module/navigation-link/shared/use-entity-binding.js +35 -3
  87. package/build-module/navigation-link/shared/use-entity-binding.js.map +2 -2
  88. package/build-module/paragraph/block.json +1 -3
  89. package/build-module/paragraph/deprecated.js +65 -12
  90. package/build-module/paragraph/deprecated.js.map +2 -2
  91. package/build-module/paragraph/edit.js +14 -26
  92. package/build-module/paragraph/edit.js.map +2 -2
  93. package/build-module/paragraph/index.js +3 -1
  94. package/build-module/paragraph/index.js.map +2 -2
  95. package/build-module/paragraph/save.js +3 -3
  96. package/build-module/paragraph/save.js.map +2 -2
  97. package/build-module/paragraph/transforms.js +7 -1
  98. package/build-module/paragraph/transforms.js.map +2 -2
  99. package/build-module/paragraph/variations.js +36 -0
  100. package/build-module/paragraph/variations.js.map +7 -0
  101. package/build-module/pullquote/block.json +3 -2
  102. package/build-module/pullquote/transforms.js +0 -31
  103. package/build-module/pullquote/transforms.js.map +2 -2
  104. package/build-module/quote/transforms.js +0 -20
  105. package/build-module/quote/transforms.js.map +2 -2
  106. package/build-style/accordion-heading/style-rtl.css +19 -3
  107. package/build-style/accordion-heading/style.css +19 -3
  108. package/build-style/accordion-panel/style-rtl.css +4 -1
  109. package/build-style/accordion-panel/style.css +4 -1
  110. package/build-style/common-rtl.css +3 -3
  111. package/build-style/common.css +3 -3
  112. package/build-style/editor-rtl.css +62 -21
  113. package/build-style/editor.css +62 -21
  114. package/build-style/embed/style-rtl.css +5 -0
  115. package/build-style/embed/style.css +5 -0
  116. package/build-style/html/editor-rtl.css +55 -21
  117. package/build-style/html/editor.css +55 -21
  118. package/build-style/navigation-link/editor-rtl.css +7 -0
  119. package/build-style/navigation-link/editor.css +7 -0
  120. package/build-style/style-rtl.css +31 -7
  121. package/build-style/style.css +31 -7
  122. package/package.json +37 -37
  123. package/src/accordion-heading/style.scss +40 -7
  124. package/src/accordion-panel/style.scss +6 -1
  125. package/src/block/edit.js +2 -2
  126. package/src/block-keyboard-shortcuts/index.js +23 -9
  127. package/src/common.scss +6 -5
  128. package/src/cover/deprecated.js +15 -3
  129. package/src/cover/edit/inspector-controls.js +1 -1
  130. package/src/cover/transforms.js +10 -2
  131. package/src/embed/icons.js +2 -4
  132. package/src/embed/style.scss +6 -0
  133. package/src/embed/variations.js +3 -3
  134. package/src/heading/index.js +2 -0
  135. package/src/heading/test/__snapshots__/transforms.native.js.snap +0 -6
  136. package/src/heading/test/transforms.native.js +1 -5
  137. package/src/heading/transforms.js +10 -3
  138. package/src/heading/variations.js +37 -0
  139. package/src/html/edit.js +62 -56
  140. package/src/html/editor.scss +69 -10
  141. package/src/html/modal.js +290 -0
  142. package/src/html/test/utils.js +234 -0
  143. package/src/html/utils.js +75 -0
  144. package/src/navigation-link/edit.js +44 -13
  145. package/src/navigation-link/editor.scss +7 -0
  146. package/src/navigation-link/index.php +65 -2
  147. package/src/navigation-link/link-ui/index.js +9 -8
  148. package/src/navigation-link/shared/controls.js +70 -12
  149. package/src/navigation-link/shared/test/controls.js +5 -0
  150. package/src/navigation-link/shared/test/use-entity-binding.js +14 -1
  151. package/src/navigation-link/shared/use-entity-binding.js +57 -9
  152. package/src/paragraph/block.json +1 -3
  153. package/src/paragraph/deprecated.js +87 -20
  154. package/src/paragraph/edit.js +7 -18
  155. package/src/paragraph/edit.native.js +18 -6
  156. package/src/paragraph/index.js +2 -0
  157. package/src/paragraph/save.js +4 -3
  158. package/src/paragraph/test/__snapshots__/transforms.native.js.snap +0 -6
  159. package/src/paragraph/test/edit.native.js +5 -5
  160. package/src/paragraph/test/transforms.native.js +0 -1
  161. package/src/paragraph/transforms.js +7 -1
  162. package/src/paragraph/variations.js +39 -0
  163. package/src/pullquote/block.json +3 -2
  164. package/src/pullquote/test/__snapshots__/transforms.native.js.snap +5 -5
  165. package/src/pullquote/test/transforms.native.js +1 -1
  166. package/src/pullquote/transforms.js +0 -31
  167. package/src/quote/test/__snapshots__/transforms.native.js.snap +0 -6
  168. package/src/quote/test/transforms.native.js +1 -5
  169. package/src/quote/transforms.js +0 -25
  170. package/src/utils/transformation-categories.native.js +0 -1
  171. package/tsconfig.tsbuildinfo +1 -1
  172. package/src/pullquote/test/edit.native.js +0 -73
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/html/edit.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useContext, useState } from '@wordpress/element';\nimport {\n\tBlockControls,\n\tPlainText,\n\tuseBlockProps,\n\tstore as blockEditorStore,\n} from '@wordpress/block-editor';\nimport {\n\tToolbarButton,\n\tDisabled,\n\tToolbarGroup,\n\tVisuallyHidden,\n} from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { useInstanceId } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport Preview from './preview';\n\nexport default function HTMLEdit( { attributes, setAttributes, isSelected } ) {\n\tconst [ isPreview, setIsPreview ] = useState();\n\tconst isDisabled = useContext( Disabled.Context );\n\n\tconst instanceId = useInstanceId( HTMLEdit, 'html-edit-desc' );\n\n\tconst isPreviewMode = useSelect( ( select ) => {\n\t\treturn select( blockEditorStore ).getSettings().isPreviewMode;\n\t}, [] );\n\n\tfunction switchToPreview() {\n\t\tsetIsPreview( true );\n\t}\n\n\tfunction switchToHTML() {\n\t\tsetIsPreview( false );\n\t}\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: 'block-library-html__edit',\n\t\t'aria-describedby': isPreview ? instanceId : undefined,\n\t} );\n\n\treturn (\n\t\t<div { ...blockProps }>\n\t\t\t<BlockControls>\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tisPressed={ ! isPreview }\n\t\t\t\t\t\tonClick={ switchToHTML }\n\t\t\t\t\t>\n\t\t\t\t\t\tHTML\n\t\t\t\t\t</ToolbarButton>\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tisPressed={ isPreview }\n\t\t\t\t\t\tonClick={ switchToPreview }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Preview' ) }\n\t\t\t\t\t</ToolbarButton>\n\t\t\t\t</ToolbarGroup>\n\t\t\t</BlockControls>\n\t\t\t{ isPreview || isPreviewMode || isDisabled ? (\n\t\t\t\t<>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tcontent={ attributes.content }\n\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t/>\n\t\t\t\t\t<VisuallyHidden id={ instanceId }>\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'HTML preview is not yet fully accessible. Please switch screen reader to virtualized mode to navigate the below iFrame.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</VisuallyHidden>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<PlainText\n\t\t\t\t\tvalue={ attributes.content }\n\t\t\t\t\tonChange={ ( content ) => setAttributes( { content } ) }\n\t\t\t\t\tplaceholder={ __( 'Write HTML\u2026' ) }\n\t\t\t\t\taria-label={ __( 'HTML' ) }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</div>\n\t);\n}\n"],
5
- "mappings": ";AAGA,SAAS,UAAU;AACnB,SAAS,YAAY,gBAAgB;AACrC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,OACH;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAK9B,OAAO,aAAa;AA4BhB,SAgBA,UAfC,KADD;AA1BW,SAAR,SAA2B,EAAE,YAAY,eAAe,WAAW,GAAI;AAC7E,QAAM,CAAE,WAAW,YAAa,IAAI,SAAS;AAC7C,QAAM,aAAa,WAAY,SAAS,OAAQ;AAEhD,QAAM,aAAa,cAAe,UAAU,gBAAiB;AAE7D,QAAM,gBAAgB,UAAW,CAAE,WAAY;AAC9C,WAAO,OAAQ,gBAAiB,EAAE,YAAY,EAAE;AAAA,EACjD,GAAG,CAAC,CAAE;AAEN,WAAS,kBAAkB;AAC1B,iBAAc,IAAK;AAAA,EACpB;AAEA,WAAS,eAAe;AACvB,iBAAc,KAAM;AAAA,EACrB;AAEA,QAAM,aAAa,cAAe;AAAA,IACjC,WAAW;AAAA,IACX,oBAAoB,YAAY,aAAa;AAAA,EAC9C,CAAE;AAEF,SACC,qBAAC,SAAM,GAAG,YACT;AAAA,wBAAC,iBACA,+BAAC,gBACA;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,WAAY,CAAE;AAAA,UACd,SAAU;AAAA,UACV;AAAA;AAAA,MAED;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACA,WAAY;AAAA,UACZ,SAAU;AAAA,UAER,aAAI,SAAU;AAAA;AAAA,MACjB;AAAA,OACD,GACD;AAAA,IACE,aAAa,iBAAiB,aAC/B,iCACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,SAAU,WAAW;AAAA,UACrB;AAAA;AAAA,MACD;AAAA,MACA,oBAAC,kBAAe,IAAK,YAClB;AAAA,QACD;AAAA,MACD,GACD;AAAA,OACD,IAEA;AAAA,MAAC;AAAA;AAAA,QACA,OAAQ,WAAW;AAAA,QACnB,UAAW,CAAE,YAAa,cAAe,EAAE,QAAQ,CAAE;AAAA,QACrD,aAAc,GAAI,kBAAc;AAAA,QAChC,cAAa,GAAI,MAAO;AAAA;AAAA,IACzB;AAAA,KAEF;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useState } from '@wordpress/element';\nimport {\n\tBlockControls,\n\tBlockIcon,\n\tInspectorControls,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\nimport {\n\tToolbarButton,\n\tToolbarGroup,\n\tPlaceholder,\n\tButton,\n\t__experimentalVStack as VStack,\n} from '@wordpress/components';\nimport { code } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport Preview from './preview';\nimport HTMLEditModal from './modal';\n\nexport default function HTMLEdit( { attributes, setAttributes, isSelected } ) {\n\tconst [ isModalOpen, setIsModalOpen ] = useState( false );\n\tconst blockProps = useBlockProps( {\n\t\tclassName: 'block-library-html__edit',\n\t} );\n\n\t// Show placeholder when content is empty\n\tif ( ! attributes.content?.trim() ) {\n\t\treturn (\n\t\t\t<div { ...blockProps }>\n\t\t\t\t<Placeholder\n\t\t\t\t\ticon={ <BlockIcon icon={ code } /> }\n\t\t\t\t\tlabel={ __( 'Custom HTML' ) }\n\t\t\t\t\tinstructions={ __(\n\t\t\t\t\t\t'Add custom HTML code and preview how it looks.'\n\t\t\t\t\t) }\n\t\t\t\t>\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Edit HTML' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t</Placeholder>\n\t\t\t\t<HTMLEditModal\n\t\t\t\t\tisOpen={ isModalOpen }\n\t\t\t\t\tonRequestClose={ () => setIsModalOpen( false ) }\n\t\t\t\t\tcontent={ attributes.content }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div { ...blockProps }>\n\t\t\t<BlockControls>\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<ToolbarButton onClick={ () => setIsModalOpen( true ) }>\n\t\t\t\t\t\t{ __( 'Edit code' ) }\n\t\t\t\t\t</ToolbarButton>\n\t\t\t\t</ToolbarGroup>\n\t\t\t</BlockControls>\n\t\t\t<InspectorControls>\n\t\t\t\t<VStack\n\t\t\t\t\tclassName=\"block-editor-block-inspector-edit-contents\"\n\t\t\t\t\texpanded\n\t\t\t\t>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName=\"block-editor-block-inspector-edit-contents__button\"\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tonClick={ () => setIsModalOpen( true ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Edit code' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t</VStack>\n\t\t\t</InspectorControls>\n\t\t\t<Preview content={ attributes.content } isSelected={ isSelected } />\n\t\t\t<HTMLEditModal\n\t\t\t\tisOpen={ isModalOpen }\n\t\t\t\tonRequestClose={ () => setIsModalOpen( false ) }\n\t\t\t\tcontent={ attributes.content }\n\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],
5
+ "mappings": ";AAGA,SAAS,UAAU;AACnB,SAAS,gBAAgB;AACzB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,OAClB;AACP,SAAS,YAAY;AAKrB,OAAO,aAAa;AACpB,OAAO,mBAAmB;AAWvB,SAES,KAFT;AATY,SAAR,SAA2B,EAAE,YAAY,eAAe,WAAW,GAAI;AAC7E,QAAM,CAAE,aAAa,cAAe,IAAI,SAAU,KAAM;AACxD,QAAM,aAAa,cAAe;AAAA,IACjC,WAAW;AAAA,EACZ,CAAE;AAGF,MAAK,CAAE,WAAW,SAAS,KAAK,GAAI;AACnC,WACC,qBAAC,SAAM,GAAG,YACT;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,MAAO,oBAAC,aAAU,MAAO,MAAO;AAAA,UAChC,OAAQ,GAAI,aAAc;AAAA,UAC1B,cAAe;AAAA,YACd;AAAA,UACD;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACA,uBAAqB;AAAA,cACrB,SAAQ;AAAA,cACR,SAAU,MAAM,eAAgB,IAAK;AAAA,cAEnC,aAAI,WAAY;AAAA;AAAA,UACnB;AAAA;AAAA,MACD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACA,QAAS;AAAA,UACT,gBAAiB,MAAM,eAAgB,KAAM;AAAA,UAC7C,SAAU,WAAW;AAAA,UACrB;AAAA;AAAA,MACD;AAAA,OACD;AAAA,EAEF;AAEA,SACC,qBAAC,SAAM,GAAG,YACT;AAAA,wBAAC,iBACA,8BAAC,gBACA,8BAAC,iBAAc,SAAU,MAAM,eAAgB,IAAK,GACjD,aAAI,WAAY,GACnB,GACD,GACD;AAAA,IACA,oBAAC,qBACA;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV,UAAQ;AAAA,QAER;AAAA,UAAC;AAAA;AAAA,YACA,WAAU;AAAA,YACV,uBAAqB;AAAA,YACrB,SAAQ;AAAA,YACR,SAAU,MAAM,eAAgB,IAAK;AAAA,YAEnC,aAAI,WAAY;AAAA;AAAA,QACnB;AAAA;AAAA,IACD,GACD;AAAA,IACA,oBAAC,WAAQ,SAAU,WAAW,SAAU,YAA0B;AAAA,IAClE;AAAA,MAAC;AAAA;AAAA,QACA,QAAS;AAAA,QACT,gBAAiB,MAAM,eAAgB,KAAM;AAAA,QAC7C,SAAU,WAAW;AAAA,QACrB;AAAA;AAAA,IACD;AAAA,KACD;AAEF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,304 @@
1
+ // packages/block-library/src/html/modal.js
2
+ import { __ } from "@wordpress/i18n";
3
+ import { useState, useMemo } from "@wordpress/element";
4
+ import { useSelect } from "@wordpress/data";
5
+ import {
6
+ Modal,
7
+ Button,
8
+ Flex,
9
+ privateApis as componentsPrivateApis,
10
+ __experimentalHStack as HStack,
11
+ __experimentalVStack as VStack
12
+ } from "@wordpress/components";
13
+ import { PlainText, store as blockEditorStore } from "@wordpress/block-editor";
14
+ import { fullscreen, square } from "@wordpress/icons";
15
+ import { unlock } from "../lock-unlock";
16
+ import Preview from "./preview";
17
+ import { parseContent, serializeContent } from "./utils";
18
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
19
+ var { Tabs } = unlock(componentsPrivateApis);
20
+ function HTMLEditModal({
21
+ isOpen,
22
+ onRequestClose,
23
+ content,
24
+ setAttributes
25
+ }) {
26
+ const { html, css, js } = parseContent(content);
27
+ const [editedHtml, setEditedHtml] = useState(html);
28
+ const [editedCss, setEditedCss] = useState(css);
29
+ const [editedJs, setEditedJs] = useState(js);
30
+ const [isDirty, setIsDirty] = useState(false);
31
+ const [showUnsavedWarning, setShowUnsavedWarning] = useState(false);
32
+ const [isFullscreen, setIsFullscreen] = useState(false);
33
+ const { canUserUseUnfilteredHTML, editorStyles } = useSelect(
34
+ (select) => {
35
+ const settings = select(blockEditorStore).getSettings();
36
+ return {
37
+ canUserUseUnfilteredHTML: settings.__experimentalCanUserUseUnfilteredHTML,
38
+ editorStyles: settings.styles
39
+ };
40
+ },
41
+ []
42
+ );
43
+ const shouldShowJsTab = canUserUseUnfilteredHTML || js.trim() !== "";
44
+ const styleContent = useMemo(() => {
45
+ if (!editorStyles) {
46
+ return "";
47
+ }
48
+ return editorStyles.filter((style) => style.css).map((style) => style.css).join("\n");
49
+ }, [editorStyles]);
50
+ if (!isOpen) {
51
+ return null;
52
+ }
53
+ const handleHtmlChange = (value) => {
54
+ setEditedHtml(value);
55
+ setIsDirty(true);
56
+ };
57
+ const handleCssChange = (value) => {
58
+ setEditedCss(value);
59
+ setIsDirty(true);
60
+ };
61
+ const handleJsChange = (value) => {
62
+ setEditedJs(value);
63
+ setIsDirty(true);
64
+ };
65
+ const handleUpdate = () => {
66
+ setAttributes({
67
+ content: serializeContent({
68
+ html: editedHtml,
69
+ css: editedCss,
70
+ js: editedJs
71
+ })
72
+ });
73
+ setIsDirty(false);
74
+ };
75
+ const handleCancel = () => {
76
+ setIsDirty(false);
77
+ onRequestClose();
78
+ };
79
+ const handleRequestClose = () => {
80
+ if (isDirty) {
81
+ setShowUnsavedWarning(true);
82
+ } else {
83
+ onRequestClose();
84
+ }
85
+ };
86
+ const handleDiscardChanges = () => {
87
+ setShowUnsavedWarning(false);
88
+ onRequestClose();
89
+ };
90
+ const handleContinueEditing = () => {
91
+ setShowUnsavedWarning(false);
92
+ };
93
+ const handleUpdateAndClose = () => {
94
+ handleUpdate();
95
+ onRequestClose();
96
+ };
97
+ const toggleFullscreen = () => {
98
+ setIsFullscreen((prevState) => !prevState);
99
+ };
100
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
101
+ /* @__PURE__ */ jsxs(
102
+ Modal,
103
+ {
104
+ title: __("Edit HTML"),
105
+ onRequestClose: handleRequestClose,
106
+ className: "block-library-html__modal",
107
+ size: "large",
108
+ isDismissible: false,
109
+ shouldCloseOnClickOutside: !isDirty,
110
+ shouldCloseOnEsc: !isDirty,
111
+ isFullScreen: isFullscreen,
112
+ __experimentalHideHeader: true,
113
+ children: [
114
+ styleContent && /* @__PURE__ */ jsx(
115
+ "style",
116
+ {
117
+ dangerouslySetInnerHTML: { __html: styleContent }
118
+ }
119
+ ),
120
+ /* @__PURE__ */ jsx(Tabs, { orientation: "horizontal", defaultTabId: "html", children: /* @__PURE__ */ jsxs(VStack, { spacing: 4, style: { height: "100%" }, children: [
121
+ /* @__PURE__ */ jsxs(HStack, { justify: "space-between", children: [
122
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(Tabs.TabList, { children: [
123
+ /* @__PURE__ */ jsx(Tabs.Tab, { tabId: "html", children: "HTML" }),
124
+ /* @__PURE__ */ jsx(Tabs.Tab, { tabId: "css", children: "CSS" }),
125
+ shouldShowJsTab && /* @__PURE__ */ jsx(Tabs.Tab, { tabId: "js", children: __("JavaScript") })
126
+ ] }) }),
127
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
128
+ Button,
129
+ {
130
+ __next40pxDefaultSize: true,
131
+ icon: isFullscreen ? square : fullscreen,
132
+ label: __("Enable/disable fullscreen"),
133
+ onClick: toggleFullscreen,
134
+ variant: "tertiary"
135
+ }
136
+ ) })
137
+ ] }),
138
+ /* @__PURE__ */ jsxs(
139
+ HStack,
140
+ {
141
+ alignment: "stretch",
142
+ justify: "flex-start",
143
+ spacing: 4,
144
+ className: "block-library-html__modal-tabs",
145
+ style: { flexGrow: 1 },
146
+ children: [
147
+ /* @__PURE__ */ jsxs("div", { style: { flexGrow: 1 }, children: [
148
+ /* @__PURE__ */ jsx(
149
+ Tabs.TabPanel,
150
+ {
151
+ tabId: "html",
152
+ focusable: false,
153
+ className: "block-library-html__modal-tab",
154
+ children: /* @__PURE__ */ jsx(
155
+ PlainText,
156
+ {
157
+ value: editedHtml,
158
+ onChange: handleHtmlChange,
159
+ placeholder: __("Write HTML\u2026"),
160
+ "aria-label": __("HTML"),
161
+ className: "block-library-html__modal-editor"
162
+ }
163
+ )
164
+ }
165
+ ),
166
+ /* @__PURE__ */ jsx(
167
+ Tabs.TabPanel,
168
+ {
169
+ tabId: "css",
170
+ focusable: false,
171
+ className: "block-library-html__modal-tab",
172
+ children: /* @__PURE__ */ jsx(
173
+ PlainText,
174
+ {
175
+ value: editedCss,
176
+ onChange: handleCssChange,
177
+ placeholder: __("Write CSS\u2026"),
178
+ "aria-label": __("CSS"),
179
+ className: "block-library-html__modal-editor"
180
+ }
181
+ )
182
+ }
183
+ ),
184
+ shouldShowJsTab && /* @__PURE__ */ jsx(
185
+ Tabs.TabPanel,
186
+ {
187
+ tabId: "js",
188
+ focusable: false,
189
+ className: "block-library-html__modal-tab",
190
+ children: /* @__PURE__ */ jsx(
191
+ PlainText,
192
+ {
193
+ value: editedJs,
194
+ onChange: handleJsChange,
195
+ placeholder: __(
196
+ "Write JavaScript\u2026"
197
+ ),
198
+ "aria-label": __("JavaScript"),
199
+ className: "block-library-html__modal-editor"
200
+ }
201
+ )
202
+ }
203
+ )
204
+ ] }),
205
+ /* @__PURE__ */ jsx(
206
+ "div",
207
+ {
208
+ className: "block-library-html__preview",
209
+ style: { width: "50%" },
210
+ children: /* @__PURE__ */ jsx(
211
+ Preview,
212
+ {
213
+ content: serializeContent({
214
+ html: editedHtml,
215
+ css: editedCss,
216
+ js: editedJs
217
+ })
218
+ }
219
+ )
220
+ }
221
+ )
222
+ ]
223
+ }
224
+ ),
225
+ /* @__PURE__ */ jsxs(
226
+ HStack,
227
+ {
228
+ alignment: "center",
229
+ justify: "flex-end",
230
+ spacing: 4,
231
+ children: [
232
+ /* @__PURE__ */ jsx(
233
+ Button,
234
+ {
235
+ __next40pxDefaultSize: true,
236
+ variant: "tertiary",
237
+ onClick: handleCancel,
238
+ children: __("Cancel")
239
+ }
240
+ ),
241
+ /* @__PURE__ */ jsx(
242
+ Button,
243
+ {
244
+ __next40pxDefaultSize: true,
245
+ variant: "primary",
246
+ onClick: handleUpdateAndClose,
247
+ children: __("Update")
248
+ }
249
+ )
250
+ ]
251
+ }
252
+ )
253
+ ] }) })
254
+ ]
255
+ }
256
+ ),
257
+ showUnsavedWarning && /* @__PURE__ */ jsxs(
258
+ Modal,
259
+ {
260
+ title: __("Unsaved changes"),
261
+ onRequestClose: handleContinueEditing,
262
+ size: "medium",
263
+ children: [
264
+ /* @__PURE__ */ jsx("p", { children: __(
265
+ "You have unsaved changes. What would you like to do?"
266
+ ) }),
267
+ /* @__PURE__ */ jsxs(Flex, { direction: "row", justify: "flex-end", gap: 2, children: [
268
+ /* @__PURE__ */ jsx(
269
+ Button,
270
+ {
271
+ __next40pxDefaultSize: true,
272
+ variant: "secondary",
273
+ onClick: handleDiscardChanges,
274
+ children: __("Discard unsaved changes")
275
+ }
276
+ ),
277
+ /* @__PURE__ */ jsx(
278
+ Button,
279
+ {
280
+ __next40pxDefaultSize: true,
281
+ variant: "secondary",
282
+ onClick: handleContinueEditing,
283
+ children: __("Continue editing")
284
+ }
285
+ ),
286
+ /* @__PURE__ */ jsx(
287
+ Button,
288
+ {
289
+ __next40pxDefaultSize: true,
290
+ variant: "primary",
291
+ onClick: handleUpdateAndClose,
292
+ children: __("Update and close")
293
+ }
294
+ )
295
+ ] })
296
+ ]
297
+ }
298
+ )
299
+ ] });
300
+ }
301
+ export {
302
+ HTMLEditModal as default
303
+ };
304
+ //# sourceMappingURL=modal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/html/modal.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useState, useMemo } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport {\n\tModal,\n\tButton,\n\tFlex,\n\tprivateApis as componentsPrivateApis,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n} from '@wordpress/components';\nimport { PlainText, store as blockEditorStore } from '@wordpress/block-editor';\nimport { fullscreen, square } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\nimport Preview from './preview';\nimport { parseContent, serializeContent } from './utils';\n\nconst { Tabs } = unlock( componentsPrivateApis );\n\nexport default function HTMLEditModal( {\n\tisOpen,\n\tonRequestClose,\n\tcontent,\n\tsetAttributes,\n} ) {\n\t// Parse content into separate sections and use as initial state\n\tconst { html, css, js } = parseContent( content );\n\tconst [ editedHtml, setEditedHtml ] = useState( html );\n\tconst [ editedCss, setEditedCss ] = useState( css );\n\tconst [ editedJs, setEditedJs ] = useState( js );\n\tconst [ isDirty, setIsDirty ] = useState( false );\n\tconst [ showUnsavedWarning, setShowUnsavedWarning ] = useState( false );\n\tconst [ isFullscreen, setIsFullscreen ] = useState( false );\n\n\t// Check if user has permission to save scripts and get editor styles\n\tconst { canUserUseUnfilteredHTML, editorStyles } = useSelect(\n\t\t( select ) => {\n\t\t\tconst settings = select( blockEditorStore ).getSettings();\n\t\t\treturn {\n\t\t\t\tcanUserUseUnfilteredHTML:\n\t\t\t\t\tsettings.__experimentalCanUserUseUnfilteredHTML,\n\t\t\t\teditorStyles: settings.styles,\n\t\t\t};\n\t\t},\n\t\t[]\n\t);\n\n\t// Show JS tab if user has permission OR if block contains JavaScript\n\tconst shouldShowJsTab = canUserUseUnfilteredHTML || js.trim() !== '';\n\n\t// Combine all editor styles to inject into modal\n\tconst styleContent = useMemo( () => {\n\t\tif ( ! editorStyles ) {\n\t\t\treturn '';\n\t\t}\n\t\treturn editorStyles\n\t\t\t.filter( ( style ) => style.css )\n\t\t\t.map( ( style ) => style.css )\n\t\t\t.join( '\\n' );\n\t}, [ editorStyles ] );\n\n\tif ( ! isOpen ) {\n\t\treturn null;\n\t}\n\n\tconst handleHtmlChange = ( value ) => {\n\t\tsetEditedHtml( value );\n\t\tsetIsDirty( true );\n\t};\n\tconst handleCssChange = ( value ) => {\n\t\tsetEditedCss( value );\n\t\tsetIsDirty( true );\n\t};\n\tconst handleJsChange = ( value ) => {\n\t\tsetEditedJs( value );\n\t\tsetIsDirty( true );\n\t};\n\tconst handleUpdate = () => {\n\t\tsetAttributes( {\n\t\t\tcontent: serializeContent( {\n\t\t\t\thtml: editedHtml,\n\t\t\t\tcss: editedCss,\n\t\t\t\tjs: editedJs,\n\t\t\t} ),\n\t\t} );\n\t\tsetIsDirty( false );\n\t};\n\tconst handleCancel = () => {\n\t\tsetIsDirty( false );\n\t\tonRequestClose();\n\t};\n\tconst handleRequestClose = () => {\n\t\tif ( isDirty ) {\n\t\t\tsetShowUnsavedWarning( true );\n\t\t} else {\n\t\t\tonRequestClose();\n\t\t}\n\t};\n\tconst handleDiscardChanges = () => {\n\t\tsetShowUnsavedWarning( false );\n\t\tonRequestClose();\n\t};\n\tconst handleContinueEditing = () => {\n\t\tsetShowUnsavedWarning( false );\n\t};\n\tconst handleUpdateAndClose = () => {\n\t\thandleUpdate();\n\t\tonRequestClose();\n\t};\n\tconst toggleFullscreen = () => {\n\t\tsetIsFullscreen( ( prevState ) => ! prevState );\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Modal\n\t\t\t\ttitle={ __( 'Edit HTML' ) }\n\t\t\t\tonRequestClose={ handleRequestClose }\n\t\t\t\tclassName=\"block-library-html__modal\"\n\t\t\t\tsize=\"large\"\n\t\t\t\tisDismissible={ false }\n\t\t\t\tshouldCloseOnClickOutside={ ! isDirty }\n\t\t\t\tshouldCloseOnEsc={ ! isDirty }\n\t\t\t\tisFullScreen={ isFullscreen }\n\t\t\t\t__experimentalHideHeader\n\t\t\t>\n\t\t\t\t{ styleContent && (\n\t\t\t\t\t<style\n\t\t\t\t\t\tdangerouslySetInnerHTML={ { __html: styleContent } }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t<Tabs orientation=\"horizontal\" defaultTabId=\"html\">\n\t\t\t\t\t<VStack spacing={ 4 } style={ { height: '100%' } }>\n\t\t\t\t\t\t<HStack justify=\"space-between\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Tabs.TabList>\n\t\t\t\t\t\t\t\t\t<Tabs.Tab tabId=\"html\">HTML</Tabs.Tab>\n\t\t\t\t\t\t\t\t\t<Tabs.Tab tabId=\"css\">CSS</Tabs.Tab>\n\t\t\t\t\t\t\t\t\t{ shouldShowJsTab && (\n\t\t\t\t\t\t\t\t\t\t<Tabs.Tab tabId=\"js\">\n\t\t\t\t\t\t\t\t\t\t\t{ __( 'JavaScript' ) }\n\t\t\t\t\t\t\t\t\t\t</Tabs.Tab>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</Tabs.TabList>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\t\ticon={ isFullscreen ? square : fullscreen }\n\t\t\t\t\t\t\t\t\tlabel={ __( 'Enable/disable fullscreen' ) }\n\t\t\t\t\t\t\t\t\tonClick={ toggleFullscreen }\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t<HStack\n\t\t\t\t\t\t\talignment=\"stretch\"\n\t\t\t\t\t\t\tjustify=\"flex-start\"\n\t\t\t\t\t\t\tspacing={ 4 }\n\t\t\t\t\t\t\tclassName=\"block-library-html__modal-tabs\"\n\t\t\t\t\t\t\tstyle={ { flexGrow: 1 } }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div style={ { flexGrow: 1 } }>\n\t\t\t\t\t\t\t\t<Tabs.TabPanel\n\t\t\t\t\t\t\t\t\ttabId=\"html\"\n\t\t\t\t\t\t\t\t\tfocusable={ false }\n\t\t\t\t\t\t\t\t\tclassName=\"block-library-html__modal-tab\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<PlainText\n\t\t\t\t\t\t\t\t\t\tvalue={ editedHtml }\n\t\t\t\t\t\t\t\t\t\tonChange={ handleHtmlChange }\n\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'Write HTML\u2026' ) }\n\t\t\t\t\t\t\t\t\t\taria-label={ __( 'HTML' ) }\n\t\t\t\t\t\t\t\t\t\tclassName=\"block-library-html__modal-editor\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</Tabs.TabPanel>\n\t\t\t\t\t\t\t\t<Tabs.TabPanel\n\t\t\t\t\t\t\t\t\ttabId=\"css\"\n\t\t\t\t\t\t\t\t\tfocusable={ false }\n\t\t\t\t\t\t\t\t\tclassName=\"block-library-html__modal-tab\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<PlainText\n\t\t\t\t\t\t\t\t\t\tvalue={ editedCss }\n\t\t\t\t\t\t\t\t\t\tonChange={ handleCssChange }\n\t\t\t\t\t\t\t\t\t\tplaceholder={ __( 'Write CSS\u2026' ) }\n\t\t\t\t\t\t\t\t\t\taria-label={ __( 'CSS' ) }\n\t\t\t\t\t\t\t\t\t\tclassName=\"block-library-html__modal-editor\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</Tabs.TabPanel>\n\t\t\t\t\t\t\t\t{ shouldShowJsTab && (\n\t\t\t\t\t\t\t\t\t<Tabs.TabPanel\n\t\t\t\t\t\t\t\t\t\ttabId=\"js\"\n\t\t\t\t\t\t\t\t\t\tfocusable={ false }\n\t\t\t\t\t\t\t\t\t\tclassName=\"block-library-html__modal-tab\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<PlainText\n\t\t\t\t\t\t\t\t\t\t\tvalue={ editedJs }\n\t\t\t\t\t\t\t\t\t\t\tonChange={ handleJsChange }\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={ __(\n\t\t\t\t\t\t\t\t\t\t\t\t'Write JavaScript\u2026'\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\taria-label={ __( 'JavaScript' ) }\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"block-library-html__modal-editor\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</Tabs.TabPanel>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"block-library-html__preview\"\n\t\t\t\t\t\t\t\tstyle={ { width: '50%' } }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Preview\n\t\t\t\t\t\t\t\t\tcontent={ serializeContent( {\n\t\t\t\t\t\t\t\t\t\thtml: editedHtml,\n\t\t\t\t\t\t\t\t\t\tcss: editedCss,\n\t\t\t\t\t\t\t\t\t\tjs: editedJs,\n\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t<HStack\n\t\t\t\t\t\t\talignment=\"center\"\n\t\t\t\t\t\t\tjustify=\"flex-end\"\n\t\t\t\t\t\t\tspacing={ 4 }\n\t\t\t\t\t\t>\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\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\tonClick={ handleCancel }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t\t</Button>\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\tvariant=\"primary\"\n\t\t\t\t\t\t\t\tonClick={ handleUpdateAndClose }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'Update' ) }\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</HStack>\n\t\t\t\t\t</VStack>\n\t\t\t\t</Tabs>\n\t\t\t</Modal>\n\n\t\t\t{ showUnsavedWarning && (\n\t\t\t\t<Modal\n\t\t\t\t\ttitle={ __( 'Unsaved changes' ) }\n\t\t\t\t\tonRequestClose={ handleContinueEditing }\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'You have unsaved changes. What would you like to do?'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<Flex direction=\"row\" justify=\"flex-end\" gap={ 2 }>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\tonClick={ handleDiscardChanges }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Discard unsaved changes' ) }\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\tvariant=\"secondary\"\n\t\t\t\t\t\t\tonClick={ handleContinueEditing }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Continue editing' ) }\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\tvariant=\"primary\"\n\t\t\t\t\t\t\tonClick={ handleUpdateAndClose }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Update and close' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Flex>\n\t\t\t\t</Modal>\n\t\t\t) }\n\t\t</>\n\t);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,46 @@
1
+ // packages/block-library/src/html/utils.js
2
+ function parseContent(content = "") {
3
+ if (!content || !content.trim()) {
4
+ return { html: "", css: "", js: "" };
5
+ }
6
+ const doc = document.implementation.createHTMLDocument("");
7
+ doc.body.innerHTML = content;
8
+ const styleTag = doc.body.querySelector(
9
+ 'style[data-wp-block-html="css"]'
10
+ );
11
+ const css = styleTag ? styleTag.textContent.trim() : "";
12
+ if (styleTag) {
13
+ styleTag.remove();
14
+ }
15
+ const scriptTag = doc.body.querySelector(
16
+ 'script[data-wp-block-html="js"]'
17
+ );
18
+ const js = scriptTag ? scriptTag.textContent.trim() : "";
19
+ if (scriptTag) {
20
+ scriptTag.remove();
21
+ }
22
+ const html = doc.body.innerHTML.trim();
23
+ return { html, css, js };
24
+ }
25
+ function serializeContent({ html = "", css = "", js = "" }) {
26
+ const parts = [];
27
+ if (css.trim()) {
28
+ parts.push(`<style data-wp-block-html="css">
29
+ ${css}
30
+ </style>`);
31
+ }
32
+ if (js.trim()) {
33
+ parts.push(`<script data-wp-block-html="js">
34
+ ${js}
35
+ </script>`);
36
+ }
37
+ if (html.trim()) {
38
+ parts.push(html);
39
+ }
40
+ return parts.join("\n\n");
41
+ }
42
+ export {
43
+ parseContent,
44
+ serializeContent
45
+ };
46
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/html/utils.js"],
4
+ "sourcesContent": ["/**\n * Parses content string into separate HTML, CSS, and JS sections.\n *\n * Extracts CSS from <style data-wp-block-html=\"css\"> tags and\n * JavaScript from <script data-wp-block-html=\"js\"> tags.\n * Everything else is treated as HTML.\n *\n * @param {string} content - The combined content string\n * @return {Object} Object with html, css, and js properties\n */\nexport function parseContent( content = '' ) {\n\tif ( ! content || ! content.trim() ) {\n\t\treturn { html: '', css: '', js: '' };\n\t}\n\n\t// Create a temporary document to parse HTML safely\n\tconst doc = document.implementation.createHTMLDocument( '' );\n\tdoc.body.innerHTML = content;\n\n\t// Extract CSS from marked style tag\n\tconst styleTag = doc.body.querySelector(\n\t\t'style[data-wp-block-html=\"css\"]'\n\t);\n\tconst css = styleTag ? styleTag.textContent.trim() : '';\n\tif ( styleTag ) {\n\t\tstyleTag.remove();\n\t}\n\n\t// Extract JS from marked script tag\n\tconst scriptTag = doc.body.querySelector(\n\t\t'script[data-wp-block-html=\"js\"]'\n\t);\n\tconst js = scriptTag ? scriptTag.textContent.trim() : '';\n\tif ( scriptTag ) {\n\t\tscriptTag.remove();\n\t}\n\n\t// Everything else is HTML\n\tconst html = doc.body.innerHTML.trim();\n\n\treturn { html, css, js };\n}\n\n/**\n * Serializes HTML, CSS, and JS into a single content string.\n *\n * Creates marked <style> and <script> tags for CSS and JS sections,\n * then appends the HTML content.\n *\n * @param {Object} sections Object with html, css, and js properties\n * @param {string} sections.html HTML content\n * @param {string} sections.css CSS content\n * @param {string} sections.js JavaScript content\n * @return {string} Combined content string\n */\nexport function serializeContent( { html = '', css = '', js = '' } ) {\n\tconst parts = [];\n\n\t// Add CSS if present\n\tif ( css.trim() ) {\n\t\tparts.push( `<style data-wp-block-html=\"css\">\\n${ css }\\n</style>` );\n\t}\n\n\t// Add JS if present\n\tif ( js.trim() ) {\n\t\tparts.push( `<script data-wp-block-html=\"js\">\\n${ js }\\n</script>` );\n\t}\n\n\t// Add HTML\n\tif ( html.trim() ) {\n\t\tparts.push( html );\n\t}\n\n\treturn parts.join( '\\n\\n' );\n}\n"],
5
+ "mappings": ";AAUO,SAAS,aAAc,UAAU,IAAK;AAC5C,MAAK,CAAE,WAAW,CAAE,QAAQ,KAAK,GAAI;AACpC,WAAO,EAAE,MAAM,IAAI,KAAK,IAAI,IAAI,GAAG;AAAA,EACpC;AAGA,QAAM,MAAM,SAAS,eAAe,mBAAoB,EAAG;AAC3D,MAAI,KAAK,YAAY;AAGrB,QAAM,WAAW,IAAI,KAAK;AAAA,IACzB;AAAA,EACD;AACA,QAAM,MAAM,WAAW,SAAS,YAAY,KAAK,IAAI;AACrD,MAAK,UAAW;AACf,aAAS,OAAO;AAAA,EACjB;AAGA,QAAM,YAAY,IAAI,KAAK;AAAA,IAC1B;AAAA,EACD;AACA,QAAM,KAAK,YAAY,UAAU,YAAY,KAAK,IAAI;AACtD,MAAK,WAAY;AAChB,cAAU,OAAO;AAAA,EAClB;AAGA,QAAM,OAAO,IAAI,KAAK,UAAU,KAAK;AAErC,SAAO,EAAE,MAAM,KAAK,GAAG;AACxB;AAcO,SAAS,iBAAkB,EAAE,OAAO,IAAI,MAAM,IAAI,KAAK,GAAG,GAAI;AACpE,QAAM,QAAQ,CAAC;AAGf,MAAK,IAAI,KAAK,GAAI;AACjB,UAAM,KAAM;AAAA,EAAsC,GAAI;AAAA,SAAa;AAAA,EACpE;AAGA,MAAK,GAAG,KAAK,GAAI;AAChB,UAAM,KAAM;AAAA,EAAsC,EAAG;AAAA,UAAc;AAAA,EACpE;AAGA,MAAK,KAAK,KAAK,GAAI;AAClB,UAAM,KAAM,IAAK;AAAA,EAClB;AAEA,SAAO,MAAM,KAAM,MAAO;AAC3B;",
6
+ "names": []
7
+ }
@@ -61,20 +61,30 @@ var useIsInvalidLink = (kind, type, id, enabled) => {
61
61
  const isPostType = kind === "post-type" || type === "post" || type === "page";
62
62
  const hasId = Number.isInteger(id);
63
63
  const blockEditingMode = useBlockEditingMode();
64
- const postStatus = useSelect(
64
+ const { postStatus, isDeleted } = useSelect(
65
65
  (select) => {
66
66
  if (!isPostType) {
67
- return null;
67
+ return { postStatus: null, isDeleted: false };
68
68
  }
69
69
  if (blockEditingMode === "disabled" || !enabled) {
70
- return null;
70
+ return { postStatus: null, isDeleted: false };
71
71
  }
72
- const { getEntityRecord } = select(coreStore);
73
- return getEntityRecord("postType", type, id)?.status;
72
+ const { getEntityRecord, hasFinishedResolution } = select(coreStore);
73
+ const entityRecord = getEntityRecord("postType", type, id);
74
+ const hasResolved = hasFinishedResolution("getEntityRecord", [
75
+ "postType",
76
+ type,
77
+ id
78
+ ]);
79
+ const deleted = hasResolved && entityRecord === void 0;
80
+ return {
81
+ postStatus: entityRecord?.status,
82
+ isDeleted: deleted
83
+ };
74
84
  },
75
85
  [isPostType, blockEditingMode, enabled, type, id]
76
86
  );
77
- const isInvalid = isPostType && hasId && postStatus && "trash" === postStatus;
87
+ const isInvalid = isPostType && hasId && (isDeleted || postStatus && "trash" === postStatus);
78
88
  const isDraft = "draft" === postStatus;
79
89
  return [isInvalid, isDraft];
80
90
  };
@@ -166,7 +176,12 @@ function NavigationLinkEdit({
166
176
  [clientId, maxNestingLevel]
167
177
  );
168
178
  const { getBlocks } = useSelect(blockEditorStore);
169
- const { clearBinding, createBinding } = useEntityBinding({
179
+ const {
180
+ clearBinding,
181
+ createBinding,
182
+ hasUrlBinding,
183
+ isBoundEntityAvailable
184
+ } = useEntityBinding({
170
185
  clientId,
171
186
  attributes
172
187
  });
@@ -273,13 +288,13 @@ function NavigationLinkEdit({
273
288
  renderAppender: false
274
289
  }
275
290
  );
276
- if (!url || isInvalid || isDraft) {
291
+ if (!url || isInvalid || isDraft || hasUrlBinding && !isBoundEntityAvailable) {
277
292
  blockProps.onClick = () => {
278
293
  setIsLinkOpen(true);
279
294
  };
280
295
  }
281
296
  const classes = clsx("wp-block-navigation-item__content", {
282
- "wp-block-navigation-link__placeholder": !url || isInvalid || isDraft
297
+ "wp-block-navigation-link__placeholder": !url || isInvalid || isDraft || hasUrlBinding && !isBoundEntityAvailable
283
298
  });
284
299
  const missingText = getMissingText(type);
285
300
  const placeholderText = `(${isInvalid ? __("Invalid") : __("Draft")})`;
@@ -375,7 +390,7 @@ function NavigationLinkEdit({
375
390
  link: attributes,
376
391
  onClose: () => {
377
392
  setIsLinkOpen(false);
378
- if (!url) {
393
+ if (!url && !hasUrlBinding) {
379
394
  onReplace([]);
380
395
  } else if (isNewLink.current) {
381
396
  selectBlock(clientId);