=== AIM Transparency - AI Disclosure for EU AI Act ===
Contributors: itsnothuman
Tags: eu ai act, article 50, ai transparency, ai disclosure, ai compliance
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 2.1.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Disclose and label AI-generated images and content in 22 EU languages. A badge visitors see, plus metadata that survives download. Free, any theme.

== Description ==

AIM Transparency labels the AI on your WordPress site so visitors can see it: images made by a machine, a chatbot that answers them, and written content produced with AI.

It also finds what you have missed. It reads your library for images that already arrived carrying AI provenance, and it names the AI tools running on your site.

It is free, it works with any theme, and nothing about your site or your visitors leaves your server.

= How it works =

1. **Say how it was made.** Pick a source type from the dropdown on the image in your Media Library: AI Generated, AI Modified, or one of the honest non-AI answers. One image at a time, or a hundred at once with the bulk action.
2. **Your visitors see a badge.** A small "AI Generated" label appears on that image wherever it is shown, inside your own theme's layout.
3. **The file carries the mark.** The same answer is written into the image file as standard IPTC provenance, and onto the page as schema.org JSON-LD.

Steps 2 and 3 are why there are two layers. The badge is what a person notices. The mark inside the file is what stays with the image after someone downloads or re-hosts it, and it is what search engines and detection tools read. A page-only label disappears the moment the file is saved.

= AI-written text =

Article 50(4) covers text rather than pictures, and only where that text is published to inform the public on matters of public interest: news, journalism, public affairs, health or safety guidance. A shop, a portfolio or a personal blog is not that, and the duty never reaches them at all.

So the plugin asks that question once, in Settings. Answer no and it stops asking. Answer yes and every post gets a control in the editor, in both the block and classic editors, recording whether the text was AI Generated, AI Modified, or marked simply as AI — and a short line appears for readers.

The exemption is worked out, not claimed. Where a person reviewed the text **and** someone is named as holding editorial responsibility, nothing is owed, and both facts are recorded with the date. Review on its own is half the test, so a post with nobody named still discloses and says why.

Text and images are judged separately, because the law judges them separately. Human review of an article does not exempt an AI-generated image inside it, and the badge stays.

= Key features =

* Flag images as **AI Generated** or **AI Modified**, one at a time or in bulk, with an "AI" column in the Media Library.
* Or record that an image is **not** AI: Camera Photo, Human Created and Composite write the matching IPTC value, with no badge.
* The badge renders on galleries, portfolio grids, masonry, featured images, content images, and block and FSE themes.
* **WooCommerce is covered**: shop grids, the single-product gallery, cross-sells, and the image that swaps in when a buyer picks a variation.
* JPEG and PNG are written with nothing installed. WebP, AVIF, GIF and TIFF use `exiftool` where your host has it. Every generated thumbnail is marked, not just the original.
* **22 official EU languages**, following your site language, with nothing to configure.
* A **chatbot notice** for Article 50(1), which covers AI that talks to people rather than AI that makes pictures.
* **Detection** finds what you have missed: it reads your unflagged images for AI provenance and names the AI tools running on your site, all on your own server.
* **A compliance record**: export a CSV of every disclosed image, alongside an Article 4 AI-literacy checklist you fill in yourself.
* **Disclose AI-written text** under Article 50(4), recorded per post in the block or classic editor, with the human-review exemption worked out rather than claimed.
* Disclosure **shortcodes** for written content, where there is no image for a badge to sit on.
* Three dashboard themes, including one that matches WordPress admin, so the plugin looks like part of your site.

= Twenty-two languages =

A disclosure only informs someone if it is in a language they read. A German visitor sees KI-generiert, a Polish one Wygenerowane przez AI.

The badge, the disclosure wording, the chatbot notice and the whole admin dashboard are translated into 22 of the EU's 24 official languages. Where a string carries a legal term, the wording follows that language's own official text of Regulation (EU) 2024/1689 rather than a translation of the English. Irish and Maltese are the two official EU languages WordPress itself does not ship.

The translations were produced with AI assistance. Every visitor-facing string has been reviewed against the Regulation's own language versions, but not by a native speaker of every language, so the dashboard says so in any language other than English and asks you to report anything that reads wrong. Corrections go to support@aimtransparency.com and are welcome.

= Multilingual sites =

