<?xml version="1.0"?><artefact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="artefact.xsd" name="AgilePress Schema JSON-LD Block" slug="agilepress-schema-json-ld-block" type="code-package" schemaVersion="2">
  <file path="readme.txt">
    <description>This file contains the readme information for the block. It is used to provide information about the block, its usage, and any other relevant details.</description>
    <content><![CDATA[
=== AgilePress Schema JSON-LD Block ===

Contributors:      AgilePress
Tags:              schema, json-ld, structured-data, seo
Tested up to:      6.9
Stable tag:        1.0.0
License:           GPLv2 or later
License URI:       https://www.gnu.org/licenses/gpl-2.0.html

A powerful WordPress block for managing Schema.org structured data markup with template support and dynamic placeholder replacement.

== Description ==

AgilePress Schema JSON-LD Block is a sophisticated block for adding Schema.org structured data to your WordPress posts and pages. It provides a clean, user-friendly interface for managing JSON-LD markup without cluttering your content editor.

**Key Features:**

* **Clean Editor Interface**: Displays only a visual placeholder in the editor, keeping your workspace uncluttered
* **Sidebar Editing**: All JSON-LD editing happens in the Block Sidebar via InspectorControls
* **Template Library**: Pre-built templates for common schema types including LocalBusiness, Organization, and FAQ
* **Real-time Validation**: Instant JSON validation feedback as you type
* **Dynamic Placeholders**: Support for WordPress core placeholders and ACF custom fields
* **SEO Optimized**: Outputs clean JSON-LD markup via wp_head for optimal search engine parsing

**Supported Placeholders:**

* `{{title}}` - Post/page title
* `{{excerpt}}` - Post excerpt
* `{{date}}` - Publication date
* `{{url}}` - Current post URL
* `{{featured_image_url}}` - Featured image URL
* `{{acf:field_name}}` - Any ACF field (supports strings and arrays)

**Template Options:**

1. **Blank** - Start from scratch
2. **LocalBusiness** - Perfect for local business listings
3. **Organization** - For company/organization information
4. **FAQ** - Structured FAQ markup

The block uses dynamic rendering to process placeholders on the frontend, ensuring your structured data always reflects current content.

== Installation ==

1. Upload the plugin files to the `/wp-content/plugins/agilepress-schema-json-ld-block` directory, or install the plugin through the WordPress plugins screen directly.
2. Activate the plugin through the 'Plugins' screen in WordPress
3. Add the "AgilePress Schema JSON-LD Block" block to any post or page
4. Configure your JSON-LD in the Block Sidebar
5. Publish and verify your structured data using Google's Rich Results Test

== Frequently Asked Questions ==

= Does this block work with ACF (Advanced Custom Fields)? =

Yes! The block fully supports ACF custom fields using the `{{acf:field_name}}` placeholder syntax. It handles both string and array field types safely.

= How do I validate my JSON-LD? =

The block includes real-time validation that displays "Valid JSON" or "Invalid JSON" status in the sidebar as you edit. You can also use Google's Rich Results Test or Schema.org validator for external verification.

= Can I use multiple schema blocks on one page? =

Yes, you can add multiple AgilePress Schema JSON-LD Block blocks to a single page. Each will output its own separate JSON-LD script tag.

= Where does the JSON-LD appear on my site? =

The structured data is injected into the `<head>` section of your page via `wp_head`, making it invisible to visitors but perfectly readable by search engines.

= What if I want to add custom schema types? =

Start with the "Blank" template and paste in your custom JSON-LD schema. The block will validate it and process any placeholders you include.

== Screenshots ==

1. Clean editor placeholder showing "JSON-LD Configured" status
2. Block Sidebar with template selector and JSON-LD editor
3. Real-time validation feedback
4. Example LocalBusiness template with placeholders

== Changelog ==

= 0.1.0 =
* Initial release
* Template library with LocalBusiness, Organization, and FAQ schemas
* Dynamic placeholder replacement for WordPress core and ACF fields
* Real-time JSON validation
* Clean wp_head injection without extra markup

== Technical Details ==

The block uses a dynamic rendering approach with `render_callback` to process placeholders server-side. This ensures that:

* Placeholders are replaced with current data on every page load
* ACF fields are safely accessed and formatted
* Invalid JSON never reaches the frontend
* Search engines receive clean, valid JSON-LD markup

The frontend output is optimized with no extra paragraph or break tags, outputting only the pure JSON-LD script tag.
]]></content>
  </file>
  <file path="agilepress-schema-json-ld-block.php">
    <description>This file contains the block registration code in the form of a single block plugin. Any other plugin related functionality should be added to this file. All block rendering functionality should go to the `render.php` file.</description>
    <content><![CDATA[<?php
/**
 * Plugin Name:       AgilePress Schema JSON-LD Block
 * Description:       A powerful WordPress block for managing Schema.org structured data markup with template support and dynamic placeholder replacement.
 * Version:           0.1.0
 * Requires at least: 6.1
 * Requires PHP:      7.4
 * Author:            AgilePress
 * License:           GPLv2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       agilepress-schema-json-ld-block
 *
 * @package Agilepress
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Registers the block using the metadata loaded from the `block.json` file.
 */
if ( ! function_exists( 'agilepress_schema_json_ld_block_init' ) ) {
	function agilepress_schema_json_ld_block_init() {
		register_block_type( __DIR__ . '/build/' );
	}
}
add_action( 'init', 'agilepress_schema_json_ld_block_init' );

/**
 * Process placeholders in JSON-LD content.
 *
 * @param string $content The JSON-LD content with placeholders.
 * @return string The processed content with placeholders replaced.
 */
if ( ! function_exists( 'agilepress_schema_process_placeholders' ) ) {
	function agilepress_schema_process_placeholders( $content ) {
		global $post;

		if ( ! $post ) {
			return $content;
		}

		$featured_image = get_the_post_thumbnail_url( $post->ID, 'full' );

		$replacements = array(
			'{{title}}'              => get_the_title( $post->ID ),
			'{{excerpt}}'            => get_the_excerpt( $post->ID ),
			'{{date}}'               => get_the_date( 'c', $post->ID ),
			'{{url}}'                => get_permalink( $post->ID ),
			'{{featured_image_url}}' => $featured_image ? $featured_image : '',
		);

		$content = str_replace( array_keys( $replacements ), array_values( $replacements ), $content );

		$content = preg_replace_callback(
			'/\{\{acf:([a-zA-Z0-9_-]+)\}\}/',
			function ( $matches ) use ( $post ) {
				$field_name = $matches[1];

				if ( ! function_exists( 'get_field' ) ) {
					return '';
				}

				$field_value = get_field( $field_name, $post->ID );

				if ( is_array( $field_value ) ) {
					return wp_json_encode( $field_value );
				} elseif ( is_string( $field_value ) || is_numeric( $field_value ) ) {
					return esc_js( $field_value );
				}

				return '';
			},
			$content
		);

		return $content;
	}
}

/**
 * Output JSON-LD schema in the head section.
 */
if ( ! function_exists( 'agilepress_schema_output_jsonld' ) ) {
	function agilepress_schema_output_jsonld() {
		global $post;

		if ( ! is_singular() || ! $post ) {
			return;
		}

		if ( ! has_blocks( $post->post_content ) ) {
			return;
		}

		$blocks = parse_blocks( $post->post_content );

		foreach ( $blocks as $block ) {
			if ( 'agilepress/block-agilepress-schema-json-ld-block' === $block['blockName'] ) {
				if ( ! empty( $block['attrs']['jsonldContent'] ) ) {
					$jsonld_content = $block['attrs']['jsonldContent'];

					$processed_content = agilepress_schema_process_placeholders( $jsonld_content );

					$decoded = json_decode( $processed_content, true );
					if ( json_last_error() === JSON_ERROR_NONE && is_array( $decoded ) ) {
						$safe_json = wp_json_encode( $decoded );
						if ( $safe_json ) {
							wp_print_inline_script_tag(
								$safe_json,
								array( 'type' => 'application/ld+json' )
							);
						}
					}
				}
			}
		}
	}
}
add_action( 'wp_head', 'agilepress_schema_output_jsonld', 1 );]]></content>
  </file>
  <file path="src/block.json">
    <description>This file contains metadata about the block including its name, title, category, icon, and other properties. The icon is a WordPress Dashicon name (e.g., "admin-post", "format-aside", "admin-page"). Do not use any icon that's not in the list under any circustamce. These are the only slugs available:
	
	menu menu-alt menu-alt2 menu-alt3 admin-site admin-site-alt admin-site-alt2 admin-site-alt3 dashboard admin-post admin-media admin-links admin-page admin-comments admin-appearance admin-plugins plugins-checked admin-users admin-tools admin-settings admin-network admin-home admin-generic admin-collapse filter admin-customizer admin-multisite welcome-write-blog welcome-add-page welcome-view-site welcome-widgets-menus welcome-comments welcome-learn-more format-aside format-image format-gallery format-video format-status format-quote format-chat format-audio camera camera-alt images-alt images-alt2 video-alt video-alt2 video-alt3 media-archive media-audio media-code media-default media-document media-interactive media-spreadsheet media-text media-video playlist-audio playlist-video controls-play controls-pause controls-forward controls-skipforward controls-back controls-skipback controls-repeat controls-volumeon controls-volumeoff image-crop image-rotate image-rotate-left image-rotate-right image-flip-vertical image-flip-horizontal image-filter undo redo database-add database database-export database-import database-remove database-view align-full-width align-pull-left align-pull-right align-wide block-default button cloud-saved cloud-upload columns cover-image ellipsis embed-audio embed-generic embed-photo embed-post embed-video exit heading html info-outline insert insert-after insert-before remove saved shortcode table-col-after table-col-before table-col-delete table-row-after table-row-before table-row-delete editor-bold editor-italic editor-ul editor-ol editor-ol-rtl editor-quote editor-alignleft editor-aligncenter editor-alignright editor-insertmore editor-spellcheck editor-expand editor-contract editor-kitchensink editor-underline editor-justify editor-textcolor editor-paste-word editor-paste-text editor-removeformatting editor-video editor-customchar editor-outdent editor-indent editor-help editor-strikethrough editor-unlink editor-rtl editor-ltr editor-break editor-code editor-paragraph editor-table align-left align-right align-center align-none lock unlock calendar calendar-alt visibility hidden post-status edit trash sticky external arrow-up arrow-down arrow-right arrow-left arrow-up-alt arrow-down-alt arrow-right-alt arrow-left-alt arrow-up-alt2 arrow-down-alt2 arrow-right-alt2 arrow-left-alt2 sort leftright randomize list-view excerpt-view grid-view move share share-alt share-alt2 rss email email-alt email-alt2 networking amazon facebook facebook-alt google instagram linkedin pinterest podio reddit spotify twitch twitter twitter-alt whatsapp xing youtube hammer art migrate performance universal-access universal-access-alt tickets nametag clipboard heart megaphone schedule tide rest-api code-standards buddicons-activity buddicons-bbpress-logo buddicons-buddypress-logo buddicons-community buddicons-forums buddicons-friends buddicons-groups buddicons-pm buddicons-replies buddicons-topics buddicons-tracking wordpress wordpress-alt pressthis update update-alt screenoptions info cart feedback cloud translation tag category archive tagcloud text bell yes yes-alt no no-alt plus plus-alt plus-alt2 minus dismiss marker star-filled star-half star-empty flag warning location location-alt vault shield shield-alt sos search slides text-page analytics chart-pie chart-bar chart-line chart-area groups businessman businesswoman businessperson id id-alt products awards forms testimonial portfolio book book-alt download upload backup clock lightbulb microphone desktop laptop tablet smartphone phone index-card carrot building store album palmtree tickets-alt money money-alt smiley thumbs-up thumbs-down layout paperclip color-picker edit-large edit-page airplane bank beer calculator car coffee drumstick food fullscreen-alt fullscreen-exit-alt games hourglass open-folder pdf pets printer privacy superhero superhero-alt</description>
    <content><![CDATA[{
    "$schema": "https://schemas.wp.org/trunk/block.json",
    "apiVersion": 3,
    "name": "agilepress/block-agilepress-schema-json-ld-block",
    "version": "0.1.0",
    "title": "AgilePress Schema JSON-LD Block",
    "category": "widgets",
    "icon": "media-code",
    "description": "Manage Schema.org structured data markup with template support and dynamic placeholder replacement.",
    "example": [],
    "attributes": {
        "jsonldContent": {
            "type": "string",
            "default": ""
        },
        "template": {
            "type": "string",
            "default": "blank"
        }
    },
    "supports": {
        "html": false,
        "multiple": true
    },
    "textdomain": "agilepress-schema-json-ld-block",
    "editorScript": "file:./index.js",
    "editorStyle": "file:./index.css",
    "style": "file:./style-index.css",
    "render": "file:./render.php"
}]]></content>
  </file>
  <file path="src/index.js">
    <description>This file registers the block, specifies the edit and save functions, and loads the block's metadata</description>
    <content><![CDATA[/**
 * Registers a new block provided a unique name and an object defining its behavior.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
 */
import { registerBlockType } from '@wordpress/blocks';

/**
 * Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files.
 * All files containing `style` keyword are bundled together. The code used
 * gets applied both to the front of your site and to the editor.
 *
 * @see https://www.npmjs.com/package/@wordpress/scripts#using-css
 */
import './style.scss';

/**
 * Internal dependencies
 */
import Edit from './edit';
import save from './save';
import metadata from './block.json';

/**
 * Every block starts by registering a new block type definition.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
 */
registerBlockType( metadata.name, {
	/**
	 * @see ./edit.js
	 */
	edit: Edit,

	/**
	 * @see ./save.js
	 */
	save,
} );]]></content>
  </file>
  <file path="src/edit.js">
    <description>This file contains the edit function for the block which is responsible for rendering the block in the editor.</description>
    <content><![CDATA[/**
 * Retrieves the translation of text.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-i18n/
 */
import { __ } from '@wordpress/i18n';

/**
 * React hook that is used to mark the block wrapper element.
 * It provides all the necessary props like the class name.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/#useblockprops
 */
import { useBlockProps, InspectorControls } from '@wordpress/block-editor';

/**
 * WordPress components for the sidebar
 */
import { PanelBody, TextareaControl, SelectControl, Notice } from '@wordpress/components';

/**
 * React hooks
 */
import { useState, useEffect } from '@wordpress/element';

/**
 * Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files.
 * Those files can contain any CSS code that gets applied to the editor.
 *
 * @see https://www.npmjs.com/package/@wordpress/scripts#using-css
 */
import './editor.scss';

/**
 * Template definitions for different schema types
 */
const SCHEMA_TEMPLATES = {
	blank: '',
	localBusiness: JSON.stringify( {
		"@context": "https://schema.org",
		"@type": "LocalBusiness",
		"name": "{{title}}",
		"image": "{{featured_image_url}}",
		"url": "{{url}}",
		"telephone": "{{acf:phone}}",
		"address": {
			"@type": "PostalAddress",
			"streetAddress": "{{acf:street_address}}",
			"addressLocality": "{{acf:city}}",
			"addressRegion": "{{acf:state}}",
			"postalCode": "{{acf:postal_code}}",
			"addressCountry": "{{acf:country}}"
		},
		"openingHoursSpecification": {
			"@type": "OpeningHoursSpecification",
			"dayOfWeek": [
				"Monday",
				"Tuesday",
				"Wednesday",
				"Thursday",
				"Friday"
			],
			"opens": "09:00",
			"closes": "17:00"
		}
	}, null, '  ' ),
	organization: JSON.stringify( {
		"@context": "https://schema.org",
		"@type": "Organization",
		"name": "{{title}}",
		"url": "{{url}}",
		"logo": "{{featured_image_url}}",
		"description": "{{excerpt}}",
		"contactPoint": {
			"@type": "ContactPoint",
			"telephone": "{{acf:phone}}",
			"contactType": "Customer Service",
			"email": "{{acf:email}}"
		},
		"sameAs": [
			"{{acf:facebook_url}}",
			"{{acf:twitter_url}}",
			"{{acf:linkedin_url}}"
		]
	}, null, '  ' ),
	faq: JSON.stringify( {
		"@context": "https://schema.org",
		"@type": "FAQPage",
		"mainEntity": [
			{
				"@type": "Question",
				"name": "Question 1 goes here",
				"acceptedAnswer": {
					"@type": "Answer",
					"text": "Answer 1 goes here"
				}
			},
			{
				"@type": "Question",
				"name": "Question 2 goes here",
				"acceptedAnswer": {
					"@type": "Answer",
					"text": "Answer 2 goes here"
				}
			}
		]
	}, null, '  ' )
};

/**
 * The edit function describes the structure of your block in the context of the
 * editor. This represents what the editor will render when the block is used.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#edit
 *
 * @param {Object} props Block props
 * @return {Element} Element to render.
 */
export default function Edit( { attributes, setAttributes } ) {
	const { jsonldContent, template } = attributes;
	const [ isValid, setIsValid ] = useState( true );
	const [ validationMessage, setValidationMessage ] = useState( '' );

	// Validate JSON whenever content changes
	useEffect( () => {
		if ( ! jsonldContent || jsonldContent.trim() === '' ) {
			setIsValid( true );
			setValidationMessage( '' );
			return;
		}

		try {
			JSON.parse( jsonldContent );
			setIsValid( true );
			setValidationMessage( __( 'Valid JSON', 'agilepress-schema-json-ld-block' ) );
		} catch ( error ) {
			setIsValid( false );
			setValidationMessage( __( 'Invalid JSON: ', 'agilepress-schema-json-ld-block' ) + error.message );
		}
	}, [ jsonldContent ] );

	// Handle template selection
	const handleTemplateChange = ( newTemplate ) => {
		setAttributes( {
			template: newTemplate,
			jsonldContent: SCHEMA_TEMPLATES[ newTemplate ],
		} );
	};

	// Handle JSON-LD content change
	const handleContentChange = ( newContent ) => {
		setAttributes( {
			jsonldContent: newContent,
		} );
	};

	const blockProps = useBlockProps( {
		className: 'agilepress-schema-json-ld-block-placeholder',
	} );

	return (
		<>
			<InspectorControls>
				<PanelBody title={ __( 'Schema Settings', 'agilepress-schema-json-ld-block' ) } initialOpen={ true }>
					<SelectControl
						label={ __( 'Template', 'agilepress-schema-json-ld-block' ) }
						value={ template }
						options={ [
							{ label: __( 'Blank', 'agilepress-schema-json-ld-block' ), value: 'blank' },
							{ label: __( 'LocalBusiness', 'agilepress-schema-json-ld-block' ), value: 'localBusiness' },
							{ label: __( 'Organization', 'agilepress-schema-json-ld-block' ), value: 'organization' },
							{ label: __( 'FAQ', 'agilepress-schema-json-ld-block' ), value: 'faq' },
						] }
						onChange={ handleTemplateChange }
						help={ __( 'Select a template to start with pre-filled JSON-LD', 'agilepress-schema-json-ld-block' ) }
					/>

					<TextareaControl
						label={ __( 'JSON-LD Content', 'agilepress-schema-json-ld-block' ) }
						value={ jsonldContent }
						onChange={ handleContentChange }
						rows={ 15 }
						help={ __( 'Enter your JSON-LD schema markup. Use placeholders like {{title}}, {{url}}, {{acf:field_name}}', 'agilepress-schema-json-ld-block' ) }
						className="agilepress-schema-json-ld-block-textarea"
					/>

					{ validationMessage && (
						<Notice
							status={ isValid ? 'success' : 'error' }
							isDismissible={ false }
						>
							{ validationMessage }
						</Notice>
					) }

					<div className="agilepress-schema-json-ld-block-help">
						<h4>{ __( 'Available Placeholders:', 'agilepress-schema-json-ld-block' ) }</h4>
						<ul>
							<li><code>{ '{{title}}' }</code> - { __( 'Post/page title', 'agilepress-schema-json-ld-block' ) }</li>
							<li><code>{ '{{excerpt}}' }</code> - { __( 'Post excerpt', 'agilepress-schema-json-ld-block' ) }</li>
							<li><code>{ '{{date}}' }</code> - { __( 'Publication date', 'agilepress-schema-json-ld-block' ) }</li>
							<li><code>{ '{{url}}' }</code> - { __( 'Current post URL', 'agilepress-schema-json-ld-block' ) }</li>
							<li><code>{ '{{featured_image_url}}' }</code> - { __( 'Featured image URL', 'agilepress-schema-json-ld-block' ) }</li>
							<li><code>{ '{{acf:field_name}}' }</code> - { __( 'Any ACF field', 'agilepress-schema-json-ld-block' ) }</li>
						</ul>
					</div>
				</PanelBody>
			</InspectorControls>

			<div { ...blockProps }>
				<div className="agilepress-schema-json-ld-block-icon">
					<svg width="48" height="48" viewBox="0 0 24 24" fill="none">
						<path d="M13 3H4v18h16V10l-7-7zm0 2.5L17.5 11H13V5.5z" fill="currentColor" />
					</svg>
				</div>
				<div className="agilepress-schema-json-ld-block-title">
					{ __( 'JSON-LD Configured', 'agilepress-schema-json-ld-block' ) }
				</div>
				<div className="agilepress-schema-json-ld-block-subtitle">
					{ jsonldContent ? __( 'Schema markup active', 'agilepress-schema-json-ld-block' ) : __( 'Configure in sidebar', 'agilepress-schema-json-ld-block' ) }
				</div>
			</div>
		</>
	);
}]]></content>
  </file>
  <file path="src/save.js">
    <description>This file contains the save function for the block which is responsible for creating the static result of rendering the block on the client to display the saved result on the front end.</description>
    <content><![CDATA[/**
 * The save function defines the way in which the different attributes should
 * be combined into the final markup, which is then serialized by the block
 * editor into `post_content`.
 *
 * For dynamic blocks, return null to indicate dynamic rendering.
 *
 * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save
 *
 * @return {null} Returns null for dynamic rendering via PHP.
 */
export default function save() {
	return null;
}]]></content>
  </file>
  <file path="src/style.scss">
    <description>This file contains styles for the block in the front end.</description>
    <content><![CDATA[/**
 * The following styles get applied both on the front of your site
 * and in the editor.
 *
 * Replace them with your own styles or remove the file completely.
 */

.wp-block-agilepress-block-agilepress-schema-json-ld-block {
	/* No frontend styling needed - block outputs JSON-LD in head */
	display: none;
}
]]></content>
  </file>
  <file path="src/editor.scss">
    <description>This file contains styles for the block in the editor.</description>
    <content><![CDATA[/**
 * The following styles get applied inside the editor only.
 *
 * Replace them with your own styles or remove the file completely.
 */

.agilepress-schema-json-ld-block-placeholder {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: 40px 20px;
	background: #f0f0f1;
	border: 2px dashed #c3c4c7;
	border-radius: 4px;
	text-align: center;
	min-height: 200px;
	transition: all 0.2s ease;

	&:hover {
		background: #e8e8ea;
		border-color: #a7aaad;
	}
}

.agilepress-schema-json-ld-block-icon {
	color: #1e1e1e;
	margin-bottom: 16px;
	opacity: 0.6;

	svg {
		display: block;
	}
}

.agilepress-schema-json-ld-block-title {
	font-size: 16px;
	font-weight: 600;
	color: #1e1e1e;
	margin-bottom: 8px;
}

.agilepress-schema-json-ld-block-subtitle {
	font-size: 13px;
	color: #757575;
}

.agilepress-schema-json-ld-block-textarea {
	font-family: Consolas, Monaco, 'Courier New', monospace;
	font-size: 12px;
	line-height: 1.5;
}

.agilepress-schema-json-ld-block-help {
	margin-top: 16px;
	padding: 12px;
	background: #f0f0f1;
	border-radius: 4px;

	h4 {
		margin: 0 0 8px 0;
		font-size: 13px;
		font-weight: 600;
		color: #1e1e1e;
	}

	ul {
		margin: 0;
		padding: 0;
		list-style: none;

		li {
			margin-bottom: 6px;
			font-size: 12px;
			line-height: 1.5;
			color: #50575e;

			code {
				background: #fff;
				padding: 2px 6px;
				border-radius: 2px;
				font-size: 11px;
				color: #d63638;
			}
		}
	}
}

.components-panel__body .components-notice {
	margin: 16px 0 0 0;
}
]]></content>
  </file>
  <file path="src/view.js">
    <description>This file contains the view function for the block which is responsible for rendering interactive behaviors of the block on the front end. Ideally using the WordPress interactivity API.</description>
    <content><![CDATA[/**
 * No frontend JavaScript needed for this block as it only outputs JSON-LD
 * in the document head via PHP.
 */]]></content>
  </file>
  <file path="src/render.php">
    <description>This file contains the render callback function for the block, which is responsible for rendering the block content on the front end. A render function should exist only if the block is dynamic.</description>
    <content><![CDATA[<?php
/**
 * Render callback for the AgilePress Schema JSON-LD Block block.
 *
 * This block doesn't render visible content on the page.
 * JSON-LD is output via wp_head hook in the main plugin file.
 *
 * @param array    $attributes Block attributes.
 * @param string   $content    Block content.
 * @param WP_Block $block      Block instance.
 *
 * @return string Empty string as JSON-LD is output via wp_head.
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

return '';]]></content>
  </file>
</artefact>