# Massoftind Custom Fields & Field Builder — Changelog

## Unreleased

## 1.9.217 — 2026-10-22

- Feature: Existing custom post types can change Post Type Key. Confirming migrate updates `wp_posts.post_type`, field-group location rules, relationship/post-object filters, taxonomy attachments, Content Order, Featured Posts, admin table columns, Post Types field values, and WPML maps. Rewrite Slug, REST base, and GraphQL type names stay on the old identity so public URLs and WPGraphQL queries do not jump. Bricks / Elementor / qTranslate patches are unchanged; their stored queries are not rewritten. Theme template filenames and hardcoded queries are not rewritten.

## 1.9.216 — 2026-10-12

- Feature: WPGraphQL `MenuItem.massoftindFields` / `massoftindField` for navigation menu custom fields (same JSON API + language arg).
- Feature: RootQuery `massoftindOptions` / `massoftindOption` for Site Section / global options (`section` slug optional, `language` supported).
- Compat: Bricks / Elementor / WPML / qTranslate / existing Page–Post GraphQL paths unchanged.

## 1.9.215 — 2026-09-29

- Feature: GraphQL `title`, `content`, and `excerpt` accept `language` and honor query variable `$language` / `$lang` (same as massoftindFields) for qTranslate / WPML — one variable localizes core + MFB fields without cookies.

## 1.9.214 — 2026-09-29

- Feature: GraphQL `massoftindFields(language: "pt")` / `massoftindField(name: "…", language: "pt")` switch qTranslate `$q_config['language']` and WPML language for that resolve (forces front-end localization). No cookies/headers required for headless clients.

## 1.9.213 — 2026-09-29

- Fix: `WpGraphQLSupport::collect_post_fields` now passes `page_template` and `page_parent` into location matching (same context as `FieldValueService`). Template-assigned groups such as Home Fields were skipped; only broader page groups (e.g. empty Inner Banner fields) appeared in GraphQL.

## 1.9.212 — 2026-09-25

- Compat: Custom post types and taxonomies register `show_in_graphql` + GraphQL single/plural names (default on; editable in CPT/Taxonomy editors) so WPGraphQL can query MFB types.
- Compat: `WpGraphQLSupport` attaches `massoftindField` / `massoftindFields` to every GraphQL-exposed post type (including MFB CPTs); resolves WPGraphQL model `databaseId`.
- Compat: Bricks / Elementor / WPML / qTranslate prior patches left untouched.

## 1.9.211 — 2026-09-22

- Fix: Admin Content Order treats `orderby=menu_order title` as drag-order mode (WooCommerce “Sortering” tab) — `sanitize_key()` was collapsing it to `menu_ordertitle` and hiding Order handles.
- Fix: Admin-only late `pre_get_posts` (priority 999) so WooCommerce cannot reset the Products list to date order — **not** registered on the front end (Bricks / Elementor / WC catalog orderby unchanged).
- Compat: Skip builder-owned queries (`post__in`, Elementor/Bricks query flags); front WC/WPML product catalogs still untouched; term-order filters remain admin list-table only (WPML product_cat URLs safe); qTranslate unaffected.

## 1.9.210 — 2026-09-22

- Fix: Term Description WYSIWYG no longer doubles Add Media / Visual|Code on WooCommerce `product_cat` (and related) screens — skip Field Builder editor when WooCommerce already renders `wp_editor()`, with a JS guard for any pre-existing editor instance.
- Fix: Content Order on Products — admin `edit.php?post_type=product` now sorts by `menu_order` after drag-save (previously all product queries were skipped as “WooCommerce”, so the front looked correct while wp-admin reverted to date order on refresh).
- Fix: Do not add Field Builder Order handles on WooCommerce product taxonomies — WooCommerce `term-ordering.js` already provides drag UI (avoids double handles).

## 1.9.209 — 2026-09-21

- Fix: `massoftind_fb_get()` / `get_field()` returned empty on taxonomy archives and other non-singular loops — early safety stub used `class_exists( …, false )` so `FieldValueService` never autoloaded when `lock_front_post_context()` skipped (singular-only). New `massoftind_fb_service()` always allows SPL autoload (works even when an old MU stub froze `massoftind_fb_values()`).

## 1.9.208 — 2026-09-17

- Fix: MU safety installer never runs on front-end / cron — only activation + `admin_init` upgrade path (production-safe for locked `mu-plugins` hosts).
- Fix: Permanent site option skips further MU write attempts after one permission failure (no daily retry / no `debug.log` spam).
- Fix: `@file_put_contents` + `error_clear_last` on MU install; Local JSON / SVG writes also silence permission warnings.

## 1.9.207 — 2026-09-17

- Fix: Stop flooding `debug.log` when `mu-plugins` is not writable (WP Engine / managed hosts) — safety MU install checks writability, skips rewrite when already current, and cools down after permission failures instead of calling `file_put_contents` on every request.

## 1.9.206 — 2026-09-15

- Fix: YouTube admin preview renders on load and when switching qTranslate languages (not only on typing).
- Fix: YouTube initial poster uses the active language’s URL when the stored value is multilingual.

## 1.9.205 — 2026-09-15

- Fix: YouTube field supports per-language URLs under qTranslate (`type="text"` + hooks on `.massoftind-fb-youtube-url`; sanitize preserves multilingual strings instead of collapsing to one video ID).
- Fix: YouTube `format_value` resolves the active language before building embed/thumbnail data.
- Fix: Link field URL hidden input gets qTranslate hooks and IDs (per-language URLs sync on save with title).

## 1.9.204 — 2026-09-15

- Fix: URL / Email fields under qTranslate no longer overwrite other languages — use `type="text"` + `inputmode` when qTranslate is active because HTML5 `type="url"` / `type="email"` reject `[:en]…[:pt]…` markup.
- Fix: qTranslate multilingual hooks target only `.massoftind-fb-url-input` / `.massoftind-fb-email-input` (not YouTube, oEmbed, Video, or Icon picker URLs).
- Fix: `qtranslate-admin.js` selector matched PHP exclusions (1.9.203 PHP exclude was bypassed by the JS helper still hooking all `type="url"`).

## 1.9.203 — 2026-09-15

- Fix: YouTube field is excluded from qTranslate multilingual URL hooks (canonical video URL, not per-language).
- Fix: YouTube sanitize extracts the video ID before `esc_url_raw()` so a one-language paste wrapped as `[:en]https://…[:]` still saves.
- Fix: Group field editor chrome matches Repeater (header + white padded body) so sub-field labels no longer sit flush against the header.
- Fix: Meta box inputs default to full (100%) width inside groups, repeaters, and top-level fields.

## 1.9.202 — 2026-09-08

- Fix: Filter by Post Status uses the same searchable tag multi-select UI as Taxonomy fields (pills + search + remove), matching the editor multi-select look.
- Fix: Deduplicate status labels and hide WooCommerce order statuses from the post-status filter.

## 1.9.201 — 2026-09-08

- New: Relationship / Post Object **Filter by Post Status** (ACF Pro-style). Empty = any status; choose Publish, Draft, Private, etc. to limit Available items. Meta Key is for custom fields only — not post status.
- Fix: Filter by Post Status Type Setting uses a checkbox list UI (selectable) instead of a native multi-select that looked like plain text.

## 1.9.200 — 2026-09-04

- Fix: Field Builder post types respect Supports → Featured Image (unchecked removes thumbnail support and the Featured Image metabox; no longer forced for all custom CPTs).
- New: Enable / disable all toggle on Post Type Supports & Visibility and Taxonomy Attach / Settings checkbox groups.

## 1.9.199 — 2026-09-02

- Docs: WordPress.org readme uses `[youtube]` embeds (embedded players) for plugin overview and CPT UI import tutorials.

## 1.9.198 — 2026-09-02

