1.6.5 — Gallery image titles and admin button consistency (2026-11-05)
- Editable image titles are saved for each service or serviceman gallery independently; the shared Media Library title and alt text are not modified.
- New and existing gallery image cards include a labeled text field; drag/drop, reorder, add and delete still work.
- Empty custom titles hide the visible image label while preserving accessible image alt text.
- Lightbox captions use custom gallery titles and retain navigation counts.
- Gallery editor controls now use one consistent blue palette and rounded button shape; destructive hover stays distinct.
- No changes to theme license bootstrap, mobile menu, serviceman statistics, video editor, or unrelated pages.

== Release 1.6.4 ==
* Mobile menu spacing reduced and Elementor menu drawer moved to the top document layer only while open, then restored on close; floating call widgets no longer overlap the menu. Desktop flyout logic unchanged.
* Corrected serviceman editor overview grid selector (previously targeted a non-existent ancestor). Scoped visual consistency to serviceman admin cards without changing stat auto/manual calculations.
* Restyled public service / serviceman galleries, accessible image viewer controls, and WordPress media-gallery management buttons.
* Re-enabled native rich-text editor for video posts by removing the CSS that hid it; removed duplicate short-description input. Existing legacy short descriptions remain as fallback when no editor content is present.
* No database schema migration, license file change, or modification of user-generated content.

v1.6.3 — 2026-11-04
- Direct integration of deep menu repair (desktop, mobile, mega-menu)
- Service / serviceman media galleries and portfolio lightbox
- Service display priority ordering (posts.menu_order)
- Visible video descriptions + rich video editor

v1.6.1 - WordPress installation ZIP compatibility
- Repacked the theme as a standard ZIP with one khedmatkar/ root folder and POSIX forward-slash paths.
- Normalized archive file and directory permissions for WordPress hosting compatibility.
- Confirmed style.css is present at the root of the theme folder.
- No functionality, database schema, or saved theme options changed in this packaging-only release.
- Re-encode the clean build when distributing a newly licensed 1.6.1 release.

v1.6.0 (rebuilt stable-design package, same theme version)
- Restored original v1.5.9 header, footer, template location resolution, and CSS base.
- Fixed direct-term archive query so WordPress does not re-include descendant services.
- Use original readable main.css with dedicated cache key; keep 1.6.0 security/order and category changes.
- No migration or overwrite of customer theme options.

v1.6.0 - Hierarchical service category archives
- Service category archives now show immediate child categories as navigation cards before the service list.
- Parent category archives only list services assigned directly to that parent; services assigned only to a child category no longer leak into parent listings.
- Child category archives keep the same rule recursively, so each level owns only its directly assigned services.
- The Elementor Service Categories widget now starts from root categories, exposes child-category links inside each root panel, and lists only direct services for each category.
- Preserves the full parent/child breadcrumb hierarchy introduced in 1.5.9.
- No service/category assignments are migrated or deleted; existing content remains intact.

v1.5.9 - Service breadcrumb hierarchy fix
- Build single-service breadcrumbs from the selected child service category through every parent category automatically.
- Services now only need the most specific child category assigned; assigning the parent separately is no longer required for breadcrumbs.
- If both parent and child categories are assigned, prefer the deepest assigned category and avoid duplicate breadcrumb levels.
- Apply the same full parent hierarchy to service-category archive breadcrumbs and breadcrumb JSON-LD schema.
- Keep all existing theme settings, content, routes and frontend styling unchanged.

v1.5.8 (second route collision hotfix)
- Allow a video route slug to be reused when the matching WordPress page belongs to Khedmatkar's own video module (selected video page or its built-in /videos/ page template).
- Apply the same owner-aware page collision check in BOTH AJAX validation and the final options sanitizer, including repeated slug edits and returning to videos.
- Preserve collision protection for unrelated WordPress pages, module route duplicates and plugin route bases.
- Keep all other theme files, UI controls and saved options unchanged.

1.5.8 — اصلاح تکمیلی مسیرها (بدون افزایش نسخه)
- اصلاح تغییر چندباره اسلاگ‌ها: حذف ساختارهای بازنویسی قدیمی قبل از ثبت مسیرهای جدید.
- ریدایرکت مسیرهای قبلی از 301 دائمی به 302 موقت و غیرقابل کش تبدیل شد تا بازگشت به اسلاگ قدیمی ممکن باشد.
- نمایش خطای واضح برای اسلاگ خالی، رزرو‌شده، تکراری یا متداخل با برگه وردپرس، به جای پیام اشتباه ذخیره موفق.
- همگام‌سازی ورودی‌های اسلاگ با مقادیر ذخیره‌شده بعد از هر ذخیره AJAX.
- حفظ تمام تنظیمات و ساختار قبلی نسخه 1.5.8.

