@wordpress/block-library 9.34.1-next.2f1c7c01b.0 → 9.35.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 (149) 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-module/block/edit.js +2 -2
  50. package/build-module/block/edit.js.map +2 -2
  51. package/build-module/block-keyboard-shortcuts/index.js +17 -7
  52. package/build-module/block-keyboard-shortcuts/index.js.map +2 -2
  53. package/build-module/cover/deprecated.js +15 -3
  54. package/build-module/cover/deprecated.js.map +2 -2
  55. package/build-module/cover/edit/inspector-controls.js +1 -1
  56. package/build-module/cover/edit/inspector-controls.js.map +2 -2
  57. package/build-module/cover/transforms.js +10 -2
  58. package/build-module/cover/transforms.js.map +2 -2
  59. package/build-module/embed/icons.js +2 -2
  60. package/build-module/embed/icons.js.map +2 -2
  61. package/build-module/embed/variations.js +3 -3
  62. package/build-module/embed/variations.js.map +2 -2
  63. package/build-module/heading/index.js +3 -1
  64. package/build-module/heading/index.js.map +2 -2
  65. package/build-module/heading/transforms.js +10 -3
  66. package/build-module/heading/transforms.js.map +2 -2
  67. package/build-module/heading/variations.js +34 -0
  68. package/build-module/heading/variations.js.map +7 -0
  69. package/build-module/html/edit.js +62 -51
  70. package/build-module/html/edit.js.map +2 -2
  71. package/build-module/html/modal.js +304 -0
  72. package/build-module/html/modal.js.map +7 -0
  73. package/build-module/html/utils.js +46 -0
  74. package/build-module/html/utils.js.map +7 -0
  75. package/build-module/navigation-link/edit.js +25 -10
  76. package/build-module/navigation-link/edit.js.map +2 -2
  77. package/build-module/navigation-link/link-ui/index.js +8 -3
  78. package/build-module/navigation-link/link-ui/index.js.map +2 -2
  79. package/build-module/navigation-link/shared/controls.js +42 -7
  80. package/build-module/navigation-link/shared/controls.js.map +2 -2
  81. package/build-module/navigation-link/shared/use-entity-binding.js +35 -3
  82. package/build-module/navigation-link/shared/use-entity-binding.js.map +2 -2
  83. package/build-module/paragraph/block.json +1 -3
  84. package/build-module/paragraph/deprecated.js +65 -12
  85. package/build-module/paragraph/deprecated.js.map +2 -2
  86. package/build-module/paragraph/edit.js +14 -26
  87. package/build-module/paragraph/edit.js.map +2 -2
  88. package/build-module/paragraph/index.js +3 -1
  89. package/build-module/paragraph/index.js.map +2 -2
  90. package/build-module/paragraph/save.js +3 -3
  91. package/build-module/paragraph/save.js.map +2 -2
  92. package/build-module/paragraph/transforms.js +7 -1
  93. package/build-module/paragraph/transforms.js.map +2 -2
  94. package/build-module/paragraph/variations.js +36 -0
  95. package/build-module/paragraph/variations.js.map +7 -0
  96. package/build-style/accordion-heading/style-rtl.css +19 -3
  97. package/build-style/accordion-heading/style.css +19 -3
  98. package/build-style/accordion-panel/style-rtl.css +4 -1
  99. package/build-style/accordion-panel/style.css +4 -1
  100. package/build-style/common-rtl.css +3 -3
  101. package/build-style/common.css +3 -3
  102. package/build-style/editor-rtl.css +62 -21
  103. package/build-style/editor.css +62 -21
  104. package/build-style/embed/style-rtl.css +5 -0
  105. package/build-style/embed/style.css +5 -0
  106. package/build-style/html/editor-rtl.css +55 -21
  107. package/build-style/html/editor.css +55 -21
  108. package/build-style/navigation-link/editor-rtl.css +7 -0
  109. package/build-style/navigation-link/editor.css +7 -0
  110. package/build-style/style-rtl.css +31 -7
  111. package/build-style/style.css +31 -7
  112. package/package.json +37 -37
  113. package/src/accordion-heading/style.scss +40 -7
  114. package/src/accordion-panel/style.scss +6 -1
  115. package/src/block/edit.js +2 -2
  116. package/src/block-keyboard-shortcuts/index.js +23 -9
  117. package/src/common.scss +6 -5
  118. package/src/cover/deprecated.js +15 -3
  119. package/src/cover/edit/inspector-controls.js +1 -1
  120. package/src/cover/transforms.js +10 -2
  121. package/src/embed/icons.js +2 -4
  122. package/src/embed/style.scss +6 -0
  123. package/src/embed/variations.js +3 -3
  124. package/src/heading/index.js +2 -0
  125. package/src/heading/transforms.js +10 -3
  126. package/src/heading/variations.js +37 -0
  127. package/src/html/edit.js +62 -56
  128. package/src/html/editor.scss +69 -10
  129. package/src/html/modal.js +290 -0
  130. package/src/html/test/utils.js +234 -0
  131. package/src/html/utils.js +75 -0
  132. package/src/navigation-link/edit.js +44 -13
  133. package/src/navigation-link/editor.scss +7 -0
  134. package/src/navigation-link/index.php +65 -2
  135. package/src/navigation-link/link-ui/index.js +9 -8
  136. package/src/navigation-link/shared/controls.js +70 -12
  137. package/src/navigation-link/shared/test/controls.js +5 -0
  138. package/src/navigation-link/shared/test/use-entity-binding.js +14 -1
  139. package/src/navigation-link/shared/use-entity-binding.js +57 -9
  140. package/src/paragraph/block.json +1 -3
  141. package/src/paragraph/deprecated.js +87 -20
  142. package/src/paragraph/edit.js +7 -18
  143. package/src/paragraph/edit.native.js +18 -6
  144. package/src/paragraph/index.js +2 -0
  145. package/src/paragraph/save.js +4 -3
  146. package/src/paragraph/test/edit.native.js +5 -5
  147. package/src/paragraph/transforms.js +7 -1
  148. package/src/paragraph/variations.js +39 -0
  149. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/heading/variations.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { Path, SVG } from '@wordpress/primitives';\nimport { heading } from '@wordpress/icons';\n\nconst variations = [\n\t{\n\t\tname: 'heading',\n\t\ttitle: __( 'Heading' ),\n\t\tdescription: __(\n\t\t\t'Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.'\n\t\t),\n\t\tisDefault: true,\n\t\tscope: [ 'inserter', 'transform' ],\n\t\tattributes: { fitText: undefined },\n\t\ticon: heading,\n\t},\n\t// There is a hardcoded workaround in packages/block-editor/src/store/selectors.js\n\t// to make Stretchy variations appear as the last of their sections in the inserter.\n\t{\n\t\tname: 'stretchy-heading',\n\t\ttitle: __( 'Stretchy Heading' ),\n\t\tdescription: __( 'Heading that resizes to fit its container.' ),\n\t\ticon: (\n\t\t\t<SVG xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n\t\t\t\t<Path d=\"m3 18.6 6-4.7 6 4.7V5H3v13.6Zm16.2-9.8v1.5h2.2L17.7 14l1.1 1.1 3.7-3.7v2.2H24V8.8h-4.8Z\" />\n\t\t\t</SVG>\n\t\t),\n\t\tattributes: { fitText: true },\n\t\tscope: [ 'inserter', 'transform' ],\n\t\tisActive: ( blockAttributes ) => blockAttributes.fitText === true,\n\t},\n];\n\nexport default variations;\n"],
5
+ "mappings": ";AAGA,SAAS,UAAU;AACnB,SAAS,MAAM,WAAW;AAC1B,SAAS,eAAe;AAsBpB;AApBJ,IAAM,aAAa;AAAA,EAClB;AAAA,IACC,MAAM;AAAA,IACN,OAAO,GAAI,SAAU;AAAA,IACrB,aAAa;AAAA,MACZ;AAAA,IACD;AAAA,IACA,WAAW;AAAA,IACX,OAAO,CAAE,YAAY,WAAY;AAAA,IACjC,YAAY,EAAE,SAAS,OAAU;AAAA,IACjC,MAAM;AAAA,EACP;AAAA;AAAA;AAAA,EAGA;AAAA,IACC,MAAM;AAAA,IACN,OAAO,GAAI,kBAAmB;AAAA,IAC9B,aAAa,GAAI,4CAA6C;AAAA,IAC9D,MACC,oBAAC,OAAI,OAAM,8BAA6B,SAAQ,aAC/C,8BAAC,QAAK,GAAE,2FAA0F,GACnG;AAAA,IAED,YAAY,EAAE,SAAS,KAAK;AAAA,IAC5B,OAAO,CAAE,YAAY,WAAY;AAAA,IACjC,UAAU,CAAE,oBAAqB,gBAAgB,YAAY;AAAA,EAC9D;AACD;AAEA,IAAO,qBAAQ;",
6
+ "names": []
7
+ }
@@ -1,76 +1,87 @@
1
1
  // packages/block-library/src/html/edit.js