**Tested with Polylang.** The badge, the disclosure wording and the chatbot notice follow the language the visitor is reading. A disclosure set on an image is also carried to that image's translated copies, so the badge does not vanish on a translated page when media translation is switched on — that is the failure this was tested for, and fixed.

The plugin ships a `wpml-config.xml`, which Polylang and WPML both read: it marks the source-type fields to be copied to translations, and exposes any badge or notice wording you have typed yourself for string translation. Leave that wording empty and the built-in text is used, already translated into 22 languages.

**WPML is not tested yet.** The integration uses WPML's own documented API and configuration file, so it is built for it, but we have not run it against a real WPML install and will not claim it works until we have. Using WPML? Tell us how it goes: support@aimtransparency.com.

= Legal note =

The EU AI Act (Regulation (EU) 2024/1689) has applied since 2 August 2026. Article 50 asks anyone publishing AI-generated or AI-manipulated content to disclose it clearly, in a way a person can notice. If your site displays AI images, you are a deployer and the duty is yours.

This plugin is tooling for that duty. **It is not legal advice.** Whether your content is in scope, what counts as a deepfake, and how you word your disclosure remain your decisions. If the answer matters to your business, consult a legal professional.

= Who it is for =

Anyone publishing AI-generated or AI-edited visuals to an EU audience: blogs, news and magazine sites, agencies building client sites, shops using AI product photography, and portfolios. A small site is not exempt on size alone, and the Act reaches sites outside the EU whose content is seen by people in it.

= Shortcodes =

* `[aicl_disclosure]` takes `type` (`ai-generated`, `ai-edited`, `ai-assisted`, `chatbot`) and `style` (`inline`, `badge`, `banner`), with an optional `text` override.
* `[aicl_ai_notice]` is the chatbot notice.
* `[aicl_text_disclosure]` places the Article 50(4) line by hand on a post you have marked, instead of letting it sit above or below automatically. It prints nothing on a post you have not marked, or on one the exemption covers.

= The IPTC values it writes =

The same vocabulary C2PA uses, so the marks stay readable as tooling matures.

* AI-generated: `http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia`
* AI-edited composite: `http://cv.iptc.org/newscodes/digitalsourcetype/compositeWithTrainedAlgorithmicMedia`
* Algorithmic, not AI: `http://cv.iptc.org/newscodes/digitalsourcetype/algorithmicMedia`
* Camera photo: `http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture`
* Human created: `http://cv.iptc.org/newscodes/digitalsourcetype/digitalCreation`
* Composite of non-AI elements: `http://cv.iptc.org/newscodes/digitalsourcetype/composite`

= Optional extras =

An opt-in directory at `directory.aimtransparency.com` lets you list your site publicly as one that discloses AI. It is off by default, nothing is shared without your explicit consent, and you can remove the listing whenever you like. See "External services" below.

A free site checker at https://aimtransparency.com/checker reads any URL's public code and lists the chatbots and generators it finds, grouped by the article that applies. No signup.

Built by itisnothuman, a small independent studio: https://itisnothuman.com . Docs at https://aimtransparency.com , guides at https://aimtransparency.com/guides/ .

== External services ==

This plugin can connect to the AIM Transparency service at `directory.aimtransparency.com`, operated by the plugin's developer. Every connection is **optional and user-initiated**: nothing is sent on install, on activation, or during normal use.

1. **AI Transparency Directory** (opt-in, off by default). If you opt in from the dashboard, the plugin sends your site URL, site name, plugin and WordPress versions, the number of images you have labeled, an optional contact email, your consent version/time, and a one-time verification token to `https://directory.aimtransparency.com/api/register`, so your site can be listed publicly as one that discloses AI content. The service then makes a single request back to a token endpoint on your site to verify you control it. You can remove your listing at any time, which deletes the stored data.

2. **Pro waitlist** (sent only when you submit the form). If you enter your email in the optional "notify me about Pro" form, that email is sent to `https://directory.aimtransparency.com/api/waitlist` so the developer can email you about the Pro add-on, and is stored only for that purpose.

The plugin makes no other external requests. The `iptc.org`, `schema.org`, `ns.adobe.com` and `w3.org` URLs in the code are standard metadata vocabulary identifiers written into your files and pages; they are not network requests.

Privacy policy: https://aimtransparency.com/privacy

