== Changelog (older versions) ==

For recent versions see the Changelog section in readme.txt.

= 1.9.84 =
* Feature: The Design settings page's Marker section now has a "Cluster Color" field, to customise the grouped-marker bubbles on the map independently of the individual marker pin color - previously these always used Leaflet's fixed default green/yellow/orange.

= 1.9.83 =
* Fix: Trying to add a custom field with a reserved key (like "id") - or a key that ended up empty after cleanup - silently failed while still showing "Field settings saved.", with no indication the new field wasn't actually added. Now shows a clear error message instead - and no longer alongside a contradictory "saved" confirmation, since nothing was actually saved in that case.

= 1.9.81 =
* Fix: If every field's "Show on List" was switched off, the list view's table columns silently fell back to the Info Panel's fields instead - a leftover compatibility fallback from before "Show on List" existed as its own setting. Removed; the list now always reflects its own settings only, showing just the orchestra name if nothing else is enabled for it.

= 1.9.80 =
* Fix: The "Show in Expanded Row" group header on the Fields settings page was longer than the other three (Popup/Panel/List), making that column pair render wider than the rest. Shortened to "Show Expanded" and made robust against overly long text in general, so this can't recur through a future translation either.

= 1.9.79 =
* Feature: The list view's expanded (click-to-open) row now has its own "Show in Expanded Row" settings on the Fields page, independent of the info panel. Previously it silently reused the Info Panel's Field/Title settings, so showing something in the panel also made it appear in the list's expanded row with no way to control that separately.

= 1.9.78 =
* Change: The Website link in the map popup now shows a shortened version of the actual URL (scheme and "www." dropped, truncated with "…") instead of just the field's label - so it's clear where the link goes before clicking, instead of a generic "Website" link.

= 1.9.77 =
* Fix: Turning off a venue-group field's "Field" checkbox (Popup/Panel) also cleared its "Title" checkbox, even though the other 4 fields in that group could still have their shared title on - misleadingly showing that one field as "no title" when the group's title was actually still active. It's now just greyed out, keeping its state.

= 1.9.76 =
* Fix: Venue Name/Street/Postal Code/City/Country render as one combined address block in the popup and info panel, sharing a single title - turning "Title" on for just one of them silently turned it on for all five, with no indication of that in the Fields settings page. Their Popup/Panel Title checkboxes are now kept in sync with each other, so the admin UI doesn't offer a per-field control it can't actually honor.

= 1.9.75 =
* Fix: The Fields settings table's fixed column widths and divider positions weren't reliably applied - WordPress' own .widefat table style and the plugin's own styling had equal precedence, so the browser could silently fall back to sizing columns by content instead of by the table's explicit widths. Now enforced explicitly so it renders the same everywhere.
* Change: The List group's "(on Mobile)" sub-header is now a smaller second line under "Title", instead of one long "Title on Mobile" label, so that column doesn't make the whole header row taller than the others.

= 1.9.74 =
* Fix: The Fields settings table could leave a stray gap of unclaimed space in its last column on wide screens (WordPress' own .widefat table style sets width:100%, which fought with the table's own sizing). Every column, including Label, now has an explicit width, so the table always renders at a predictable, consistent size.
* Change: The divider lines between the Popup/Panel/List groups on the Fields settings page are now more visible (thicker, darker), and the group headers read "Show on Popup"/"Show on Panel"/"Show on List" instead of just "Popup"/"Panel"/"List" for clarity. The List group's second column is now labelled "Title on Mobile" instead of just "Mobile".

= 1.9.73 =
* Fix: On wide screens, the Fields settings table's Label column could stretch to fill the entire available width, and the "Type"/"Required"/"Enabled" headers could wrap onto two lines. The table now has a maximum width, and those headers stay on one line.

= 1.9.72 =
* Fix: The Fields settings table's Label column could render far too narrow (wrapping its own header text) because a header row with merged (colspan) cells doesn't reliably tell browsers how to size a table with `table-layout: fixed`. Column widths are now set explicitly via a `<colgroup>`, which is unambiguous.

= 1.9.71 =
* Fix: The Type icon on the Fields settings page sat flush against the left edge of its column instead of being centred.
* Fix: The Label column had a fixed width, which could force the narrow Popup/Panel/List columns to stretch wider than intended on wide screens. Label is now the only flexible column, so the others stay exactly as narrow as designed.
* Change: Added a light divider between each "Field" and "Title"/"Mobile" pair on the Fields settings page, not just between the Popup/Panel/List groups themselves.