1.5.8 - Compact consolidated content settings UI
- Combined Theme Settings > Section Names and Slugs and Theme Settings > Texts into one sidebar entry: Texts and Slugs.
- Added two compact internal views for names/permalinks and default copy, with native expandable groups and quick search.
- Kept all 57 existing option fields, keys, values and AJAX save contract unchanged; closed and hidden controls remain included in submissions.
- Added keyboard-accessible internal view switching, scoped responsive CSS, Persian search counts and no additional frontend assets.
- Migrated the old saved section-names tab preference automatically to the merged settings page.
- Performed PHP and JS syntax checks and isolated browser UI/serialization tests at desktop and mobile sizes; live WP integration remains not verified.

1.5.7 - Slug, Elementor rich text, and icon preview maintenance
- Add safely editable public post-type and taxonomy URL slugs, and section display titles. Keep internal WP post-type/taxonomy identifiers and existing post data unchanged.
- Preserve old permalink routes with conditional 404 redirects where safe; regenerate rewrite rules after route changes.
- Add a shortcut from Theme Settings > Texts to section names/slugs; preserve existing names panel and existing site option values.
- Change description controls of three hero variants and other standalone explanatory text widgets to Elementor WYSIWYG; render filtered safe HTML and hyperlinks.
- Repair lazy SVG preview initialization and hydrate selected editor icons in batches; do not preload the entire picker dataset.
- Static PHP/JS syntax and isolated PHP smoke tests performed; real WordPress/Elementor integration and installed-theme QA remain necessary.

1.5.6 - Security hardening candidate
- Block legacy unauthenticated password-based signup for phone-number accounts; continue using the existing SMS-verified flow.
- Restrict fixed OTP test codes to local/development or explicitly server-authorized environments.
- Invalidate known test-mode OTPs when switching to normal authentication.
- Require completed phone OTP verification before claiming previously unowned guest service requests.
- Revoke unverified legacy subscriber phone-account passwords on first successful OTP verification; these users should thereafter sign in using OTP.
- Strengthen ZarinPal callback request-mode and exact Authority matching.
- Safely encode inline JSON and JSON-LD script data against HTML/script-boundary injection.
- Harden public form uploads: disallow risky archive/legacy Office formats by default; delete orphan uploads on validation/database failures; keep existing form fields and API.
- Add a languages directory (current Persian hardcoded UI remains; multilingual completeness is not claimed).
- Add semantically verified compact frontend CSS (main.min.css) with the original main.css retained as a readable fallback. No Elementor widgets or customer settings migrated or overwritten.
- Static PHP/JS lint and ZIP integrity performed. Live WordPress/Elementor, payment gateway, SMS and fresh/update installation tests remain REQUIRED before marketplace release.

1.5.5
- Fix reproducible fatal errors in header/title-text widgets when mb_stripos is unavailable. Persian literal matching no longer requires mbstring.
- Retain all 1.5.4 features and saved customer settings.

1.5.4
- افزودن کلیدهای مستقل روشن/خاموش پرسش‌وپاسخ و ویدئوها در بخش عمومی؛ خاموشی ماژول، ویجت‌ها و مسیرهای عمومی آن را پنهان می‌کند و داده‌ها را نگه می‌دارد.
- انتقال تنظیمات دکمه تماس چسبان به زبانه مستقل بدون تغییر کلیدهای ذخیره‌سازی نسخه‌های قبلی.
- برجسته‌سازی چهار گزینه ماژول در پنل عمومی و حذف کارت‌ها/آیتم‌های نمونه و اطلاعات تماس فرضی از ویجت‌ها؛ متن حالت خالی مقالات نیز اختیاری و از المنتور قابل ویرایش شد.

1.5.3
- Fix undefined khedmatkar_elementor_do_location in standalone templates.
- Load an idempotent optional Elementor location bridge from every caller.
- Keep full bootstrap, settings, content and layout unchanged.

1.5.2
- Non-destructive upgrades/settings; protected partial form submission.
- Elementor template recursion/context/privacy guards and editor lifecycle fixes.
- Split assets, SEO, template locations and upgrade lifecycle modules.
- See docs/RELEASE-1.5.2-fa.txt for tests, installation and licensing limitations.

1.5.1
- Recovery build based exactly on stable 1.4.4 code.
- No layout/CSS/JS/header/footer feature changes.
- Repackaged for safe WordPress theme upload/update.