The admin dashboard is a React app; its complete readable source ships alongside the compiled bundle in `dashboard/src/`, with build steps in `docs/BUILD.md`. Everything else is hand-written PHP and JavaScript. Bundled third-party work and its licences are listed in `docs/BUILD.md` as well.

== Installation ==

1. Upload the plugin to `/wp-content/plugins/`, or install it from the Plugins screen in wp-admin.
2. Activate the plugin.
3. Open the **AIM Transparency** menu, flag images in the Media Library (single, bulk action, or the per-image control), and configure the badge in Settings. The badge and machine-readable metadata are on by default; switch the badge to the official EU AI-content icons in Badge settings if you prefer them.

== Frequently Asked Questions ==

= Is it really free? =
Yes, everything in this plugin is fully functional, nothing is locked. Flagging, the visible badge with all its styles and shapes (including the click-to-disclose modal and a custom logo), the in-dashboard media library, IPTC/XMP embedding for every supported format, JSON-LD, the AI-assistant notice, the AI-on-your-site detection card, and the CSV compliance export are all free. A separate, optional **AIM Transparency Pro** add-on (sold on our site, not hosted here) adds its own features on top: automatic flagging on upload, a library scanner (strip-guard plus retroactive discovery of provenance your files already declare), additional report export formats (a print-ready report you can save as PDF, plus JSON, Markdown & TXT), and a WooCommerce gallery cover for themes that replace WooCommerce's own gallery template.

= Does the badge satisfy the law on its own? =
The visible badge addresses the deployer's human-visible disclosure (Art. 50(4)); the embedded metadata addresses machine-readability. Both are on by default.

= Will it work with my theme? =
It hooks WordPress's own image and template filters, including `render_block` for block/FSE themes, so any theme using standard functions is covered. For themes that hardcode `<img>` tags, enable Universal badge coverage in Settings.

= Will it modify my files? =
When file embedding is on, it writes XMP into flagged image files (and every generated size). It is idempotent. Turn it off to use the visible badge + JSON-LD only.

= My host has no exiftool. =
JPEG and PNG are still marked by the built-in PHP writer. WebP and other formats need exiftool; the Metadata screen shows your current capability.

= What are the shortcodes for? =

Disclosure is not only for images. `[aicl_disclosure]` places a labelled notice anywhere shortcodes run, so you can disclose AI-assisted writing, a generated hero image, or a chat widget in your own words and in the exact spot you choose. Pick a `type` (ai-generated, ai-edited, ai-assisted, chatbot) and a `style` (inline, badge, banner). `[aicl_ai_notice]` is the dedicated chatbot notice.

= Does it detect chatbots as well as images? =

Yes. The Detection card matches your site against a registry of 672 AI systems and separates them by duty: chatbots and assistants fall under Article 50(1), which asks you to tell visitors they are talking to an AI, while image and content generators fall under 50(2), which asks you to label the output. It reports which tools are present, not that any specific image or message is AI.

= Does Detection send my site anywhere? =

No. It reads your active plugin list and fetches your own front page over a local loopback request, both on your server. Nothing is sent to any third party, and the result is cached so it does not run on every page load.

= The translation in my language reads wrong. =

Tell us and we will fix it: support@aimtransparency.com. The translations were made with AI assistance and every visitor-facing string was checked against the EU AI Act's own language versions, but not by a native speaker of all 22. A correction from someone who actually speaks the language is the most useful thing you can send us.

= Can I check a site before installing anything? =

Yes. The free checker at https://aimtransparency.com/checker scans any URL you paste and lists the AI systems it finds. It reads public page code only, never your files.

== Screenshots ==

1. A real photograph and its AI counterpart, side by side. Only the AI one carries a badge.
2. Both disclosures in one post: the badge on the AI image, and the line that says the text was written by AI.
3. Your shop, covered: badges on the WooCommerce product grid, in the free plugin.
4. Overview: a readiness score, then findings sorted into what needs attention, what is already working and what is optional. Every finding carries the action that resolves it, and every change is dated with an Undo.
5. The same screen in the Neo theme.
6. And in the Classic theme. Your choice is remembered and never changed by an update.
7. Media: every image in your library with its source type, searchable and set one row at a time.
8. Badge: position, label style, the official EU icons or your own, with a live preview.
9. Metadata: which formats this server can write the mark into, and how many files carry it.
10. Shortcodes: build a disclosure for written content, with a live preview and a contrast check.
11. Readiness: your Article 50 disclosure score beside the Article 4 AI-literacy checklist.
12. Posts: disclose AI-written text under Article 50(4). One question decides whether the duty reaches your site at all, then the wording, placement and look of the line your readers see.