= 1.9.70 =
* Fix: The Fields settings table (introduced in 1.9.68) could stretch or squeeze its columns unpredictably depending on screen/sidebar width. It now keeps a fixed minimum width and scrolls horizontally on narrow screens instead of squashing columns together.

= 1.9.69 =
* Change: Fixed an off-palette blue used in the Fields settings page's new grouped column headers (introduced in 1.9.68) - now matches the rest of the plugin's admin color scheme.

= 1.9.68 =
* Fix: The Fields settings page now requires a Label on existing fields (an empty one could show up as a bare ":" wherever "Show label" is on) - a submitted-but-blank label falls back to the previous one instead of saving blank, closing a gap where that fallback never actually triggered.
* Change: The "(builtin)" marker next to built-in field keys is now a small "*" with a legend below the table, instead of extra text on every row.
* Change: The "Rehearsal Street" field is now labelled "Rehearsal Street & No." with a placeholder example, to make clear the house number belongs in the same field - it always did (the field was never split from the house number, to keep it working the same way in countries where street/number order or format differs), but nothing said so.
* Enhancement: The Fields settings page's visibility columns are now grouped under "Popup"/"Panel"/"List" headers, each with a "Field" and a "Title" (or, for List, "Mobile") checkbox, instead of three checkboxes crammed into one "Show value" cell and three more into one "Show label" cell.
* Fix: The built-in "name" field's Popup/Panel/List visibility checkboxes never actually did anything - the orchestra name is always shown as the heading everywhere, regardless of those flags. That row is now shown as locked with an explanation, instead of offering controls with no effect.

= 1.9.67 =
* Fix: The "delete field" checkbox on the Fields settings page (replaced by a round delete button in 1.9.66) was hidden with CSS, which some sites' other loaded styles could override, making the old checkbox reappear next to the button. It's now a hidden form field instead, which no stylesheet can make visible.
* Change: Removed the "Delete" column header on the Fields settings page - each row's button already has its own accessible label, and the icon is self-explanatory.

= 1.9.66 =
* Feature: Custom fields on the Fields settings page are now reordered by dragging instead of typing an order number.
* Fix: A custom field's Type can no longer be changed after creation - editing it after data has already been entered could produce broken links (e.g. a plain-text value suddenly wrapped as a mailto: link) or drop the line-break handling for textarea fields. Delete and re-add the field to change its type. The Type column now shows a plain icon instead of a dropdown, since it's no longer editable there.
* Feature: Marking a field "Required" now warns you first if existing orchestras don't have it filled in yet, and shows how many - they'll only be asked for it the next time they're edited, not immediately.
* Feature: Deleting a custom field is now a single click on a delete button, hiding the row immediately - nothing is actually removed until "Save Changes" is submitted, so a reload without saving brings it back.
* Feature: The Fields settings page now warns before you navigate away with unsaved changes (edits, reordering, or a pending delete).
* Fix: Deleting a custom field left its value behind in every orchestra's stored data - harmless on its own, but a later field reusing the same key would have silently inherited the old, orphaned values. Deleting a field now also clears it from existing orchestras.

= 1.9.65 =
* Change: Lowered the minimum required PHP version from 8.2 to 8.0 - the plugin doesn't use any PHP 8.1/8.2-only syntax, so the higher requirement was unnecessarily excluding sites on 8.0/8.1 hosting.
* Cleanup: Removed an unused leftover demo CSV file that shipped in the assets folder.
* Docs: Trimmed the changelog below to the most recent versions; older entries have moved to changelog.txt.

= 1.9.64 =
* Fix: Description still called the Shortcode Reference page a "generator" with "a visual form" - it's a static attribute reference table, no shortcode-building form exists. Corrected.

= 1.9.63 =
* Fix: "Tested up to" corrected to major.minor format (7.0), per the WordPress.org readme spec.
* Fix: Admin header partial's variables are now function-scoped instead of file-top-level, resolving a naming-convention warning from the official Plugin Check tool.

= 1.9.62 =
* Fix: Custom fields of type "textarea" lost all line breaks when saved (multi-paragraph text was silently collapsed to a single line). Line breaks are now preserved on save and rendered correctly in the map popup and info panel.
* Docs: Changelog wording cleaned up to plainly describe what changed for users, without internal review-process references.