1.4.4
- رفع سازگاری ویرایش هدر/فوتر با Elementor جدید با ثبت قطعی پشتیبانی در زمان init/elementor init و استفاده از فیلتر رسمی is_post_support؛ بدون بازنویسی تنظیمات CPT کاربر در المنتور.
- افزودن دو کلید مستقل «بخش خدمات» و «بخش سرویس‌کارها» در تنظیمات قالب؛ خاموش کردن هر ماژول اطلاعات قبلی را حذف نمی‌کند.
- در حالت غیرفعال، منوهای مدیریت، آرشیو/صفحه تکی، REST عمومی، جستجوی قالب، ویجت‌های المنتور مرتبط و CTA/فرم‌های پیش‌فرض همان ماژول از دسترس عمومی خارج می‌شوند.
- مسیرهای ماژول غیرفعال 404 استاندارد می‌دهند و از Sitemap هسته وردپرس و Yoast کنار گذاشته می‌شوند تا صفحه کم‌محتوا یا URL یتیم در ایندکس باقی نماند.
- با تغییر وضعیت ماژول‌ها Rewrite Rules فقط همان زمان بازسازی می‌شود و داده‌های مشتری دست‌نخورده می‌ماند.

1.4.3
- بسته نصب ZIP استاندارد شد تا DirectAdmin/cPanel و unzip لینوکس مسیرها را بدون مشکل استخراج کنند.
- مهاجرت نسخه غیرتخریبی شد؛ آپدیت دیگر کل تنظیمات مشتری را بازنویسی نمی‌کند.
- ویجت مستقل «سوالات متداول آکاردئونی» با آیکن قابل تغییر، وضعیت اولیه و رفتار همیشه-یک-آیتم-باز اضافه شد.
- بهبود دسترس‌پذیری آکاردئون با aria-expanded/aria-controls و role=region.
- نسخه 1.4.2 و ویجت قدیمی نمایش پاسخ‌ها برای سازگاری عقب‌رو بدون تغییر باقی ماندند.

1.4.2
- Clean package update: versioned assets now use 1.4.2 so browsers/CDN caches stop serving the older 1.4.0/1.4.1 frontend CSS and JS.
- Added a one-time update repair that normalizes saved Khedmatkar options and refreshes rewrite rules after upgrading from older packages.
- Kept the runtime aligned with the clean non-licensed build so the theme settings load normally.

1.4.1
- فایل screenshot.png استاندارد به ریشه قالب بازگردانده شد تا تصویر پوسته در وردپرس نمایش داده شود.
- ساختار کمیسیون ساده شد: یک درصد سراسری برای همه سرویس‌کارها + درصد اختیاری برای دسته خدمت؛ کمیسیون اختصاصی هر سرویس‌کار از رابط مدیریت حذف شد.
- دسته‌های تو در تو درصد دسته تخصصی‌تر را در اولویت قرار می‌دهند؛ سفارش‌های تسویه‌شده قبلی برای حفظ سوابق مالی تغییر نمی‌کنند.
- گزارش «کارهای انجام‌شده» اضافه شد تا درخواست، مشتری، خدمت، سرویس‌کار انجام‌دهنده، مبلغ، تاریخ انجام و وضعیت حسابداری یکجا مشخص باشد؛ همراه فیلتر و صفحه‌بندی.
- لینک «درخواست‌های خدمات» به منوی خدمتکار اضافه شد و فهرست درخواست‌ها نمایش سرویس‌کار/وضعیت دقیق‌تر و فیلتر سرویس‌کار و وضعیت دارد.

1.4.0
- بسته نصب 1.4.0 برای هاست‌های حساس بازطراحی شد: 59 فایل ریز داده آیکن به 3 بسته داده نسخه‌دار کاهش یافت و Assetهای Form Smart از مسیر inc به assets منتقل شدند؛ قابلیت‌ها و خروجی آیکن‌ها حفظ شده‌اند.
- مبنا: نسخه پایدار و نصب‌پذیر 1.3.10؛ ساختار ZIP و فایل‌های استایل اصلی آن حفظ شده‌اند.
- در هدر حرفه‌ای قالب 3، آیکن «حساب کاربری» و «سرویس‌کارها» از هم جدا شد؛ پیش‌فرض حساب کاربری user و سرویس‌کارها users است و هر دو مستقلاً از تنظیمات ویجت قابل تغییر هستند.
- متن‌ها، لینک‌ها و آیکن‌های منوی جایگزین هدر در صورت نبود منوی وردپرس قابل ویرایش شدند و دیگر متن نمونه اجباری نیست.
- تب «متن‌های قالب» برای محتوای قابل ویرایش سراسری تکمیل شد: آرشیوها، CTA خدمت/سرویس‌کار، پرسش‌وپاسخ، هدر/فوتر پیش‌فرض، وبلاگ و ویدئو.
- متن «مشاهده پروفایل» ویجت دایرکتوری سرویس‌کارها در مسیر AJAX نیز از تنظیم همان ویجت خوانده می‌شود و پس از فیلتر به متن ثابت برنمی‌گردد.
- لینک نمونه دامنه در ویجت ویدئو حذف و لینک «مشاهده همه» به صفحه واقعی ویدئوهای سایت متصل شد.
- منوها و لینک‌های نمونه اجباری فوتر حذف شدند؛ مقادیر خالیِ عمدی دیگر با محتوای نمونه پر نمی‌شوند.
- متن‌های عملیاتی/سیستمی مانند خطاها، وضعیت پردازش و کنترل‌های استاندارد صفحه‌بندی عمداً از تنظیمات محتوایی جدا نگه داشته شدند.