== Changelog ==

= 2.1.1 =
* Fix: **the featured-image AI control was in English in every language.** The panel in the post editor, its help text and its save messages were written straight into the JavaScript instead of being passed through translation, so a German or Greek admin saw them untranslated while the rest of the screen was in their language. They now come from the same place as everything else and are translated into all 22 languages.

= 2.1.0 =
* New: **disclose AI-written text, not just AI images.** Article 50(4) asks a publisher to say when text was generated or manipulated by AI, but only for text published to inform the public on matters of public interest. So the plugin asks that question once, in Settings, and most sites are told plainly that the duty does not apply to them and are never asked again. Sites it does apply to get a control in the post editor, in both the block and classic editors, recording whether the text was AI Generated, AI Modified or marked simply as AI.
* New: the Article 50(4) exemption is worked out, not claimed. Where text has had human review and a named person or organisation holds editorial responsibility, no disclosure is required and both facts are recorded with the date. Review on its own is half the test, so a post with nobody named still discloses and says so.
* New: a disclosed post carries schema.org JSON-LD describing the article, alongside the existing ImageObject data for pictures.
* Note: text and images are judged separately, because the law judges them separately. Human review of an article does not exempt an AI-generated image inside it, and the badge stays.

= 2.0.3 =
* Security: **Pro entitlement is no longer decided in this plugin.** The rules that grant Pro used to live here, and this plugin is published source, so the way past them was published with it. They now live in the Pro add-on, and the record it stores is signed and tied to the site it was activated on. Nothing changes for anyone running the free plugin.

= 2.0.2 =
* Fix: **Algorithmic can now be set in bulk.** Six of the seven source types were in the Media Library bulk menu. Algorithmic, for procedural work like fractal or formula art, was left out, so the only way to set it was one image at a time. It sits with the others now, translated in all 21 languages.

= 2.0.1 =
* Improvement: **the Media screen leads with your library.** The eight source-type explanations used to sit above it, so the actual work started below the fold. They now sit under the list and fold away, and whether you leave them open or closed is remembered. A link at the top jumps to them when you want them.
* New: **filter your library by With AI or Without AI.** The filter offered only "everything recorded" before, which could not answer the obvious question of which images are the AI ones.
* Improvement: **the screen you were on survives a reload.** Refreshing used to drop you back on Overview. The tab is now part of the address, so a reload keeps your place and you can link someone straight to a screen.
* Fix: **AVIF and TIFF now appear on the Metadata screen.** The plugin has always written them wherever your host has exiftool, but the screen only knew four formats, so those images were missing from it entirely. On a server without exiftool they now say so plainly instead of showing an unexplained zero.
* Fix: AI (basic) had the same icon as AI Generated, so the two were indistinguishable in a list until you read the label. It has its own now.
* Improvement: clearer wording on the Shortcodes screen, and the picture beside a disclosure is now called a symbol throughout, so it is no longer confused with the mark written inside your image files.

