Skip to content

Releases: Kntnt/kntnt-photo-drop

v0.13.3

Choose a tag to compare

@github-actions github-actions released this 21 Jun 17:11

Fixed

  • Starting the slideshow in Firefox on iPad no longer shows a black screen with no image. The slideshow requests native fullscreen on its overlay, but Firefox for iOS/iPadOS exposes the Fullscreen API and then errors on an element requestFullscreen() — a Firefox-iOS limitation Mozilla has closed as won't-fix, whereas Safari and Chrome on the same iPad enter fullscreen normally — so the request failed and the first slide never faded in over the black overlay. Firefox on iPad now skips the native request and plays on the fixed, viewport-filling overlay instead, the same fallback already used on iPhone (where the element Fullscreen API is absent entirely); Safari, Chrome, and every desktop browser keep true fullscreen.

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.13.3/CHANGELOG.md

v0.13.2

Choose a tag to compare

@github-actions github-actions released this 21 Jun 07:25

Fixed

  • A breadcrumb containing bare-number crumbs (a 2026/06/12 date folder, a numeric filename) is no longer jumbled. The overlay figcaption is permanently direction: rtl — wanted only so an overflowing crumb shows its ellipsis at the head (a leading ellipsis that keeps the image name) — but that also makes rtl the line's base direction, which reorders mixed content on every breadcrumb, overflowing or not. Under an rtl base, crumbs that contain a Latin letter (40km, and the numeric filename that attaches to it) stay left-to-right, while pure-number crumbs (2026, 06, 12) are laid out right-to-left with the neutral between them mirrored to — so the path came out jumbled: 40km › 062112 ‹ 12 ‹ 06 ‹ 2026 instead of 2026 › 06 › 12 › 40km › 062112. The crumb text is now wrapped in a <bdi>, which isolates it and derives its own base direction from its content (left-to-right here), so it reads in path order with upright separators; the figcaption keeps rtl solely for the leading ellipsis. The lightbox fills the same <bdi> per slide.

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.13.2/CHANGELOG.md

v0.13.1

Choose a tag to compare

@github-actions github-actions released this 20 Jun 20:35

Fixed

  • A collection whose slug is purely numeric (e.g. 2026) no longer triggers a critical error. PHP coerces a numeric-string array key to an integer, so the slug-keyed discovery map handed an int to code that expected a string: the admin Photo Drop Collections page fatally errored the moment such a collection existed. The same coercion made the REST collections endpoint emit the slug as a JSON number — breaking the block editor's collection selector — and let the Create form's existing-slugs list miss a numeric-slug collision in its on-blur uniqueness check. The collection itself was always created correctly; only these consumers mishandled the key, and each now treats it as the string it represents.

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.13.1/CHANGELOG.md

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 20 Jun 19:55

Added

  • wp kntnt-photo-drop image import now accepts a directory, not only files. A directory source is walked recursively and every image under it is imported with its sub-directory structure preserved — the same folder semantics as dropping a folder on the Drop Zone: hidden files (.DS_Store, AppleDouble ._* sidecars) and RAW/video siblings are skipped before any work, while the literal source-relative target is still written with no date/uploader template expansion. Files and directories can be mixed in a single invocation, and a source folder with no importable images is a clear, non-zero-exit error.

Changed

  • CI runners updated for Node 24. actions/checkout and actions/setup-node are bumped to v5, since GitHub-hosted runners have deprecated Node 20. (contributor tooling)

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.13.0/CHANGELOG.md

v0.12.0

Choose a tag to compare

@github-actions github-actions released this 20 Jun 18:01

Added

  • .editorconfig at the repository root, mirroring the coding standard's surface conventions — tabs displayed as four columns, UTF-8, LF line endings, a final newline, trimmed trailing whitespace, and two-space YAML — so any editor applies the baseline automatically. (contributor tooling)

Changed

  • Releases now publish directly from CI, with notes drawn from the changelog. The tag-triggered release job extracts the ## [X.Y.Z] section of CHANGELOG.md as the GitHub Release body and publishes the release immediately instead of leaving a draft, so a green version tag goes live to users — and the auto-updater offers it — with no manual publish step. (contributor tooling)
  • Project documentation reorganised by audience. A new agents.d/ directory holds the agent-facing references — the coding standard, the testing strategy, and the definition of done — tightened for agents rather than humans; docs/ keeps the shared design record read by both (design.md, the ADRs, the updater guide). CONTRIBUTING.md gains a contributor-oriented testing overview and a "Before opening a pull request" checklist and was edited for a human contributor audience; every cross-reference and the coding-standard @-import were repointed. (contributor tooling)