1.3.10
- بازبسته‌بندی استاندارد قالب برای رفع خطای «شیوه‌نامه گم شده».
- بازیابی و تثبیت فایل‌های استایل فرانت‌اند از نسخه سالم 1.3.8 بدون حذف قابلیت‌های 1.3.9.
- نرمال‌سازی ساختار ZIP، مجوز فایل‌ها و مسیرهای ریشه قالب.

= 1.3.9 =
* محدوده فعالیت قالب از حالت تک‌استانی به چنداستانی ارتقا یافت؛ نصب تازه همچنان با یک استان شروع می‌شود و متادیتای قدیمی استان/شهر برای سازگاری کامل حفظ شده است.
* محدوده هر خدمت و سرویس‌کار اکنون می‌تواند در چند استان و با شهرهای مستقل هر استان ثبت شود؛ مودال درخواست، فیلتر سرویس‌کارها، پروفایل عمومی و ویجت دایرکتوری نیز از همین داده ساختاریافته استفاده می‌کنند.
* حسابداری سبک سرویس‌کارها به مدیریت اضافه شد: فروش واقعی، کمیسیون سایت، سهم سرویس‌کار، مبلغ قابل تسویه و وضعیت تسویه؛ با درصد پیش‌فرض سراسری و امکان درصد اختصاصی برای هر سرویس‌کار.
* سفارش‌های Sandbox/آزمایشی و پرداخت‌نشده از حسابداری حذف هستند. رکورد کمیسیون سفارش هنگام تخصیص Snapshot می‌شود و پس از تسویه، تغییر سرویس‌کار قفل می‌شود تا سوابق مالی پایدار بمانند.
* صفحات اختصاصی مقالات و ویدئوها علاوه بر فیلتر/بارگذاری AJAX دارای صفحه‌بندی استاندارد URL‌دار شدند؛ آرشیو خدمات، دسته خدمات، سرویس‌کارها و دایرکتوری المنتور نیز با محدودیت Query و Pagination بازبینی شدند.
* وضعیت ورود در هر سه قالب هدر یکپارچه شد: مهمان «ورود و ثبت‌نام» و کاربر واردشده «پنل کاربری» می‌بیند و کاربر واردشده همیشه به صفحه حساب هدایت می‌شود.
* نمایش استان سرویس‌کار در کارت‌ها، صفحه تکی و ویجت دایرکتوری از استان ثابت سراسری جدا شد و استان‌های واقعی همان سرویس‌کار نمایش داده می‌شود.
* امنیت ذخیره آیکن دسته خدمات با کنترل Capability سخت‌گیرانه‌تر شد؛ مسیرهای عمومی AJAX، nonce/rate-limitهای موجود و آپلودها بازبینی شدند و کد مشکوک اجرایی (eval/base64 decode و مشابه) در قالب وجود ندارد.
* Queryهای پرتکرار سرویس/سرویس‌کار و داده مودال برای مقیاس بالاتر بازبینی شدند و داده‌های کمکی سرویس‌ها/استان‌ها تا حد امکان از کش و نقشه مشترک استفاده می‌کنند.
* Syntax همه فایل‌های PHP و JavaScript، ساختار ZIP و فایل‌های لازم قالب پس از تغییرات بررسی شد.