= 1.9.61 =
* Fix: FAQ still described Custom Fields and Map Design as Pro-only add-on features - both have been free since 1.9.50. Corrected.
* Fix: The OpenStreetMap attribution shown under the map was hardcoded in German regardless of site language. Now in English, matching the plugin's English-default/GlotPress-translatable approach everywhere else.
* Docs: readme.txt now discloses OpenStreetMap's Tile Usage Policy alongside the existing Nominatim geocoding disclosure, since every map view (not just geocoding) contacts OpenStreetMap's servers.
* Cleanup: Internal code-quality pass - removed a few unnecessary lint suppressions in favor of small direct fixes (a variable name collision, redundant checks, an unused parameter). No behavior change.
* Hardening: Form data handling in the Fields, Add/Edit Orchestra, Design Settings and Column Order admin actions now sanitizes every submitted value explicitly.

= 1.9.60 =
* Feature: Full multisite support - network activation/deactivation now applies to every site, a newly created site in an already network-active install gets its own data automatically, and deleting a site from the network cleans up its data too.
* Fix: The "Geocode All Missing" button no longer sends one request per orchestra to OpenStreetMap in a single burst - it now paces requests with a short delay between each, avoiding the service's rate limit and the risk of a timeout on sites with many un-geocoded orchestras.
* Fix: The Orchestras list, Field Settings, and Dashboard pages all load noticeably faster, especially with more than a handful of orchestras or custom fields - several places were re-fetching or re-sorting the full list of data on every request instead of asking the database directly.
* Fix: Custom fields could previously be created with the reserved keys "id", "lat", or "lng", silently corrupting every orchestra's coordinates on the frontend map. These keys are no longer allowed.
* Change: Internal cleanup pass (no user-facing behavior change beyond the above) - removed dead code left over from earlier versions, translated remaining internal code comments to English, and removed an unused old German translation file (the plugin ships English by default; translations are provided via WordPress.org once available).

= 1.9.59 =
* Fix: Design Settings colors (marker, search, map border, info panel, popup, orchestra list) weren't reaching the frontend - WordPress had already printed the stylesheet's `<style>` tag in the page `<head>` before the shortcode tried to attach the color values, so they were silently dropped. Sizes (min/max width etc.) were unaffected since those travel through a different, unaffected code path.

= 1.9.58 =
* Feature: The Design Settings page's "Map" section now has a site-wide default initial view (address, radius in km, zoom) - the [orchestra_map] shortcode attributes still override it per instance, but most sites can now skip shortcode attributes entirely.
* Change: The Dashboard's shortcode list is back to a short overview (name + one line each) with a link to the new full Shortcode Reference page, which now documents every attribute for all four shortcodes.
* Fix: The left-hand admin menu no longer collapses "Orchestra Map" when on the Edit Orchestra page.

= 1.9.57 =
* Feature: [orchestra_map] now accepts an "address" attribute (auto-geocoded and cached for a week, same OpenStreetMap lookup used for orchestra entries) and a "radius_km" attribute to fit the initial view to a given radius instead of guessing a raw zoom level.

= 1.9.56 =
* Fix: "Fields" and "Design" were missing from the admin header tab bar (only present in the sidebar) - the tab list wasn't updated when those two pages were added.
* Feature: Design Settings page redesigned - each section (Marker, Search, Map, Info Panel, Popup, Orchestra List) is now its own card, laid out side by side on wider screens; every color field now has a hex text input next to the color swatch, kept in sync in both directions.

= 1.9.55 =
* Fix: Add/Edit Orchestra pages restored to the original styled card layout with "Used for automatic geocoding." hints on address fields, a placeholder on the Website field, and a Cancel button - the DDD rewrite had reduced these to a plain, unstyled form table.

= 1.9.54 =
* Fix: Column visibility toggles are now also available directly in the "Column order" chip bar above the Orchestras table (not just the "Screen Options" tab) - both stay in sync since they read/write the same underlying setting.

= 1.9.53 =
* Feature: Orchestras admin list is now a native WordPress list table – column visibility is configurable via the "Screen Options" tab, columns are sortable by clicking their header, and column order can still be changed by dragging the chips above the table (now saved per-user, persists across sessions instead of resetting on reload).

= 1.9.52 =
* Fix: All 7 admin pages (Dashboard, Orchestras, Add, Edit, Fields, Design, Shortcode Generator) wrapped their entire content in the dark ".om-plugin-header" banner class instead of only including the shared header partial – caused the whole page content to render on a dark background with unreadable text. Pages now correctly include `_header.php`/`_footer.php` inside a plain "wrap om-wrap" container, matching the original admin layout.

