{"id":312098,"date":"2026-05-17T21:39:21","date_gmt":"2026-05-17T21:39:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-content-disclosure\/"},"modified":"2026-08-22T13:33:48","modified_gmt":"2026-08-22T13:33:48","slug":"desk9-ai-content-disclosure","status":"publish","type":"plugin","link":"https:\/\/yor.wordpress.org\/plugins\/desk9-ai-content-disclosure\/","author":23303522,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.1","stable_tag":"1.4.1","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Desk9 AI Content Disclosure","header_author":"Tobias Kurth","header_description":"Helps site owners visibly document AI-assisted content and optionally output experimental machine-readable disclosures. Supports transparency documentation; does not provide legal advice.","assets_banners_color":"dd3a76","last_updated":"2026-08-22 13:33:48","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/desk9-ai-content-disclosure\/","header_author_uri":"https:\/\/desk9.design\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":327,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"desk9","date":"2026-05-17 21:52:17"},"1.0.1":{"tag":"1.0.1","author":"desk9","date":"2026-05-17 23:15:08"},"1.1.0":{"tag":"1.1.0","author":"desk9","date":"2026-08-22 00:36:02"},"1.2.0":{"tag":"1.2.0","author":"desk9","date":"2026-08-22 01:29:41"},"1.4.0":{"tag":"1.4.0","author":"desk9","date":"2026-08-22 12:08:37"},"1.4.1":{"tag":"1.4.1","author":"desk9","date":"2026-08-22 13:33:48"}},"upgrade_notice":{"1.4.1":"<p>Repairs the 1.4.0 package, which was uploaded without several of its files and could not load. Please update \u2014 1.4.0 is not usable.<\/p>","1.4.0":"<p>Adds five alternative designs and six color schemes for the notice. Your current look is now called \u201cClassic\u201d and stays selected, so the update changes nothing until you pick something else.<\/p>","1.3.0":"<p>Adds per-image AI marking: mark images in the media library or on the image block, optionally naming the tool, and show an overlay pill. The pill stays off until you enable it under Settings, so nothing changes on your site until you do.<\/p>","1.2.0":"<p>The block editor now previews the disclosure by rendering it on the server, so what you see in the canvas is the markup the front end outputs. No action needed.<\/p>","1.1.0":"<p>Custom CSS needs updating: every class, id and CSS variable moves from the <code>acd-<\/code> prefix to <code>deskaico-<\/code>, so <code>.acd-disclosure<\/code> becomes <code>.deskaico-disclosure<\/code>. Settings, content and stored data are unaffected.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3534877,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3534877,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3640300,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"deskaico\/disclosure":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"deskaico\/disclosure","title":"AI Disclosure","category":"widgets","icon":"privacy","description":"Displays an AI-assisted content disclosure with optional badges and semantic markup.","keywords":["ai","disclosure","transparency"],"version":"1.4.1","textdomain":"desk9-ai-content-disclosure","supports":{"align":true,"className":true,"spacing":{"margin":true,"padding":false},"html":false,"multiple":true},"example":{"attributes":{"useGlobalDefaults":true,"variant":"card","iconsMode":"inherit","machineReadableMode":"inherit","customText":"","overrideTools":[],"disclaimerLength":"inherit","usageScope":"inherit"},"viewportWidth":520},"usesContext":["postId","postType"],"attributes":{"useGlobalDefaults":{"type":"boolean","default":true},"customText":{"type":"string","default":""},"overrideTools":{"type":"array","default":[]},"disclaimerLength":{"type":"string","default":"inherit"},"usageScope":{"type":"string","default":"inherit"},"variant":{"type":"string","default":"card"},"iconsMode":{"type":"string","default":"inherit"},"machineReadableMode":{"type":"string","default":"inherit"},"bgColor":{"type":"string","default":""},"borderColor":{"type":"string","default":""},"borderRadiusPx":{"type":"string","default":""},"paddingPx":{"type":"string","default":""},"fontSizePx":{"type":"string","default":""}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"}},"tagged_versions":["1.0.0","1.0.1","1.1.0","1.2.0","1.4.0","1.4.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3534877,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3534877,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3534877,"resolution":"3","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"Settings page demonstrating provider selection and WCAG reminders.","2":"Block editor inspector with transparency-focused controls.","3":"Front-end disclosure card with neutral badges and accessible <code>&lt;aside&gt;<\/code> scaffolding."}},"plugin_section":[],"plugin_tags":[2353,148857,23968,148076,25098],"plugin_category":[],"plugin_contributors":[244725],"plugin_business_model":[],"class_list":["post-312098","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-block-editor","plugin_tags-disclosure","plugin_tags-gutenberg","plugin_tags-transparency","plugin_contributors-desk9","plugin_committers-desk9"],"banners":{"banner":"https:\/\/ps.w.org\/desk9-ai-content-disclosure\/assets\/banner-772x250.png?rev=3640300","banner_2x":"https:\/\/ps.w.org\/desk9-ai-content-disclosure\/assets\/banner-1544x500.png?rev=3534877","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/desk9-ai-content-disclosure\/assets\/icon-256x256.png?rev=3534877","icon_2x":"https:\/\/ps.w.org\/desk9-ai-content-disclosure\/assets\/icon-256x256.png?rev=3534877","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/desk9-ai-content-disclosure\/assets\/screenshot-1.png?rev=3534877","caption":"Settings page demonstrating provider selection and WCAG reminders."},{"src":"https:\/\/ps.w.org\/desk9-ai-content-disclosure\/assets\/screenshot-2.png?rev=3534877","caption":"Block editor inspector with transparency-focused controls."},{"src":"https:\/\/ps.w.org\/desk9-ai-content-disclosure\/assets\/screenshot-3.png?rev=3534877","caption":"Front-end disclosure card with neutral badges and accessible <code>&lt;aside&gt;<\/code> scaffolding."}],"raw_content":"<!--section=description-->\n<p><strong>Desk9 AI Content Disclosure<\/strong> helps you document AI-assisted work in a calm, readable way. Choose tools (like OpenAI or Gemini), add a short or long disclaimer, pick a layout that fits your theme, and optionally expose a compact \u201ctools used\u201d line or badge-style hints.<\/p>\n\n<p>Everything runs on your server\u2014settings and post options are stored in your WordPress database. This plugin is a practical transparency aid; statutes and obligations depend on your context, so treat the copy as informational, not a legal guarantee.<\/p>\n\n<h3>Deutsch (Kurzfassung)<\/h3>\n\n<p>Mit diesem Plugin kennzeichnen Sie KI-unterst\u00fctzte Inhalte klar f\u00fcr Besucherinnen und Besucher. Die ausf\u00fchrliche Anleitung folgt auf Englisch (Standard f\u00fcr WordPress.org). \u00dcbersetzungen \u00fcber die Community: https:\/\/translate.wordpress.org\/<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Global settings<\/strong> under <em>Settings \u2192 Desk9 AI Content Disclosure<\/em>: pick AI tools, edit long and short disclaimers (English defaults), control card styling (including an optional accent stripe), toggle badges, and set how tool names appear (short labels, bundled icons, or full names).<\/li>\n<li><strong>Per-image marking<\/strong>: flag individual images as AI generated or edited\u2014from the media library or straight from the image block\u2014optionally naming the tool, and show a small pill over them on featured images, archives and images inside content.<\/li>\n<li><strong>Six designs, six color schemes<\/strong>: keep the Classic notice or switch to an accent-bar, minimal, editorial, technical or soft direction, each with contrast-checked colors and an optional dark variant.<\/li>\n<li><strong>Block editor<\/strong>: insert the dynamic disclosure block, adjust disclaimer length, AI-usage wording, and tools per instance\u2014multiple blocks per post are supported when you need them.<\/li>\n<li><strong>Per-post document sidebar<\/strong> (supported post types): inherit global defaults, override text or tools, hide the inherited notice, or skip auto-append for that entry.<\/li>\n<li><strong>Shortcode<\/strong> <code>[deskaico_disclosure]<\/code> for precise placement in classic layouts, page builders, or template parts.<\/li>\n<li><strong>Optional auto-append<\/strong> after post content when a post is marked as AI-relevant\u2014handy when authors should not forget a notice on long-form content.<\/li>\n<li><strong>Optional Beta JSON-LD<\/strong> (off by default): experimental machine-readable hints for advanced use cases; not canonical schema.org output and may change over time.<\/li>\n<li><strong>WPML-ready<\/strong> configuration file included for teams running multilingual sites (see FAQ).<\/li>\n<\/ul>\n\n<h3>Development<\/h3>\n\n<p>Official releases include <strong>readable source<\/strong> under <code>src\/<\/code> (JavaScript and Sass) plus <code>package.json<\/code> and <code>webpack.config.js<\/code>, so you can audit or fork the plugin without a separate repository. The compiled bundles that WordPress loads live in <code>build\/<\/code> and match what ships on WordPress.org when you run the production build.<\/p>\n\n<p><strong>Rebuild compiled assets (optional):<\/strong><\/p>\n\n<ol>\n<li>Install <strong>Node.js<\/strong> (current LTS recommended) which includes <code>npm<\/code>.<\/li>\n<li>In the plugin directory, run <code>npm install<\/code> once to install dev dependencies.<\/li>\n<li>Run <code>npm run build<\/code> to regenerate the <code>build\/<\/code> assets.<\/li>\n<li>For active development with auto-rebuild, use <code>npm run start<\/code>.<\/li>\n<\/ol>\n\n<p>Layout reference: <code>src\/disclosure\/<\/code> contains the Gutenberg block; <code>src\/post-sidebar\/<\/code> powers the document sidebar; <code>webpack.config.js<\/code> extends <code>@wordpress\/scripts<\/code> so both entry points compile.<\/p>\n\n<p><strong>Translators and maintainers:<\/strong> translations are not bundled with the plugin; they are served as WordPress.org language packs, and WordPress generates the editor's JSON translation files from those packs itself. Contribute at https:\/\/translate.wordpress.org\/projects\/wp-plugins\/desk9-ai-content-disclosure\/ \u2014 <code>languages\/desk9-ai-content-disclosure.pot<\/code> in this repository is the current string template.<\/p>\n\n<h3>Privacy \/ Data handling<\/h3>\n\n<ul>\n<li>No outbound analytics or telemetry are added by this plugin for its own purposes.<\/li>\n<li>Data stays on your site: a serialized option and post meta are stored in the database with normal WordPress capability checks.<\/li>\n<li>Deleting the plugin removes that data again: <code>uninstall.php<\/code> drops the <code>deskaico_options<\/code> option and every <code>_deskaico_*<\/code> post meta key (on each site of a multisite network).<\/li>\n<li>No cookies are introduced by default.<\/li>\n<li>Users with <code>manage_options<\/code> configure global defaults; authors and editors update per-entry values according to their roles.<\/li>\n<\/ul>\n\n<h3>Icon credits<\/h3>\n\n<p>The four provider icons under <code>assets\/icons\/providers\/<\/code> \u2014 OpenAI, Google Gemini, Anthropic and Meta \u2014 come from <a href=\"https:\/\/github.com\/simple-icons\/simple-icons\">Simple Icons<\/a> and are released under <strong>CC0 1.0<\/strong>, which is GPL-compatible. Full details, including what was removed and why, are listed in <code>assets\/icons\/providers\/ATTRIBUTION.md<\/code>.<\/p>\n\n<p>An icon is bundled <strong>only where it is the provider's actual mark<\/strong>, with no generic fallback artwork. Every other provider is shown as a short text abbreviation instead, because an invented symbol would tell a reader nothing about which tool was used.<\/p>\n\n<p>Trademarks remain the property of their respective owners. The icons identify the tool an author worked with and imply no affiliation with, or endorsement by, those companies.<\/p>\n\n<h3>Internationalisation<\/h3>\n\n<p>Translations are delivered as WordPress.org <strong>language packs<\/strong>. WordPress downloads them automatically into <code>wp-content\/languages\/plugins\/<\/code> and loads them for both the PHP interface and the block editor \u2014 nothing is bundled inside the plugin folder, so updating a translation never requires a plugin release.<\/p>\n\n<p><strong>Tip:<\/strong> The dashboard language often follows <strong>Users \u2192 Profile \u2192 Language<\/strong>. If the site is localized but your user profile is still English, some strings may stay in English until you change that setting.<\/p>\n\n<p>Help translate the plugin into your language at https:\/\/translate.wordpress.org\/projects\/wp-plugins\/desk9-ai-content-disclosure\/ \u2014 once a locale reaches the release threshold, every site in that language receives the pack automatically.<\/p>\n\n<!--section=installation-->\n<h4>From the WordPress.org plugin directory (recommended)<\/h4>\n\n<ol>\n<li>In your admin dashboard, go to <em>Plugins \u2192 Add New<\/em>.<\/li>\n<li>Search for <strong>Desk9 AI Content Disclosure<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<h4>Upload a ZIP file<\/h4>\n\n<ol>\n<li>Download the plugin ZIP (from WordPress.org or your maintainer).<\/li>\n<li>Go to <em>Plugins \u2192 Add New \u2192 Upload Plugin<\/em>, choose the ZIP, and click <strong>Install Now<\/strong>.<\/li>\n<li>Click <strong>Activate Plugin<\/strong>.<\/li>\n<\/ol>\n\n<h4>Install via SFTP or hosting file manager<\/h4>\n\n<ol>\n<li>Unzip the package on your computer if needed. You should have a folder named <code>desk9-ai-content-disclosure<\/code>.<\/li>\n<li>Upload that folder to <code>wp-content\/plugins\/<\/code> on your site.<\/li>\n<li>In the dashboard, open <em>Plugins<\/em> and activate <strong>Desk9 AI Content Disclosure<\/strong>.<\/li>\n<\/ol>\n\n<p><strong>After activation:<\/strong> open <em>Settings \u2192 Desk9 AI Content Disclosure<\/em>, review defaults, then add the block or shortcode where readers should see the notice. No command line or NPM is required for normal use.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20node.js%20or%20npm%3F\"><h3>Do I need Node.js or NPM?<\/h3><\/dt>\n<dd><p>No. Pre-built scripts and styles ship in the <code>build\/<\/code> folder. Developers who want to rebuild from source can use Node\u2014see <strong>Development<\/strong> below.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20guarantee%20legal%20compliance%20%28for%20example%20eu%20ai%20act%20or%20article%2050%29%3F\"><h3>Does this plugin guarantee legal compliance (for example EU AI Act or Article 50)?<\/h3><\/dt>\n<dd><p>No. It helps you disclose AI use visibly, but laws and interpretations differ by region and use case. Consult qualified counsel for compliance questions.<\/p><\/dd>\n<dt id=\"what%20does%20%E2%80%9Cexperimental%20json-ld%E2%80%9D%20mean%3F\"><h3>What does \u201cexperimental JSON-LD\u201d mean?<\/h3><\/dt>\n<dd><p>When enabled, the plugin can emit a non-standard JSON-LD script plus related <code>data-*<\/code> attributes once per page load. Treat it as beta: it is not a guaranteed schema.org pattern and may evolve.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20data%20to%20external%20services%3F\"><h3>Does the plugin send data to external services?<\/h3><\/dt>\n<dd><p>No dedicated telemetry or analytics endpoints are bundled. Settings and per-post data stay in your WordPress database. Output is rendered on your pages like other theme and plugin content.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20wpml%2C%20polylang%2C%20or%20other%20multilingual%20plugins%3F\"><h3>Does it work with WPML, Polylang, or other multilingual plugins?<\/h3><\/dt>\n<dd><p>Yes. A <code>wpml-config.xml<\/code> ships with the plugin so WPML can register admin strings, translate the custom disclaimer meta field, and translate the <code>text<\/code> attribute on the shortcode (HTML allowed) while keeping structural fields consistent across languages. Other multilingual setups can use similar approaches or WordPress filters\u2014see the FAQ entry on hooks in older documentation if you customize output.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Repairs the <strong>1.4.0 package<\/strong>, which reached WordPress.org incomplete: several files \u2014 including <code>includes\/class-deskaico-image-badge.php<\/code>, which the plugin loads on every request \u2014 were never committed to the release tag. Installing or updating to 1.4.0 therefore ended in a fatal error. Nothing else changed; 1.4.1 is 1.4.0 with all of its files.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: <strong>design directions<\/strong> for the notice. The existing look is now named <strong>Classic<\/strong> and remains the default, joined by <em>Accent bar<\/em> (clear and official, with a small heading and the same sparkle the image pill uses), <em>Minimal<\/em> (reads like a footnote), <em>Editorial<\/em> (serif, masthead tone), <em>Technical<\/em> (monospace marker) and <em>Soft<\/em> (frameless, rounded, warm).<\/li>\n<li>New: six <strong>color schemes<\/strong> \u2014 neutral grey, blue, warm grey\/sand, green, violet and black-and-white \u2014 each setting background, border and text together at a verified contrast ratio of at least 4.5:1. Every scheme also carries a dark variant that can follow the visitor's system preference.<\/li>\n<li>New: <strong>Custom colors<\/strong> as the seventh option. Choosing it reveals the individual color fields \u2014 background, border and now text as well \u2014 each as a WordPress color picker: a swatch that opens the picker, with the hex value still editable as text. Picking a ready-made scheme hides those fields and shows that scheme's palette as read-only swatches instead, including its dark variant.<\/li>\n<li>The text color is new and defaults to empty, meaning the notice keeps inheriting the color from your theme exactly as before.<\/li>\n<li>Existing sites are untouched: Classic plus Custom colors is what an update selects, so the notice keeps looking exactly as before until you change it.<\/li>\n<li>Per-block color overrides still win over a scheme, so a single placement can deviate deliberately.<\/li>\n<li>New providers: <strong>Mistral AI, xAI \/ Grok, DeepSeek, Perplexity, Adobe Firefly, Black Forest Labs (FLUX)<\/strong> and <strong>Leonardo.ai<\/strong> \u2014 fifteen entries in total, still with \u201cOther\u201d for anything not listed.<\/li>\n<li>Icons now ship <strong>only where the provider's actual logo is bundled<\/strong>, with no generic stand-in artwork at all \u2014 the \u201cOther\u201d gear and the generic sparkle went too, so an unbranded chip is now always plain text. Invented motifs for Midjourney and Stability AI were removed, and so was the Copilot icon, which was in fact the <em>GitHub<\/em> Copilot mark \u2014 a different product. Those providers fall back to their abbreviation badge, which the renderer already did on its own. A made-up logo tells a reader nothing about which tool was used, and one drawn close enough to be recognised would be a knock-off.<\/li>\n<li>While <strong>Icons<\/strong> is the selected display style, the provider list only offers the ones a real logo exists for. Anything you already ticked stays visible and keeps working, so no stored selection can go missing.<\/li>\n<li>The provider list is now handed to the block editor from PHP instead of being repeated in three JavaScript bundles, where it had already fallen out of step.<\/li>\n<li>Fix: <code>other.svg<\/code>, the icon for the <strong>\u201cOther\u201d provider<\/strong>, contained two raw control characters in a comment and was therefore not well-formed XML. Browsers refused to render it, so the chip stayed blank whenever \u201cOther\u201d was shown in icon mode. Present since the first release.<\/li>\n<li>New: a <strong>Restore bundled wording<\/strong> button under each disclaimer preset. Once you have edited a preset there was previously no way back to the shipped text; the button rebuilds it from the plugin's own wording plus the lead sentence of the selected usage scope.<\/li>\n<li>All directions render from one shared markup tree and rearrange through CSS, so the editor preview and the front end cannot drift apart.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: <strong>mark individual images as AI generated or AI edited<\/strong>. The marking is stored on the image itself, so it follows the picture everywhere it is used \u2014 featured image, archive listings and images placed in post content, including inside galleries.<\/li>\n<li>Mark images from wherever you happen to be: a pair of fields in the media library next to the alt text, or an <strong>AI disclosure panel on the selected image block<\/strong>, so a picture you just inserted can be flagged without opening the media library at all.<\/li>\n<li>Record the <strong>tool<\/strong> that made the image and let the pill name it, for example \u201cAI generated \u00b7 Midjourney\u201d.<\/li>\n<li>New: an optional <strong>overlay pill<\/strong> on marked images \u2014 choose the corner, the size, icon-only or icon plus wording, and your own text. Icon-only keeps the wording available to screen readers rather than dropping it.<\/li>\n<li>Marked images carry the pill <strong>in the block editor too<\/strong>, so you see the marking while writing rather than only after publishing.<\/li>\n<li>The pill is drawn over the picture with CSS and never alters the image file, so it disappears when the picture is downloaded or screenshotted \u2014 the settings screen says so plainly rather than implying a permanent watermark.<\/li>\n<li>Styled entirely through CSS custom properties, so its look can be retuned from a child theme without touching plugin markup.<\/li>\n<li>Off by default; enabling the pill under <strong>Settings \u2192 Image marking<\/strong> is what makes marked images show it.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>The block editor preview is now produced by the block's own PHP renderer through the block-renderer REST route, so the canvas shows the exact markup and styling the front end outputs. It replaces a separate JavaScript approximation that had drifted apart from the real output: it showed placeholder badges (\u201cOAI \u22ef\u201d) instead of your configured tools, truncated the disclaimer at 220 characters, dropped the AI usage lead sentence, and \u2014 because the front-end stylesheet was only ever enqueued during rendering \u2014 displayed no card, border, background or badge styling at all.<\/li>\n<li>The front-end stylesheet is now loaded into the editor canvas as well, so preview and front end are styled by one and the same file.<\/li>\n<li>Fix: <strong>alignment<\/strong> and <strong>margin<\/strong> set on the block applied in the editor but were dropped on the front end, because the renderer builds its own element and never called <code>get_block_wrapper_attributes()<\/code>. Both are now carried through to the published markup.<\/li>\n<li>Fix: per-post overrides were resolved against no post at all when rendering outside a singular view; the renderer now falls back to the post the REST request sets up.<\/li>\n<li>Removed roughly 400 lines of duplicated preview logic in JavaScript along with the <code>deskaicoEditorConfig<\/code> payload that only fed it.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li><strong>Breaking (CSS only):<\/strong> every CSS class, HTML <code>id<\/code> and CSS custom property now uses the <code>deskaico-<\/code> prefix instead of the legacy <code>acd-<\/code> shorthand (<code>.acd-disclosure<\/code> \u2192 <code>.deskaico-disclosure<\/code>, <code>--acd-bg<\/code> \u2192 <code>--deskaico-bg<\/code>, and so on). The old three-letter prefix predates the plugin\u2019s rename and no longer matched anything else in the codebase. Custom CSS targeting the old names needs updating; settings, content and stored data are untouched.<\/li>\n<li>Translations now ship exclusively as WordPress.org language packs instead of files bundled in <code>\/languages\/<\/code>, so a corrected translation reaches sites without a plugin release. Help translate at https:\/\/translate.wordpress.org\/projects\/wp-plugins\/desk9-ai-content-disclosure\/<\/li>\n<li>Fix: the block\u2019s front-end stylesheet targeted <code>.wp-block-ai-content-disclosure-disclosure<\/code>, a class generated by the block namespace used before the plugin was renamed. The rule never matched anything; it now targets <code>.wp-block-deskaico-disclosure<\/code>.<\/li>\n<li>Compatibility: all runtime registrations (block, shortcode, post meta, auto-append, JSON-LD collector) now boot on <code>init<\/code> instead of <code>plugins_loaded<\/code>. This removes the WordPress 6.7+ debug notices about <code>_load_textdomain_just_in_time<\/code> and about <code>wp_register_script<\/code> \/ <code>wp_register_style<\/code> running before the enqueue hooks.<\/li>\n<li>Fix: an empty or invalid <strong>border color<\/strong> fell back to the background default, so the card border became invisible. Background, border and accent colors now each fall back to their own default.<\/li>\n<li>New: <code>uninstall.php<\/code> removes the plugin option and all <code>_deskaico_*<\/code> post meta when the plugin is deleted (multisite-aware).<\/li>\n<li>Housekeeping: declared <strong>Tested up to 7.1<\/strong>; removed a stray temporary file from the plugin folder.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Settings\/runtime: fix global <strong>long \/ short presets<\/strong> accidentally saved as only the informational <strong>usage-scope lead<\/strong> (no preset body)\u2014options are rebuilt from the bundled texts plus your selected scope whenever that pattern is detected, so Settings and the front end stay consistent until you intentionally edit the presets.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Settings: fixing how <strong>AI usage scope<\/strong> merges its introductory paragraph into <strong>long<\/strong> and <strong>short<\/strong> disclaimer presets in the browser\u2014strip legacy leads whether they appear as plaintext or wrapped in a leading <code>&lt;p&gt;\u2026&lt;\/p&gt;<\/code>, refresh both textareas once on page load, and clarify the helper text beneath the dropdown (German strings updated).<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Block: when <strong>AI usage extent<\/strong> is <strong>Inherit site setting<\/strong> and the block uses <strong>global site disclaimer text<\/strong>, the front end now outputs the wording stored under <strong>Settings<\/strong> as-is (the admin screens already merge the usage-scope sentence into those textareas when you save). Applying the programmatic prefix twice no longer hides or duplicates the canonical Settings copy compared with choosing <strong>None<\/strong>.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Frontend: prevent <strong>duplicated AI usage-scope lead sentences<\/strong>. Saved disclaimer HTML from Settings often wraps the introductory sentence inside <code>&lt;p&gt;\u2026&lt;\/p&gt;<\/code>; stripping only matched raw prefixes at the beginning of the string, so WordPress appended the same lead again\u2014now trimmed whether it is plaintext or first matching paragraph (<code>deskaico_strip_leading_usage_scope_prefixes<\/code>).<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Frontend: fixing disclaimer resolution so <strong>Settings \u2192 Disclaimer text<\/strong> is honored whenever a disclosure <strong>block or shortcode<\/strong> explicitly uses <strong>global site defaults<\/strong>, even if the document sidebar uses \u201cCustom message &amp; tools\u201d for auto-append\/overrides on the same entry.<\/li>\n<li>Front-end ignores \u201cempty-looking\u201d markup (such as stray empty paragraphs): only real visible text satisfies custom disclaimer fields, preventing the notice from collapsing to nothing.<\/li>\n<li>Document sidebar help text clarified for how per-post customs interact with globally defaulted blocks.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Block editor preview: the canvas now reflects <strong>Settings \u2192 Default disclaimer length<\/strong> (long vs short) and the saved long\/short disclaimer texts, including the block inserter preview\u2014no more \u201cblank\u201d or always-long English placeholder when the short template is selected.<\/li>\n<li>Developer note: <code>deskaicoEditorConfig<\/code> now passes <code>defaultDisclaimerVariant<\/code>, <code>disclaimerPlainLong<\/code>, and <code>disclaimerPlainShort<\/code> for editor preview only (front-end markup is unchanged).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release on WordPress.org: settings UI, disclosure renderer, dynamic block (inspector presets for disclaimer length, AI usage extent, per-block tools, multiple blocks per post) and shortcode <strong><code>[deskaico_disclosure]<\/code><\/strong>, document sidebar (post overrides and optional auto-append layout), Beta JSON-LD collector, German translation starter pack.<\/li>\n<li>Distinctive listing title <strong>Desk9 AI Content Disclosure<\/strong>, slug <code>desk9-ai-content-disclosure<\/code>, <strong>Text Domain<\/strong> aligned with the slug; all PHP identifiers use the <strong><code>deskaico<\/code> \/ <code>DESKAICO<\/code> \/ <code>Deskaico<\/code><\/strong> prefix for Plugin Check compliance.<\/li>\n<li>Toolbar buttons load from <code>@wordpress\/components<\/code> for current WordPress block editor compatibility; block namespace <strong><code>deskaico\/disclosure<\/code><\/strong>.<\/li>\n<li><strong>Show selected tools as<\/strong>: abbreviations, bundled SVG icons, or plain full names (comma-separated).<\/li>\n<li>Front-end compact layout uses neutral <strong>\u201cTools used:\u201d<\/strong> wording (no automatic plugin credits or outbound promotional links on the public site).<\/li>\n<li>Source transparency: human-readable JavaScript and Sass under <code>src\/<\/code> with <code>package.json<\/code> and <code>webpack.config.js<\/code>; <strong>Development<\/strong> section in this readme documents <code>npm install<\/code> \/ <code>npm run build<\/code>; compiled assets ship in <code>build\/<\/code>.<\/li>\n<li>Defense-in-depth output escaping: <code>Deskaico_Renderer::render()<\/code> runs final HTML through <code>wp_kses()<\/code> with allow-list <code>deskaico_kses_allowed_disclosure<\/code>.<\/li>\n<li>Beta JSON-LD emitted via <code>wp_print_inline_script_tag()<\/code> with safe JSON encoding flags.<\/li>\n<li>Bundled PHP translations via <strong>Text Domain<\/strong> + <strong>Domain Path<\/strong> with WordPress JIT loading (per Plugin Check). Ship <code>languages\/desk9-ai-content-disclosure-{locale}.mo<\/code>; duplicate <code>msgid<\/code> removed in <code>de_DE.po<\/code>.<\/li>\n<li>Verified with WordPress Plugin Check \u201cplugin-review\u201d PHPCS ruleset and relevant security\/naming sniffs.<\/li>\n<\/ul>","raw_excerpt":"Disclose AI-assisted content with a block, shortcode, or auto-append. No telemetry. Supports transparency\u2014not legal advice.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312098","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=312098"}],"author":[{"embeddable":true,"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/desk9"}],"wp:attachment":[{"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312098"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312098"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312098"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312098"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312098"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/yor.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312098"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}