* تکمیل رابط تیکت در نسخه 1.3.8: صفحه تیکت‌ها حالا ابتدا فقط فهرست سبک تیکت‌های قبلی را نشان می‌دهد؛ گفتگو فقط پس از انتخاب همان تیکت با AJAX بارگذاری می‌شود. وضعیت‌های «باز»، «پاسخ داده شد» و «بسته شد» با رنگ مستقل مشخص هستند و پاسخ خوانده‌نشده تا زمان باز کردن همان گفتگو باقی می‌ماند. این ساختار تعداد Queryهای کامنت در ورود به پنل را نیز کاهش می‌دهد.
* اصلاح نهایی UI بدون تغییر نسخه: حذف متن توضیحی «فرم درخواست / محدوده ارائه» از مودال حالت فرم؛ حذف آیکن بالای CTA صفحه سرویس‌کار؛ تثبیت رنگ سفید متن و آیکن داخل دکمه «ثبت درخواست» در همه حالت‌های لینک.
= 1.3.8 =
* بخش تیکت پشتیبانی حرفه‌ای‌تر شد: فرم ثبت تیکت از صفحه اصلی پنل جمع شد و با دکمه «ثبت تیکت جدید» داخل مودال اختصاصی، ریسپانسیو و قابل بستن با Escape/پس‌زمینه باز می‌شود.
* فیلد انتخاب خدمت در مودال ثبت درخواست به انتخاب‌گر جستجوپذیر داخلی تبدیل شد؛ بدون Select2/CDN یا وابستگی خارجی، مناسب فهرست‌های بزرگ خدمات.
* تولید داده مودال درخواست برای هاست‌های ضعیف بهینه شد؛ کوئری جداگانه سرویس‌کار برای هر خدمت حذف و به یک کوئری مشترک + کش کوتاه‌مدت با پاک‌سازی خودکار پس از تغییر خدمت/سرویس‌کار/تنظیمات تبدیل شد.
* ثبت تیکت در سمت سرور محدودیت طول و rate limit کاربر دارد و از ثبت چندباره سریع جلوگیری شده است.
* فراخوانی‌های مستقیم mbstring در مسیرهای کلیدی با fallback امن اصلاح شد تا نبود افزونه mbstring باعث Fatal Error نشود.
* نسخه نهایی از نظر Syntax همه فایل‌های PHP و JavaScript، JSONها، BOM و سلامت ZIP بازبینی شد.

= 1.3.7 =
* عنوان FAQ در خروجی همه نوشته‌ها/برگه‌ها/خدمات فقط «سوالات متداول» است و عنوان نوشته به آن اضافه نمی‌شود.
* چیدمان تماس هدر حرفه‌ای قالب 2 اصلاح شد؛ متن و شماره‌ها راست‌چین و آیکن تماس در سمت چپ گروه تماس قرار گرفت.
* آیکن باز/بسته شدن آکاردئون سوالات متداول به سمت راست هر سؤال منتقل شد.

= 1.3.6 =
* هدر حرفه‌ای قالب 1 دقیقاً به ساختار نسخه 1.3.4 بازگردانده شد؛ تغییرات تماس نسخه قبل فقط برای قالب 2 باقی ماند.
* هدر حرفه‌ای قالب 2 از نو طراحی شد: کارت تماس مستقل، آیکن تلفن استاندارد، دو شماره بدون هم‌پوشانی و رفتار ریسپانسیو جدید.
* ارتفاع تصویر شاخص کارت‌های صفحات دسته‌بندی وبلاگ افزایش یافت و در موبایل/تبلت نیز نسبت مناسب حفظ می‌شود.
* نمایش FAQ اصلاح شد: پاسخ‌ها مستقیماً در HTML خروجی قرار می‌گیرند و وابستگی به AJAX برای نمایش پاسخ حذف شد.
* برای صفحات تکی که توسط Elementor Theme Builder جایگزین می‌شوند، fallback نمایش FAQ اضافه شد تا تیک فعال واقعاً در خروجی دیده شود.

= 1.3.5 =
* بازطراحی تماس ثابت پایین: شماره تلفن درشت‌تر و عنوان کم‌اهمیت‌تر، ارتفاع کمتر و رفع تداخل با دکمه بازگشت به بالا.
* اصلاح کتابخانه آیکن و افزودن فلش‌های استاندارد مستقیم به SVG داخلی برای یکسان بودن پیش‌نمایش و خروجی سایت.
* بازطراحی گروه تماس ویجت هدر حرفه‌ای و رفع هم‌پوشانی آیکن و دو شماره.
* سوالات متداول به‌صورت پیش‌فرض فعال است و فقط با برداشتن تیک مخفی می‌شود.
* صفحات دسته‌بندی وبلاگ از همان سایدبار نوشته‌ها استفاده می‌کنند.
* یکسان‌سازی ارتفاع کارت‌های ویجت تعمیرکاران برتر و تثبیت چیدمان اطلاعات/امتیاز.
* بازبینی سازگاری ریسپانسیو، دسترسی‌پذیری، امنیت AJAX و کیفیت بسته تجاری؛ اصلاح نسخه/مستندات و تست نحوی PHP/JavaScript.

1.3.4
- Fixed the serviceman request modal when the shared Form Smart shortcode is used by preloading its frontend CSS/JS before page rendering.
- Rendered the global request modal before footer scripts so shortcode-enqueued scripts are not missed.
- Added scoped responsive guards for the Form Smart layout inside the request modal.