= 2.0.0 =
* New: **the plugin now speaks 22 official EU languages**: Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Polish, Portuguese, Romanian, Slovak, Slovenian, Spanish and Swedish. Every visitor-facing disclosure and the whole admin dashboard are translated, with the legal wording taken from each language's own official text of Regulation (EU) 2024/1689 rather than translated from English. Irish and Maltese are the two official EU languages WordPress itself does not ship. A disclosure only informs someone if it is in a language they read.
* New: **the dashboard now looks like WordPress.** A compliance tool should read as part of your admin rather than as a guest that brought its own furniture, so the default is a new WordPress-native layout built from the same container, heading and tab strip that every core settings screen uses. It picks up your admin colour scheme on its own, and there is nothing of ours to drift out of date when WordPress changes. The Neo and Classic themes are still there, and if you have already chosen one, updating does not change it under you.
* New: **the Overview screen now fixes things instead of only reporting them.** Every finding carries the action that resolves it, so an image missing its mark, a chat widget nobody has disclosed, or an unrecorded Article 4 statement is one click from done rather than a trip to another tab. Findings are sorted into what needs attention, what is already working and what is genuinely optional, so a clear site reads as clear instead of as a wall of warnings. Each change is dated in a Recent changes list with an Undo beside it, so nothing the screen does is one-way.
* Improvement: the dashboard reads WordPress's own translation runtime instead of shipping a second copy of it, so the admin screens stay in step with the language files the rest of the plugin loads.
* New: **multilingual sites are handled properly.** Tested with Polylang: a source type set on an image is carried to that image's translated copies, so the badge no longer disappears on a translated page when media translation is switched on. The plugin ships a `wpml-config.xml` that both Polylang and WPML read. WPML itself is built for but not yet tested, and the readme says so rather than claiming otherwise.
* New: **the dashboard asks for corrections in any language other than English.** The translations were made with AI assistance and checked against the Regulation's own text in each language, but not by a native speaker of every one, so the plugin says so where it matters and gives you an address to report anything that reads wrong.
* Fix: **the plugin no longer assumes every chat tool is an AI.** It used to treat all 304 chat systems it knows about as AI assistants, including Tawk.to, Olark, Intercom and Crisp, which are live chat answered by real people. Following that advice would have told your visitors they were talking to an AI while a colleague was typing. Every chat tool is now classified by who actually replies, and the plugin says one of three things: this one replies with AI, this one can be either depending on your setup, or this one is answered by your team and Article 50(1) does not apply.
* Improvement: detection reads more of your site (your shop and product pages as well as the home page, posts and pages) and keeps only the part of each page it needs, so the check covers more ground while storing about a tenth as much.
* Improvement: a new `aicl_scan_urls` filter lets you point detection at any page a widget only appears on, such as a checkout or a members area.

= 1.3.1 =
* Fix: "We could not check your pages" appeared on sites that were working perfectly well. Detection reads a few of your own pages to find chat widgets, and a server cannot always reach itself at its public web address: local installs publish on a different port than the web server listens on, an origin behind a proxy often cannot resolve its own hostname, and some firewalls block a site from requesting itself. The scan now falls back to asking the server directly, on its own address, so it succeeds in these setups instead of reporting a failure. Sites that were already fine are unaffected and make no extra requests.

= 1.3.0 =
* New: **the plugin speaks German, French and Spanish.** Every visitor-facing disclosure is translated: the badge wording, the "this image was generated by an AI model" explanation, the disclosure modal and the chatbot notice, plus the admin menu, the media-library labels and the Article 4 readiness checklist. A disclosure only informs someone if it is in a language they read, so this is the release that makes Article 50 work outside English. The dashboard screens themselves are still English and are next. (Bundled translations were previously never loaded at all, which is fixed here.)
* New: detection now finds AI chat widgets that were **not** installed as WordPress plugins. Alongside plugins and script addresses, it recognises the JavaScript a widget leaves in the browser and the cookies it sets, so a chat tool pasted into your theme, added through a tag manager or served from your own CDN is still found. Same 672 systems, more ways of spotting them. Matching is deliberately strict: a widget's name mentioned in a blog post, quoted in an install tutorial, or sitting in a file name is not treated as that widget running.
* New: detection reads three pages instead of one: your home page plus your most recently updated post and page. A widget that only loads on posts is no longer missed because the home page happens not to show it.
* Improvement: **the dashboard now admits when it could not check.** If your pages cannot be read (a firewall blocking loopback requests, a password-protected site, a server error), you get a plain explanation and what was still checked, instead of a confident "You're all clear". When it is genuinely clear, it now tells you what it covered. A scan that could not run is no longer reported as a scan that found nothing.
* Security: the CSV compliance export now neutralises spreadsheet formula injection. A filename or caption beginning with =, +, - or @ was previously written to the CSV as-is, where Excel and Sheets would treat it as a formula. Exports also carry a UTF-8 marker so accented filenames stop mangling.
* Fix: the self-scan no longer skips TLS verification.

= 1.2.9 =
* Fix: on a WooCommerce variable product, choosing a variation swapped the picture but left the previous image's disclosure on it. A photograph could end up wearing an "AI Generated" badge, and an AI variation could end up with none. The badge now follows the image: WooCommerce publishes each variation, so the plugin adds its verdict there and the browser re-decides whenever the picture changes.
* Fix: the dashboard under-reported large libraries. Figures were gathered from a bounded page of attachments, so a site past that bound saw a smaller flagged count than it really had, and disclosure coverage was calculated over the truncated set. Totals are now aggregated in the database and are correct at any size. If your numbers jump after updating, the new ones are the true ones.