- Docs: added CPT UI import video tutorial (https://www.youtube.com/watch?v=5VlBq9pJ3po) to in-plugin documentation and readme.

## 1.9.197 — 2026-09-01

- Fix: Table field “Add row” uses header column count when the body is empty or out of sync (add columns first, then rows).
- Compat: Elementor repeater row tags use the same sub-field formatting as `massoftind_fb_sub_field()` (Image URL return format, qTranslate, etc.).

## 1.9.196 — 2026-09-01

- Fix: Repeater / accordion `massoftind_fb_sub_field()` now applies Image **Return Format → Image URL** (loops keep raw rows; format on read).
- Fix: Developer Panel repeater templates show URL-style image examples when Return Format is Image URL.

## 1.9.195 — 2026-09-01

- Fix: Image field **Return Format → Image URL** now returns the attachment URL from `massoftind_fb_get()` / `get_field()` (settings were not always read when stored as a top-level or object-shaped value).

## 1.9.194 — 2026-09-01

- New: Table, Phone, Country, Address, Date Range, Slug, Tags, Image Hotspot, Markdown, and Post Types field types (54 total).
- Improve: ACF migration imports matching addon field slugs as native types.
- Compat: Bricks, Elementor, WPML, and qTranslate support for all new field types.

## 1.9.193 — 2026-09-01

- New: Icon Picker (`icon_picker`), oEmbed (`oembed`), Separator (`separator`), and Nav Menu (`nav_menu`) field types.
- Improve: ACF migration imports `icon_picker` and `oembed` as native field types (no longer downgraded to Text/URL).

## 1.9.192 — 2026-09-01

- Remove: Frontend forms — `[massoftind_fb_form]` shortcode, `massoftind-fb/form` block, Settings toggles, and admin documentation for public submission forms.

## 1.9.191 — 2026-09-01

- Fix: WordPress.org readme short description trimmed to 150 characters (Plugin Check import warning).

## 1.9.190 — 2026-09-01

- UI: Clearer admin menu labels — All Field Groups, Global Options, Gutenberg Blocks, Admin Table Columns, Sort Content Order, Export Field Groups, Import from ACF.
- Docs: WordPress.org readme optimized for search (short description, ACF migration & Gutenberg sections, FAQ, tag `acf migration` replaces `gallery`).

## 1.9.189 — 2026-09-01

- Rename: Plugin display name is now **Massoftind Custom Fields & Field Builder** (slug, URLs, and text domain unchanged).
- Fix: Plugin Check — sanitize `instance_id` and `massoftind_fb_block_fields` POST input in block field AJAX handlers.

## 1.9.188 — 2026-09-01

- New: Gutenberg Block Bindings source (`massoftind-fb/field`) — bind core blocks (Paragraph, Image, Heading, etc.) to MFB field values on the front end.
- New: "Massoftind Field Group" Gutenberg block — pick a field group in the block inspector, edit its fields in a modal (WYSIWYG, media, date, conditional logic all re-initialize correctly), and render values on the front end.
- New: Custom Blocks registry — define named/iconed Gutenberg blocks from the admin (no code), attach field groups via a Block location rule, and render matched fields per block instance.
- New: Field group "Available in block" toggle (`show_in_block`) controls which groups appear in the generic field-group block dropdown.
- New: Block location rule parameter — target field groups to a specific custom block name.
- New: Migrate from ACF admin tool — scan real ACF (free or PRO) field groups, import into MFB with location rules / repeaters / flexible content, and report skipped or downgraded field types (e.g. icon_picker → Text, flat accordion markers flattened).
- Fix: Custom block rendering no longer picks up unrelated field groups that only matched generic post-type rules (strict `targets_block()` gate).
- Security: Public REST field-values endpoint now serializes WP_User / WP_Post / WP_Term objects to safe minimal data (no password hashes, emails, or full post content leaked).
- Security: Relationship / Post Object AJAX post search now filters results to posts the current user can read.
- Fix: Import mapping for ACF `color_picker` → Color and `icon_picker` → Text field types.

## 1.9.187 — 2026-08-31

- Fix: Plugin Check — removed phpunit.xml.dist (dev-only config) from the shipped release package.
- Fix: Plugin Check — SVG upload sanitizer now uses wp_delete_file() instead of unlink() to remove a rejected file.
- Fix: Plugin Check — renamed massoftind_fb_values() fallback impl helpers (_massoftind_fb_get_impl, _massoftind_fb_field_impl, _massoftind_fb_have_rows_impl, _massoftind_fb_the_row_impl, _massoftind_fb_sub_field_impl, _massoftind_fb_option_impl) to drop the leading underscore so all global functions start with the massoftind_fb_ prefix.

## 1.9.186 — 2026-08-31

- Security: REST public field-values endpoint fails closed (empty allowlist now returns nothing instead of every field); Password field values are never exposed via this endpoint.
- Security: Fixed stored-XSS risk where a crafted field-group import (choice option labels) could break out of the inline <script> bootstrap on the Group Editor screen — added JSON_HEX_* escaping everywhere JSON is embedded in <script> tags and strip tags from choice values/labels at save time.
- Security: Hidden Login "block other logins" no longer relies on a static, forgeable POST field to identify legitimate login submissions — now verified with a real WordPress nonce.
- Security: SVG uploads are sanitized at upload time and rewritten to disk (previously only sanitized when inlined via wp_get_attachment_image, leaving the raw uploaded file exploitable via direct URL); sanitizer hardened against more script/event-handler/URI/CSS injection vectors.
- Security: Frontend form submissions now validate the submitted post type against registered public post types before creating content.
- Security: Local JSON sync directory setting is now confined under wp-content (defense-in-depth against a misconfigured path); list view column headers are escaped on output; added ABSPATH guards to remaining stub index.php files.

## 1.9.185 — 2026-08-31

- Fix: Fallback value service missing have_option_rows and related template-compat methods; stop permanently caching fallback before plugin bootstrap completes.


## 1.9.184 — 2026-08-31

- Fix: Parse error in must-use safety loader — strip duplicate <?php when building massoftind-field-builder-safety.php.


## 1.9.183 — 2026-08-31

- Fix: Term Description WYSIWYG — scope editor to add/edit term forms only (no toolbar leaking into taxonomy list table).
- Fix: Theme safety during plugin updates — early massoftind_fb_* stubs plus must-use loader so child themes calling helpers at load time do not fatal.


## 1.9.182 — 2026-08-31

- Fix: Critical error on 1.9.181 — restore TermDescriptionEditor class and term description editor script (empty files in 1.9.181 release).


## 1.9.181 — 2026-08-31

- Fix: Site Section link fields — removing a CTA/link now persists after save (purges legacy ACF-style option keys; empty URL clears title/qTranslate leftovers).
- New: Taxonomy term Description — WYSIWYG editor on all term add/edit screens (categories, tags, custom taxonomies); allows safe post-style HTML.

## 1.9.180 — 2026-08-28

- UI: Relationship field — infinite scroll in Available list (auto-loads next page on scroll; fills viewport when the first page is short).

## 1.9.179 — 2026-08-28

- New: File field — image MIME types (jpg, jpeg, png, gif, webp, avif, svg) in Allowed File Types; front-end accepts images when configured (ACF parity).
- UI: Repeater/Group Row layout — CSS grid columns; Relationship and WYSIWYG span full row; link URL overflow and quicktags fixes in row/table layouts.
- Fix: Relationship search — paginated results with Load more (50/page, filterable max 100); no longer capped at ~20 items.
- Fix: Plugin Check — Local JSON uses WP_Filesystem; frontend form flash args sanitized; VIP-safe relationship exclusion; PHPUnit bootstrap ABSPATH guards.

## 1.9.178 — 2026-08-27

- Compat: Elementor row tags run through `massoftind_fb_format_value` (qTranslate decode parity with Bricks loops); WPML registers seamless/prefixed Clone field names; frontend forms disconnect WPML duplicates before save (same as admin MetaBoxes). Bricks / qTranslate cores untouched.

- New: WPGraphQL — `massoftindField` / `massoftindFields` on GraphQL post types + RootQuery (Settings → WPGraphQL fields; JSON-encoded values).
- New: Local JSON CI — WP-CLI `wp mfb local-json status|push|pull [--force]`; Tools documents deploy sync (definitions only).
- UI: Conditional logic — starts_with / ends_with / >= / <= operators, AND separators, live rule summary, clearer AND/OR hint.
- New: Relationship — Term mode (`__term__`), Filter by Meta Key/Value/Compare on Available posts, bidirectional for users and terms (post↔user meta / term meta); min selection blocks publish when below min.
- Compat: Bricks, WPML, and qTranslate cores untouched.

- New: Elementor Pro Loop Grid bridge — Query ID `mfb_repeater` + Massoftind Repeater Field control; row dynamic tags use the active loop index.
- New: Frontend forms — shortcode `[massoftind_fb_form]` and block `massoftind-fb/form` (nonce, honeypot, caps, rate limit; Settings → Frontend forms / Guest).
- New: Stronger Clone — seamless vs group display, prefix field names, select fields to clone; seamless splices into parent groups at match time.
- New: CPT editor — custom post statuses (`slug|Label` lines); registered on `init`.
- New: Minimal PHPUnit smoke suite (`composer test` / `tests/Unit`) for CloneExpander + custom status normalization.
- Compat: Bricks, WPML, and qTranslate cores untouched.

- New: `massoftind_fb_add_local_field_group()` / `massoftind_fb_register_field_group()` + `massoftind_fb/init` for code-first groups; optional Local JSON push/pull (Settings + Tools; definitions only).
- New: Relationship **Bidirectional** + target field name (same-language posts only; no cross-WPML linking).
- New: Field types **Button Group** and **Page Link** (Elementor/Developer snippets wired).
- New: `massoftind_fb_meta_query()` helper; optional public read-only REST `GET /public/field-values/{post_id}` (Settings, default off).

- New: Elementor row tags — Layout Blocks / flexible layouts in the picker; nested group→repeater path resolution; `massoftind-row-url` and `massoftind-row-number` (with text/image).
- Fix: REST `GET/PUT /field-values/{post_id}` returns raw meta (edit-safe for qTranslate; no WPML original fallback on empty translations) and optional `?lang=` maps to the WPML translation post ID.
- UI: List View filter note for Field Builder “contains” / qTranslate; CPT Visibility tip for REST / archive / rewrite; Export subtitle clarifies no field values.
- New: Elementor Free-compatible **Repeater Row** dynamic tags (`massoftind-row-text`, `massoftind-row-image`) — pick repeater sub field + row index; Developer Panel snippets updated.
- New: REST `GET/PUT /option-values/{section}` and `/term-values/{taxonomy}/{term_id}` for Site Sections and term field values (capability-checked; raw edit-safe reads; optional `?lang=` for WPML option keys; term PUT syncs WPML Copy).
- New: CPT editor — capability_type / map_meta_cap, extra Labels fields, and attach Taxonomies from the post type screen.
- Fix: Featured list filter no longer duplicates when a List View owns the table (standalone dropdown skipped; Featured views link still works).
- Fix: List View Author filter uses a user dropdown (was a text box that only accepted numeric IDs).
- New: Taxonomy columns support **Filter only (hide column)** — Show as list filter auto-injects filter-only term dropdowns so the toolbar gets terms without forcing a grid column.
- New: List View switcher on post/user list screens when multiple active views exist for the table (uses existing per-user preference).
- New: Tools → Export **site package** checkboxes for field groups, post types, taxonomies, Site Sections, List Views, and optional Settings (Featured Posts / Hidden Login / Content Order). Import restores settings modules and shows a full summary.
- New: Developer Panel adds Bricks `{mfb_*}` / `{mfb_row:*}` and Elementor dynamic-tag copy snippets beside PHP (snippets only; Bricks/Elementor runtime unchanged).

## 1.9.177 — 2026-08-27

- New: Taxonomies → **Show as list filter** — term dropdown on the post list toolbar (same row as dates / Filter). Auto-wires a filterable Taxonomy column into active List Views; when no List View is active, renders a fallback term filter. Filterable ≠ Sortable (List View editor note clarified). Admin `edit.php` only; Bricks / Elementor / WPML field paths unchanged.

## 1.9.176 — 2026-08-27

- Fix: Uninstall preserves field groups, settings, Site Sections, List Views, and option/field values so delete → reinstall keeps previous data. Only regenerable transients / rewrite-flush flags are cleared.


## 1.9.175 — 2026-08-27

- UI: Tools → Content Sync shows a clear “Sync complete” success panel, toast, and “Sync again” button when batched sync finishes.

## 1.9.174 — 2026-08-26

- Fix: PHPCS — escape Featured Image admin CSS with `esc_html`; ignore WPML/core hook-prefix warnings where third-party/core APIs are invoked intentionally.
- Fix: PHPCS — sanitize Hidden Login / Featured Posts settings inputs and `$_SERVER` / `$_GET` reads; replace VIP-prohibited `suppress_filters` / `post__not_in` in Featured Posts queries with WPML language switch + PHP exclusion.
- UI: Field Usage Guide rows — field name in the badge, description beside it (no Advanced/Basic category pills).
- UI: Settings → Filters & Hooks — plain-language section titles, human titles + descriptions per hook (badge Filter/Action, hook name on the right); intro clarified for non-developers.
- UI: Settings → General preference copy rewritten in plain language (Bricks, Elementor, Legacy Meta, SVG, Meta Key Prefix, and related status notes).
- Compat: Featured Posts auto-detected by **List Views** — when enabled for a post type, `+ Featured` appears in Add column, is injected into the active view (reorder/save like other columns), and the fallback end-of-table column is skipped so List View owns position. Filterable Featured status in List View filters.
- Compat: Featured Posts hardened for Bricks / Elementor / WPML / qTranslate — list filter is admin `edit.php` only (no front/AJAX query mutation); metabox save requires our nonce (Elementor/Bricks saves ignored); WPML registers `_massoftind_fb_featured` as Copy and toggles sync across translation IDs; radio/max counts use unique translation groups. Prior field-meta, Content Order, Featured Image, and Site Section WPML fixes unchanged.
- New: Settings → **Featured Posts** — star toggle on list tables, edit metabox, list filter / Featured view, optional radio (one) or max-count limits per post type. Meta `_massoftind_fb_featured` = `1`; helpers `massoftind_fb_is_featured()` / `massoftind_fb_featured_meta_key()`. Option key `massoftind_fb_featured_posts`. Distinct from Featured Image; Bricks / Elementor / WPML / qTranslate field paths unchanged.
- Fix: Group and Repeater collapse toggles did not hide content when Layout was Table or Row (`display:grid !important` overrode collapsed/`[hidden]` styles).
- New: Settings → **Hidden Login** — custom login slug, hide wp-admin for guests (redirect home), optional block of administrator sign-in on other login forms. Option key `massoftind_fb_hidden_login`.
- UI: Settings tabs stay on one row (5 columns) on desktop.

## 1.9.173 — 2026-08-25

- Fix: WPML **Copy** on Site Section / options fields now mirrors values across languages. Options use per-language keys (`…_en`, `…_nb`), so WPML post-meta Copy never applied — EN could stay OFF while NO was ON. Explicit Copy writes all language keys and reads from the default language; explicit Copy once / Translate seeds missing language keys from the default language only.
- Compat: Option Copy/seed runs only when WPML is active **and** the field preference is set explicitly (type default `copy-once` does not auto-seed). qTranslate-only sites, Bricks `{acf_*}` / `massoftind_fb_option`, Elementor, and Content Order paths are unchanged. Admin Repeater/Group Layout remains editor-only.

## 1.9.172 — 2026-08-25

- Fix: WPML field preference “Don’t translate” (`ignore`) was wiped on Save — DOM sync iterated every radio and unchecked options wrote `''`, so refresh fell back to Copy once. Skip unchecked radios when reading settings.

## 1.9.171 — 2026-08-25

- New: Repeater and Group fields include a Layout setting (Block / Table / Row) so each section can change how sub fields appear in the WordPress editor only. Stored values, `have_rows` / `get_field`, Bricks, Elementor, WPML, and qTranslate are unchanged. ACF imports map root `layout` into field settings.

## 1.9.170 — 2026-08-25

- Compat: Content Order front-end menu_order hardened for Bricks/Elementor (respect explicit orderby / non-default query_vars), WPML (product + term filters unchanged), qTranslate untouched; query opt-out `massoftind_fb_skip_content_order`.

## 1.9.169 — 2026-08-25

- Fix: Content Order applies `menu_order` on the front end for enabled post types (Custom Post Order parity) so theme `WP_Query` loops no longer need a manual `orderby`. WooCommerce product queries stay untouched; term ordering remains admin-only (WPML-safe).

## 1.9.168 — 2026-08-25

- Fix: Developer Panel snippets for Site Section–only groups now use `massoftind_fb_get( 'field', 'option' )` (and matching `get_field` / `massoftind_fb_field`) instead of post-context getters.

## 1.9.167 — 2026-08-24

- Fix: Selecting Featured Image then Update left the box empty (“Set featured image”) — WordPress `wp.media.featuredImage.set()` only injects HTML into `#postimagediv .inside`. Our stable box never got the new `_thumbnail_id`, so Update saved nothing. Patch `set()` to update `#massoftind-fb-featured-image .inside` as well.

## 1.9.166 — 2026-08-24

- Fix: Featured Image UI did not match default WordPress — preview showed a full-width photo because core `edit.css` only styles `#postimagediv .inside img`, while our stable box id is `massoftind-fb-featured-image`. Mirror core sidebar styles, force admin thumbnail size `266×266`, keep header + “Click the image…” + “Remove featured image” visible.

## 1.9.165 — 2026-08-24

- Fix: Featured Image disappeared again on live CPT edit screens after 1.9.164 restored core id `postimagediv` (other plugins remove that id). Use stable id `massoftind-fb-featured-image`, keep modern `wp.media.featuredImage` modal via plugin bind, and inject a sidebar DOM fallback if the box is still missing after render.

## 1.9.164 — 2026-08-24

- Fix: Featured Image click opened legacy thickbox (“Add media files from your computer”) instead of the default WordPress modal with **Set featured image** — WordPress `media-editor.js` only binds `#postimagediv #set-post-thumbnail`. Restored metabox id `postimagediv`, hard-unset without false stubs, enqueue `media-editor`, and bind the modern `wp.media.featuredImage` frame.

## 1.9.163 — 2026-08-24

- Fix: Featured Image missing on Image Gallery / CPT UI edit screens **only while Field Builder is active** — root cause: `edit_form_after_title` called core `do_meta_boxes()`, which sets a request-wide `$already_sorted` flag and can permanently drop side boxes (including Featured Image) after `remove_meta_box` left a false stub. After-title groups now paint without that call.
- Fix: Register Featured Image as `massoftind-fb-featured-image` (not core `postimagediv`) so other removers cannot wipe it; hard-unset our id instead of `remove_meta_box` false stubs.

## 1.9.162 — 2026-08-24

- Fix: Featured Image still missing on CPT UI Image Galleries after 1.9.161 — normalize `WP_Screen` vs string on `do_meta_boxes`, force theme `post-thumbnails` to global `true`, re-add `postimagediv` on `admin_head` (last chance before paint), mark box block-editor compatible (not back-compat), print unhide CSS in `admin_head` + dedicated style handle.

## 1.9.161 — 2026-08-24

- Fix: Featured Image still missing on CPT UI Image Galleries after 1.9.160 — re-add `postimagediv` on `do_meta_boxes` (plugins often remove it after `add_meta_boxes`), force for all custom `show_ui` post types, use `high` sidebar priority, CSS unhide.

## 1.9.160 — 2026-08-24

- Fix: Featured Image on CPT UI post types (Image Galleries) — force thumbnail support for every CPT UI type, re-add `postimagediv` at priority 9999, and remove it from the Screen Options hidden list so the box always appears in classic editor.

## 1.9.159 — 2026-08-24

- Fix: Taxonomy **Add** form — after AJAX add-tag, Field Builder fields (Category Image, etc.) now reset. Core only cleared visible inputs, so hidden image IDs/previews stayed on the form.
- New: Taxonomy list table column for Image fields so Category Image thumbnails appear next to term names.

## 1.9.158 — 2026-08-24

- Fix: Featured Image missing on CPT UI post types (e.g. `imagegallery`) — when Field Builder registered the CPT first without `thumbnail`, CPT UI could not re-register. Now restores CPT UI Featured Image support, theme post-thumbnails, and re-adds the classic editor metabox.

## 1.9.157 — 2026-08-24

- Fix: **Featured Image on CPT UI post types** (and any CPT with `thumbnail` support) — metabox, Set featured image button, theme thumbnail support, and media scripts now apply when Field Builder field groups are attached, not only for post types registered inside Field Builder.

## 1.9.156 — 2026-08-21

- Fix: Gallery Logos UI — overlapping thumbs / stacked Edit× icons after reorder (jQuery UI Sortable + flex; also when gallery sits in a hidden meta tab).
- Fix: Gallery uses float layout, clears leftover absolute positioning, refreshes on meta-tab switch.
- Compat: Admin UI only — Bricks, Elementor, WPML, and qTranslate value/rendering paths unchanged.

## 1.9.155 — 2026-08-21

- Fix: Gallery field — reordering images no longer leaves duplicate Edit/Remove icons; improved drag helper/placeholder.
- New: Repeater rows are drag-sortable via a grip handle (order persists on save).
- Fix: Content Order — correct per-page offset when saving, more reliable sortable init, re-bind after Quick Edit.
- Compat: Bricks, Elementor, WPML, and qTranslate paths unchanged.

## 1.9.154 — 2026-08-21

- Fix: `get_field( $name, get_queried_object() )` / `massoftind_fb_get()` accept `WP_Term` objects (ACF parity) so taxonomy term banners and term meta render on archives.
- Compat: Bricks, Elementor, WPML, and qTranslate paths unchanged — term values still run through `massoftind_fb_format_value`.

## 1.9.153 — 2026-08-20

- Fix: Menu SVG icons — convert theme `<img class="menu_svg_image" src="….svg">` to sanitized inline `<svg>` on the front end (no theme edit). Works even when Allow SVG Uploads is off.
- Note: Allow SVG Uploads remains upload-only. Front-end menu inlining is separate.

## 1.9.152 — 2026-08-20

- Fix: `get_field( $name, $item )` / `massoftind_fb_get()` accept menu item objects (ACF parity) so Appearance → Menus fields like Menu SVG resolve on the front end.
- Fix: Template-compat post ID normalizer extracts `->ID` from objects instead of falling back to the current page.
- Fix: Image fields on `nav_menu_item` return a URL string (unless Return Format is Image Array) so existing `<img src="' . $icon . '">` theme filters work without edits.

## 1.9.151 — 2026-08-20

- New: **Elementor Dynamic Tags** — Massoftind Field / Image / URL / Gallery / Color / Number group for CMS page building without ACF.
- New: Settings → **Elementor Dynamic Tags** (on by default); source Current post/term or Site Sections / Options.
- Compat: Bricks, WPML, and qTranslate paths unchanged.

## 1.9.150 — 2026-08-20

- New: Location rule **Menu Item** (`nav_menu`) — attach fields to Appearance → Menus items (ACF-compatible, e.g. Menu SVG).
- New: ACF import maps `nav_menu` / `menu_item` / `nav_menu_item` location rules; values save as `nav_menu_item` post meta for `get_field( $name, $item_id )` (Elementor Pro, Bricks, themes).
- Compat: WPML menu-item duplicates disconnect on save; qTranslate still formats via existing `massoftind_fb_format_value` on get.

## 1.9.149 — 2026-08-20

- Fix: Bricks loop `get_field()` values run through `massoftind_fb_format_value` again (qTranslate `[:lang]` decode).
- Fix: Stale Massoftind repeater context clears when Bricks starts a non-MFB query; container-root gating still blocks Our Story–style tag theft.
- Fix: Bricks text/link dynamic data applies the same format filter before shortcodes.

## 1.9.148 — 2026-08-20

- Fix: Nested `have_rows( 'group_field' )` inside a repeater/group (e.g. `video_section` in `banner_section`) no longer drops associative group values — hero video loops work again.

## 1.9.147 — 2026-08-20

- Fix: Bricks repeater loop tags like `{acf_item_repeater_item_heading}` render again (Mission / Why Live Local empty boxes).
- Fix: Loop-row resolution matches the active repeater path (not a shorter FieldCatalog root), and settings no longer wipe loop tags before the loop runs.
- Fix: `get_field()` reads the active Bricks Massoftind loop row so Bricks' native ACF provider gets sub-field values.

## 1.9.146 — 2026-08-20

- Fix: `get_sub_field()` keeps numeric attachment IDs (instead of converting them to arrays) when the sub-field definition is missing, so `wp_get_attachment_image()` works with Image ID return format.
- Fix: Stronger repeater parent lookup when resolving nested image/file sub-fields.
- New: `massoftind_fb_attachment_image()` / `massoftind_fb_get_attachment_image()` helpers that render SVGs and other attachments that `wp_get_attachment_image()` skips.

## 1.9.145 — 2026-08-20

- Fix: Bricks query loops no longer leave stale row context that steals later `{mfb_*}` / group field tags (e.g. Our Story after Mission/Vision).
- Fix: ACF Star Rating Field import type `star_rating_field` maps to native Star Rating so admin no longer shows "This field type is not available."
- Fix: Bricks dynamic data for `star_rating` fields outputs star HTML instead of a bare number.

## 1.9.144 — 2026-08-20

- Fix: `[current_year]` and other shortcodes in Text/Textarea/Site Section fields expand in Bricks output (`do_shortcode` on Bricks DD + `massoftind_fb_format_value`).

## 1.9.143 — 2026-08-20

- Fix: Catalog/service/homepage sections empty — option fallback works for legacy ACF Options keys and Site Sections even when the field group matches the front page.
- Fix: Bricks Heading/Text/Link `{acf_*}` resolved in element settings before render.
- Fix: WPML post-only fields still never inherit globals; legacy option detection added.

## 1.9.142 — 2026-08-20

- Fix: Bricks `{acf_*}` global / Site Section fields load without `:option`. `get_field()` and `get_field_object()` fall back to wp_options so footer, homepage, and contact fields populate.
- Fix: Nested group and underscore-path option fields (`footer_connect_section_heading`) resolve from group storage.
- Fix: Option fallback only for Site Section fields — never overrides empty post meta on WPML/qTranslate post fields that share a name.

## 1.9.141 — 2026-08-20

- Fix: Bricks Logo/Image fatal (`preg_split(): array given`). Removed early `render_tag` at priority 5 — it returned image arrays before Bricks' native ACF provider, crashing Logo elements in the footer.
- Fix: Logo element dynamic image fields resolve via `filter_element_settings`.

## 1.9.140 — 2026-08-20

- Fix: Bricks `{acf_*}` tags render again. Re-enable Bricks' native ACF provider (with MFB `get_field_object()`) and resolve tags at priority 5 via BricksSupport — 1.9.139 had removed the provider, which left raw `{ACF_…}` visible in footers and headings.
- Fix: Site Section / options lookups try the full field path (`footer_connect_section_heading`) for ACF Options Page parity.

## 1.9.139 — 2026-08-20

- Fix: Bricks Builder `{acf_*}` dynamic data no longer fatals on `get_field_object()` when ACF is replaced by Field Builder.
- Fix: Unregister Bricks' native ACF dynamic-data provider when only the MFB shim exists. `{acf_*}` resolves via MFB BricksSupport so WPML (WpmlSupport) and qTranslate (QTranslateSupport) are not fighting provider-acf.php.
- Fix: Bricks-only installs load minimal helpers (`helpers/bricks-template-compat.php`) when full template compatibility is disabled.

## 1.9.138 — 2026-08-18

- Fix: Repeater `have_rows()` existence checks (tab nav) plus later `if`/`while` no longer abort the loop before `the_row()` — product Documents tabs render again.
- Fix: Do not define `function acf()` in the ACF shim. qTranslate-X and ACFML were treating the shim as real ACF (fatals on alsof, empty/invalid field data on fasadenor). WP All Import still uses `class_exists('acf')`.
- Fix: `get_sub_field()` returns an ACF-style file array for attachment IDs when the sub-field definition cannot be resolved.

## 1.9.137 — 2026-08-18

- Fix: Restore `acf_get_field_type()` on the ACF shim so qTranslate-X ACF admin no longer fatals on `admin_init` when ACF is not installed.

## 1.9.136 — 2026-08-18

- Fix: WP All Import ACF Add-On no longer fatals after each imported post (`acf_save_post_revision()` missing). The ACF shim now provides revision helpers plus `acf_extract_var()`.

## 1.9.135 — 2026-08-17

- Fix: Load the ACF compatibility shim at plugin include time (not `plugins_loaded`) so WP All Import ACF Add-On Pro can activate without echoing “Advanced Custom Fields must be installed” (210 characters of unexpected output).

## 1.9.134 — 2026-08-17

- New: ACF plugin compatibility layer — when ACF is not installed, expose `class acf` and `acf_get_field_groups()` / `acf_get_fields()` so WP All Import ACF Add-On Pro can activate and map Massoftind field groups.
- Fix: WPML no longer marks structured Field Builder meta as `encoding=json` (that caused "String is not valid JSON" and made the plugin look unconfigured).
- Fix: Field group definition meta (`_massoftind_fb_fields`, settings, location rules) is registered with WPML as Copy, like ACF field groups.

## 1.9.133 — 2026-08-17

- Fix: Plugin Check `MissingVersion` — Google Maps API `wp_enqueue_script()` now uses `MASSOFTIND_FB_VERSION` (admin + frontend).
- Fix: Plugin Check `stable_tag_mismatch` — readme Stable tag matches plugin header (`1.9.133`).

## 1.9.132 — 2026-08-13

- New: Google Map field type with Places Autocomplete, draggable admin marker, and frontend helpers (`massoftind_fb_google_map`, `massoftind_fb_google_map_html`, `massoftind_fb_the_google_map`) supporting interactive and static embed modes.
- New: Google Maps API Key plugin setting (Field Builders → Settings).

## 1.9.117 — 2026-08-12

- Fix: qTranslate-X Language Switching Buttons on Site Section option pages (e.g. General Options). Registered `admin.php?page=massoftind-fb-site-section-*` in qTranslate admin-config so LSB JS loads, marked WYSIWYG editors multilingual, and re-hooked fields on those screens.

## 1.9.116 — 2026-08-12

- Fix: Repeater/Group WYSIWYG paragraphs lost after Update. Nested editors on page load now use native `wp_editor()` (same as the working top-level field) instead of broken deferred TinyMCE init. Save sync runs on publish/save click and form submit.

## 1.9.115 — 2026-08-12

- Fix: Repeater/Group WYSIWYG paragraph breaks after save. Nested editors now clone TinyMCE settings from the working top-level `wp_editor()` instance, load the `wordpress` plugin (wpautop/removep), convert stored `<p>` HTML back to line breaks for the textarea, and normalize plain-text saves with `wpautop`.

## 1.9.114 — 2026-08-12

- Fix: TinyMCE error `Failed to load plugin url: .../tinymce/A` on WYSIWYG fields. Passing `external_plugins` as a PHP array into `wp_editor()` was stringified as `"Array"`, so TinyMCE tried to load single-letter plugin URLs. Top-level editors now rely on core `mce_external_plugins`; repeater/group deferred editors receive a proper JSON object.

## 1.9.113 — 2026-08-12

- Fix: WYSIWYG inside Repeater / Group / Accordion / Tabs now keeps Enter / paragraph line breaks after save. Deferred editors use the same TinyMCE `wpautop` + paragraph settings as top-level fields, apply core `tiny_mce_before_init` filters, and sync editor HTML to the textarea before form submit.

## 1.9.112 — 2026-08-10

- Fix: Critical error `preg_split(): array given` in Bricks `dynamic-data-parser.php` on Image elements. Massoftind now resolves image dynamic data in `bricks/element/settings` (writes attachment `id`, removes `useDynamicData`) so an ID array is never passed through `bricks/dynamic_data/render_tag` into Bricks' parser. Filter priority set to `PHP_INT_MAX` for remaining tag renders.

## 1.9.111 — 2026-08-10

- Fix: Critical error on Services/Bricks Image tags — `TypeError: preg_split(): array given` in Bricks `dynamic-data-parser.php`. Massoftind `render_tag` now runs at priority 999 (after Bricks providers) so returning an attachment ID array for image context no longer breaks the parser.

## 1.9.110 — 2026-08-10

- Fix: Bricks Image elements using `{acf_*}` / `{mfb_*}` now receive an array of attachment IDs (Bricks reads `$images[0]`). Previously a JSON/object string could leak into `src`, producing broken images (`src="{"`) on pages like Services.

## 1.9.109 — 2026-08-10

- Fix: Bricks Dynamic Data — Site Section / Options Page fields (e.g. General Options → Footer Connect) now render for plain `{acf_field}` tags. Previously only post meta was read unless the tag used `:option`.

## 1.9.108 — 2026-08-10

- Fix: **Bricks integration never loaded** — `BRICKS_VERSION` is defined by the Bricks theme after `plugins_loaded`, so BricksSupport never registered Dynamic Data filters. Boot moved to `after_setup_theme`. Explains live sites printing `{acf_*}` despite Settings toggles ON.
- Enhancement: Settings shows runtime status for Bricks ACF alias (ACF active vs alias on).

## 1.9.107 — 2026-08-10

- Fix: Bricks Dynamic Data — resolve `{ACF_…}` / `{acf_…}` case-insensitively so UPPERCASE mistyped tags no longer render as literal text.

## 1.9.106 — 2026-08-10

- Fix / audit: **Bricks ACF Pro Dynamic Data parity** (ACF inactive + alias on):
  - Query Loop keys match Bricks: `acf_{field}` / `acf_{group_nested_loopable}` (not bare names only).
  - Longest-match root field resolution so names like `key_points_title` are not truncated at the first `_`.
  - Nested loops (repeater/gallery/relationship inside repeater or group) read from the active parent row.
  - Flexible/layout_blocks: `{acf_get_row_layout}`, `{acf_flex_layout_sub}` strip layout slug inside the loop.
  - Formatters: toggle/`true_false`, radio/button_group, dates, color, link/page_link, YouTube, image `:size`, google_map address/latlng text.
- Honest gaps: no native Massoftind `icon_picker` / map UI (import maps oembed→url, google_map→text, page_link→link, button_group→radio, flexible→layout_blocks); user-meta location fields not fully mirrored; Bricks date-as-Unix filter mode not replicated; alias never intercepts while ACF Pro is active.

## 1.9.105 — 2026-08-10

- Improved: **Bricks ↔ ACF Pro parity** (when ACF is off): nested group underscore paths; `layout_blocks`/flexible query loops + `{acf_get_row_layout}`; relationship / post_object / gallery loops with `setup_postdata`; toggle/`true_false` + YouTube format fixes; image `:size`. Based on Bricks `provider-acf.php` tag/loop conventions.

## 1.9.104 — 2026-08-10

- New: **Bricks ACF tag alias** — with ACF deactivated, Bricks `{acf_*}` Dynamic Data and repeater loops whose query type is the field name are served by Massoftind (`massoftind_fb_get`). No Bricks template or core changes. Off automatically while ACF is active. Settings → Bricks ACF tag alias.

## 1.9.103 — 2026-08-10

- New: **Bricks Builder integration** — `{mfb_*}` Dynamic Data tags via `massoftind_fb_get()` (safe with ACF Pro active); `{mfb_option:}`; image `:id`/`:url`; term context; Query type **Massoftind Repeater** + `{mfb_row:*}`. Settings toggle **Bricks Dynamic Data** (default on). Does not override Bricks’ ACF provider.

## 1.9.102 — 2026-08-07

- Fix: **WPML term meta sync** — Copy / Copy once / Translate had no effect on product categories (`product_cat`) because sync only handled postmeta. Now seeds/syncs Field Builder term meta across WPML term translations (NO → EN), including when opening the English term edit screen.

## 1.9.101 — 2026-08-07

- Fix: **`have_rows()` / `the_field()` term selectors** — template-compat was running `product_cat_{id}` / `term_{id}` through `normalize_post_id()` (→ `false`), so taxonomy repeaters never looped on the front end even though FieldValueService already supported them. Same pass-through as `get_field()`.

## 1.9.96 — 2026-08-07

- Fix: **Instructions HTML stripped on save** — group JSON was sanitized with `sanitize_text_field` (removes all tags) before field sanitization. Basic HTML like `<strong>` now survives Save / page refresh.

## 1.9.95 — 2026-08-07

- Fix: **Instructions HTML** — `strong` / `b` / `em` display correctly (CSS was forcing regular weight); decode escaped tags from older saves.
- Fix: **WPML Translation** radio cards — native WP radio decoration no longer covers the first letter of each option.

## 1.9.91 — 2026-08-07

- Enhancement: **Field Trash in group editor** — deleting a top-level field moves it to Trash (All | Trash tabs). Restore or permanently delete; Empty Trash supported. Trash is saved with the field group.

## 1.9.90 — 2026-08-07

- Fix: **Trash** tab linked to unregistered `page=massoftind-fb` (“Sorry, you are not allowed…”). Correct URL is `page=massoftind-fb-field-groups&status=trash`.

## 1.9.89 — 2026-08-07

- Enhancement: **Field Groups Trash** — deleting a group moves it to Trash (All | Trash tabs). Restore or permanently delete from Trash; Empty Trash supported.

## 1.9.88 — 2026-08-07

- Enhancement: **Developer Panel** toggle button in the field group editor header (and × in the panel). Open/closed state is saved in `localStorage`. Settings → Developer Panel still disables the panel entirely.

## 1.9.87 — 2026-08-07

- Fix: **Field Instructions** — `<strong>`, `<em>`, `<a>`, and other basic HTML are preserved on save and rendered on post/term edit screens (were stripped / escaped before).

## 1.9.86 — 2026-08-07

- Improved: **WPML Translation UI** — radio cards with short hints for Don't translate / Copy / Copy once / Translate (replaces the select dropdown).

## 1.9.85 — 2026-08-07

- New: **WPML per-field Translation** — Field Builder shows Don't translate / Copy / Copy once / Translate (when WPML is active). Preference is stored as `settings.wpml` and pushed to WPML Custom Fields Translation on group save.

## 1.9.84 — 2026-08-07

- Fix: **`have_rows()` on taxonomy terms** — `product_cat_{id}` / `term_{id}` selectors were cast to `0`, so category repeaters never looped on the front end.

## 1.9.83 — 2026-08-06

- Fix: **WYSIWYG** — TinyMCE no longer removes attribute-less `<span>` wrappers when switching Visual ↔ Code or on update (iframe embeds still allowed).

## 1.9.82 — 2026-08-06

- Fix: **Relationship → User** — when Type Settings **Filter by Role** is set (e.g. Administrator), Available users are locked to that role; the toolbar no longer offers All Roles / other roles. The role dropdown appears only when Filter by Role is **All Roles**.

## 1.9.81 — 2026-08-06

- New: **Relationship → User** — toolbar **All Roles** is an interactive dropdown (All Roles + each WP role) that filters Available users via AJAX.

## 1.9.80 — 2026-08-06

- Fix: Field Group editor — on load, the first field is selected **and** highlighted in the left list (`is-active`), matching click selection.

## 1.9.79 — 2026-08-06

- Fix: **Location taxonomy labels** — duplicate labels (Category / Tag for blog vs WooCommerce) now show `(slug)` beside the label, e.g. `Category (product_cat)`.
- Fix: **Taxonomy term screens** — field groups assigned with `Taxonomy is equal to …` now render on Add/Edit term screens (including Product Categories) and persist via term meta.

## 1.9.78 — 2026-08-05

- Fix: **Featured Image on Add New** for Field Builder post types (e.g. Home Banner) — “Set featured image” is always visible (button style) and no longer depends on the `hide-if-no-js` class that could leave an empty Featured Image box.

## 1.9.77 — 2026-08-05

- New: **Relationship → Filter by Role** — when Filter by Post Type is **User**, Type Settings shows **Filter by Role** with **All Roles** plus each WordPress role; Available users are filtered accordingly.
- Fix: Field builder sidebar **Delete** tooltip no longer sticks after keyboard/focus (hover-only on field list actions).

## 1.9.76 — 2026-08-05

- Fix: **Relationship** — clearing Selected (click × then Update) now saves empty correctly. An empty sentinel input is posted so meta is wiped instead of keeping the previous IDs (User mode and posts).

## 1.9.75 — 2026-08-05

- New: **Relationship → User** — Filter by Post Type can be set to **User**; Available lists all users (searchable); Selected stores user IDs; `format_value` returns `WP_User` objects (or IDs).
- Fix: Taxonomy filter placeholder remains dynamic (Select Category / Tag / …).
- Fix: Post Type **All** expands to all UI post types.

## 1.9.74 — 2026-08-05

- Fix: **Relationship** — term dropdown shows **Select Category** / **Select Tag** / etc. from Filter by Taxonomy (not generic “Select taxonomy”).
- Fix: **Relationship** — Filter by Post Type **All** expands to all UI post types; toolbar filter first option is **All**.

## 1.9.73 — 2026-08-05

- Improved: **Image field UI** — empty state shows **Select Image**; after select, thumbnail with circular **Edit** (pencil) and **Remove** (×) overlays (same pattern as Gallery). Click the thumbnail to replace.
- Improved: Media Attachment Details label **External URL** → **Link URL** (storage key `external_url` unchanged).

## 1.9.72 — 2026-08-05

- Fix: **WYSIWYG `[embed]` / oEmbed** — YouTube (and other) embeds no longer render as blank space. WordPress registers `[embed]` as `__return_false`; the plugin now runs `WP_Embed` before `do_shortcode`. Echo with `massoftind_fb_kses_wysiwyg()` (not `wp_kses_post()`, which strips iframes).

## 1.9.71 — 2026-08-04

- Fix: **Content Order + WPML** — removed custom `get_terms` JOINs that made Product/Blog category admin lists show “No categories found” while language counts still showed items. WooCommerce categories use WC `order` meta; other taxonomies use native `term_order`.

## 1.9.70 — 2026-08-04

- Fix: **Content Order + WooCommerce Product categories** — drag order now also updates WooCommerce term meta `order`, so the list keeps the new order after refresh (WPML language tabs included).

## 1.9.69 — 2026-08-04

- Fix: **readme.txt** — Tags limited to 5 (`readme_parser_warnings_too_many_tags`).

## 1.9.68 — 2026-08-04

- New: **Taxonomy multi-select drag reorder** — drag selected term tags (e.g. Select Popular Categories) to change order; order is saved.

## 1.9.67 — 2026-08-04

- Fix: **Content Order** — WooCommerce `product_cat` / `product_tag` (and related) selections are saved again; ordering applies on admin term lists only so front-end archives stay safe.
- Improved: Unrelated **admin notices** (shipping / third-party alerts) are hidden on Field Builder admin pages.

## 1.9.66 — 2026-08-04

- Docs: Expanded WordPress.org **Details** — Highlights, full field list, gallery External URL/Target, Min/Max, WPML, integrations, helpers, FAQ.

## 1.9.65 — 2026-08-04

- Fix: Plugin Check **NonPrefixedHooknameFound** for `wpml_object_id` — phpcs ignore placed on the apply_filters line (WPML public API).

## 1.9.64 — 2026-08-04

- Fix: Plugin Check **PostNotIn_exclude** warnings — relationship/term search and Taxonomy field filter exclusions in PHP instead of `post__not_in` / `get_terms( exclude )`.

## 1.9.63 — 2026-08-04

- Improved: **Link Target** media sidebar UI — 2×2 segmented control (New tab, Same window, Parent, Top) instead of a plain dropdown.

## 1.9.62 — 2026-08-04

- Improved: **External URL + Link Target** live entirely in Massoftind Field Builder (no theme `functions.php` require).

## 1.9.61 — 2026-08-04

- Fix: **External URL + Link Target** appear in Media Attachment Details (plugin registers fields; child theme `require` restored).

## 1.9.60 — 2026-08-04

- Improved: **Gallery / Image Array** — includes optional attachment `external_url` and `target` (from media sidebar meta).
- Improved: **`massoftind_fb_gallery_html()`** — when lightbox is off and an External URL is set, wraps images with that link + target.
- Improved: Gallery developer examples show how to use `external_url` / `target` in theme loops.

## 1.9.59 — 2026-08-04

- New: **Taxonomy Min / Max** — optional selection limits appear when **Allow Multiple** is enabled (enforced in the picker and on save).

## 1.9.58 — 2026-08-04

- Fix: **Relationship + WPML** — Selected posts resolve to the current admin language for titles/IDs (Available and Selected stay in sync).
- New: **Relationship Min / Max** — optional selection limits appear when **Allow Multiple** is enabled.

## 1.9.57 — 2026-08-04

- Improved: **Exclude Terms toggle** — enable the toggle to show “Search terms to exclude”; disable it to hide the picker (exclusions are ignored while off).

## 1.9.56 — 2026-08-04

- Improved: **Exclude Terms** is shown only when **Allow Multiple** is on.

## 1.9.55 — 2026-08-04

- Improved: **Exclude Terms UI** — searchable tag/pill picker in Taxonomy Type Settings (replaces the old native multi-select box).

## 1.9.54 — 2026-08-04

- Fix: **Taxonomy multi-select order** — tags and saved values keep the order you pick (Advisors → Core Team no longer reorders by name).
- New: **Exclude Terms** multi-select in Taxonomy Type Settings (beside Return Format); those terms are omitted from the edit-screen picker and term search.

## 1.9.53 — 2026-08-04

- Fix: **Settings panels full width** — Preferences, Field Usage Guide, and Filters & Hooks were constrained by the old two-column grid (~420px); they now span 100% of the content area.

## 1.9.52 — 2026-08-04

- Improved: **Settings UI** — modern segmented tabs with icons/hints, grouped preference cards, sticky save bar, refined Usage / Filters accordions and panel headers.

## 1.9.51 — 2026-08-04

- New: **Settings → Filters & Hooks tab** — documents plugin filters/actions with copy-paste examples (location rule match for all params, format_value, Site Sections, list views, WPML, etc.). Settings page split into General / Field Usage Guide / Filters & Hooks tabs.

## 1.9.50 — 2026-08-04

- Improved: **`massoftind_fb_location_rule_match` applies to all location params** — filter runs after built-in matching for taxonomy, post_type, custom, and every other rule type so themes can override match results from `functions.php`.

## 1.9.45 — 2026-08-04

- Fix: **Nested repeater Add Row stuck on “Limit reached (max 1)”** — parent repeater `max` was applied to nested Sub Field repeaters (e.g. Banner Key Points max 1 disabled Key Points Repeater Add Row even with no max). Limit UI / `data-max` now scoped to each repeater only.

## 1.9.44 — 2026-08-03

- Fix: **Norwegian + English product category 404** — Content Order is fully disabled on the front end; auto-detect missing `product-category` / `produktkategori` rewrite rules and rebuild them after WooCommerce is loaded. **You must upload this build** — sites still on 1.9.42 keep the broken front-end term filters.

## 1.9.43 — 2026-08-03

- Fix: **Product category 404 with Field Builder 1.9.42 still active** — Content Order was rewriting front-end `get_terms` (including WP/WPML `orderby=none` slug lookups), so `/en/product-category/…` and Norwegian category URLs failed. Term ordering is admin-only now; WooCommerce taxonomies cannot be enabled for Content Order; product catalog queries are left alone on the front; WPML CPT sync no longer runs on front requests. Deploy then open any page once (rewrite flush) or Save Permalinks.

## 1.9.42 — 2026-08-03

- Fix: **English/Norwegian WooCommerce product category pages 404 when Field Builder is active** — do not register or mutate `product_cat` / `product_tag` (or rewrite slugs `product-category` / `produktkategori`); remove them if stored; defer `flush_rewrite_rules` until late `init` so WooCommerce rules are included. After update, visit any admin/front page once (or Settings → Permalinks → Save) to rebuild rewrites.

## 1.9.41 — 2026-08-03

- Improved: **No re-translate required** — disconnecting WPML “Copied From the Original” keeps existing English ACF / Field Builder values on that post (fill-migrate ACF→FB on the translation only; never copy Norwegian over EN). Admin notice clarifies this.

## 1.9.40 — 2026-08-03

- Fix: **Pages / posts / products still wiped Norwegian on English Update** — root cause was WPML **“Copied From the Original”** duplicates (options were already fixed with per-language keys). On Field Builder save we now: (1) snapshot original-language meta, (2) auto **Translate independently** (remove `_icl_lang_duplicate_of`), (3) restore original meta if WPML synced during the request. Works for pages, posts, products, and other post types. Admin warning when editing a linked duplicate.

## 1.9.39 — 2026-08-03

- Fix: **Updating English Home Page no longer wipes Norwegian** — all Field Builder metas default to WPML **Copy once**; leftover **Copy** prefs are upgraded; `wpml_sync_custom_field_copied_value` blocks translation→original overwrites (duplicate / sync path); empty values are never seeded over usable meta.

## 1.9.38 — 2026-08-03

- Fix: **WPML Home Page / repeater edits wiped on English Update** — repeaters, groups, and other structural containers now default to WPML **Copy once** (not Copy), so EN edits are not re-synced from Norwegian on every save. Sync no longer downgrades Translate/Copy-once → Copy. Admin field UI reads only the translation post’s meta (no original-language fallback that made EN look like NO while saves still wrote EN).
- Improved: Plugin Check — phpcs:ignore for required WPML API filters `wpml_current_language` / `wpml_default_language` (same pattern as other WPML hooks in this file).

## 1.9.37 — 2026-08-03

- Fix: **Site Section options (Footer, etc.) are language-specific under WPML** — option keys are suffixed with the current language (`…_nb`, `…_en`). Saving in Norwegian no longer overwrites English. Unsuffixed keys remain as legacy/default-language fallback. Removed registering these options as WPML admin-texts (shared-string model caused the overwrite). Options migrate will not overwrite existing language values unless Force is used — no need to re-sync.

## 1.9.36 — 2026-08-03

- Fix: Native **Custom Fields** (`postcustom`) stays hidden/unchecked in Screen Options on all post edit screens — including CPTs — even after a user has saved Screen Options prefs (defaults alone were ignored). Override with `massoftind_fb_hide_native_custom_fields`.

## 1.9.35 — 2026-08-03

- New: Settings → **Allow SVG Uploads** toggle (default off). Enables administrator SVG/SVGZ uploads through existing `SvgSupport` (MIME allow + filetype fix). Filter `massoftind_fb_allow_svg_uploads` still overrides the setting.

## 1.9.34 — 2026-08-03

- Fix: `FieldGroupService::save()` wraps fields / location / settings JSON in `wp_slash()` before `update_post_meta()`. Without this, `wp_unslash()` strips JSON escape backslashes when text contains `"`, producing invalid meta and an empty field list in the builder (Story Single, Contact, etc.).
- Improved: `decode_json_meta()` logs a `WP_DEBUG` message when JSON decode fails so corrupted groups are easier to spot; re-save or re-import repairs them after this fix.

## 1.9.33 — 2026-08-03

- New: **Field Type** select + **Browse Fields** in General for top-level and nested sub fields (change Text → Image without recreating the field).
- Fix: Removed automatic `tamplate-` → `template-` rewrite on page template location rules (preserve exact template paths from JSON/theme).
- Fix: Import — empty `location` defaults to `post_type == post`; duplicate field keys/names in a group are uniquified (e.g. Contact `office_map` collision).

## 1.9.32 — 2026-08-03

- Improved: Repeater **Add Row** sits in a bottom footer (dashed modern CTA) so it stays reachable after scrolling long row lists; section collapse hides the footer with the rows.
- CSS: `.massoftind-fb-migrate-progress` and `.massoftind-fb-migrate-form` use `max-width: 100%`.

## 1.9.31 — 2026-08-03

- Fix: Content Sync no longer runs the entire site in one HTTP request (caused Cloudflare/WP Engine **502 Bad Gateway**). Sync now uses batched AJAX (5 posts / request + chunked WPML seeding) with an on-page progress bar. Background WPML repair also processes ~15 translations per admin page load.

## 1.9.30 — 2026-08-03

- Fix: After ACF → Field Builder migration, English (secondary) translations often stayed empty while Norwegian worked. Reads now fall back to the WPML original post when the translation has no usable meta; Tools migrate expands to all WPML siblings and re-seeds `_massoftind_fb_*` onto translations; copy/repair also materializes legacy ACF keys first; bare field names are registered in WPML Custom Fields Translation (visible without “Show system fields”).
- New one-time repair flag: `massoftind_fb_wpml_meta_repair_1_9_30` (runs when opening Field Builder admin).

## 1.9.29 — 2026-08-03

- Fix: Sync Field Builder meta keys (`_massoftind_fb_*`) into WPML → Settings → Custom Fields Translation as Copy / Copy once (updates `icl_sitepress_settings`).

## 1.9.28 — 2026-08-03

- Fix: Collapsing FAQ Repeater / Group headers correctly hides all nested rows and subfields (`display:flex` no longer overrides `[hidden]`).

## 1.9.27 — 2026-08-03

- New: Repeater field headers always include a collapse/expand control before Add Row (FAQ Repeater, copies, nested), matching Group; shows live row count.

## 1.9.26 — 2026-08-03

- Improved: Repeater row chrome — modern header bar (chevron control, gradient index badge, summary, horizontal Duplicate/Remove toolbar); Group header matches.

## 1.9.25 — 2026-08-03

- New: Repeater rows — collapse/expand toggle next to Duplicate/Remove (chevron + row number; summary when collapsed).
- New: Group fields always show a collapsible header toggle on the edit screen.

## 1.9.24 — 2026-08-03

- Fix: WPML English/empty translations — text-like fields default to copy-once; register key+name meta; seed Field Builder meta on post duplicate / translation completed; one-time repair for existing translations.

## 1.9.23 — 2026-08-03

- Fix: Tab View Left/Top works without Tab separators (one tab per top-level field); JSON import keeps tab_placement and tab markers.
- New: Repeater and Group Type Settings — Collapsible / Collapsed by default accordion headers on the post edit screen.

## 1.9.22 — 2026-08-03

- New: Field-group metaboxes on the post edit screen show an Edit Fields shortcut (manage_options) to open the Field Group builder.

## 1.9.21 — 2026-08-03

- New: Yoast SEO, Rank Math, WooCommerce, WP All Import Pro, and WP All Export Pro integrations (load only when host plugin is active).

## 1.9.20 — 2026-08-03

- Fix: Template-compat fallback load when `have_rows` is missing; `have_rows` peek guard prevents infinite loops without `the_row()`.

## 1.9.19 — 2026-07-31

- Template compatibility hardened so existing theme PHP (`get_field`, `have_rows`, `the_row`, …) and soft `acf.*` JS keep working with Field Builder alone.

## 1.9.18 — 2026-07-31

- Trademark-safe wording: removed third-party product names from public changelogs/docs/comments; internal import APIs renamed to portable/legacy helpers. Data compatibility for imported JSON and legacy meta keys is unchanged.

## 1.9.17 — 2026-07-31

- New: Content Order module — enable post types / taxonomies, drag-reorder on admin list tables, query ordering via menu_order and term meta.

## 1.9.10 — 2026-07-31

- Fix: Post Type / Taxonomy / List View / Site Section saves redirect before admin output (no headers-already-sent warnings).
- Fix: Empty portable `menu_position` (`""`) maps to default 25.

## 1.9.9 — 2026-07-31

- Fix: Mixed portable JSON imports now partition field groups, post types, taxonomies, and options pages (Site Sections).
- Fix: Portable post type / taxonomy menu icons (`{ type, value }`) and rewrite settings map correctly.

## 1.9.8 — 2026-07-31

- Improved: Field Groups bulk actions dropdown, Apply button, and row checkboxes match the dashboard UI.

## 1.9.5 — 2026-07-31

- Gallery return format defaults to Image Array (`ID`, `url`, …) for theme loops.
- Align readme Stable tag with plugin header (Plugin Check `stable_tag_mismatch`).
- Docs + readme: video walkthrough https://www.youtube.com/watch?v=6Z7VDzOmx1M
- Soften user-facing copy that referenced third-party trademarks.

## 1.9.4 — 2026-07-31

- Fix: Content Sync overwrites outdated/dead gallery IDs and other stale Massoftind meta.
- Improved: Tools page simplified — one-click Sync everything now plus advanced options.

## 1.9.3 — 2026-07-31

- Fix: Layout Blocks rebuild from portable flexible meta (layout slug lists).
- Fix: Gallery falls through when stored attachment IDs are missing.

## 1.9.2 — 2026-07-31

- Fix: Gallery / Layout Blocks no longer treat a numeric flexible count (or empty junk) in prefixed meta as the final value — fall through to legacy unprefixed rebuild.
- Fix: Legacy row heuristic keeps underscore leaf keys (layout meta key, `section_heading`).
- New: Field Groups bulk select + delete.

## 1.9.0 — 2026-07-31

- New: **Message** field (instructional text; no stored value).
- New: **Date & Time** field (`datetime`) + portable JSON import mapping.
- New: Write helpers `massoftind_fb_update()`, `massoftind_fb_add_row()`, `massoftind_fb_delete_row()`; optional template-compat aliases when enabled.
- Location rules: post status, post format, post taxonomy, attachment, user form, comment.
- Import: clone / password / message / date-time fidelity; editor-only tab markers skipped (group tab placement still detected).
- Docs/UI: avoid third-party trademarks in user-facing copy.

## 1.6.0 — 2026-07-31

- New field type: **Layout Blocks** (`layout_blocks`) — composable content sections where each row picks a named layout and its sub-fields.
- Builder: manage block layouts (label, name, nested sub-fields) on Layout Blocks fields.
- Post editor: add/duplicate/remove layout sections with a layout picker menu.
- Import: portable `flexible_content` maps to `layout_blocks` and preserves `layouts` + nested sub-fields.
- Import: groups re-import by key/title so Layout Blocks layouts replace older empty repeater imports; import key stored for future updates.
- Repair: groups that still have flexible layouts stuck in settings (or type repeater) are upgraded to Layout Blocks when loaded.
- Location rules: include CPT UI / `show_ui` post types (not only `public`).
- Theme API: `massoftind_fb_get_layout()` and template-compat `get_row_layout()`; `have_rows` / `get_sub_field` resolve the active layout’s sub-fields (including nested repeaters).
- Legacy meta: rebuild layout row keys into Layout Blocks arrays.

## 1.5.0 — 2026-07-29

- Migration helpers: optional template compatibility helpers (`get_field`, `have_rows`, `get_fields`, …) with Settings toggle.
- Legacy meta read fallback: when Massoftind meta is empty, rebuild values from unprefixed keys and repeater row keys (`name_0_sub`).
- Site Section migration: read `options_*` (and custom option roots) from `wp_options`; Tools can migrate values; helpers with `'option'` supported.
- Tools → Content Migration: detect posts with legacy field references and copy values into Massoftind meta (migrate-on-save also applies when editors update a post).
- Import: normalize location rules (page template path typos, options_page → site_section), richer type mapping, relationship/post_types fixes.

## 1.4.0 — 2026-07-29

- Optional template helper aliases when not already defined (`get_field`, `the_field`, `have_rows`, `the_row`, `get_sub_field`, `the_sub_field`, `get_row`, `get_row_index`).
- Nested `have_rows()` reads child repeaters from the current parent row and resets exhausted loops.
- Image return format `array` returns attachment arrays (`ID`, `url`, `alt`, …) while keeping numeric 0/1/2 keys for older themes.

## 1.3.61 — 2026-07-29

- Text / Textarea: always keep safe HTML tags on save (span, strong, em, i, …) — no toggle required.

## 1.3.60 — 2026-07-29

- Text / Textarea: optional "Allow basic HTML" setting so safe tags (span, strong, em, i, b, u, br, a, …) are kept on save.
- Theme helper `massoftind_fb_field()` outputs with `wp_kses` when that setting is enabled.
- Added `massoftind_fb_kses_basic_html()` / `massoftind_fb_kses_allowed_basic_html()` helpers.

## 1.3.59 — 2026-07-28

- WordPress Playground `blueprint.json` for one-click live demo.
- Dashboard onboarding checklist for first field group.
- Optional dismissible WordPress.org review nudge after a field group exists.
- readme: Playground link, clearer custom-fields keywords, screenshot captions.

## 1.3.46 — 2026-07-22

- WordPress.org review: REST permission callbacks use `manage_options` for field groups and `edit_post` for per-post field values.
- Text domain set to `massoftind-field-builder` to match the plugin slug.
- Late escaping for field/admin output (`esc_attr`, `wp_kses`, `wp_kses_post`).
- Removed generic `DFB_*` global constants.

## 1.3.44 — 2026-07-21

- Native qTranslate-X / qTranslate-XT support: Language Switching Buttons in admin; front-end helpers decode the active language.

## 1.3.43 — 2026-07-20

- WordPress.org submission polish: removed third-party trademark tags from readme; simplified PluginMeta so plugin details come from the official directory API.

## 1.3.42 — 2026-07-20

- Plugin Check WARNING fixes: php_string_literal() for developer template code; phpcs ignore for priority meta_key ordering.

## 1.3.41 — 2026-07-20

- Plugin Check ERROR fixes (translators, local assets / no CDN, wp_enqueue for details iframe).

## 1.3.40 — 2026-07-20

- WordPress.org packaging: readme.txt, license.txt, languages folder, Plugin Check cleanup.
- Removed Plugin URI (no separate product page); Author: Mass Software Solutions.
- Removed manual load_plugin_textdomain(); PDF/Word doc downloads moved out of plugin package.

## 1.3.39 — 2026-07-20

- Developer Panel: **Full Template Example** for Repeaters/Groups now includes Conditional Logic (`Show this field if`) as real PHP `if` checks.
- Fixed nested group vars overwriting parent vars (e.g. `$content` inside `$leftgroup`).
- Fields that share the same condition (e.g. left + right groups) each get their own `if`, not `elseif`.

## 1.3.38 — 2026-07-17

- Fixed Conditional Logic dropdown changes looking like a full page reload: autosave no longer rebuilds the open field settings panel after every save.

## 1.3.37 — 2026-07-17

- Date field: added **Display Format** presets (ISO, F j Y, d/m/Y, m/d/Y, full weekday, custom PHP format string).
- Date field: added **Return Format** (Raw Y-m-d or Formatted).
- New template helpers: `massoftind_fb_date()` and `massoftind_fb_the_date()` with localized output via `wp_date()`.
- Admin date preview badge when a non-ISO display format is selected.

## 1.3.36 — 2026-07-17

- Time field: added **Display Format** setting (24-Hour `15:42` or 12-Hour `03:42 PM`).
- Time field: added **Return Format** setting (Raw HH:MM or Formatted).
- New template helpers: `massoftind_fb_time()` and `massoftind_fb_the_time()` for formatted output.
- 12-hour admin preview badge shown next to the time picker when 12-Hour format is selected.

## 1.3.34 — 2026-07-17

- Field names are now auto-made unique with readable suffixes (`text_copy`, `text_2`) when duplicating fields or when names collide — no more cryptic `field_xxxxx` keys in the Name field or Developer Panel.
- Duplicating a field auto-assigns a unique name from its label (e.g. `text_copy` for "Text (Copy)").
- Existing groups with duplicate names are repaired on load and save.

## 1.3.33 — 2026-07-17

- Developer Panel: each field now gets its own section keyed by unique field key, so duplicate field names no longer collapse into one panel entry.
- Developer Panel: when multiple fields share the same name, generated code uses the field key (e.g. `massoftind_fb_get( 'field_abc123' )`) instead of the ambiguous name.
- Developer Panel selection sync now matches the selected builder field by field key.

## 1.3.32 — 2026-07-17

- Unique meta keys: fields now store values under `_massoftind_fb_{field_key}` instead of `_massoftind_fb_{field_name}`, preventing value collisions when two fields share the same name across different field groups.
- POST form data is keyed by unique field key (`massoftind_fb_fields[field_xxxx]`) to avoid browser-level overwrites for duplicate field names.
- Full backward compatibility: reads fall back to name-based meta keys for existing data; name-based storage is preserved when field names are unique.
- Field key ↔ name mapping saved per post for reliable template helper lookups.

## 1.3.31 — 2026-07-17

- Fixed empty field groups on edit screens when a Group/Repeater/Accordion/Tabs field had Conditional Logic targeting its own sub-fields (e.g. BannerGroup hidden until radio = video).
- Multiple page template location rules (OR) continue to work; invalid container conditional logic is now stripped on load and save.

## 1.3.30 — 2026-07-17

- Developer Panel: Group "Full Template Example" now generates `if` / `elseif` code from sub-field Conditional Logic (e.g. show image when radio is image, video when radio is video).
- Developer Panel: sub-fields with Conditional Logic get a dedicated "Conditional Logic Template" snippet.

## 1.3.29 — 2026-07-17

- Developer Panel: removed Group field "Full Template Example" (long markup dump). Use per-sub-field snippets or `massoftind_fb_group_get()` instead.
- Developer Panel: removed Video field "Full Markup" example; use `massoftind_fb_video()` instead.

## 1.3.28 — 2026-07-17

- Fixed `massoftind_fb_get()` for duplicate field names (e.g. two Group fields both named `group`): stored meta keys now pick the correct field definition instead of returning an empty group array.

## 1.3.27 — 2026-07-17

- Conditional logic: hidden fields no longer disable their inputs, so values (e.g. BannerGroup image while Video is selected) still save.
- Group fields: sub-values missing from POST are preserved from existing meta instead of being wiped.

## 1.3.26 — 2026-07-17

- Field labels: removed `text-transform: uppercase` so labels keep their original casing.

## 1.3.25 — 2026-07-17

- Instructions now show under each field label on edit screens .
- Repeater/accordion/tabs AJAX rows keep instructions, wrapper width, and other field meta.
- Broken import text like `u00d7` is shown as `×`.

## 1.3.24 — 2026-07-17

- Wrapper Width placeholder restored to `50%`.
- Repeater/accordion/tabs: default fields stay 100% wide; custom widths apply on the column wrapper so nested fields no longer crowd into one row.

## 1.3.23 — 2026-07-17

- Wrapper Width: default fields stay 100% wide; custom widths (e.g. 33.33%) only apply when set and sit side-by-side.

## 1.3.22 — 2026-07-17

- Wrapper Width: fields with widths like 33.33% now sit side-by-side in meta boxes, repeaters, groups, accordions, and tabs (was forced to a vertical stack). Bare numbers (e.g. 50) are treated as percentages.

## 1.3.21 — 2026-07-17

- Import JSON: accept portable field-group JSON exports (top-level groups array) and convert them to Massoftind Field Builder format; clearer Import page copy.

## 1.3.20 — 2026-07-16

- Shortcode field UI refreshed: modern shell, badge toolbar, monospace editor, example chips.

## 1.3.19 — 2026-07-16

- New Shortcode field type: paste any WordPress shortcode and output with do_shortcode() / massoftind_fb_the_shortcode().

## 1.3.18 — 2026-07-15

- Repeater max-rows tooltip: positioned left so it is not clipped; shorter tip text; Duplicate hidden at max; click still shows full toast.

## 1.3.17 — 2026-07-15

- Repeater Maximum Rows: clicking + or Duplicate at the limit shows a toast message; Add and Duplicate look disabled when at max.

## 1.3.16 — 2026-07-15

- Location Rules: modern menu placement panel — full-width card, clear menu dropdown, Before/After toggle pills, status badge.

## 1.3.15 — 2026-07-15

- Removed “Show as top-level menu / Place” block from the Site Section Edit Values screen (set menu placement in Location Rules instead).

## 1.3.14 — 2026-07-15

- Site Section menu UI: Place dropdown sits beside the menu dropdown (not stacked), with a live “After Portfolios” preview.
- Group panels show a clear Edit icon + “Edit Fields” link.

## 1.3.13 — 2026-07-15

- Site Section menu placement: pick any top-level admin menu and place Before or After it (own top-level item).
- Default is no selection — section stays under Site Sections until a menu is chosen.
- Saving a field group with menu placement now reloads so the admin sidebar updates.

## 1.3.12 — 2026-07-15

- Site Section Location Rules: new “Show in admin menu” option — Massoftind (Site Sections) or Appearance.
- Sections placed under Appearance appear in the WP Appearance menu; default stays under Site Sections.
- Site Section Edit + index cards show/can change the menu placement.

## 1.3.11 — 2026-07-15

- Location Rules helper text simplified (removed old page-template examples).
- Site Section Edit: each field group header has an Edit Fields icon; empty groups show a clear Edit Fields CTA.

## 1.3.10 — 2026-07-15

- Site Sections Theme usage: code panels start collapsed; open only on click.

## 1.3.9 — 2026-07-15

- SVG support: administrators can upload SVG/SVGZ; Image fields preview SVGs; `wp_get_attachment_image()` / `massoftind_fb_image()` inline SVG safely.

## 1.3.8 — 2026-07-15

- Unified admin action UI across Field Groups, Site Sections, Dashboard, Builder, Repeater/Accordion/Tabs: circular icons + dark hover tooltips.
- Site Sections pages now use the same page-hero / dash-button chrome as Field Groups.

## 1.3.7 — 2026-07-15

- Site Sections cards: Edit Values / Edit Fields / Delete use the same icon + dark tooltip UI as Field Groups.

## 1.3.6 — 2026-07-15

- Field Groups actions: icon-only Edit / Duplicate / Delete with dark hover tooltips (matches builder sidebar).

## 1.3.5 — 2026-07-15

- Site Sections Theme usage: removed generic Basic/Repeater intro blocks; only real field code is shown.

## 1.3.4 — 2026-07-15

- Site Sections cards: cleaner action footer — Edit Values + Edit Fields side by side, Delete as a quiet link.

## 1.3.3 — 2026-07-15

- Site Sections Theme usage: collapsible usage-guide UI (type badge, label, variable, copy button) matching Settings.

## 1.3.2 — 2026-07-15

- Site Sections Theme usage: shows real PHP snippets per field, including Repeater foreach via `massoftind_fb_option()`.

## 1.3.1 — 2026-07-15

- Builder: Group / Repeater remain available when adding sub-fields inside nested containers (unlimited nesting).
- Developer Panel: nested Group / Repeater template code now generates correct nested loops and group output.

## 1.3.0 — 2026-07-15

- Builder: allow Group / Repeater (and other containers) as nested sub-fields at any depth so you can nest Group → Sub Fields → Repeater → Sub Fields repeatedly.

## 1.2.99 — 2026-07-15

- Site Sections: fixed field groups not showing on Edit Values (slug matching); restored Delete; clearer slug helpers and Edit Fields links.

## 1.2.98 — 2026-07-15

- Site Sections: removed the Add Site Section form; sections appear automatically from field groups that use the Site Section location rule.

## 1.2.97 — 2026-07-15

- Site Sections: removed default Header/Footer; create your own sections (e.g. header-section, footer-section) from the Site Sections screen.

## 1.2.96 — 2026-07-15

- Site Sections: global Header/Footer (and extensible) admin screens with Site Section location rule; save/load via `massoftind_fb_option()`.

## 1.2.95 — 2026-07-15

- Gallery/Image Edit: preselects the clicked attachment using WordPress Featured Image selection logic so Attachment Details (Alt, Title, Caption, Description, Edit Image) loads correctly.

## 1.2.94 — 2026-07-15

- Image/Gallery Edit opens Media Library Attachment Details (Alt Text, Title, Caption, Description, File URL, Edit Image) instead of a blank crop modal.

## 1.2.93 — 2026-07-15

- Code Editor UI now uses the plugin light theme tokens (white/surface) instead of a black editor chrome.

## 1.2.92 — 2026-07-15

- Image & Gallery Edit now opens WordPress core Edit Image (crop / rotate / scale), same as Media Library → Edit Image.

## 1.2.91 — 2026-07-15

- Code Editor: modern full-width UI with toolbar + WordPress CodeMirror syntax highlighting on the post edit screen.

## 1.2.90 — 2026-07-15

- Video Developer Panel: when Return Format is HTML Player, Full Template generates `echo massoftind_fb_get()` (working code) instead of Array `$field['url']` markup.

## 1.2.89 — 2026-07-15

- Video: fixed admin select/preview both showing (`[hidden]` vs `display:flex`). Clarified that Return Format HTML Player returns a string — Full Template Array markup needs Return Format Array.

## 1.2.88 — 2026-07-15

- Video: Playback options (Autoplay, Loop, Mute, Unmute) moved to Type Settings. Frontend overlay uses SVG Play/Pause and Mute/Unmute buttons only (like the reference control style).

## 1.2.87 — 2026-07-15

- Video Developer Panel Full Template now generates the complete player markup (wrapper, video URL/source, and full controls bar).

## 1.2.86 — 2026-07-15

- Video: fixed broken custom control bar layout (nowrap + styled seek/volume thumbs); removed redundant Unmute text button; Developer Panel uses full multi-line template snippets for HTML Player.

## 1.2.85 — 2026-07-15

- Video: fixed frontend display when Return Format is HTML Player (`massoftind_fb_video` / `echo massoftind_fb_get`). Developer Panel snippets now match the selected return format.

## 1.2.84 — 2026-07-15

- Group, Repeater, and Accordion Full Template / Developer Panel snippets now share one type-aware generator for all sub-field types (File, Checkbox, Gallery, Link, Post Object, Taxonomy, Video, etc.).

## 1.2.83 — 2026-07-15

- Developer Panel / Group snippets for File fields now output a download link from the File Array (url/name) instead of casting arrays away.

## 1.2.82 — 2026-07-15

- Fixed location matching when multiple Page Templates were AND’d in one box (treated as OR). Romit Page Field Group rules corrected so fields show on Romit and Home templates.

## 1.2.81 — 2026-07-15

- Location Rules UI clarifies AND vs OR (AND between rules in one box; Add Rule Group for OR). Fixes confusion when targeting multiple page templates.

## 1.2.80 — 2026-07-15

- Developer Panel group/repeater snippets now generate type-aware code for Checkbox, Radio, Select, Gallery (and related types) instead of casting arrays to strings.

## 1.2.79 — 2026-07-14

- Added HTML5 Video field: media library or URL, Autoplay/Loop/Mute/Unmute options (shown after a video is set), and custom player controls (play, seek, mute, unmute, volume, download, fullscreen).

## 1.2.78 — 2026-07-14

- Checkbox and Radio defaults now apply in massoftind_fb_get() / format_value when no saved value exists (frontend matches admin pre-select).

## 1.2.77 — 2026-07-14

- Checkbox Default now uses the same dropdown UI as Radio (— None — / Choices).

## 1.2.76 — 2026-07-14

- Checkbox and Radio Type Settings now include a Default control to pre-select from Choices (multi for Checkbox, single for Radio).

## 1.2.75 — 2026-07-14

- Fixed Range (and any blank-Name field) not saving: empty Name now falls back to the field key. massoftind_fb_get() also resolves by field key. New fields auto-get a Name from the label.

## 1.2.74 — 2026-07-14

- Group and Repeater Sub Fields sit inside the same field card (no separate Sub Fields box underneath).

## 1.2.73 — 2026-07-14

- Group and Repeater Sub Fields always use a separate card below settings (including nested containers), matching the same layout pattern.

## 1.2.72 — 2026-07-14

- Field settings panel header now includes the same Close (×) and collapse arrow controls used on Sub Fields rows.

## 1.2.71 — 2026-07-14

- Modernized Color field UI: swatch + HEX input + clear + preset chips (replaces the stretched native color bar).

## 1.2.70 — 2026-07-14

- Select Allow Multiple now uses the searchable pill/tag UI (same as Post Object). Works for Static, Post Query, Taxonomy, and Users. AJAX Loading searches those remote sources; empty multi-select clears correctly on save.

## 1.2.69 — 2026-07-14

- massoftind_fb_get() now resolves Select/other values nested under Group fields, and field-definition lookup includes group sub-fields.

## 1.2.68 — 2026-07-14

- Hardened massoftind_fb_choice_label() for array values and case mismatches; added massoftind_fb_get_choice_label() helper for Select/Radio/Checkbox templates.

## 1.2.67 — 2026-07-14

- Fixed Select/Radio/Checkbox options collapsing into one entry (choices are now stored as a value→label map; recovered already-corrupted choice strings).

## 1.2.66 — 2026-07-14

- Replaced Choices textarea with an Add Option UI that auto-generates values from labels (Select, Radio, Checkbox).
- Restored the Options Source dropdown chevron arrow in Type Settings.

## 1.2.65 — 2026-07-14

- Fixed nested Group/Repeater Sub Fields drag-to-reorder (lists inside open inline config were cancelled; parent list no longer steals nested handles).

## 1.2.64 — 2026-07-14

- Fixed Sub Fields drag-to-reorder: sortable cancel matched the parent config panel and blocked every drag handle.

## 1.2.63 — 2026-07-14

- Added Duplicate row/section actions for Repeater, Accordion, and Tabs that copy all current field values (including WYSIWYG).
- Modernized post-editor Repeater UI: card rows, pill numbers, clearer add/duplicate/remove controls.

## 1.2.62 — 2026-07-14

- Rebuilt Required / Conditional Logic toggles so WP admin checkbox styles no longer clip or misalign the switch thumb.

## 1.2.61 — 2026-07-14

- Fixed General settings layout: Label/Name side-by-side, Required on its own row, Instructions and multi-select fields full width.

## 1.2.60 — 2026-07-14

- File field is document-only (PDF, DOC, XLS, etc.); images are blocked in the media picker and on save.
- Added Allowed File Types + Return Format settings, modern file picker UI, and massoftind_fb_file() helper.
- massoftind_fb_field() now renders a download link for file arrays instead of printing "Array".

## 1.2.59 — 2026-07-14

- Modernized Sub Fields rows to match Presentation / Conditional Logic accordion headers (label, delete, chevron).
- Added a Search field types box to the + Add Sub Field picker.

## 1.2.58 — 2026-07-14

- Sub Fields rows now open as one accordion section (single border, chevron, click again to close).
- Removed the double border and duplicate TEXTAREA header inside the open settings panel.

## 1.2.57 — 2026-07-14

- Fixed Required and other toggle switches inside Sub Fields (sortable was capturing clicks; toggle IDs no longer collide with parent field).
- Improved toggle hit target and inline sub-field settings panel styling.

## 1.2.56 — 2026-07-14

- Fixed + Add Sub Field button after Sub Fields header layout change (type picker now opens correctly).
- Sub field settings (Textarea, Repeater, etc.) now expand directly under the selected list row instead of a separate detached panel.

## 1.2.55 — 2026-07-14

- Redesigned Sub Fields as a full config card (not a nested accordion) for Repeater, Group, Accordion, and Tabs.
- Nested Repeaters now show the same full Sub Fields section as top-level fields (list + Add + nested field settings).

## 1.2.54 — 2026-07-14

- Fixed Developer Panel template examples for Repeater nested under Group (and Repeater under Repeater) so they generate foreach row loops instead of casting arrays to strings.
- Updated Accordion full examples and nested DeveloperCodeService snippets for row-based nested containers.

## 1.2.53 — 2026-07-14

- Added nested Sub Fields configuration for Repeater, Group, Accordion, and Tabs when used as sub fields.
- Preserved nested sub field definitions when rendering AJAX rows for container fields.

## 1.2.52 — 2026-07-13

- Remembered the active Left/Top meta-box tab across Update page reloads.

## 1.2.51 — 2026-07-13

- Added a YouTube field that accepts watch URLs and extracts the video ID.
- Showed a styled poster thumbnail with an anchor link and video ID in admin and frontend output.
- Added the massoftind_fb_youtube() helper for one-line poster rendering.

## 1.2.50 — 2026-07-13

- Added TinyMCE table support to WYSIWYG fields (WordPress core no longer ships the table plugin).
- Showed the table button on the second WYSIWYG toolbar row when Teeny Mode is off.

## 1.2.49 — 2026-07-13

- Applied the same if-condition Display Image pattern for Image URL and Image Array return formats.
- Wrapped the Image helper function example in an if condition.

## 1.2.48 — 2026-07-13

- Wrapped the Image ID Display Image developer example in an if condition.

## 1.2.47 — 2026-07-13

- Removed the Tab Separator field type from the builder.
- Renamed Tabs with Sub Fields back to Tabs.

## 1.2.46 — 2026-07-13

- Renamed Tabs to Tabs with Sub Fields to identify its repeater-style nested behavior.
- Renamed the layout-only Tab field to Tab Separator to prevent confusion.
- Clarified both tab field purposes in the builder and documentation.

## 1.2.45 — 2026-07-13

- Removed the Priority control from field-group settings while preserving saved priority values.
- Removed the Advanced field settings section and its Help Text and Read Only controls.

## 1.2.44 — 2026-07-13

- Moved the field editor empty-state text above the plus control.
- Made the central plus control open the Add Field picker.

## 1.2.43 — 2026-07-13

- Added attachment alt text, width, and height to the Image URL developer example.
- Updated massoftind_fb_image() to preserve WordPress attachment attributes for URL and Array formats.

## 1.2.42 — 2026-07-13

- Made Image developer examples update for Image ID, Image URL, and Image Array return formats.
- Added return-format-aware nested Image examples for repeater and group fields.
- Updated massoftind_fb_image() to render ID, URL, and Array values safely.

## 1.2.41 — 2026-07-13

- Developer Panel sections now start collapsed and open only after a field or section is clicked.
- Removed automatic reopening after developer-code refreshes while preserving an already open section.

## 1.2.40 — 2026-07-13

- Ensured the initially selected field opens in the Developer Panel on first page load.
- Added explicit field-name metadata to synchronize the builder after deferred script initialization.

## 1.2.39 — 2026-07-13

- Synchronized field selection with the matching Developer Panel code section.
- Developer examples now open, highlight, and scroll into view automatically.
- Preserved manual accordion controls with one developer section open at a time.

## 1.2.38 — 2026-07-13

- Expanded the Documentation screen to the full available content width.
- Fixed undefined documentation color tokens so section numbers and accents render correctly.

## 1.2.37 — 2026-07-13

- Replaced Field Groups text actions with compact Edit, Duplicate, and Delete icons.
- Action labels expand on hover and keyboard focus while retaining accessible names.

## 1.2.36 — 2026-07-13

- Added a modern, branded Documentation panel in WordPress admin.
- Added standalone HTML, A4 PDF, and editable Word guides covering fields, builder controls, template helpers, REST routes, architecture, security, and compatibility.
- Improved PHPDoc, JavaScript module contracts, CSS section documentation, and cross-layer nesting comments.
- Added the Front Page location-rule option and aligned taxonomy matching with builder values.
- Replaced the inactive cache tool with a working Documentation shortcut.

## 1.0.0 — 2026-07-09

### Module 1: Core Bootstrap
- Plugin bootstrap with PSR-4 autoloader and singleton architecture
- Activator, deactivator, and uninstall handlers
- Field Group custom post type (`massoftind_fb_group`)
- Plugin settings with defaults

### Module 2: Services Layer
- `FieldGroupService` — CRUD for field groups
- `FieldValueService` — meta storage, retrieval, repeater loops
- `LocationMatcher` — AND/OR location rule engine
- `Sanitizer` — input sanitization for groups and fields
- `ImportExportService` — JSON import/export with validation
- `DeveloperCodeService` — live PHP code generation

### Module 3: Field Types (27 types)
- Basic: Text, Textarea, Number, Email, URL, Password, Hidden, Date, Time, Color, Range
- Media: Image, Gallery, File
- Content: WYSIWYG, Code Editor
- Choice: Select, Checkbox, Radio, Toggle
- Advanced: Post Object, Relationship, Taxonomy, User, Repeater, Group, Clone
- Extensible `FieldRegistry` with `massoftind_fb_register_field_types` hook

### Module 4: Admin Interface
- Dashboard with statistics
- Field Groups list with duplicate/delete
- Visual field group builder (3-column layout)
- Import, Export, Settings, and Tools pages
- Post edit meta boxes with location-based display

### Module 5: AJAX API
- Save, delete, duplicate field groups
- Post/user search for relationship fields
- Developer code generation
- Import validation and execution
- Export to JSON

### Module 6: REST API
- `GET/POST/DELETE /massoftind-fb/v1/field-groups`
- `GET/PUT /massoftind-fb/v1/field-values/{post_id}`
- Authenticated endpoints with capability checks

### Module 7: Developer Experience
- Helper functions: `massoftind_fb_get()`, `massoftind_fb_field()`, `massoftind_fb_have_rows()`, `massoftind_fb_the_row()`, `massoftind_fb_sub_field()`, `massoftind_fb_option()`, `massoftind_fb_image()`, `massoftind_fb_gallery()`
- Template-compatibility aliases: `get_field_value()`, `have_field_rows()`, `the_field_row()`, `get_sub_field()`
- Live developer panel with syntax highlighting and copy buttons

### Module 8: Frontend Assets
- Modern admin CSS with dark mode support
- Builder JavaScript with drag-and-drop, auto-save, keyboard shortcuts
- Field type interactions (media library, repeater, relationship AJAX)
- Developer panel with collapsible code examples

## 1.0.1 — 2026-07-09

### Bug Fixes
- Fixed fatal error when another custom-fields plugin is active: wrapped `get_sub_field()` alias in `function_exists()` check
- Fixed memory exhaustion on activation caused by circular dependency in `Plugin::instance()` bootstrap
- Deferred component loading to `plugins_loaded` hook
- Lazy-loaded field registry in `FieldValueService` and `DeveloperCodeService`
- Renamed `RestController::NAMESPACE` to `API_NAMESPACE` (reserved PHP keyword)