= 1.9.51 =
* Fix: Frontend shortcodes ([orchestra_map], [orchestra_list], [orchestra_search], [orchestra_panel]) now run on the new internal architecture, improving how design colors are output on the frontend. No user-facing behavior change – markup, data and JS stay the same.

= 1.9.50 =
* Fix: Custom Fields and Design settings are no longer gated behind a Pro license check – both now have a free, fully functional admin UI (Fields / Design menu pages).
* Change: Admin pages (Dashboard, Orchestras, Add, Edit, Fields, Design, Shortcode Generator) now run on the new internal architecture; no user-facing behavior change beyond the above.

= 1.9.49 =
* Fix: Mobile list view no longer shows a stray colon before fields that have no label (data-label="").

= 1.9.48 =
* Fix: Clicking a map marker now also opens the corresponding list accordion. Map marker click dispatches `om:select` (source: map); the list responds with accordion open + scroll; the map skips its own zoom/popup logic for source:map to avoid a double-popup flicker.

= 1.9.47 =
* Fix: List accordion now reliably opens when selecting an orchestra via the standalone search bar. The `selectId` is passed directly in the `om:filter` event so the accordion is opened immediately after the list re-renders, eliminating the previous inter-event timing issue.

= 1.9.46 =
* Fix: Clicking an orchestra in the standalone search bar (`[orchestra_search]`) now correctly opens the map popup, list accordion, and panel. Previously `om:filter` fired after `om:select` and hid the panel again; the event order is now reversed and the list gained an `om:select` listener.

= 1.9.45 =
* Fix: Geocoding warning box now hides immediately after a successful single auto-geocode (triggered on Add/Edit), without requiring a page reload.

= 1.9.44 =
* Fix: Data initialization moved from IIFE top-level to inside `DOMContentLoaded` in all three JS modules. When a theme outputs scripts in `<head>` without `defer`, the IIFE executed before the page body was parsed and `document.getElementById('orchestra-map-config')` returned null. Now the `#orchestra-map-config` div is read at DOM-ready time when it is always present.

= 1.9.43 =
* Fix: Orchestra data (`window.orchestraMapData`) was never available on the frontend in environments where `wp_add_inline_script` is intercepted or dropped (Block Themes / FSE, caching/optimisation plugins). Added a guaranteed HTML fallback: each shortcode now embeds a hidden `<div id="orchestra-map-config" data-config="[JSON]">` directly in its output. All three JS modules (`orchestra-map-public.js`, `orchestra-map-list.js`, `orchestra-map-search.js`) now read from this element when `window.orchestraMapData` is not set, and then share the parsed data via `window.orchestraMapData` for subsequent scripts.

= 1.9.42 =
* Fix: `window.orchestraMapData` was never set on sites running a Block Theme (FSE / WordPress 7+). Block Themes print scripts inside `wp_head()` before `the_content()` processes shortcodes, so any `wp_add_inline_script()` calls from shortcode renderers arrived too late. Added `preload_if_needed()` hooked to `wp_enqueue_scripts` at priority 11: it detects orchestra-map shortcodes in the post content and pre-enqueues scripts + inline data during the normal enqueue phase, guaranteeing the global is available regardless of when the theme prints its scripts.

= 1.9.41 =
* Fix: `window.orchestraMapData` was undefined on the frontend when a JS-optimisation plugin (Autoptimize, LiteSpeed Cache, WP Rocket, etc.) stripped inline scripts attached to the virtual `orchestra-map-data` handle (src=false). The inline data is now attached to a real script handle (`orchestra-map`, `orchestra-map-list`, or `orchestra-map-search`) with a `before` position, falling back to the virtual handle only when no optimiser is present. Also removed duplicate localisation logic from the `[orchestra_search]` shortcode.

= 1.9.40 =
* Fix: Built-in field labels (Orchestra Name, Website, Email, Rehearsal Venue/Street/City, Postal Code, Country) are now translatable – labels are resolved via __() at runtime instead of being hardcoded in the static defaults array.

= 1.9.39 =
* Fix: German translation (de_DE) now loads correctly – load_plugin_textdomain() was empty; added explicit call with __FILE__-based path.