= 1.2.8 =
* Fix: the official EU mark on a disclosure notice rendered squashed. The Commission's set has a square mark and two wider lockups that already spell out their own label; the notice now always uses the square one, undistorted, since the sentence beside it is already saying the same thing.

= 1.2.7 =
* New: a **Shortcodes panel** in the dashboard, under Disclosure. Pick the type, the style, your own wording, colours and mark, watch it render, and copy the finished shortcode. The shortcodes were previously documented but invisible in the plugin.
* New: `[aicl_disclosure]` takes `bg` and `color`, so a notice can match your theme instead of always being the default near-black pill. A pair below the WCAG AA minimum of 4.5:1 is rejected and the default renders instead, because a disclosure nobody can read is not a disclosure.
* New: `mark` chooses the glyph: `aim` (the built-in mark), `eu` (the official European Commission AI-content icon for the matching source type), or `none`. A `logo` attribute places your own image beside the mark, never instead of it.
* Improvement: each source type has its own icon in the dashboard lists (camera, pen, layers, shapes) rather than one cog standing in for everything that is not AI.
* Fix: the toggle control centres its knob correctly on both themes.

= 1.2.6 =
* New: the dashboard has been redesigned. Every screen is now a single sheet divided by hairlines instead of a grid of separate cards, so Overview reads top to bottom: your readiness score, the figures behind it, what is running on your site, then your library. Readiness gained a numbered Article 4 checklist with proper evidence fields, Media shows each image's disclosure state at a glance, and Upgrade sets out plainly what is free and what Pro adds.
* New: Detection now recognises **671 AI systems**, up from a short list of image tools. It separates chatbots and assistants (Article 50(1)) from image and content generators (Article 50(2)), so you can see which duty applies to what.
* New: reusable disclosure shortcodes. `[aicl_disclosure]` places an AI notice anywhere shortcodes run, with a type (generated, edited, assisted or chatbot) and a style (inline, badge or banner). `[aicl_ai_notice]` covers the chatbot case.
* Improvement: Detection also reads your own front page, so AI widgets that load in the browser are found, not just plugins on disk. It stays on your server; nothing is sent to a third party.
* Improvement: uploading an image refreshes the Detection result straight away instead of waiting for the cache to expire.
* Improvement: clearer wording throughout the dashboard, and a refreshed getting-started screen in both the Neo and Classic themes.

= 1.2.5 =
* Improvement: the getting-started screen has fresh artwork that matches your Neo or Classic dashboard theme, in a cleaner full-bleed layout.
* Improvement: the Detection card is more reliable. Re-scanning clears resolved warnings right away, it respects images you have marked as human-made instead of re-flagging them, and it lists AI-capable plugins by their real names.
* Improvement: clearer, more natural wording across the dashboard and the getting-started screen.
* Fix: the dashboard now keeps your chosen theme (Neo or Classic) consistent everywhere, including the getting-started screen.

= 1.2.4 =
* New: a Detection card on the dashboard that surfaces AI you have not disclosed yet. It finds images in your library whose files read as AI-generated (a declared source type, or a known generator name like Midjourney, DALL·E or Firefly) but are not flagged, and lists active plugins that can generate AI images. Everything is computed locally, with no external requests.

= 1.2.3 =
* New: a one-screen welcome after activation that walks you to your first flagged image: pick an image, choose how it was made, and see it disclosed straight away. Reopen it any time from Transparency > Getting started.
* Maintenance: minor internal hardening and housekeeping.

= 1.2.2 =
* Improvement: the Pro library scan now runs to completion from one click: the dashboard processes the library in batches with a live progress bar (inspected / adopted / remaining) and a cancel button, instead of stopping after one pass.
* Improvement: the scan result now reports what discovery found (images adopted from provenance already declared inside the files), alongside the strip-guard counts.
* i18n: the disclosure modal footer, its close button and the badge screen-reader fallback are now translatable.

