== Changelog ==

The current release is summarised in readme.txt. This file holds the full history,
per WordPress.org's guidance to keep the readme small.

= 2026.8.1 =

No functional changes. Every file the plugin ships behaves as it did in 2026.8.0,
and the only edits inside them are to comments.

What this release exists for is the listing you are reading. WordPress.org serves a
plugin's description from the readme in its stable tag, so revised wording only
reaches the directory when a new version is published. This is that publish.

**Changed**

* House style drops the em dash, so 130 of them across the documentation, the
  directory listing and the source comments have been rewritten. The punctuation
  was chosen per sentence rather than swapped wholesale: a dash standing in for a
  colon became a colon, one introducing an aside became parentheses, and one
  joining two independent clauses became a full stop.
* A build check now fails on any typographic dash, so the style holds without
  anyone having to remember it.

= 2026.8.0 =

A rewrite. The plugin no longer installs or activates a theme at all, and a
signage request no longer switches your site's theme — which, before this
release, any anonymous visitor could do for every visitor at once. Signage
players are now recognised from their request and sent to the signage view
automatically, so a screen can be pointed at an ordinary page URL with no `?srly`
to add. The design is rebuilt to fit any screen from 800x480 to 4K in both
orientations, with the fonts bundled rather than fetched from a CDN. Requires
WordPress 6.8 and PHP 8.2.

**Breaking**

* Requires WordPress 6.8 and PHP 8.2. Tested up to WordPress 7.1.
* The bundled Screenly Cast theme is no longer installed into
  `wp-content/themes`. Rendering is handled by the plugin. If you had customised
  that copied theme directory, those edits are not carried over.
* The unused `screenly_cast` post type and `screenly_cast_category` taxonomy have
  been removed. Existing posts of that type are left in the database untouched,
  but nothing renders them.
* Versioning moves to CalVer (`YYYY.M.MICRO`) to match Screenly's other projects.
* Licence changed to AGPL-3.0-only.

**Security**

* A signage request no longer switches the site's active theme. Previously any
  anonymous visitor requesting a `?srly` URL changed the active theme for every
  visitor, and a site could be left serving the bundled theme to everyone. This
  is also the cause of the 2017 report that the plugin "cleared CSS
  customizations":
  Customizer CSS is stored per theme, so switching the theme took the site's
  custom CSS out of play.
* The upgrade repair now requires an administrator and refuses to run during AJAX
  or cron. `admin-ajax.php` fires `admin_init` before it checks `action` or any
  nonce and is reachable unauthenticated, so without that guard an anonymous
  request could have triggered a theme switch.

**Added**

* Signage players are recognised automatically and sent to the signage view, so
  a screen can be pointed at an ordinary page URL with no `?srly` to add. Detection
  uses the `X-Screenly-*` headers, the Android package name and player user agent
  tokens. Crawlers, signed-in users and meeting-room devices are excluded, as are
  engines shared with consumer hardware (LG webOS, Samsung Tizen, bare
  QtWebEngine) — a missed player still works with `?srly`, but a wrongly claimed
  device would show signage to somebody who was only browsing.
* A post with no featured image now uses the first image in its content, so adding
  a picture with the "Add Media" button is enough. Reported in 2018 as "image with
  text overlay does not appear to work".
* The date can be hidden with the `screenly_cast_show_date` filter, and the
  colours and type scale can be overridden through the design's CSS custom
  properties. Both requested in 2018.
* Verified against the WordPress 7.1 release candidate. None of 7.1's breaking
  changes apply: the plugin adds nothing to the block editor, uses no
  `@wordpress/components`, adds no toolbar items, and does no image processing.

**Fixed**

* Asset cache-busting never worked: the version constant shipped as the literal
  placeholder text, so browsers and players kept serving stale CSS and JS after
  an update.
* The theme was copied into `wp-content/themes` on *every page load*, attempting
  a recursive directory copy on each request.
* Theme switching and option deletion ran during ordinary front-end page views,
  with a redirect that could loop.
* Activation, deactivation and uninstall hooks were never registered, so plugin
  options were never cleaned up. There is now an uninstall routine.
* The logo setting could never work: it was registered under one option name,
  read under another, from a file that was never loaded, against a mismatched
  settings group. It is now a working media picker under Settings → Screenly Cast,
  and an existing logo value is migrated. Removing the logo also clears a
  migrated URL fallback, which previously reappeared on every render with no way
  to remove it.
* Requirement notices were double-escaped and displayed HTML entities as literal
  text.
* Casting an image media URL works again. WordPress 6.4 disabled attachment pages
  by default, which had silently broken it.
* Content that arrives without a wrapping element — a table or figure block, whose
  wrapper the tag allowlist removes while keeping its text — is now clamped like
  anything else. It previously bypassed the character budget entirely.
* A self-closing disallowed element such as `<svg />` no longer discards the rest
  of the post.
* A title too wide for the screen is no longer clipped in silence. On a portrait
  player the fluid type scale is driven by the long edge, so a single word at the
  largest size could be wider than the screen; the fitter now steps the title down
  on width as well as height.
* Signage requests to an archive or the blog index now compose against the entry's
  image, rather than silently rendering text-only.
* The `screenly_cast_show_date` and `screenly_cast_is_signage_player` filters now
  treat the string `'0'` as false, which is what `get_option()` returns for a
  saved-off boolean.
* PHP 8 warnings from the short-link helper, and invalid markup on attachment
  renders.
* The plugin's own upgrade no longer risks interrupting an administrator with an
  FTP credentials prompt: removing the old theme directory is attempted only when
  PHP can write directly, and is treated as best-effort.

**Changed**

* Content shaping uses an explicit tag allowlist rather than `strip_tags`, and
  both the allowlist and the character budget are filterable.
* Content is fitted to the actual viewport, measured in the browser, rather than
  trimmed one word at a time against a stale measurement.
* Webfonts are bundled with the plugin. The Google Fonts CDN request is gone, as
  is the third-party QR code API.
* Signage renders are marked noindex, and the theme's stylesheets, fonts, emoji
  scripts, oEmbed discovery and speculation rules are all kept out of them.

= 1.0.5 =

* Fix: Make failing unit tests pass
* Fix: Update handling of the `?srly` query parameter
* Fix: Screenly Cast theme not being applied when using the `srly` query
  parameter

= 1.0.4 =

* Fix: Move build artifacts to separate dist/ directory
* Fix: Improve build script to create correct WordPress plugin structure
* Fix: Update documentation for build process and plugin installation

= 1.0.3 =

* Fix: Correct directory structure for WordPress.org SVN deployment
* Fix: Ensure proper handling of plugin assets
* Fix: Streamline build process for cleaner releases

= 1.0.2 =

* Fix: Remove all development files and directories from release package
* Fix: Improve .distignore patterns to match actual directory structure
* Fix: Clean up root directory files from WordPress.org deployment

= 1.0.1 =

* Fix: Remove development files from release package
* Fix: Clean up files included in WordPress.org deployment

= 1.0.0 =

* Major: Complete rewrite of the plugin
* Modern PHP 7.4+ features and type safety
* Improved code organization and maintainability
* Updated minimum WordPress version to 6.2.4
* Better error handling and version compatibility checks
* Added comprehensive test suite with unit and integration tests
* Added theme installation and management functionality
* Added proper WordPress coding standards compliance
* Added proper query handling for Screenly Cast content

= 0.1.19 =

* Added PHPUnit test files for WordPress