1.3.3
- Added centralized, normalized mobile uniqueness across theme registration, OTP registration, profile saves and automatic serviceman-account creation.
- Mobile matching now treats 09..., 98..., +98... and 0098... forms as the same number and checks Khedmatkar plus WooCommerce phone metadata.
- Added an atomic phone-owner reservation layer so concurrent registration/update requests cannot claim the same mobile for two users.
- Customer mobile becomes immutable in the account profile once registered; server-side validation prevents bypassing the readonly field.
- Q&A question/answer avatars now resolve the actual linked WordPress user and consistently load the image uploaded in the account profile.
- Added legacy Q&A author fallback via _khed_qa_author_id and email-based answer-author resolution for older comments.
- Reworked the Q&A forum card UI with a smaller avatar/header, compact question excerpt and a non-stretched inline importance/star control.
- Preserved full Q&A question content when administrators edit a question instead of clearing the details field.
- Fixed an undefined profile-avatar attachment content variable during image upload.

1.3.2
- Reduced the serviceman single-page navy hero height and moved the primary request CTA into a dedicated responsive sidebar card with concise guidance.
- Rebuilt customer profile-completion UX with missing-field guidance, progress, required-field validation and a direct jump to profile editing.
- Blocked logged-in customer request submission until all required profile fields are complete; both native and fallback AJAX request paths enforce the rule server-side.
- Added Theme Settings as the final admin-bar shortcut for administrators.
- Reworked the Elementor Q&A Forum widget to one compact question per row and renamed the item-count control to rows per page.
- Added AJAX pagination to the Q&A widget while preserving filters/search and making the row count configurable per widget instance.
- Added full question details/content support to Q&A submission and admin editing; single-question pages now show the question details followed by all approved answers/comments and the answer form.
- Added responsive styling for the new serviceman sidebar CTA, profile-completion guidance and Q&A pagination/details.
- Revalidated PHP syntax, JavaScript syntax and UTF-8 BOM safety after the changes.

1.3.1
- Fixed severe WordPress Appearance > Menus slowdown by removing per-menu-item full SVG-library rendering and repeated megamenu template queries.
- Icon pickers in menus and admin editors now lazy-load the shared icon library through AJAX only when opened.
- Removed an accidental UTF-8 BOM from inc/services.php to prevent premature output/header side effects.
- Hardened rewrite-rule refresh with a dedicated route schema so serviceman/service archives recover reliably after updates; this release forces a rewrite refresh once.
- Reduced serviceman archive load by using configured base-city data instead of scanning up to 500 serviceman profiles on each page view.
- Removed serviceman card N+1 service-title queries by sharing one published-service title map per request.
- Replaced full approved-comment loading for ratings with a lightweight SQL aggregate, improving serviceman archive/profile scalability.
- Avoided duplicate admin ticket-count queries in the same request.
- PHP syntax and BOM scan passed after changes.

1.3.0
- Simplified the serviceman single-page hero request area to one compact «ثبت درخواست» CTA.
- Removed manual trust badge, work-experience and completed-jobs fields from serviceman profiles.
- Completed-job totals now count assigned requests that reach the completed status; work experience is derived from membership/profile date.
- Strengthened one-to-one serviceman/user lifecycle: automatic account creation/linking, safe relinking on mobile change and cleanup of theme-created accounts on permanent profile deletion.
- Removed FAQ support from the serviceman post type and public serviceman template.
- Replaced free-text activity area with city-dependent neighborhood checkboxes, search and structured metadata in both admin and serviceman self-service panels.
- Added bundled neighborhood data for major Iranian cities plus a safe whole-city fallback for locations without detailed neighborhood data.
- Preserved legacy activity-area readability and migration behavior while moving new saves to structured neighborhood metadata.

1.2.9
- Final verification release for the 1.2.8 workflow/UI changes.
- Bumped bundled Form Smart asset version to force-refresh the new AJAX builder/admin CSS/JS and avoid stale cached editor UI after theme update.
- Revalidated global serviceman form flow, private mobile/user linkage, Forms unread badge sync, single price editor, and prominent sticky contact CTA.

1.2.8
- Unified service-request form entries under the Forms module with unread badge sync.
- Removed received-forms shortcut from Theme Settings menu.
- Added global serviceman form shortcode and removed per-serviceman form ID.
- Automatic serviceman user creation using mobile number as username.
- Serviceman mobile is private and no longer rendered on public profile.
- Service price editor simplified to one price input.
- Sticky contact CTA enlarged with richer lightweight CSS animation.
- Form Smart admin builder/list/submissions upgraded with AJAX actions and a more consistent UI.