Removed

  • docs/blocks.md. Its reproduced block.json schemas had drifted from the real block files (now the single authoritative source), and its admin-page CRUD UX was folded into docs/design.md. (contributor tooling)

Security

  • The transitive development dependency webpack-dev-server is bumped to 5.2.5 via npm overrides (GHSA-mx8g-39q3-5c79). Build-chain/dev-server only; nothing shipped to the browser changes.

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.12.0/CHANGELOG.md

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 19 Jun 16:40

The major redesign previously settled only in the specs is now implemented in code (#42#53, plus follow-ups #54).

Added

  • Three-rendition model — main / full / thumbnail. Each image is now stored as up to three WebP renditions: the main (the upload width/quality copy, served for download and for copying into the Media Library), a mid-size full image shown in the lightbox and slideshow, and a small thumbnail for the grid; each tier is skipped when the source is no wider, so a small image collapses to a single file. The full and thumbnail width/quality are admin-editable after the collection is established and changing one regenerates the affected renditions for every existing image (regenerate-then-flip: the gallery keeps serving the old renditions until the new batch completes, and an interrupted run is safe). The gallery's srcset is now {thumbnail, full}, with the full image as the display ceiling and the main download-only. (ADR-0013)
  • Gallery overlays replace the former caption and download settings: four overlays — breadcrumbs, download, add-to-media, and trash — each with its own visibility (off / on the thumbnail / in the lightbox / both), a nine-point position, and one shared appearance. Add-to-media copies an image's main rendition into the Media Library as an independent attachment (a copy, never a link); trash permanently deletes an image and its derived renditions behind an inline-popover confirmation. Both act through a new capability-gated REST write-path. (ADR-0015, #51, #52, #53)
  • Every capability is filterable. Upload, add-to-media, delete, the editor-only broken-reference notice, listing, and management each read from a kntnt_photo_drop_*_capability filter with a sensible WordPress-standard default. (ADR-0015)
  • Drop Zone upload-progress UI: an aggregate progress bar with a "N of T processed" summary and a Cancel control sharing the row directly beneath it, a three-bucket (uploaded / skipped / failed) summary, and a Retry that re-sends the real bytes of failed files. (#44, #68)
  • Effective-width help on the Create/Edit forms: the Full width and Thumbnail width fields now carry inline help naming their effective value — the smaller of the entered value and the tier above (full caps to the upload width, thumbnail to the effective full width) — so a width entered above the cap is shown to have no effect, since a tier is skipped when the source is no wider. Presentational only; no change to stored values or rendition behaviour. (#65, ADR-0013)

Changed

  • The immutable output contract narrows to upload width + upload quality — the only irreversible pair, because the source is discarded once the main image is encoded. The full and thumbnail settings are no longer frozen at establishment; they are re-derivable and admin-editable (see Added). The admin Create/Edit forms gain the full/thumbnail fields, permanence markers on the immutable upload fields, and an auto-defaulted slug. (ADR-0013, #50)
  • Drop Zone placement is now a mutable path-components template (%year%/%month%/%day%/%uploader% by default), editable per collection and affecting only future uploads, replacing the immutable "uploader folders" boolean. It is expanded server-side — %uploader% from the authenticated user's nicename, so it cannot be spoofed — and flat-at-root placement is retired. (ADR-0014)
  • Gallery ordering is a pre-order tree traversal — a folder's own images before its subfolders, natural-sorted within each level; descending reverses the sort within each level while keeping the own-images-before-subfolders structure. (ADR-0015, #43)
  • The gallery's caption is replaced by the breadcrumbs overlay: the humanised folder path with the collection display name as the first crumb. (ADR-0015)
  • Create-collection immutability warning reworked. The plain-language notice notice-warning opens the create form above every field so its scope is unambiguous, and its body now names the upload width/quality as the irreversible cause without claiming they are the whole ⚠ set (the slug also carries a ⚠ marker). The ⚠ markers render in WordPress's amber/warning hue (#dba617) wherever they appear — both the create form and the edit form's read-only upload contract, which now carries the marker too. (#62, ADR-0013)
  • Contributor and agent-workflow standards (process docs). The TDD rule now requires the red step to be demonstrated (a test seen failing before the code that satisfies it) and to automate at the lowest layer that meaningfully constrains behaviour; a documented autonomous multi-agent operating model was added to AGENTS.md (agents never block on the maintainer, resolve ambiguity by recorded assumption, and report upward in three buckets — automatically tested / remaining for a human / assumptions & blockers). ADRs 0002/0003/0005/0008 carry amendment banners pointing to the redesign decisions, and ADR-0002 records the rejection of a "store originals as-is" / lossless-WebP mode (high-quality lossy WebP is the fidelity ceiling).
  • The collection Create/Edit forms present the three image tiers as one uniform section. The former "Upload contract (immutable)" and "Renditions (re-derivable)" headings are gone; upload, full, and thumbnail now sit together under a single Image settings heading. The upload pair is still immutable — marked on Create, read-only on Edit, and rejected server-side — while the full and thumbnail settings remain editable. (#67)
  • The Full and Thumbnail width fields clamp live to the tier above while you type on the Create/Edit forms: Full cannot exceed the upload width (when an upload limit is set) and Thumbnail cannot exceed Full, and lowering a tier pulls the ones below it down to match. Server-side validation remains the source of truth. (#69)
  • The integration and end-to-end test harness is now worktree-portable@wordpress/env mounts the plugin under the checkout's own directory name and the e2e fixtures derive that slug, with a WP_ENV_PORT override, so the suites run from a git worktree (and several in parallel) without hand-editing paths. (contributor tooling)
  • Add-to-media inserts at full resolution. Copying a collection image into the Media Library no longer produces a downscaled …-scaled master for mains wider than WordPress's 2560px big-image threshold; the contract-bounded main is inserted as-is (sub-sizes still generate). (ADR-0015)
  • Add-to-media is a single click and no longer duplicates. Copying a collection image into the Media Library now takes one click instead of a two-click confirm; an image already copied is detected (by a stamped source identity) and, instead of silently adding a second copy, the gallery offers an inline Overwrite confirm that replaces the existing attachment's file in place (same attachment id). (ADR-0015 amendment)
  • Rendition widths have a 320px floor. The Create/Edit forms and the collection create / collection update CLI reject an upload, full, or thumbnail width below 320px; blank fields (which fall back to the source dimensions, or collapse to the tier above) are unaffected.

Removed

  • The immutable "uploader folders" boolean (replaced by the mutable path-components template) and the standalone caption concept (replaced by the breadcrumbs overlay). Pre-1.0, no migration. (ADR-0014, ADR-0015)

Fixed

  • The Drop Zone upload-progress UI now respects the block's default padding. The progress bar, summary, and Cancel control inset by the default padding — as they already did for an explicit inspector padding — instead of rendering flush to the block edges. (#56)
  • Equal-width collections upload at full speed again. When a collection's full width/quality equal its upload width/quality (so no separate full image is produced), ingestion no longer performs a redundant full-resolution decode per image, and such a collection uploads in time comparable to the two-tier baseline. (#57)
  • Gallery breadcrumbs overflow correctly. A path wider than its box now shows a leading "…" and keeps the tail — the deepest folder — visible inside the right padding, instead of clipping the tail with no ellipsis and running to the image edge; the behaviour is RTL-aware and correct at all nine overlay positions. (#58)
  • Gallery breadcrumb default colours survive theme figcaption styling. The breadcrumbs keep their white-on-dark default under a theme that colours figcaption, while a Colour-panel foreground/background selection still overrides them. (#60)
  • The trash confirmation popover text is left-aligned (start-aligned in RTL) regardless of a centred gallery or theme context. (#61)
  • The Edit collection form lists Display name above Slug, matching the Create form; the Slug stays read-only. (#63)
  • Saving a collection with the default path-components template no longer fails. The default %year%/%month%/%day%/%uploader% was false-rejected as "Invalid path components" because sanitize_text_field mangled %day%; the %-placeholders now survive submission intact, while genuinely invalid templates (stray %, .., absolute paths, backslashes, NUL) are still rejected. (#64)
  • Downloading a gallery image no longer opens a stray browser tab or navigates the page away. The download icon now saves a same-origin image — the default — through a direct same-document <a download> instead of fetching it into a blob: Firefox opens a blob: URL it can render inline (such as WebP) in a new tab even with the download attribute set, so the previous blob-based save downloaded the file and opened a tab. Only a cross-origin (offloaded-media) host still uses the blob path. The fetch-failure fallback was also corrected to a same-tab <a download> rather than a current-tab navigation, so a failed download never sends the gallery's own tab away. (#59, ADR-0015)

Security

  • T...
Read more

v0.10.1

Choose a tag to compare

@TBarregren TBarregren released this 12 Jun 18:47

Two bug fixes for the Photo Drop Gallery lightbox and the Drop Zone folder upload.

Fixed

  • The Photo Drop Gallery's lightbox previous (left) arrow is now always clickable. On a narrow window the enlarged image could reach the left edge and overlap the arrow; because the controls were not lifted above the image in the painting order, the image both hid the left arrow and swallowed its clicks, leaving no way to step backwards (the right arrow, which paints after the image, was unaffected). The previous, next, and close controls now sit above the image at every window size.
  • Uploading a folder on macOS no longer creates phantom uploads for hidden system files. Beside every photo, macOS keeps an invisible ._-prefixed sidecar file (and a .DS_Store per folder); because such a sidecar inherits the photo's .JPG name, it slipped through the Drop Zone's upload filter and was uploaded — surfacing as a "ghost file" (for example ._DSCF0012.JPG) the photographer could not account for. Hidden files (any name beginning with a dot) are now silently ignored at intake: never uploaded, and never shown in the status list.

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.10.1/CHANGELOG.md

v0.10.0

Choose a tag to compare

@TBarregren TBarregren released this 12 Jun 11:23

The Photo Drop Gallery's empty state is now split by cause: a real collection that simply has no images yet shows a configurable, visitor-facing message, while a missing or broken collection still stays an editor-only notice.

Added

  • The Photo Drop Gallery now has a configurable empty-gallery message — the text every visitor sees when the chosen collection has no images yet (for example, before a photographer has uploaded). It defaults to "There are currently no images in the gallery. Please try again later." and is editable in the block's Collection inspector panel; leave it empty to keep the default. (ADR-0012)

Changed

  • The gallery's empty-state messaging now splits by cause. A block pointing at no collection — or a deleted or otherwise broken one — still shows visitors nothing and a logged-in editor the notice "This gallery has no collection selected. Choose a collection in the block settings.", so a deletion never leaks to the public. A real collection that simply holds no images yet is now treated as a legitimate visitor-facing state and shows the configurable empty-gallery message to everyone — where previously it showed visitors nothing and editors a single combined notice. (ADR-0012)

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.10.0/CHANGELOG.md

v0.9.0

Choose a tag to compare

@TBarregren TBarregren released this 12 Jun 10:11

The slideshow becomes live: each loop now plays the gallery's current images — uploads stream in, takedowns propagate, photo frames keep up (ADR-0011).

Added

  • The Photo Drop Gallery slideshow now re-syncs with the gallery at the start of every loop: images uploaded while the slideshow plays join the rotation on the next pass, deleted images leave it, and caption changes follow — no page reload needed. The slideshow simply refetches the page it is on, so each loop plays exactly what a reload would show (including any full-page cache the site runs). A single-image gallery cycles too — previously its slideshow stood still forever — so a photo frame started at the beginning of an event keeps up as the photographer's uploads stream in; and when the gallery has been emptied or its collection deleted, the playback ends within one loop, so removed images never linger on screen. A network hiccup never interrupts playback: the slideshow keeps its current images and tries again on the next loop. (ADR-0011)
  • End-to-end coverage of the resync — an image imported mid-playback joins at the loop boundary, a single-image slideshow grows, an emptied collection ends the playback — and a Jest suite for the resync's fresh-view parsing, wrapper matching, and keep/replace/end decisions.

Fixed

  • npm run lint:js no longer crawls for minutes through Playwright's generated HTML report when run after the e2e suite: the project ESLint configuration (the @wordpress/scripts bundled config, unchanged) now ignores the gitignored test-artifact directories.

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.9.0/CHANGELOG.md

v0.8.0

Choose a tag to compare

@TBarregren TBarregren released this 12 Jun 07:42

This release raises the minimum WordPress version to 7.0, fixes the Photo Drop Zone's default dashed-box styling so it renders on the published page (not only in the editor), and makes the Manage collections inspector link always available.

Added

  • The Photo Drop Zone block's inspector now always shows the Manage collections link to the admin page, instead of only once a collection has been selected. (#41)

Changed

  • The minimum WordPress version is now 7.0 (was 6.6). The plugin tracks current WordPress and carries no compatibility code for older releases — the seeded heading uses only the current typography text-alignment mechanism, and the end-to-end suite runs against current WordPress.

Fixed

  • The Photo Drop Zone's default appearance — the dashed box with its light background and padding — now shows on the published page, not only in the editor. The default was stored as a block-attribute default, which WordPress never serialises into post_content, so the dynamic block rendered its wrapper without it on the front end; the default now lives in the block's stylesheet (which loads on both the editor and the front end), and the block's border, colour, and spacing controls still override it.

Full changelog: https://github.com/Kntnt/kntnt-photo-drop/blob/v0.8.0/CHANGELOG.md