2
2
  import { __ } from "@wordpress/i18n";
3
- import { useContext, useState } from "@wordpress/element";
3
+ import { useState } from "@wordpress/element";
4
4
  import {
5
5
  BlockControls,
6
- PlainText,
7
- useBlockProps,
8
- store as blockEditorStore
6
+ BlockIcon,
7
+ InspectorControls,
8
+ useBlockProps
9
9
  } from "@wordpress/block-editor";
10
10
  import {
11
11
  ToolbarButton,
12
- Disabled,
13
12
  ToolbarGroup,
14
- VisuallyHidden
13
+ Placeholder,
14
+ Button,
15
+ __experimentalVStack as VStack
15
16
  } from "@wordpress/components";
16
- import { useSelect } from "@wordpress/data";
17
- import { useInstanceId } from "@wordpress/compose";
17
+ import { code } from "@wordpress/icons";
18
18
  import Preview from "./preview";
19
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
19
+ import HTMLEditModal from "./modal";
20
+ import { jsx, jsxs } from "react/jsx-runtime";
20
21
  function HTMLEdit({ attributes, setAttributes, isSelected }) {
21
- const [isPreview, setIsPreview] = useState();
22
- const isDisabled = useContext(Disabled.Context);
23
- const instanceId = useInstanceId(HTMLEdit, "html-edit-desc");
24
- const isPreviewMode = useSelect((select) => {
25
- return select(blockEditorStore).getSettings().isPreviewMode;
26
- }, []);
27
- function switchToPreview() {
28
- setIsPreview(true);
29
- }
30
- function switchToHTML() {
31
- setIsPreview(false);
32
- }
22
+ const [isModalOpen, setIsModalOpen] = useState(false);
33
23
  const blockProps = useBlockProps({
34
- className: "block-library-html__edit",
35
- "aria-describedby": isPreview ? instanceId : void 0
24
+ className: "block-library-html__edit"
36
25
  });
37
- return /* @__PURE__ */ jsxs("div", { ...blockProps, children: [
38
- /* @__PURE__ */ jsx(BlockControls, { children: /* @__PURE__ */ jsxs(ToolbarGroup, { children: [
26
+ if (!attributes.content?.trim()) {
27
+ return /* @__PURE__ */ jsxs("div", { ...blockProps, children: [
39
28
  /* @__PURE__ */ jsx(
40
- ToolbarButton,
29
+ Placeholder,
41
30
  {
42
- isPressed: !isPreview,
43
- onClick: switchToHTML,
44
- children: "HTML"
31
+ icon: /* @__PURE__ */ jsx(BlockIcon, { icon: code }),
32
+ label: __("Custom HTML"),
33
+ instructions: __(
34
+ "Add custom HTML code and preview how it looks."
35
+ ),
36
+ children: /* @__PURE__ */ jsx(
37
+ Button,
38
+ {
39
+ __next40pxDefaultSize: true,
40
+ variant: "primary",
41
+ onClick: () => setIsModalOpen(true),
42
+ children: __("Edit HTML")
43
+ }
44
+ )
45
45
  }
46
46
  ),
47
47
  /* @__PURE__ */ jsx(
48
- ToolbarButton,
49
- {
50
- isPressed: isPreview,
51
- onClick: switchToPreview,
52
- children: __("Preview")
53
- }
54
- )
55
- ] }) }),
56
- isPreview || isPreviewMode || isDisabled ? /* @__PURE__ */ jsxs(Fragment, { children: [
57
- /* @__PURE__ */ jsx(
58
- Preview,
48
+ HTMLEditModal,
59
49
  {
50
+ isOpen: isModalOpen,
51
+ onRequestClose: () => setIsModalOpen(false),
60
52
  content: attributes.content,
61
- isSelected
53
+ setAttributes
62
54
  }
63
- ),
64
- /* @__PURE__ */ jsx(VisuallyHidden, { id: instanceId, children: __(
65
- "HTML preview is not yet fully accessible. Please switch screen reader to virtualized mode to navigate the below iFrame."
66
- ) })
67
- ] }) : /* @__PURE__ */ jsx(
68
- PlainText,
55
+ )
56
+ ] });
57
+ }
58
+ return /* @__PURE__ */ jsxs("div", { ...blockProps, children: [
59
+ /* @__PURE__ */ jsx(BlockControls, { children: /* @__PURE__ */ jsx(ToolbarGroup, { children: /* @__PURE__ */ jsx(ToolbarButton, { onClick: () => setIsModalOpen(true), children: __("Edit code") }) }) }),
60
+ /* @__PURE__ */ jsx(InspectorControls, { children: /* @__PURE__ */ jsx(
61
+ VStack,
62
+ {
63
+ className: "block-editor-block-inspector-edit-contents",
64
+ expanded: true,
65
+ children: /* @__PURE__ */ jsx(
66
+ Button,
67
+ {
68
+ className: "block-editor-block-inspector-edit-contents__button",
69
+ __next40pxDefaultSize: true,
70
+ variant: "secondary",
71
+ onClick: () => setIsModalOpen(true),
72
+ children: __("Edit code")
73
+ }
74
+ )
75
+ }
76
+ ) }),
77
+ /* @__PURE__ */ jsx(Preview, { content: attributes.content, isSelected }),
78
+ /* @__PURE__ */ jsx(
79
+ HTMLEditModal,
69
80
  {
70
- value: attributes.content,
71
- onChange: (content) => setAttributes({ content }),
72
- placeholder: __("Write HTML\u2026"),
73
- "aria-label": __("HTML")
81
+ isOpen: isModalOpen,
82
+ onRequestClose: () => setIsModalOpen(false),
83
+ content: attributes.content,
84
+ setAttributes
74
85
  }
75
86
  )
76
87
  ] });
@@ -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
+ }