{"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-09-16T23:55:29","modified_gmt":"2026-09-16T23:55:29","slug":"desk9-ai-content-disclosure","status":"publish","type":"plugin","link":"https:\/\/nl.wordpress.org\/plugins\/desk9-ai-content-disclosure\/","author":23303522,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.2","stable_tag":"1.4.2","tested":"7.1.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-09-16 23:55:29","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":594,"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","revision":3534883},"1.0.1":{"tag":"1.0.1","author":"desk9","date":"2026-05-17 23:15:08","revision":3534915},"1.1.0":{"tag":"1.1.0","author":"desk9","date":"2026-08-22 00:36:02","revision":3659773},"1.2.0":{"tag":"1.2.0","author":"desk9","date":"2026-08-22 01:29:41","revision":3659797},"1.4.0":{"tag":"1.4.0","author":"desk9","date":"2026-08-22 12:08:37","revision":3660527},"1.4.1":{"tag":"1.4.1","author":"desk9","date":"2026-08-22 13:33:48","revision":3660643},"1.4.2":{"tag":"1.4.2","author":"desk9","date":"2026-09-16 23:55:29","revision":3699359}},"upgrade_notice":{"1.4.2":"<p>Settings only: the provider list is easier to read, and picking &quot;Icons&quot; no longer hides the providers that have no bundled logo. Your selection, your settings and everything on the front end stay exactly as they are.<\/p>","1.4.1":"<p>Repairs the 1.4.0 package, which was uploaded without several of its files and could not load. Please update - 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 &quot;Classic&quot; 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","1.4.2"],"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 \"tools used\" line or badge-style hints.<\/p>\n\n<p>Everything runs on your server - settings 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-unterstuetzte Inhalte klar fuer Besucherinnen und Besucher. Die ausfuehrliche Anleitung folgt auf Englisch (Standard fuer WordPress.org). Uebersetzungen ueber die Community: https:\/\/translate.wordpress.org\/<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Global settings<\/strong> under <em>Settings &gt; 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 - from the media library or straight from the image block - optionally 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 - multiple 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 - handy 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\/ - <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> - OpenAI, Google Gemini, Anthropic and Meta - 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 - 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 &gt; Profile &gt; 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\/ - 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 &gt; 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 &gt; Add New &gt; 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 &gt; 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 - see <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%22experimental%20json-ld%22%20mean%3F\"><h3>What does \"experimental JSON-LD\" 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 - see 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.2<\/h4>\n\n<ul>\n<li>The <strong>provider list under Settings<\/strong> is now one bordered list instead of fifteen loose checkboxes stacked on top of each other: one row per tool, the whole row is the click target rather than the checkbox alone, and a selected row is shaded so the current choice reads at a glance.<\/li>\n<li>Every row now carries the <strong>mark the front end would draw<\/strong> - the bundled logo where one exists, and the short text badge the renderer falls back to everywhere else. You can see which is which before you tick anything.<\/li>\n<li>New: a <strong>selected count<\/strong> above the list, plus <strong>Select all<\/strong> and <strong>Clear<\/strong>.<\/li>\n<li><strong>The list no longer hides anything.<\/strong> Since 1.4.0, picking \"Icons\" removed every provider without a bundled logo from the list, which cut fifteen entries down to four and read like the plugin had dropped the rest. All fifteen are back and all of them stay selectable; while \"Icons\" is the display mode each one without a logo simply says <em>shows as a text badge<\/em>, which is what the renderer has always done for it anyway.<\/li>\n<li>Keyboard focus outlines the whole row; previously it was only visible on the checkbox itself.<\/li>\n<li>Housekeeping: the plugin's source now uses plain ASCII throughout. Typographic dashes and curly quotes in interface strings, in this readme and in code comments were replaced with <code>-<\/code> and straight quotes, because a site whose <code>blog_charset<\/code> is not UTF-8 rendered them as mojibake. The wording is otherwise the same, but the affected strings count as new for translators and need translating again. The separator on the image pill is unchanged and still renders as a middot.<\/li>\n<li>Settings only. No stored option, no post meta and no front-end output changes, and a provider already ticked stays ticked.<\/li>\n<\/ul>\n\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 - including <code>includes\/class-deskaico-image-badge.php<\/code>, which the plugin loads on every request - 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> - neutral grey, blue, warm grey\/sand, green, violet and black-and-white - 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 - background, border and now text as well - 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> - fifteen entries in total, still with \"Other\" 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 - the \"Other\" 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 - 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>\"Other\" 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 \"Other\" 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 - 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 \"AI generated - Midjourney\".<\/li>\n<li>New: an optional <strong>overlay pill<\/strong> on marked images - 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 - 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 &gt; 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 (\"OAI ...\") instead of your configured tools, truncated the disclaimer at 220 characters, dropped the AI usage lead sentence, and - because the front-end stylesheet was only ever enqueued during rendering - 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> -&gt; <code>.deskaico-disclosure<\/code>, <code>--acd-bg<\/code> -&gt; <code>--deskaico-bg<\/code>, and so on). The old three-letter prefix predates the plugin's 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's 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) - options 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 - strip legacy leads whether they appear as plaintext or wrapped in a leading <code>&lt;p&gt;...&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;...&lt;\/p&gt;<\/code>; stripping only matched raw prefixes at the beginning of the string, so WordPress appended the same lead again - now 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 &gt; 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 \"Custom message &amp; tools\" for auto-append\/overrides on the same entry.<\/li>\n<li>Front-end ignores \"empty-looking\" 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 &gt; Default disclaimer length<\/strong> (long vs short) and the saved long\/short disclaimer texts, including the block inserter preview - no more \"blank\" 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>\"Tools used:\"<\/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 \"plugin-review\" 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 - not legal advice.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312098","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=312098"}],"author":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/desk9"}],"wp:attachment":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312098"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312098"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312098"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312098"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312098"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312098"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}