= 1.9.38 =
* Fix: German translation (de_DE) cleaned up – removed Pro-plugin strings that belong in Orchestra Map Pro, added 19 missing Free-plugin strings, updated PO/MO.

= 1.9.37 =
* Fix: Replace raw inline `<script>` / `<style>` output with `wp_add_inline_script()` and `wp_add_inline_style()` to comply with WP.org coding standards. Introduces a virtual `orchestra-map-data` script handle that carries `window.orchestraMapData` as an inline script. Admin column-visibility CSS is now applied via JavaScript on page load instead of a PHP-echoed `<style>` tag.

= 1.9.36 =
* Fix: Popup min/max width percentage calculation now uses Leaflet's own container measurement (map.getSize().x) instead of offsetWidth, which could return 0 before layout is complete.

= 1.9.35 =
* Feature: Popup min. width configurable in Design tab (default 30% of map width) – prevents narrow popups when the orchestra name is short.

= 1.9.34 =
* Feature: Popup max. width configurable in Design tab – accepts pixels (e.g. 300) or percent of map width (e.g. 40%).

= 1.9.33 =
* Cleanup: Shortcode generator – removed obsolete "Combined (Map + List)" box and the search-bar toggle from [orchestra_map] (search is now a standalone [orchestra_search] shortcode).

= 1.9.32 =
* Feature: New [orchestra_panel] shortcode – renders the detail panel as a standalone element, freely positionable on the page.
* Refactor: [orchestra_map] no longer bundles search or panel; compose your layout freely with [orchestra_map], [orchestra_list], [orchestra_panel], [orchestra_search]. All shortcodes sync automatically when on the same page.
* Refactor: Map center/lat/lng/zoom moved from orchestraMapData to data-attributes on the map div, so any shortcode can safely initialize the shared data first.

= 1.9.31 =
* Feature: List view now has an inline accordion – clicking a row expands a detail panel with the configured panel fields directly within the table.

= 1.9.30 =
* Feature: Title checkboxes (label_popup, label_panel, label_list) now take effect in the frontend – controls whether the field label is shown before each value in popup, panel and list.

= 1.9.29 =
* Enhancement: Fields table redesigned – elegant grouped column headers with vertical sub-labels (Field/Title), hover rows, compact inputs, and scroll wrapper.

= 1.9.28 =
* Feature: Fields table now shows Field/Title sub-columns for Popup, Panel and List locations – allows hiding the field label per display context.

= 1.9.27 =
* Fix: German translation now loads correctly – added explicit load_plugin_textdomain() call (WP auto-load only applies to WP.org-hosted plugins).

= 1.9.26 =
* Fix: Improved coding standards compliance and input/output handling throughout the plugin; global functions renamed for naming consistency.

= 1.9.25 =
* Fix: Improved output escaping and translation-readiness throughout the plugin.

= 1.9.24 =
* Fix: Built-in field labels (venue, address, ZIP, city, country) are now English by default; one-time migration resets old German defaults for existing installs.

= 1.9.23 =
* Tweak: Default style colors updated to SWu Labs CI (navy + teal).

= 1.9.22 =
* Fix: Custom fields in the add/edit form are now hidden when Orchestra Map Pro has no valid license.

= 1.9.21 =
* Split into free plugin (wordpress.org) and Pro add-on
* Geocoding is now free for all users
* Improved Danger Zone settings persistence

= 1.9.20 =
* Fixed field visibility inconsistencies across popup, panel and list views
* Resolved several CSS layout issues in the admin interface

= 1.9.16 =
* Added venue name field (rehearsal location, separate from the address)
* Fixed search bar not staying in sync when the map was filtered externally

= 1.9.10 =
* Migrated license validation and automatic update delivery to hub.swulabs.com

= 1.9.9 =
* Removed website icon from map popups for a cleaner, distraction-free appearance

= 1.9.8 =
* Fixed venue name not saving correctly when editing an existing orchestra
* Optimised Import / Export: faster processing, better column matching
* Added sortable columns to the orchestra list table

= 1.9.6 =
* Fixed update cache not re-validating correctly after license changes

= 1.9.5 =
* Fixed stale update cache preventing the latest version from being detected

= 1.9.4 =
* Fixed info panel and list view not respecting field visibility settings
* Relocated the bulk geocoding controls to a more prominent position in the list view

= 1.9.3 =
* Resolved outdated update cache causing incorrect version information to be displayed

= 1.0.0 =
* Initial release
