+
+ ) }
+
+ );
+}
diff --git a/projects/plugins/jetpack/extensions/blocks/ai-image/editor.js b/projects/plugins/jetpack/extensions/blocks/ai-image/editor.js
new file mode 100644
index 000000000000..d7ec194d817a
--- /dev/null
+++ b/projects/plugins/jetpack/extensions/blocks/ai-image/editor.js
@@ -0,0 +1,4 @@
+import registerJetpackBlock from '../../shared/register-jetpack-block';
+import { name, settings } from '.';
+
+registerJetpackBlock( name, settings );
diff --git a/projects/plugins/jetpack/extensions/blocks/ai-image/editor.scss b/projects/plugins/jetpack/extensions/blocks/ai-image/editor.scss
new file mode 100644
index 000000000000..634918e488d5
--- /dev/null
+++ b/projects/plugins/jetpack/extensions/blocks/ai-image/editor.scss
@@ -0,0 +1,15 @@
+/**
+ * Editor styles for Jetpack AI Image
+ */
+
+.wp-block-ai-image-image {
+ cursor: pointer;
+ width: 128px;
+ height:128px;
+ margin: 12px;
+}
+.wp-block-ai-image-image:hover {
+ width: 146px;
+ height:146px;
+ margin: 0px;
+}
diff --git a/projects/plugins/jetpack/extensions/blocks/ai-image/index.js b/projects/plugins/jetpack/extensions/blocks/ai-image/index.js
new file mode 100644
index 000000000000..406349c58f22
--- /dev/null
+++ b/projects/plugins/jetpack/extensions/blocks/ai-image/index.js
@@ -0,0 +1,72 @@
+import { useBlockProps } from '@wordpress/block-editor';
+import { Fragment } from '@wordpress/element';
+import { __, _x } from '@wordpress/i18n';
+import { getIconColor } from '../../shared/block-icons';
+import attributes from './attributes';
+import edit from './edit';
+
+/**
+ * Style dependencies
+ */
+import './editor.scss';
+
+export const name = 'ai-image';
+export const title = __( 'AI Image (Experimental)', 'jetpack' );
+export const settings = {
+ apiVersion: 2,
+ title,
+ description: (
+
+
+ { __(
+ 'Automatically generate an illustration for your post, powered by AI magic. We are experimenting with this feature and can tweak or remove it at any point.',
+ 'jetpack'
+ ) }
+
+
+ ),
+ icon: {
+ src: 'welcome-write-blog',
+ foreground: getIconColor(),
+ },
+ category: 'media',
+ keywords: [
+ _x( 'AI', 'block search term', 'jetpack' ),
+ _x( 'DALLe', 'block search term', 'jetpack' ),
+ _x( 'Diffusion', 'block search term', 'jetpack' ),
+ ],
+ supports: {
+ // Support for block's alignment (left, center, right, wide, full). When true, it adds block controls to change block’s alignment.
+ align: false /* if set to true, the 'align' option below can be used*/,
+ // Pick which alignment options to display.
+ /*align: [ 'left', 'right', 'full' ],*/
+ // Support for wide alignment, that requires additional support in themes.
+ alignWide: false,
+ // When true, a new field in the block sidebar allows to define an id for the block and a button to copy the direct link.
+ anchor: false,
+ // When true, a new field in the block sidebar allows to define a custom className for the block’s wrapper.
+ customClassName: false,
+ // When false, Gutenberg won't add a class like .wp-block-your-block-name to the root element of your saved markup
+ className: true,
+ // Setting this to false suppress the ability to edit a block’s markup individually. We often set this to false in Jetpack blocks.
+ html: false,
+ // Passing false hides this block in Gutenberg's visual inserter.
+ /*inserter: true,*/
+ // When false, user will only be able to insert the block once per post.
+ multiple: true,
+ // When false, the block won't be available to be converted into a reusable block.
+ reusable: false,
+ },
+ edit,
+ /* @TODO Write the block editor output */
+ save: args => {
+ const blockProps = useBlockProps.save();
+ return
+ );
+}
diff --git a/projects/plugins/jetpack/extensions/blocks/ai-paragraph/editor.js b/projects/plugins/jetpack/extensions/blocks/ai-paragraph/editor.js
new file mode 100644
index 000000000000..d7ec194d817a
--- /dev/null
+++ b/projects/plugins/jetpack/extensions/blocks/ai-paragraph/editor.js
@@ -0,0 +1,4 @@
+import registerJetpackBlock from '../../shared/register-jetpack-block';
+import { name, settings } from '.';
+
+registerJetpackBlock( name, settings );
diff --git a/projects/plugins/jetpack/extensions/blocks/ai-paragraph/editor.scss b/projects/plugins/jetpack/extensions/blocks/ai-paragraph/editor.scss
new file mode 100644
index 000000000000..bf76d66d77de
--- /dev/null
+++ b/projects/plugins/jetpack/extensions/blocks/ai-paragraph/editor.scss
@@ -0,0 +1,18 @@
+/**
+ * Editor styles for Jetpack AI Paragraph
+ */
+
+.wp-block-ai-generate-suggestion {
+ padding: 0;
+}
+
+.wp-block-ai-generate-suggestion .content {}
+
+.wp-block-ai-generate-suggestion .components-text-control__input {
+ margin: 10px;
+ width:80%;
+}
+
+.wp-block-ai-generate-suggestion .components-button.is-primary {
+ margin: 10px;
+}
diff --git a/projects/plugins/jetpack/extensions/blocks/ai-paragraph/index.js b/projects/plugins/jetpack/extensions/blocks/ai-paragraph/index.js
new file mode 100644
index 000000000000..5a4d5b69ade7
--- /dev/null
+++ b/projects/plugins/jetpack/extensions/blocks/ai-paragraph/index.js
@@ -0,0 +1,85 @@
+import { useBlockProps } from '@wordpress/block-editor';
+import { createBlock } from '@wordpress/blocks';
+import { Fragment } from '@wordpress/element';
+import { __, _x } from '@wordpress/i18n';
+import { getIconColor } from '../../shared/block-icons';
+import attributes from './attributes';
+import edit from './edit';
+
+/**
+ * Style dependencies
+ */
+import './editor.scss';
+
+export const name = 'ai-paragraph';
+export const title = __( 'AI Paragraph (Experimental)', 'jetpack' );
+export const settings = {
+ apiVersion: 2,
+ title,
+ description: (
+
+
+ { __(
+ 'Automatically generate new paragraphs using your existing content, powered by AI magic. We are experimenting with this feature and can tweak or remove it at any point.',
+ 'jetpack'
+ ) }
+
+
+ ),
+ icon: {
+ src: 'welcome-write-blog',
+ foreground: getIconColor(),
+ },
+ category: 'text',
+ keywords: [
+ _x( 'AI', 'block search term', 'jetpack' ),
+ _x( 'GPT', 'block search term', 'jetpack' ),
+ ],
+ supports: {
+ // Support for block's alignment (left, center, right, wide, full). When true, it adds block controls to change block’s alignment.
+ align: true /* if set to true, the 'align' option below can be used*/,
+ // Pick which alignment options to display.
+ /*align: [ 'left', 'right', 'full' ],*/
+ // Support for wide alignment, that requires additional support in themes.
+ alignWide: true,
+ // When true, a new field in the block sidebar allows to define an id for the block and a button to copy the direct link.
+ anchor: true,
+ // When true, a new field in the block sidebar allows to define a custom className for the block’s wrapper.
+ customClassName: true,
+ // When false, Gutenberg won't add a class like .wp-block-your-block-name to the root element of your saved markup
+ className: true,
+ // Setting this to false suppress the ability to edit a block’s markup individually. We often set this to false in Jetpack blocks.
+ html: true,
+ // Passing false hides this block in Gutenberg's visual inserter.
+ /*inserter: true,*/
+ // When false, user will only be able to insert the block once per post.
+ multiple: true,
+ // When false, the block won't be available to be converted into a reusable block.
+ reusable: false,
+ },
+ edit,
+ save: attrs => {
+ const blockProps = useBlockProps.save();
+ return