= 1.2.1 =
* New: **human-provenance source types**: flag images as *Camera Photo* (`digitalCapture`), *Human Created* (`digitalCreation`, e.g. 3D renders or digital art made without generative AI) or *Composite* (`composite`, a non-AI mix such as photos + renders). Each embeds the current IPTC Digital Source Type into the file and the page JSON-LD, with no visible badge by default: honest provenance for human-made work, not just AI labels. (An optional visible badge for these types is available with the Custom badge style.)
* Improvement: embedding is now idempotent: files that already carry the exact Digital Source Type value (for example C2PA-signed camera captures) are left byte-for-byte untouched.
* Improvement: source-type names and the visitor-facing disclosure texts are now translatable.
* Fix: images whose badge is hidden (e.g. the Algorithmic type) now correctly emit their machine-readable JSON-LD, as the settings always described.
* Accessibility: custom-style badges on non-AI types no longer announce "artificially generated" to screen readers.

= 1.2.0 =
* New: a fresh default dashboard style ("Neo"), with a one-click toggle back to the original monochrome look, in Settings > Appearance or the palette button in the top bar. Both styles support light and dark mode. Fonts are bundled locally (Inter + Bricolage Grotesque, SIL OFL); the plugin still makes no external requests.
* New: the badge live preview now demonstrates the badge on bundled sample images (our own AI-generated artwork, labelled as such), with a small slider to switch scenes. Docs and Support links added to the dashboard sidebar.

= 1.1.0 =
* New: **AI-assistant (chatbot) disclosure** for EU AI Act Article 50(1): tell visitors when they are interacting with an AI rather than a human. Drop the `[aicl_ai_notice]` shortcode into any page with a chat UI, or enable the optional floating notice that appears when a known chat widget is detected. Configurable disclosure text and position.

= 1.0.0 =
* Initial release: media flag, bulk actions, visible badge across Enfold/standard/block themes, optional universal badge coverage, IPTC/XMP embedding (exiftool + pure-PHP JPEG/PNG), JSON-LD, free CSV compliance export, React dashboard, opt-in transparency directory.

== Upgrade Notice ==

= 2.0.3 =
Hardens how the Pro add-on is licensed. No change to the free plugin's features.

= 2.0.2 =
Adds the missing Algorithmic entry to the Media Library bulk menu, so all seven source types can be set on a selection at once.

= 2.0.1 =
The Media screen now leads with your library, you can filter by With AI or Without AI, a reload keeps the screen you were on, and AVIF and TIFF finally show up on the Metadata screen.

= 2.0.0 =
22 EU languages, a dashboard rebuilt to look like WordPress itself, an Overview that fixes findings in place with an Undo behind every change, and a fix so live chat answered by people is no longer labelled as AI.

= 1.3.1 =
Fixes a false "We could not check your pages" warning on local installs, proxied origins and sites whose server cannot reach its own public address.

= 1.3.0 =
German, French and Spanish translations, detection of chat widgets installed outside WordPress, and a dashboard that says when it could not check rather than claiming you are clear.

= 1.2.9 =
Fixes a wrong badge on WooCommerce variation images, and corrects under-reported dashboard figures on large libraries.

= 1.2.8 =
Fixes the EU mark rendering squashed on a disclosure notice.

= 1.2.7 =
A Shortcodes panel in the dashboard, plus colour and mark options for [aicl_disclosure] with a contrast floor so a disclosure stays readable.

= 1.2.6 =
A redesigned dashboard, Detection across 671 AI systems with chatbots told apart from image generators, and new [aicl_disclosure] shortcodes for labelling AI content anywhere on your site.

= 1.2.5 =
Refreshed getting-started screen, a more reliable Detection card, and clearer wording throughout.

= 1.2.4 =
Adds a dashboard Detection card that finds AI images and AI-capable plugins you have not disclosed yet, computed locally with no external calls.

= 1.2.3 =
Adds a friendly first-run welcome that gets you to your first labelled image in about a minute.

= 1.2.2 =
The Pro library scan now completes a whole library from one click, with a live progress bar, and reports what it discovered, not just what it guarded.

= 1.2.1 =
Adds human-provenance source types (Camera Photo, Human Created, Composite) so you can honestly label non-AI work too, and fixes JSON-LD output for badge-hidden types.

= 1.2.0 =
A new default dashboard style, with a toggle back to the classic look in Settings > Appearance.

= 1.1.0 =
Adds an AI-assistant (chatbot) disclosure for EU AI Act Article 50(1): the [aicl_ai_notice] shortcode and an optional floating notice telling visitors when they are talking to an AI, not a human.