1.2.7
- تبدیل راهنمای علامت سؤال به کنترل بومی details/summary؛ باز/بسته‌شدن راهنما بدون وابستگی به JavaScript کار می‌کند.
- حذف تبدیل خودکار و سراسری توضیحات به Tooltip؛ فقط توضیح‌های واقعاً لازم در محل مناسب پشت علامت سؤال قرار می‌گیرند.
- اضافه‌شدن راهنمای مستقیم برای استان پایه، رفتار ثبت درخواست، رفتار CTA، Sandbox، خدمات/محدوده و بخش‌های پیچیده مدیریت.
- تقویت بارگذاری فونت فارسی در کل پوسته مدیریت خدمتکار، ویرایش خدمت/سرویس‌کار/درخواست و فیلدهای وردپرس.
- اصلاح قطعی کنتراست دکمه‌های «ثبت درخواست» پنل با کلاس اختصاصی و رنگ متن سفید در link/visited/hover/focus/active، مستقل از Overrideهای عمومی سایت.
- حفظ رابط یکدست دکمه‌های حذف، آکاردئون و Drag & Drop نسخه 1.2.6 و اجرای تست‌های رگرسیون روی قیمت، استان/شهر، خدمات قابل ارائه و پرداخت Live/Sandbox.

1.2.6
- یکدست‌سازی رابط مدیریت خدمات و سرویس‌کارها و بازطراحی دکمه‌های حذف/عملیات.
- کاهش توضیحات دائمی و تبدیل راهنماهای طولانی به راهنمای علامت سؤال قابل کلیک.
- اصلاح بارگذاری فونت فارسی در تنظیمات قالب، متاباکس‌ها و ویرایشگر TinyMCE.
- اصلاح کنتراست دکمه ثبت درخواست در پنل کاربری و خوانایی متن در تمام حالت‌ها.

Khedmatkar 1.2.5 - Commercial service workflow / editor UX
- Preserved existing WordPress roles when linking/unlinking servicemen; admin/editor roles are never replaced.
- Dispatch assignment is locked until a real successful payment is verified; Sandbox and unpaid orders cannot be dispatched.
- Cleaned province/city dataset duplicate/typo entries used by commercial location filters.
- Rebuilt service and serviceman editor interfaces with theme typography, searchable cards, clearer summaries and responsive admin layouts.
- Converted service single-page content blocks to collapsed accordions with drag-and-drop ordering.
- Added one site-wide operating province; all service and serviceman city coverage is constrained to that province.
- Added serviceman self-management for covered cities and provided services, with server-side authorization and validation.
- Unified serviceman skills/specialties with linked services across cards, single pages, schema and advanced search.
- Reworked paid-service price editing with formatted thousands separators, visible currency and live saved-price preview.
- Added an admin warning and server-side block for paid services that have no valid price.
- Organized ZarinPal Merchant ID and live/test payment controls in Theme Settings; test mode remains OFF by default.
- Pinned transaction Merchant ID/currency/environment at payment creation and separated sandbox success as paid_test so test orders cannot be dispatched or treated as real payment.
- Suppressed operational new-order and payment-success SMS for paid Sandbox tests.
- Preserved the restrictive-host icon architecture introduced in 1.2.4 (zero standalone SVG files in the installer).
- Removed the remaining compact PHP file that embedded frontend SVG payloads; service icon parity is now rebuilt from non-executable whitelisted JSON geometry.

Khedmatkar 1.2.4 - Restrictive-host icon compatibility
- Removed all 532 standalone .svg files from the theme package.
- Repacked supplied icons as non-executable structured JSON geometry in small bounded-size chunks.
- Runtime loader rebuilds SVG markup from an explicit allow-list of safe path attributes.
- Preserves icon keys, labels, source mappings and visual geometry without requiring the host to copy SVG files.
- Added stricter chunk/id/path validation and runtime caching.

Khedmatkar 1.2.3 - Installer-safe supplied icon architecture
- Removed executable PHP icon chunks that embedded large inline SVG payloads.
- Supplied icon metadata now loads from a compact JSON manifest.
- All 532 supplied SVGs are stored as individual non-executable assets with ASCII filenames.
- Preserves the previous icon keys, labels, source mappings and SVG output while avoiding PHP-file copy false positives on restrictive hosting.
- Added safer manifest/file validation and per-icon runtime caching.

Khedmatkar 1.2.2 - Hosting-safe icon package
- Replaced the single 2.8 MB generated-supplied-icons.php file with small generated icon chunks.
- Prevents WordPress theme installer/updater copy failures on restrictive/shared hosting.
- Icon library output and icon keys remain backward compatible.
- Normalized package permissions for reliable installation.

Khedmatkar 1.2.1 - Request UX / city coverage / admin cleanup
- Default request buttons now open a real modal; Theme Settings selects simple form vs online ordering.
- Paid services visibly show price and payment behavior on the service page.
- Service coverage can be limited to selected provinces/cities; online/form validation enforces the selected area after coverage is configured.
- Service edit screen now has formatted price input, searchable province/city selectors and searchable serviceman assignment cards.
- Serviceman single page request CTA moved into the upper hero area.
- Sticky contact redesigned as a compact light control; colors, size, radius and animation are configurable.
- ZarinPal Merchant ID/payment, workflow SMS and contact CTA settings moved into an organized main Theme Settings tab.
- Native ordering/payment remains independent of WooCommerce.
- Request modal filters servicemen by service + location and blocks payment when price/coverage is missing.

Khedmatkar 1.2.0 - Native service ordering / direct payment

Orders and workflow
- Added two native service modes: serviceman booking and direct paid order.
- Added a dedicated serviceman WordPress role and panel with assigned-request accept/reject actions.
- Added customer request statuses, invoice/payment metadata, and profile address fields.
- Added company-side post-payment serviceman assignment for dispatch workflows.
- Preserved legacy 1.1.x requests and mapped old Persian statuses to the new status model.
- Guest-created requests (when guest requests are explicitly allowed) are claimed by the verified customer account after login with the same mobile number.

Payment
- Added direct ZarinPal payment request/verify flow with one-time callback secret and server-side service pricing.
- Payment is independent from WooCommerce: no product, cart, checkout, or WooCommerce order dependency.
- Added invoice number, payment reference, receipt screen, paid/failed states and post-payment company assignment.

SMS
- Added event-based Kavenegar lookup / Melipayamak Body-ID templates for new request, accept, reject, customer payment success and company payment success.
- New-request flow sends separate customer/company notifications when their templates are configured.
- Process SMS notifications are pattern-only and no longer fall back to plain-text SMS.

Frontend / UX
- Added responsive global request modal and converted request CTAs to open it by default while preserving manual-link overrides.
- Added fixed bottom-left contact CTA with default test number 021223344, lightweight CSS pulse and reduced-motion support.
- Added responsive serviceman request cards and native payment receipt UI.
- Prevented duplicate AJAX form submissions while a request is processing.

Authentication / security
- Added administrator-controlled fixed-code OTP test mode (default code 12345), OFF by default.
- Test mode retains nonce, per-phone OTP transient, rate limits, attempt lockout and constant-time verification.
- Added a persistent admin warning while test mode is enabled; disabling the option fully returns authentication to the normal SMS path.
- Added server-side validation of service mode, price and serviceman assignment; customer input cannot override paid/booking mode or service price.
- Added authorization checks so servicemen can only decide requests assigned to their own linked account.

Khedmatkar 1.1.0 - Stable / Commercial hardening

Security
- Disabled public test-login/test-OTP behavior in production environments.
- Added rate limiting to password login, registration, OTP sending, OTP verification, service requests and internal smart-form submissions.
- Upgraded OTP generation to 6 digits for new requests.
- Replaced plaintext OTP transient storage with HMAC hashes and constant-time comparison.
- Added OTP failed-attempt lockout and IP-level verification throttling.
- Added mobile normalization/validation and duplicate-phone-account protection.
- Scoped font/Lottie upload MIME permissions to appropriate administrative capabilities.
- Added explicit capability and WordPress menu nonce verification to custom navigation-menu metadata saving.

Elementor / Elementor Pro
- Registered Elementor Pro core Theme Builder locations via the official Theme Locations API.
- Added Header/Footer/Single/Archive rendering fallbacks without requiring Elementor Pro.
- Stopped forcibly writing the elementor_cpt_support option or forcing post/page choices.
- Kept support for Khedmatkar-owned Elementor post types through the runtime integration filter.
- Removed broad theme typography rules that could override Elementor Pro widgets.
- Removed legacy rules that globally forced Elementor boxed container widths.
- Limited fallback Elementor icon-font loading to editor/preview/admin contexts.

WooCommerce / plugin compatibility
- Preserved native WooCommerce theme and gallery support.
- Confirmed there are no bundled WooCommerce template overrides to become stale after plugin updates.
- Removed generic WooCommerce link/image/form styling overrides that could conflict with plugin updates.
- Ensured WooCommerce pages are not clipped by the theme main-content overflow rule.
- Changed bundled Form Smart behavior so an installed standalone plugin takes precedence; the theme no longer removes external plugin hooks or shortcodes.

Technical / standards
- Corrected theme version metadata to 1.1.0 and compatibility target to WordPress 7.1.
- Removed an incomplete, inactive license bootstrap that referenced a missing class file.
- Added a standard 404.php fallback template.
- Removed nested <main> landmarks from content templates; the document now keeps a single main landmark.
- Improved default mobile navigation ARIA attributes.
- Added customize-selective-refresh-widgets theme support.
- Added readme and changelog files for commercial distribution.

1.1.0 hotfix
- Restored the original visual ordering of Professional Header template #1 on desktop.
- Kept RTL text/content direction inside logo, phone, menu, actions and search areas.
- Mobile layout remains RTL and unchanged.

1.6.2 (2026-10-23)
- Automatic/manual switch for completed jobs and experience, separately, from admin and verified serviceman panel.
- New WordPress widget area directly below profile statistics on the left-hand sidebar of single servicemen.
- No functions.php changes; backwards compatible with existing 1.6.1 automatic values.
