لاگ تغییرات

تاریخچه نسخه‌های دیوان قانون

v5.3.2 — رفع تکرار شماره ماده + فیکس شکستن اعداد دورقمی

فعلی


۱) 🔢 فیکس «دوخطی شدن» اعداد دورقمی (ماده ۱۰، ۱۱، ۱۰۰ و...)

•**ریشه باگ**: در پردازش متن، قاعده «شکستن لیست‌های شماره‌دار» برای شماره‌هایی که ابتدای خط هستند غیرفعال است؛ اما موتور پردازش برای اعداد چندرقمی از **رقم دوم** دوباره شروع می‌کرد و «۱۰-» را به «۱» و «۰-» می‌شکاند! به همین دلیل مواد تک‌رقمی سالم بودند ولی دورقمی‌ها دوخطی می‌شدند.
•حالا با افزودن قید «رقم قبلی»، اعداد چسبیده به هم (۱۰، ۱۲، ۱۰۰، ۱۲۳ و...) هرگز از وسط شکسته نمی‌شوند — هم در نمایش سایت و هم در پردازش ایمپورت و هم در ویرایش‌گر درون‌خطی.

۲) ♻️ نمایش یک‌باره شماره ماده (حذف تکرار)

شماره هر ماده قبلاً **سه بار** نمایش داده می‌شد: بج سبز بالای باکس + تیتر «ماده ۱۰» کنارش + پیشوند «ماده ۱۰-» در اولین خط خودِ متن. حالا:
•**بج سبز** تنها جای نمایش شماره است (طراحی قبلی حفظ شد).
•تیتر تکراری «ماده N» حذف شد؛ اگر ماده عنوان واقعی داشته باشد (مثل «شرایط انحصار وکالت») همان نمایش داده می‌شود.
•پیشوند «ماده N-» از ابتدای متن مواد **حذف می‌شود** — این اصلاح برای همه قوانین موجود (بدون نیاز به ایمپورت مجدد) و همه ایمپورت‌های بعدی یکسان اعمال می‌شود.
•کپی متن، ارجاع‌گیری (APA/BibTeX)، چاپ و اشتراک‌گذاری هم از متن تمیزشده استفاده می‌کنند (شماره ماده در قالب استاندارد ارجاع خودش درج می‌شود، نه تکرار داخل متن).
•همین اصلاح در نسخه اپ موبایل، صفحه مقایسه قوانین و کارت «نتیجه دقیق» جستجو هم اعمال شد.

۳) 📥 بهبود ایمپورت قوانین (استاندارد ذخیره)

•در ایمپورت قوانین، شماره ماده فقط در فیلد مخصوص خودش ذخیره می‌شود و متن ماده بدون پیشوند «ماده N-» ذخره می‌شود (متن تمیز = نمایش تمیز).
•«تبصره ۱-» و «ماده ۱۰-» و «اصل ۴-» دیگر قربانی شکست خط نمی‌شوند.
•امضای «رئیس قوه قضاییه» هم مثل سایر مقام‌ها به‌درستی در باکس «مصوبه و امضای قانون» قرار می‌گیرد.
•استخراج عنوان ماده (متنی که قبل از دونقطه است) حالا از متن تمیز انجام می‌شود — دیگر «ماده ۱۰-» در عنوان ماده نمی‌آید.

**فایل‌ها:** app/Helpers/Util.php، اسکرپر ایمپورت قوانین، app/routes_admin.php، resources/views/partials/article-card.php، resources/views/law-detail.php، resources/views/app_law_detail.php، resources/views/search.php، resources/views/compare.php (فهرست کامل در README بسته)

**نصب:** زیپ divanlaw-v5.3.2-update.zip را در public_html/divanlaw اکسترکت کنید (Overwrite) — بدون مایگریشن دیتابیس؛ اصلاح متن‌های قبلی در لحظه نمایش انجام می‌شود.

---


v5.3.1 — اصلاح ایمپورت قوانین + حریم خصوصی منابع



۱) 📥 اصلاحات اسکرپر ایمپورت قوانین (منبع دوم)

•**حذف سال/تاریخ مصوبه از عنوان قانون**: عنوان‌هایی مثل «آیین‌نامه اجرایی قانون شوراهای حل اختلاف [مصوب ۱۴۰۳]» حالا به شکل تمیز «آیین‌نامه اجرایی قانون شوراهای حل اختلاف» ذخیره می‌شوند و تاریخ مصوبه در **فیلد مخصوص خودش** (تاریخ تصویب) می‌رود.
•**زیرشاخه‌های هر ماده در یک باکس**: زیرشاخه‌های حرفی/عددی هر ماده (الف، ب، پ، ۱، ۲ و...) دیگر باکس جداگانه نمی‌گیرند — همه داخل باکس همان ماده قرار می‌گیرند (مثل بقیه منابع).
•**متن پایانی فقط یک باکس**: بخش «مصوبه و امضای قانون» فقط **یک بار در انتهای قانون** می‌آید (متن به تصویب رسیدن + امضاها با هم)؛ دیگر برای هر پاراگراف یک باکس جداگانه ساخته نمی‌شود.
•تشخیص هوشمند: پاراگراف‌هایی که اتفاقی شامل کلمه «مصوب» هستند اما جزء متن ماده‌اند (مثل «الف) قانون: قانون شوراهای حل اختلاف مصوب ۱۴۰۲...») به‌طور خودکار به ماده‌ی خودشان برمی‌گردند.

۲) 🔒 حریم خصوصی منابع تأمین محتوا

•نام هیچ‌کدام از سایت‌های منبع (منبع اصلی و منبع دوم) در **هیچ صفحه عمومی سایت** نمایش داده نمی‌شود — از لاگ تغییرات گرفته تا هر جای دیگر در دید کاربر.
•**اسلاگ قوانین ایمپورت‌شده از منبع دوم خنثی شد**: به جای پیشوند قبلی، حالا dvn2-{post_id} — یعنی در آدرس صفحه قانون هم هیچ نشانی از نام منبع نیست (قوانین قبلی که با اسلاگ قدیمی وارد شده‌اند باید حذف و دوباره وارد شوند).
•فایل‌های مستندات و لاگ ریشه سایت (CHANGELOG.md، README و...) دیگر از مرورگر قابل بازکردن نیستند (خطای ۴۰۳) — فیلتر htaccess اضافه شد.
•در دیتابیس هم منبع قوانین فقط با عنوان عمومی «مرجع رسمی» ثبت می‌شود (یکسان برای همه منابع).
•صفحه عمومی «لاگ تغییرات» حالا فیلتر خودکار دارد؛ اگر آینده هم نامی از منابع در تغییرات نوشته شود، در نمایش عمومی با «منبع رسمی» جایگزین می‌شود.
•لینک‌های مقایسه منبع فقط در **پنل مدیریت** (صفحه ایمپورت) در دسترس ادمین است.

**فایل‌ها:** app/Helpers/منبع رسمی.php، app/routes_admin.php، public/index.php، .htaccess، CHANGELOG.md

---

v5.3.0 — API استاندارد هوش مصنوعی + اسکرپر منبع دوم قوانین



۱) 🌐 API استاندارد OpenAI برای بخش هوش مصنوعی

علاوه بر ZhipuAI BigModel و DeepSeek، حالا **استانداردی که تقریباً همه سرویس‌های هوش مصنوعی دنیا استفاده می‌کنند** (OpenAI-compatible) اضافه شد:

•کارت «API استاندارد OpenAI» در تنظیمات (ادمین → تنظیمات → هوش مصنوعی) با ۷ سرویس آماده:
- **OpenAI** (gpt-4o-mini) — **Groq** (رایگان/سریع) — **OpenRouter** (+۴۰۰ مدل) — **AvalAI** (ایرانی) — **Together AI** — **Mistral** — **Ollama** (لوکال)
•هر سرویس دیگری که OpenAI-compatible باشد هم جواب می‌دهد: کافی است «آدرس پایه API» (بدون /chat/completions) + کلید + نام مدل را دستی وارد کنید.
•نرمال‌سازی خودکار آدرس API (اگر ادمین /chat/completions را هم وارد کرده باشد، دوبار اضافه نمی‌شود).
•دو تنظیم جدید اختیاری: **دمای مدل** (temperature — پاسخ دقیق‌تر برای تفسیر قانون) و **حداکثر توکن پاسخ** (max_tokens — کنترل هزینه).
•پشتیبانی از هر دو فرمت پاسخ استاندارد (choices[0].message.content و legacy choices[0].text) و پیام‌های خطای استاندارد.

**فایل‌ها:** app/Helpers/AI.php، app/routes_admin.php، resources/views/admin/settings.php

۲) 📥 اسکرپر جدید: ایمپورت قوانین از منبع دوم

صفحه جدید در پنل: **ادمین → «ایمپورت منبع دوم»** — با **دقیقاً همان استانداردهای ایمپورت منبع اصلی** (مقدمه، بخش‌های کتاب/باب/فصل، مواد با شماره و عنوان، تاریخ تصویب، description و دسته‌بندی خودکار):

•**لیست از REST API وردپرس منبع دوم** (۴۲ هزار+ پست، ۱۰۰ آیتم در هر صفحه) با صفحه‌بندی، فیلتر دسته و جستجو
•پارس محتوا: ماده (فارسی/عددی/حرفی مثل «ماده اول»)، بخش‌ها (جلد/کتاب/باب/فصل)، تبصره‌ها و لیست‌ها به ماده خودشان می‌چسبند، نقل‌قول‌های «نسخه قدیمی» حذف می‌شوند، متن مصوبه/امضا نگه داشته می‌شود
•**تشخیص تکراری در سه لایه** — قانون تکراری هرگز ایمپورت نمی‌شود:
۱) تطبیق source_url (لینک همان پست منبع)
۲) تطبیق slug (dvn2-{post_id})
۳) تطبیق **عنوان نرمال‌شده فارسی** با قوانین موجود از **هر منبعی** — علامت‌های «[مصوب ۱۴۰۵]»، نیم‌فاصله، ی/ي و ك/ک نادیده گرفته می‌شود
•**در لیست مشخص می‌شوند**: بج سبز «✓ وارد شده از این منبع» و بج کهربایی «⚠ تکراری — هم‌نام با قانون موجود»
•**دو لینک مقایسه برای هر قانون**: لینک قانون در منبع + لینک قانون وارد‌شده در «دیوان قانون» — تا بررسی کنید آیا آن دو قانون یکی هستند یا نه (لینک‌ها فقط در پنل مدیریت)
•پیش‌نمایش کامل قبل از ایمپورت: تعداد ماده، بخش‌ها، نمونه مواد، هشدار تکراری با لینک مقایسه
•منبع ثبت‌شده در دیتابیس: فقط عنوان عمومی «مرجع رسمی» + source_url (بدون نام برند)

**فایل‌ها:** app/Helpers/منبع رسمی.php (جدید)، app/routes_admin.php، resources/views/admin/import-منبع رسمی.php (جدید)، resources/views/layouts/admin.php

---

v5.2.0 — سئوی کامل صفحات + کنترل ادمین



🎯 مشکل حل‌شده

در گوگل، همه صفحات با عنوان «دیوان قانون» ایندکس شده بودند؛ چون اکثر صفحات (دسته‌بندی‌ها، گاه‌شمار، برچسب‌ها، تماس، وبلاگ و...) هیچ عنوان و توضیحات اختصاصی نداشتند و فقط نام سایت در تگ <title> می‌آمد.

✅ چه چیزی اضافه شد؟


**۱) عنوان اختصاصی و سئوشده برای تک‌تک صفحات:**
•الگوی استاندارد: «عنوان همان صفحه | دیوان قانون»
•صفحه قانون: «قانون مدنی | دیوان قانون»
•صفحه دسته: «قوانین مدنی | دیوان قانون»
•وبلاگ، برچسب‌ها، گاه‌شمار، درباره، تماس، لاگ تغییرات و... همگی عنوان یکتا دارند
•عنوان‌های طولانی‌تر از ~۶۵ کاراکتر در مرز کلمه بریده و با «…» کوتاه می‌شوند (الگوی گوگل)
•صفحه اصلی: «دیوان قانون | مرجع قوانین و مقررات ایران»

**۲) توضیحات متا (Meta Description) خودکار و کلیدواژه‌محور:**
•برای هر قانون: «متن کامل و آخرین اصلاحات «نام قانون» شامل ۵۱۲ ماده — [خلاصه قانون]»
•برای هر دسته: «فهرست قوانین «نام دسته» — ۲۳ قانون با متن کامل، آخرین اصلاحات و جستجو در مواد قانونی.»
•برای هر برچسب، صفحه وبلاگ و صفحات اختصاصی هم به‌طور خودکار از محتوای همان صفحه ساخته می‌شود
•همه توضیحات ≤۱۶۰ کاراکتر (استاندارد نمایش گوگل) و حاوی عبارات واقعی جستجوی کاربران: «متن کامل»، «آخرین اصلاحات»، «ماده»، «قانون ...»

**۳) پنل مدیریت سئو (ادمین → «سئوی صفحات»):**
•برای ۱۵ نوع صفحه، ادمین می‌تواند عنوان و توضیحات دلخواه ثبت کند (خالی = خودکار)
•شمارنده کاراکتر زنده با رنگ (سبز/نارنجی/قرمز) + پیش‌نمایش زنده سبک گوگل
•کلمات کلیدی پیش‌فرض و توضیحات پیش‌فرض سایت هم از همین صفحه قابل تغییر است
•**فیلدهای سئوی اختصاصی هر قانون** هم به فرم ویرایش قانون اضافه شد (عنوان سئو + توضیحات سئو) — اولویت: اختصاصی قانون > تنظیم نوع صفحه > خودکار

**۴) رفع ایندکس‌های مزاحم (noindex):**
•صفحات نتایج جستجو، مقایسه، ورود/ثبت‌نام، داشبورد و صفحات خطا: noindex (محتوای تکراری/کم‌ارزش برای گوگل)
•نسخه موبایل اپ (/app/...): noindex — دیگر با نسخه اصلی سایت در گوگل رقابت نمی‌کند و عبارت «دیوان قانون» تکراری ایندکس نمی‌شود
•canonical اشتباه وبلاگ (که در نصب ساب‌فولدر آدرس بدون /divanlaw تولید می‌کرد) اصلاح شد

**فایل‌ها:** app/Helpers/SEO.php، public/index.php، app/routes_admin.php، resources/views/admin/seo.php (جدید)، resources/views/admin/law-form.php، resources/views/layouts/admin.php، resources/views/layouts/app_mobile.php، resources/views/home.php، resources/views/law-detail.php، resources/views/about.php، resources/views/auth/login.php، resources/views/auth/register.php، resources/views/errors/{404,403,419,maintenance}.php

**نکته سئو:** بعد از نصب، در Google Search Console درخواست بازخزیده‌سازی (Request Indexing) برای صفحات مهم بدهید؛ عنوان‌های جدید طی چند روز تا چند هفته جایگزین می‌شود.

---

v5.1.0 — رفع کامل سرچ + سایت‌مپ + پرش به ماده



۱) رفع خطای جستجو (SQLSTATE[HY093]) — ریشه‌ای

**ریشه مشکل:** در public/index.php کوئری جستجو از یک پلیس‌هولدر به نام :q سه بار در یک جمله SQL استفاده می‌کرد (title LIKE :q OR description LIKE :q OR content LIKE :q). اتصال PDO با ATTR_EMULATE_PREPARES => false (prepare واقعی MySQL) از تکرار همین پلیس‌هولدر پشتیبانی نمی‌کند → خطای Invalid parameter number در DB.php:88. همین خطا در لاگ سرور (public/error_log) در تاریخ‌های ۳ و ۴ اکتبر ثبت شده بود.

**اصلاحات:**
•پلیس‌هولدرها به :q1 / :q2 / :q3 تفکیک شدند (کوئری اصلی + کوئری شمارش هر دسته)
•LIMIT :off, :lim به مقدار عددی inline تبدیل شد (با prepare واقعی قابل‌اعتماد نیست)

۲) جستجوی هوشمند «ماده N قانون X» — سایت و ربات

قبل: جستجوی «ماده 10 قانون مدنی» نتیجه‌ای نمی‌داد و مجبور بودید فقط اسم قانون را بزنید.

**حالا هر دو حالت پشتیبانی می‌شود:**
•«ماده 10 قانون مدنی» / «ماده ۱۰ قانون مدنی» (اعداد فارسی)
•«قانون مدنی ماده 10» (ترتیب معکوس)
•«ماده 10 از قانون مدنی» / «ماده 10 مدنی»

**رفتار:**
•**سایت:** کارت سبز «✅ نتیجه دقیق پیدا شد» بالای نتایج با پیش‌نمایش متن ماده + دکمه «مشاهده ماده» → پرش مستقیم به همان ماده (/law/{slug}/article/{N})
•**رتبه‌بندی هوشمند:** قانونی که عنوانش با «قانون <اسم>» شروع می‌شود اولویت دارد (یعنی «ماده 10 قانون مدنی» → قانون مدنی، نه آیین دادرسی مدنی)
•**ربات بله:** همان تشخیص؛ ماده را مستقیم در چت می‌فرستد + لینک مستقیم ماده در سایت
•اگر ماده در قانون پیدا نشد یا کوئری ماده‌محور نبود → جستجوی عادی قبل مثل قبل کار می‌کند

۳) رفع کامل 404 سایت‌مپ — دو لایه محافظت

**ریشه مشکل:** قانون شماره ۴ در .htaccess روت برای sitemap.xml بازنویسی را متوقف می‌کرد (RewriteRule ... - [L])، در حالی که فایل فیزیکی وجود نداشت → آپاچی خودش 404 می‌داد. روت داینامیک سitemap در index.php از قبل وجود داشت ولی هیچ‌وقت اجرا نمی‌شد.

**اصلاحات:**
•.htaccess: درخواست sitemap.xml و robots.txt حالا به فرانت‌کنترلر (public/index.php) می‌رود و XML داینامیک تولید می‌شود
•**فایل فیزیکی:** هر بار سitemap داینامیک تولید شود (و همچنین کرون ربات هر ~۲ ساعت)، یک کپی واقعی sitemap.xml در روت پروژه (/home/irsalami/public_html/divanlaw/sitemap.xml) نوشته می‌شود — یعنی یک فایل واقعی در روت دارید که آپاچی مستقیم سرو می‌کند
•حتی اگر .htaccess به هر دلیلی کار نکند، فایل فیزیکی توسط کرون ربات به‌روز می‌ماند

۴) پرش به ماده از لینک مستقیم — حتی برای مواد آخر قانون

قبل: لینک #article-50 وقتی ماده ۵۰ در «بارگذاری بیشتر» لود نشده بود، کاری نمی‌کرد.

**اصلاحات در law-detail.php:**
•تابع scrollToArticle حالا اگر ماده هنوز لود نشده، خودکار دسته‌های بعدی را از سرور می‌کشد تا ماده ظاهر شود، بعد اسکرول + هایلایت
•اگر صفحه با #article-N باز شود (لینک مستقیم از گوگل/ربات/سرچ)، همان بارگذاری خودکار انجام می‌شود
•این یعنی همه‌ی لینک‌های عمیق ماده در سایت‌مپ (هر ۶۰۰۰+ ماده یک URL) حالا واقعاً کار می‌کنند

**فایل‌های تغییر یافته (۷ فایل):**
•.htaccess
•public/index.php
•app/routes_bot.php
•resources/views/search.php
•resources/views/law-detail.php
•CHANGELOG.md
•README-FIX.md (جدید — راهنمای نصب)

**تست‌های انجام‌شده (روی کپی واقعی پروژه با PHP 8.2):**
•جستجوی «ماده 10 قانون مدنی» → کارت نتیجه دقیق + لینک ماده ✓
•ترتیب معکوس «قانون مدنی ماده ۱۰» با اعداد فارسی ✓
•۱۰ حالت مختلف پارسر + اولویت‌بندی قانون هم‌نام ✓
•/sitemap.xml → 200 + XML معتبر + ساخت فایل فیزیکی در روت ✓
•/robots.txt → 200 ✓
•لینک مستقیم ماده → 301 به #article-10 + AJAX بارگذاری مواد ✓
•جستجوی عادی بدون خطای HY093 ✓

---

v5.0.2 — فیکس ۴



🤖 رفع «عضویت اجباری کانال کار نمی‌کند» + ابزار تست


**ریشه مشکل:** بله (برخلاف تلگرام) برای کاربر غیرعضو در getChatMember به‌جای status:"left" یک **خطای API** برمی‌گرداند (Invalid Chat or User ID / user not found). کد قبلی هر خطای API را «مشکل پیکربندی» فرض می‌کرد و عبور می‌داد (fail-open) → هیچ کاربری بلاک نمی‌شد.

**اصلاحات:**
•BaleBot::isChannelMember() بازنویسی شد:
- اعتبارسنجی کانال با getChat (کش در هر درخواست) — کانال خراب = عبور ایمن + ثبت علت
- کانال سالم + خطای کاربرمحور = **کاربر عضو نیست → بلاک**
- خطاهای دسترسی/موقت (forbidden، flood، timeout، 5xx، …) = عبور ایمن (کاربر واقعی هرگز اشتباهی بلاک نمی‌شود)
•تنظیم تشخیصی bot_force_join_diag — آخرین علت عبور ایمن، با نمایش جعبه قرمز در پنل
•BaleBot::probeForceJoin() + endpoint POST /admin/bot/test-force-join — دکمه «🔍 تست عضویت اجباری» در پنل با پاسخ خام بله
•رد لینک دعوت ble.ir/join/… هنگام ذخیره «تگ کانال» و «کانال عضویت اجباری» (کانال خصوصی با API قابل بررسی نیست — باید تگ عمومی یا شناسه عددی باشد)
•راهنمای دقیق‌تر فیلدهای کانال در پنل

**فایل‌های تغییر یافته:**
•app/Helpers/BaleBot.php
•app/routes_admin.php
•resources/views/admin/bot.php
•README-FIX4.md / CHANGELOG.md

---

v5.0.1



🤖 اصلاحات کامل ربات بله — فرمت پیام + ارسال کانال + پنل ادمین


**۱) فرمت پیام‌ها به سبک بله (مهم‌ترین تغییر):**
•بله تگ‌های HTML (<b>، <a href>) را رندر نمی‌کند و به‌صورت متن خام نمایش می‌داد. همه پیام‌های ربات (وبهوک، ارسال روزانه، پنل ادمین) به **فرمت مارک‌داون بله** تبدیل شد: *پررنگ*، [لینک](آدرس)، - [ ] آیتم تیک‌دار
•ساختار جدید پست کانال: عنوان بولد + خط جداکننده + ماده با شماره فارسی + لینک‌های سایت/اپ/کانال با ایموجی
•ایموجی‌های جذاب‌تر در خوش‌آمدگویی (با چک‌لیست قابلیت‌ها)، راهنما، نتایج جستجو، دسته‌بندی‌ها
•تابع BaleBot::mdText() — محتوای قوانین را از کاراکترهای مخرب مارک‌داون (* _ [ ]) پاکسازی می‌کند تا فرمت به‌هم نریزد

**۲) رفع خطای ۴۰۴ ارسال به کانال (ریشه‌ای):**
•پنل ادمین تگ کانال را بدون @ ذخیره می‌کرد و کد همان مقدار خام را به API می‌فرستاد → پاسخ بله: 404 no such group or user برای همه ارسال‌ها
•تابع جدید BaleBot::normalizeChatId(): عدد → همان عدد، تگ → @tag. و BaleBot::channelChatId() در همه ارسال‌های کانال استفاده می‌شود (daily-send + getChatMember عضویت اجباری)
•**رفع لینک شکسته «کانال ما»**: قبلاً href="divanlaw" (متن خام تگ) تولید می‌شد؛ حالا BaleBot::bleChannelUrl() لینک درست https://ble.ir/tag می‌سازد
•ذخیره تگ کانال هوشمند شد: @tag، tag یا لینک کامل https://ble.ir/tag را قبول می‌کند و همیشه تگ تمیز ذخیره می‌شود

**۳) پنل ادمین ربات:**
•**دکمه ذخیره تنظیمات** و بقیه دکمه‌ها رنگ صریح سبز گرفتند (قبلاً روی تم ادمین سفید/نامرئی بودند)
•**ویرایشگر بصری دکمه‌های منوی اصلی** جایگزین JSON خام شد: افزودن/حذف ردیف و دکمه، انتخاب نوع (عملیاتی/لینک)، جابجایی ردیف‌ها، اعتبارسنجی هنگام ذخیره
•**دکمه «بررسی اتصال ربات»** (getMe) + **دکمه «تست ارسال به کانال»** با نمایش دلیل دقیق خطای بله + راهنمای رفع (تگ اشتباه یا ربات ادمین نیست)
•فیلد جدید **«کلید کرون» (اختیاری)** برای محافظت از /bot/daily-send

**۴) رفع باگ‌های دیگر ربات:**
•دکمه‌های نتیجه جستجو کار نمی‌کردند (callback_data: law_ بدون هندلر → اصلاح به lawid_)
•/bot/daily-send حالا کلید مخفی اختیاری دارد (?key=) تا هر کسی نتواند کانال را اسپم کند
•عضویت اجباری: خطای API حالا لاگ می‌شود (fail-open با گزارش) و وضعیت restricted هم عضو حساب می‌شود
•vendor/init.php: محافظ function_exists برای loadEnvFile() — رفع خطای «Cannot redeclare» در برخی ابزارها

**فایل‌های تغییر یافته:**
•app/Helpers/BaleBot.php — مارک‌داون بله + normalizeChatId/channelChatId/bleChannelUrl/mdText
•app/routes_bot.php — همه پیام‌ها به مارک‌داون، رفع ارسال کانال، کلید کرون، رفع دکمه‌های جستجو
•app/routes_admin.php — ذخیره هوشمند تگ، کلید کرون، endpoint جدید /admin/bot/test-channel
•resources/views/admin/bot.php — بازطراحی کامل + ویرایشگر بصری منو + دکمه‌های تست
•vendor/init.php — محافظ loadEnvFile
•CHANGELOG.md` — همین بخش

---

v5.0.0



📱 نسخه موبایل اپ (PWA-ready) — مستقل از نسخه وب


**قابلیت بزرگ:** ساخت پوسته اپلیکیشن موبایل کامل در مسیر /app، کاملاً جدا از نسخه وب. این نسخه با ساختار بلوکی قابل تنظیم، آماده بسته‌بندی برای کافه بازار (با Capacitor/TWA) است.

**ویژگی‌ها:**
•**نوار ناوبری پایین (Bottom Nav):** ۵ تب — خانه، دسته‌ها، جستجو (دکمه مرکزی برجسته)، نشان‌ها، پروفایل
•**هدر چسبنده:** لوگو + آیکون اعلان (با badge شمارش خوانده‌نشده) + دکمه تم تاریک/روشن
•**سیستم بلوکی مستقل (app_blocks):** ۱۵ نوع بلوک قابل افزودن/حذف/جابجایی از پنل ادمین، بدون تأثیر روی نسخه وب
•**بلوک‌های پیش‌فرض صفحه خانه:** بنر معرفی (با جستجوی داخلی)، نوار آمار انیمیشنی، گرید دسترسی سریع، قانون روز، قوانین جدید (اسکرول افقی)، پربازدیدترین، دسته‌بندی‌ها، ابر برچسب‌ها، خط زمانی
•**صفحات اپ:** خانه، دسته‌بندی‌ها، جزئیات دسته، جستجو، جزئیات قانون، جزئیات برچسب، نشان‌ها، پروفایل/آمار، اعلان‌ها، خط زمانی
•**API اختصاصی اپ:** GET /api/v1/app/blocks (دریافت پیکربندی بلوک‌ها)، GET /api/v1/app/stats (آمار ترکیبی)، GET /api/v1/app/notifications (اعلان‌ها)
•**مرکز اعلان:** جدول app_notifications + صفحه اعلان‌ها + badge شمارش در هدر
•**آمار حرفه‌ای:** شمارش انیمیشنی (count-up)، آمار سایت + آمار شخصی کاربر (نشان‌ها، بازدیدها، دنبال‌شده‌ها، نظرات)
•**پنل ادمین مدیریت بلوک‌ها:** /admin/app-blocks با drag-and-drop reorder، toggle فعال/غیرفعال، ویرایش کامل، افزودن از کاتالوگ گروه‌بندی‌شده، بازگردانی به پیش‌فرض
•**طراحی متمایز:** رنگ برند سبز-طلایی دیوان‌قانون (نه سرمه‌ای مرجع)، کارت‌های گوشه‌گرد، فاصله‌گذاری راحت، RTL کامل

**تفاوت با نسخه وب:** ساختار اپ موبایل-فرست و جمع‌وجور است (نوار پایین به‌جای منوی بالای صفحه، بنر فشرده، اسکرول افقی کارت‌ها). محتوا یکسان است (همان دیتابیس) ولی ارائه متفاوت. تغییرات بلوک‌های اپ هیچ تأثیری روی نسخه وب ندارد.

فایل‌های جدید

•app/Helpers/AppBlocks.php — رندرر بلوک‌های موبایل + کاتالوگ + helperهای faNum/iconSvg
•app/routes_app.php — همه مسیرهای /app/*
•resources/views/layouts/app_mobile.php — layout موبایل با bottom-nav
•resources/views/app_*.php — ۱۰ ویوی اپ (home, categories, category_detail, search, law_detail, tag_detail, bookmarks, profile, notifications, timeline)
•resources/views/admin/app_blocks.php — پنل ادمین مدیریت بلوک‌ها
•storage/migrate_app_blocks.php — مهاجرت: جداول app_blocks + app_notifications + seed پیش‌فرض

فایل‌های تغییر یافته

•public/index.php — require مسیرهای اپ + مسیر /install-migrate-app
•app/routes_api.php — اضافه‌شدن ۳ endpoint اپ (/api/v1/app/blocks|stats|notifications)
•app/routes_admin.php — اضافه‌شدن ۵ مسیر مدیریت بلوک‌های اپ (list/save/delete/reorder/toggle/reset)
•resources/views/layouts/admin.php — لینک ناوبری «📱 بلوک‌های اپ»
•vendor/init.php — (از v4.9.2) ثابت COLLATE_CI که اپ هم از آن استفاده می‌کند
•CHANGELOG.md — به‌روزرسانی به v5.0.0

مراحل راه‌اندازی روی سرور تولید

1. فایل‌های زیپ را در روت پروژه اکسترکت کنید.
2. وارد پنل ادمین شوید.
3. یک‌بار آدرس /install-migrate-app را باز کنید تا جداول app_blocks و app_notifications ساخته و با بلوک‌های پیش‌فرض پر شوند.
4. اپ در آدرس /app در دسترس است. برای انتشار در کافه بازار، می‌توانید این PWA را با Capacitor یا Trusted Web Activity بسته‌بندی کنید.

---

v4.9.2



رفع خطای collation در صفحات برچسب‌ها (MySQL)

**مشکل:** هنگام کلیک روی برچسب‌ها در سایت تولیدی (MySQL)، خطای زیر نمایش داده می‌شد:
``
SQLSTATE[HY000]: General error: 1267 Illegal mix of collations
(utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='
`
**علت:** جدول
law_tags (ایجاد‌شده توسط migrate_tags.php) در MySQL با collation پیش‌فرض متفاوتی نسبت به جداول اصلی ساخته شده بود. JOIN بین این دو جدول روی ستون‌های رشته‌ای باعث تضاد collation می‌شد. کوئری صفحه law-detail قبلاً با COLLATE utf8mb4_general_ci اصلاح شده بود، اما سه جای دیگر جا افتاده بود.

**رفع:**
•اضافه‌شدن COLLATE به سه کوئری جاافتاده: لیست برچسب‌ها (cloud)، صفحه جزئیات برچسب، قوانین مرتبط با برچسب مشترک.
•تعریف ثابت سراسری COLLATE_CI در vendor/init.php — در MySQL برابر COLLATE utf8mb4_general_ci و در SQLite برابر رشته خالی. این‌طور کد هم در محیط توسعه (SQLite) و هم تولید (MySQL) بدون تغییر کار می‌کند.
•جایگزینی هر ۹ مورد COLLATE utf8mb4_general_ci هاردکدشده در public/index.php با ثابت COLLATE_CI.
•اضافه‌شدن مهاجرت جدید storage/migrate_collation.php (مسیر /install-migrate-collation) — تمام جداول و ستون‌های متنی دیتابیس را به utf8mb4_general_ci یکپارچه می‌کند (MySQL فقط؛ SQLite بدون عملیات).

**مراحل اعمال روی سرور تولید:**
1. سه فایل تغییر یافته را آپلود کنید.
2. وارد پنل ادمین شوید.
3. آدرس
/install-migrate-collation را یک‌بار باز کنید تا collation همه جداول یکپارچه شود.

فایل‌های تغییر یافته

•php-cms/public/index.php — COLLATE_CI در ۹ جای SQL + مسیر جدید /install-migrate-collation
•php-cms/vendor/init.php — تعریف ثابت COLLATE_CI
•php-cms/storage/migrate_collation.php` — **جدید** — مهاجرت یکپارچه‌سازی collation

---

v4.9.1



رفع باگ‌های ویرایشگر صفحات

•**رفع مودال باز نمی‌شد/بسته نمی‌شد**: کلاس hidden Tailwind با display:flex تداخل داشت. به modal-hidden با !important تغییر یافت.
•**رفع URL دوگانه**: تابع peUrl() هنگام URLهایی که قبلاً query string داشتند، ? دوگانه تولید می‌کرد (?page=faq?XTransformPort=8000). حالا به‌درستی & اضافه می‌کند.
•**رفع خطای «صفحه یافت نشد»** هنگام ایجاد صفحه جدید: redirect URL اصلاح شد.

فایل‌های تغییر یافته

•php-cms/resources/views/admin/pages.php — رفع modal CSS + peUrl() URL construction
•php-cms/public/update.php — v4.9.1
•php-cms/resources/views/layouts/app.php — نسخه ۴.۹.۱

---

v4.9.0



نمایش ساختار کامل صفحه در ویرایشگر

**مشکل قبلی:** ویرایشگر فقط بلوک‌های سفارشی را نشان می‌داد — بلوک‌های پیش‌فرض سایت (هدر، هیرو، آمار و...) نمایش داده نمی‌شدند. کاربر نمی‌توانست ببیند بلوک جدیدش کجا قرار می‌گیرد.

**رفع:** ویرایشگر حالا **ساختار کامل صفحه** را نشان می‌دهد:
•**بلوک‌های سیستمی (🔒)**: بخش‌های پیش‌فرض سایت (هدر، فوتر، هیرو، آمار و...) به‌صورت خاکستری و فقط‌خواندنی نمایش داده می‌شوند
•**منطقه سفارشی (سبز)**: جایی که بلوک‌های شما قرار می‌گیرند — کاملاً مشخص است کجا در صفحه هستند

برای هر صفحه، بلوک‌های سیستمی متفاوت است:
•**صفحه اصلی**: هدر، هیرو، آمار، قانون روز، دسته‌بندی‌ها، قوانین جدید، پربازدید، آمار AI، مواد پربازدید، فوتر
•**درباره ما**: هدر، بلوک سفارشی، هیرو، مأموریت، آمار، قابلیت‌ها، چطور کار می‌کند، هشدار، تماس توسعه‌دهنده، فوتر
•**تماس با ما**: هدر، بنر، کارت‌های اطلاعات، فرم تماس، فوتر
•**صفحه قانون**: هدر، بلوک سفارشی، هدر قانون، مقدمه، کنترل فونت، فهرست مواد، مواد، چتبات، مرتبط، نظرات، فوتر

ایجاد صفحات جدید

•دکمه «صفحه جدید» در بالای ویرایشگر
•وارد کردن عنوان + آدرس (slug) صفحه
•صفحه در آدرس /page/{slug} قابل دسترس می‌شود
•صفحات سفارشی با علامت ✦ در تب‌ها متمایز می‌شوند

ویرایش عنوان و آدرس صفحات سفارشی

•برای صفحات سفارشی، دکمه «ویرایش عنوان/آدرس» و «حذف صفحه» نمایش داده می‌شود
•تغییر آدرس (slug) → تمام بلوک‌های صفحه هم به‌روزرسانی می‌شوند

فایل‌های تغییر یافته

•php-cms/resources/views/admin/pages.php — بازنویسی کامل با system blocks + new/rename/delete page
•php-cms/resources/views/custom-page.php ← **جدید** — رندر صفحات سفارشی
•php-cms/app/routes_admin.php — مسیر /admin/pages/manage برای create/rename/delete
•php-cms/public/index.php — مسیر /page/{slug} برای صفحات سفارشی
•php-cms/public/update.php — v4.9.0
•php-cms/resources/views/layouts/app.php — نسخه ۴.۹.۰

---


---

v4.8.0



رفع بلوک‌های صفحه اصلی + صفحه قانون

**مشکل:** بلوک‌هایی که در ویرایشگر برای صفحه «home» اضافه می‌شدند نمایش داده نمی‌شدند — چون home.php و law-detail.php متد PageBlocks::render() را فراخوانی نمی‌کردند.

**رفع:**
•home.php → PageBlocks::render('home') اضافه شد (در بالای صفحه، قبل از Hero)
•law-detail.php → PageBlocks::render('law-detail') اضافه شد (در بالای صفحه، قبل از هدر قانون)

بازنویسی کامل ویرایشگر صفحات

**مشکل قبلی:**
•ویرایشگر خودکار لود نمی‌شد
•بلوک‌های اضافه‌شده نمایش داده نمی‌شدند (به‌خاطر مشکل URL fetch)
•رابط کاربری شلوغ و نامناسب بود

**رفع:**
•**رفع مشکل fetch URLs**: تابع peUrl() اضافه شد که به‌صورت خودکار XTransformPort را به URLهای fetch اضافه می‌کند (در محیط sandbox لازم، در production بی‌تأثیر)
•**۶ صفحه قابل ویرایش**: اصلی، درباره ما، تماس با ما، صفحه قانون، جستجو، دسته‌بندی‌ها
•**۸ نوع بلوک**: متن، عنوان، ویدیو، تصویر، نقل‌قول، هشدار، کارت اطلاعات، HTML دلخواه
•**انتخابگر نوع بلوک بصری**: به‌جای dropdown، گرید از کارت‌های نوع (هر کدام با آیکون)
•**پیش‌نمایش زنده**: هر بلوک پیش‌نمایش خودش را نشان می‌دهد (متن، ویدیو، تصویر و...)
•**ویرایش inline**: روی ✏️ بزنید → فرم ویرایش در همان کارت باز می‌شود
•**دکمه‌های همیشه قابل دیدن**: ↑↓ 👁️ ✏️ 🗑 روی هر بلوک
•**نوار زبان صفحه**: تب‌های بالای صفحه برای جابه‌جایی بین صفحات
•**Toast notifications**: پیام موفقیت/خطا به‌صورت浮动

تست‌ها

| Test | Result |
|------|--------|
| Homepage renders PageBlocks | ✓ PageBlocks::render('home') |
| Law detail renders PageBlocks | ✓ PageBlocks::render('law-detail') |
| Page editor auto-loads blocks | ✓ |
| Add block via UI | ✓ (3 blocks after add) |
| Delete block via UI | ✓ (2 blocks after delete) |
| Inline edit toggles | ✓ |
| 6 page tabs visible | ✓ |
| 8 block type buttons | ✓ |
| Fetch URLs work with XTransformPort | ✓ peUrl() helper |

فایل‌های تغییر یافته

•php-cms/resources/views/home.php — افزودن PageBlocks::render('home')
•php-cms/resources/views/law-detail.php — افزودن PageBlocks::render('law-detail')
•php-cms/resources/views/admin/pages.php — **بازنویسی کامل** با peUrl() fix + UI بهبودیافته
•php-cms/public/update.php — v4.8.0
•php-cms/resources/views/layouts/app.php — نسخه ۴.۸.۰
•php-cms/CHANGELOG.md — لاگ v4.8.0

---

v4.7.0



رفع شمارش مواد در پنل ادمین

•پنل ادمین (داشبورد) از COUNT(*) استفاده می‌کرد که شامل ردیف‌های تکراری بود.
•حالا از Settings::liveArticleCount() (DISTINCT) استفاده می‌کند — همان روش صفحه اصلی.

ویرایشگر صفحات زنده (Live Editor)

**بازنویسی کامل** ویرایشگر صفحات به‌صورت زنده (inline):

#### ویرایش مستقیم (بدون مودال)
•هر بلوک یک کارت است با: پیش‌نمایش زنده + فرم ویرایش inline
•روی دکمه ✏️ بزنید → فرم ویرایش باز می‌شود (در همان کارت، نه در مودال)
•تغییر عنوان/محتوا → پیش‌نمایش بلافاصله به‌روزرسانی می‌شود
•روی 💾 بزنید → ذخیره + رفرش

#### حذف همیشه قابل دسترس
•دکمه 🗑 روی هر بلوک همیشه قابل دیدن است
•با کلیک روی 🗑 → بلوک بلافاصله حذف می‌شود (بدون نیاز به باز کردن مودال)

#### دکمه‌های کنترل
•↑ ↓ : جابه‌جایی بالا/پایین (با drag-reorder در سرور)
•👁️/🚫 : فعال/غیرفعال‌کردن بلوک
•✏️ : ویرایش inline
•🗑 : حذف

#### نوع بلوک جدید: کارت اطلاعات (info_card)
•مناسب برای اطلاعات تماس (ایمیل، ساعت، تلفن، آدرس)
•محتوا به‌صورت JSON: {"icon":"mail","icon_color":"primary","subtitle":"...","content":"...","link_url":"...","link_text":"..."}
•آیکون‌های موجود: mail, clock, phone, location, flag, ai, info
•رنگ‌های قابل انتخاب: primary, amber, rose, emerald, sky, violet, gold
•پشتیبانی از gradient background

صفحه تماس با ما اکنون قابل ویرایش

•۴ بلوک پیش‌فرض برای صفحه تماس ایجاد می‌شود (ایمیل، ساعت، گزارش خطا، هوش مصنوعی)
•همه از نوع info_card — قابل ویرایش از پنل ادمین
•کد HTML hardcoded در contact.php با PageBlocks::render('contact') جایگزین شد
•ایمیل (mailto:)، لینک‌های داخلی (/search) و لینک‌های خارجی همگی پشتیبانی می‌شوند

نتایج تست

| Test | Result |
|------|--------|
| Admin dashboard article count | ✓ Uses Settings::liveArticleCount() |
| Page editor shows 4 contact blocks | ✓ پست الکترونیک، ساعات، گزارش، AI |
| Each block has edit + delete buttons | ✓ Always visible |
| Inline edit form toggles | ✓ ✏️ button opens form inline |
| Contact page renders info cards | ✓ 4 cards from DB |
| Email mailto link works | ✓ mailto:info@divan.qanun |
| Hours display correctly | ✓ "۹:۰۰ تا ۱۷:۰۰" |
| Page selector tabs (about/contact) | ✓ |

فایل‌های تغییر یافته

•php-cms/app/Helpers/PageBlocks.php — اضافه شدن renderInfoCard() + رفع لینک‌های mailto/tel
•php-cms/app/routes_admin.php — رفع شمارش مواد در داشبورد ادمین
•php-cms/public/update.php — v4.7.0 + seed بلوک‌های پیش‌فرض صفحه تماس
•php-cms/resources/views/admin/pages.php — **بازنویسی کامل** به ویرایشگر زنده
•php-cms/resources/views/contact.php — جایگزینی HTML hardcoded با PageBlocks::render
•php-cms/resources/views/layouts/app.php — نسخه ۴.۷.۰

---

v4.6.0



رفع تب‌بندی تنظیمات (تک‌ردیفه)

•تنظیمات به ۶ تب تقلیل یافت (تب «مدیریت مواد» حذف شد — کاربر اعلام کرد لازم نیست)
•تب‌ها حالا در یک ردیف افقی با اسکرول نازک (thin scrollbar) قرار دارند — دیگر دو ردیفه نیست
•flex-wrap: nowrap + overflow-x: auto + flex-shrink: 0 روی هر تب

حذف متن «حساب تست» از فرم ورود

•متن حساب تست: admin@divan.qanun / admin123 از صفحه لاگین حذف شد.

کپچای ریاضی (Anti-Spam)

**کلاس جدید App\Helpers\Captcha** — کپچای ریاضی سبک بدون وابستگی خارجی:
•سؤال: ۳ + ۷ = ? (با ارقام فارسی)
•پاسخ در $_SESSION['captcha_answer'] ذخیره می‌شود
•پس از ۵ تلاش ناموفق، کپچا regenerate می‌شود (ضد brute-force)
•پشتیبانی از ارقام فارسی و انگلیسی
•متد Captcha::field('captcha') برای رندر خودکار

به ۳ فرم اضافه شد:
•**لاگین**: /login ✓
•**ثبت نام**: /register ✓
•**تماس با ما**: /contact ✓

بازطراحی صفحه «درباره ما»

•طراحی تمیزتر با فضای سفاداری بیشتر (padding اضافه‌تر)
•۹ کارت قابلیت به‌جای ۱۲ (حذف قابلیت‌های تکراری/کم‌اهمیت)
•کارت‌های feature با hover-lift effect + shadow نرم
•استت‌پیل‌های gradient (به‌جای کارت‌های تیره)
•بخش‌های مجزا با backgroundهای متناوب (میکروفون سفید/خاکستری)
•بدون overflow افقی

ویرایشگر منوی هدر (WordPress-like)

**قبل:** فیلد متنی با فرمت عنوان|/مسیر در هر خط.
**بعد:** ویرایشگر ساختاریافته با کارت آیتم‌ها:
•هر آیتم: عنوان + URL + زیرمنوها
•دکمه افزودن/حذف/جابه‌جایی بالا/پایین
•زیرمنوها (submenu) برای هر آیتم
•ذخیره به‌صورت JSON در header_menu_json
•پشتیبانی از لینک‌های خارجی (https://...)
•رندر dropdown در دسکتاپ، رندر flat در موبایل

ویرایشگر ستون‌های فوتر (WordPress-like)

**قبل:** ستون‌های ثابت «دسترسی سریع» و «منابع» در فایل کد.
**بعد:** ویرایشگر ساختاریافته:
•هر ستون: عنوان + لیست لینک‌ها
•افزودن/حذف ستون + افزودن/حذف/جابه‌جایی لینک
•ذخیره به‌صورت JSON در footer_columns_json
•رندر خودکار در فوتر (با برند سایت به‌عنوان ستون اول)
•پشتیبانی از لینک‌های خارجی

ویرایشگر صفحات (CMS) — جدید!

**جدول جدید page_blocks** + کلاس App\Helpers\PageBlocks:
•مدیر می‌تواند برای هر صفحه (about, contact, home, law-detail) بلوک‌های محتوای سفارشی اضافه کند
•انواع بلوک:
- text — متن (HTML مجاز، sanitized)
- html — کد HTML دلخواه (با احتیاط)
- video — ویدیو از YouTube/Aparat (auto-embed)
- image — تصویر از URL
- heading — عنوان بزرگ
- quote — نقل‌قول (سبک استایل)
- warning — هشدار (پس‌زمینه زرد)
•هر بلوک: id, page_key, block_type, title, content, sort_order, is_active
•رندر خودکار در بالای صفحه (با PageBlocks::render('about'))

#### مسیرهای ادمین
•GET /admin/pages — لیست همه بلوک‌ها (گروه‌بندی بر اساس صفحه)
•POST /admin/pages/save — ایجاد/ویرایش بلوک
•POST /admin/pages/delete — حذف بلوک
•POST /admin/pages/reorder — تغییر ترتیب با drag-reorder

#### رابط کاربری
•مودال ایجاد/ویرایش بلوک با فرم کامل
•دکمه‌های جابه‌جایی بالا/پایین
•نشانگر نوع بلوک (pill رنگی)
•پیش‌نمایش محتوای بلوک
•راهنمای کلیدهای صفحه معتبر (about, contact, home, law-detail)
•افزودن به نوار ناوبری ادمین: «ویرایشگر صفحات»

پشتیبانی از ویدیو

•YouTube: youtube.com/watch?v=ID یا youtu.be/ID → auto-embed iframe
•Aparat: aparat.com/v/HASH → auto-embed
•URLهای نامشخص → لینک قابل‌کلیک

نتایج تست

| Test | Result |
|------|--------|
| Settings tabs single-row | ✓ flex-wrap: nowrap |
| 6 tabs (not 7) | ✓ removed «مدیریت مواد» |
| Login has no demo text | ✓ |
| Captcha renders on login | ✓ |
| Captcha renders on register | ✓ |
| Captcha renders on contact | ✓ |
| About page less crowded | ✓ 9 features (was 12) |
| Header menu editor renders | ✓ items + submenus |
| Footer column editor renders | ✓ columns + links |
| Add header item dynamically | ✓ addHeaderItem() works |
| Page editor /admin/pages works | ✓ renders + saves |
| Create video block → renders on /about | ✓ iframe with youtube embed |

فایل‌های تغییر یافته

•php-cms/app/Helpers/Captcha.php ← **جدید** — کپچای ریاضی
•php-cms/app/Helpers/PageBlocks.php ← **جدید** — رندر بلوک‌های صفحه
•php-cms/app/Helpers/Settings.php — اضافه شدن متدهای JSON برای هدر/فوتر + ثابت‌های پیش‌فرض
•php-cms/app/routes_admin.php — ۴ مسیر جدید برای ویرایشگر صفحات + ذخیره‌سازی JSON هدر/فوتر
•php-cms/public/index.php — اعتبارسنجی کپچا در login/register/contact
•php-cms/public/update.php — migration v4.6.0 (جدول page_blocks) + تنظیمات پیش‌فرض JSON
•php-cms/resources/views/admin/settings.php — رفع CSS تب‌ها + حذف تب articles + ویرایشگر ساختاریافته هدر/فوتر
•php-cms/resources/views/admin/pages.php ← **جدید** — رابط کاربری ویرایشگر صفحات
•php-cms/resources/views/auth/login.php — حذف متن دمو + افزودن کپچا
•php-cms/resources/views/auth/register.php — افزودن کپچا
•php-cms/resources/views/contact.php — افزودن کپچا
•php-cms/resources/views/about.php — بازطراحی کامل + رندر بلوک‌های CMS
•php-cms/resources/views/layouts/app.php — هدر با dropdown زیرمنوها + فوتر با ستون‌های سفارشی + لینک ویرایشگر صفحات
•php-cms/resources/views/layouts/admin.php — افزودن لینک «ویرایشگر صفحات» به نوار ناوبری
•php-cms/CHANGELOG.md — لاگ v4.6.0

---

v4.5.0



رفع پین فهرست مواد (TOC Pin)

**مشکل قبلی:** وقتی روی دکمه «پین فهرست» کلیک می‌کردید، خود لیست مواد هم باز می‌شد که فضای زیادی می‌گرفت.
**رفع:** حالا فقط نوار عنوان «فهرست مواد» پین می‌شود. کاربر روی عنوان کلیک می‌کند تا لیست مواد باز شود.

رفع شمارش مواد در صفحه تنظیمات

**مشکل قبلی:** در ویجت «آمار هوش مصنوعی» در صفحه تنظیمات، تعداد کل مواد از COUNT(*) استفاده می‌شد که شامل ردیف‌های تکراری هم بود.
**رفع:** حالا از COUNT(DISTINCT CONCAT(law_id, '-', number)) استفاده می‌شود (همان روش صفحه اصلی).

صفحه تنظیمات با تب‌بندی کامل (Tabs)

**مشکل قبلی:** همه تنظیمات در یک صفحه بلند به‌صورت پشت سر هم بود که خواندن و پیدا کردن تنظیمات خاص را سخت می‌کرد.
**راه‌حل:** صفحه تنظیمات به ۷ تب مجزا تقسیم شد:
1. **عمومی** — نام سایت، توضیحات، رنگ‌ها، حالت نگهداری
2. **آمار صفحه اصلی** — انتخاب بلوک‌های آماری + اعداد تقریبی
3. **مدیریت مواد** — حذف مواد تکراری + آمار مواد یکتا (با badge وقتی تکراری وجود دارد)
4. **هوش مصنوعی** — فعال‌سازی، ارائه‌دهنده، کلید API، تست اتصال
5. **سئو و گوگل** — Google Search Console، Google Analytics، OpenGraph
6. **هیدر و فوتر** ← جدید
7. **پشتیبان‌گیری** — دانلود فایل دیتابیس

ویژگی‌ها:
•تب فعال در localStorage ذخیره می‌شود (بعد از ذخیره و رفرش، همان تب باز می‌شود)
•دکمه ذخیره sticky در پایین صفحه (همیشه قابل دسترس)
•آیکون هشدار قرمز در تب «مدیریت مواد» وقتی ردیف تکراری وجود دارد
•رابط کاربری با انیمیشن fadeIn هنگام تغییر تب
•کاملاً responsive (در موبایل افقی اسکرول می‌شود)

سفارشی‌سازی کامل هیدر و فوتر (جدید)

#### منوی هیدر قابل تنظیم
•ادمین می‌تواند آیتم‌های منوی هیدر را اضافه/حذف/مرتب کند
•فرمت ساده: هر خط یک آیتم با فرمت عنوان|/مسیر (مثلاً دسته‌بندی|/categories)
•پشتیبانی از مسیرهای خارجی (مثل https://example.com/blog)
•لینک‌های خارجی با target="_blank" باز می‌شوند
•هم در منوی دسکتاپ و هم در کشوی موبایل اعمال می‌شود

#### فوتر قابل تنظیم
•**متن کپی‌رایت**: قابل تغییر (پیش‌فرض: «ساخته شده با ❤️ برای آگاهی حقوقی شهروندان»)
•**اعتبار طراح**: نمایش/عدم نمایش نام طراح و برنامه‌نویس در فوتر
- نقش طراح: «طراح و برنامه‌نویس» (قابل تغییر)
- نام طراح: «حامد بنائی» (پیش‌فرض)
- لینک بله: https://ble.ir/irsalam
- لینک تلگرام: https://t.me/irsalam
•لینک‌ها با آیکون تلگرام/بله نمایش داده می‌شوند
•هم در دسکتاپ و هم در موبایل به‌صورت واکنش‌گرا

کلاس App\Helpers\Settings — متدهای جدید

•headerMenuItems() : array — پارس کردن متن به آرایه آیتم‌های منو
•footerCopyright() : string — متن کپی‌رایت
•showDesignerCredit() : bool — آیا اعتبار طراح نمایش داده شود
•designerName(), designerRole(), designerBale(), designerTelegram() — اطلاعات طراح
•ثابت DEFAULT_HEADER_MENU — منوی پیش‌فرض

صفحه «درباره ما» کامل و جامع

صفحه /about بازنویسی کامل شد:
•**بنر هیرو** با نام سایت و شعار
•**بیانیه مأموریت** — توضیح چرایی و چگونگی
•**۴ کارت آماری**: تعداد قوانین، مواد، دسته‌بندی‌ها، برچسب‌ها (لایو از دیتابیس)
•**۱۲ کارت قابلیت**: جستجوی هوشمند، تفسیر هوش مصنوعی، چتبات پرسش‌پاسخ، شاخص سختی، ذخیره و یادداشت، دنبال کردن، خط زمانی، مقایسه، گزارش اشتباهات، ارجاع، اشتراک‌گذاری، سئو
•**بخش «چطور کار می‌کند»** با ۳ مرحله
•**زیرساخت فنی** — PHP 8.5 + FrankenPHP، MySQL/SQLite، Tailwind، GLM-4
•**هشدار حقوقی** — این اطلاعات جایگزین مشاوره حقوقی نیست
•**CTA تماس با توسعه‌دهنده** در پایین صفحه:
- دکمه «ارتباط در بله» → لینک بله طراح
- دکمه «ارتباط در تلگرام» → لینک تلگرام طراح
- دکمه «فرم تماس» → صفحه تماس
- نام طراح: «حامد بنائی — طراح و برنامه‌نویس»
•**SEO کامل** — title، description، canonical، JSON-LD AboutPage schema

تنظیمات جدید (اضافه شده به update.php)

•header_menu_items (textarea)
•footer_copyright_text (text)
•footer_show_designer (checkbox 0/1)
•footer_designer_name (text)
•footer_designer_role (text)
•footer_designer_bale (URL)
•footer_designer_telegram (URL)

نتایج تست

| Test | Result |
|------|--------|
| TOC pin: list NOT auto-open | ✓ toc_open: false after pin |
| TOC pin: header sticky | ✓ position: sticky |
| Click pinned header opens list | ✓ toc_open: true |
| Settings page tabbed | ✓ 7 tabs all work |
| Active tab persists in localStorage | ✓ |
| Dedupe badge on «مدیریت مواد» tab | ✓ (when dupArticles > 0) |
| Header menu customizable | ✓ Renders 3+ items |
| Footer designer credit | ✓ Shows حامد بنائی + Bale + Telegram |
| About page comprehensive | ✓ 12 features + 3 steps + contact CTA |
| Save settings persists | ✓ verified via DB query |

فایل‌های تغییر یافته

•php-cms/app/Helpers/Settings.php — added 7 new methods for header/footer
•php-cms/app/routes_admin.php — added 7 new settings keys + footer_show_designer checkbox handling
•php-cms/resources/views/admin/settings.php — **بازنویسی کامل** با ۷ تب
•php-cms/resources/views/layouts/app.php — منوی هدر سفارشی + فوتر سفارشی با اعتبار طراح
•php-cms/resources/views/law-detail.php — رفع پین TOC (فقط هدر پین می‌شود، نه لیست)
•php-cms/resources/views/about.php — **بازنویسی کامل** با ۱۲ قابلیت + CTA تماس با توسعه‌دهنده
•php-cms/public/update.php — migration v4.5.0 + ۷ تنظیمات جدید
•php-cms/CHANGELOG.md — لاگ v4.5.0

---

v4.4.0



رفع باگ بحرانی شمارش مواد در MySQL

**علت باگ:** کوئری COUNT(DISTINCT law_id || '-' || number) در SQLite درست کار می‌کرد (concat) اما در MySQL || عملگر OR منطقی است، بنابراین به‌جای تعداد واقعی مواد، ۱ یا ۲ برمی‌گرداشت.

**راه‌حل:** همه کوئری‌های || به CONCAT(law_id, '-', number) تغییر یافتند که در هر دو SQLite و MySQL درست کار می‌کند. ۴ مکان اصلاح شد:
•Settings::liveArticleCount() — آمار صفحه اصلی
•routes_admin.php — dedupe detection (قبل و بعد از حذف)
•admin/settings.php — نمایش تعداد مواد یکتا

دکمه‌های اکشن آیکون-فقط در موبایل + Tooltip

•دکمه‌های ذخیره/دنبال/مقایسه/چاپ/اشتراک در موبایل فقط آیکون هستند (متن با hidden sm:inline پنهان می‌شود)
•وقتی کاربر روی دکمه هاور می‌شود یا کلیک می‌کند، یک Tooltip شناور بالای دکمه ظاهر می‌شود و نام آن را نشان می‌دهد (در موبایل ۲ ثانیه نمایش داده می‌شود)
•در دسکتاپ همچنان آیکون + متن نمایش داده می‌شود
•هر دکمه data-tooltip attribute دارد که نام فارسی آن را نگه می‌دارد

کنترل اندازه فونت مواد (A- A A+)

•۳ دکمه در بالای فهرست مواد اضافه شد: A- (کوچک‌کردن)، A (پیش‌فرض)، A+ (بزرگ‌کردن)
•۵ سطح اندازه: خیلی کوچک، کوچک، پیش‌فرض، بزرگ، خیلی بزرگ
•انتخاب کاربر در localStorage ذخیره می‌شود و در بازدیدهای بعدی حفظ می‌شود
•همزمان با تغییر اندازه فونت، line-height هم بهینه می‌شود
•از CSS variables (--article-content-size, --article-line-height) استفاده می‌کند

پین کردن فهرست مواد در موبایل (Sticky TOC)

•دکمه «پین فهرست» در موبایل اضافه شد (کنار کنترل فونت)
•وقتی کاربر کلیک کند:
- فهرست مواد (<details>) باز می‌شود
- به position: sticky; top: 56px تبدیل می‌شود (زیر هدر سایت)
- هنگام اسکرول، بالای صفحه می‌ماند
- برچسب دکمه به «حذف پین» تغییر می‌کند
- Toast پیام موفقیت نمایش داده می‌شود
•با کلیک مجدد، پین حذف می‌شود
•فقط در موبایل قابل مشاهده است (در دسکتاپ فهرست از قبل sticky است)

سیستم سئوی کامل (SEO)

•**کلاس App\Helpers\SEO** اضافه شد — تمام متادیتای سئو را در یک نقطه متمرکز می‌کند
•متدها: setTitle, setDescription, setCanonical, setOgImage, setJsonLd, setRobots
•اسکیماهای JSON-LD آماده: websiteSchema, breadcrumbSchema, legislationSchema
•رندر خودکار همه تگ‌های متا با SEO::renderHead()

#### متا تگ‌های استاندارد
•<title> بهینه برای هر صفحه (قانون، دسته‌بندی، برچسب، صفحه اصلی)
•<meta name="description"> با truncation هوشمند به ۱۶۰ کاراکتر
•<meta name="robots"> با directives مناسب
•<link rel="canonical"> برای جلوگیری از duplicate content
•<meta name="author"> و <meta name="keywords">

#### OpenGraph (Facebook، WhatsApp، Telegram)
•og:type, og:site_name, og:title, og:description, og:url, og:locale
•og:image با ابعاد ۱۲۰۰×۶۳۰ پیکسل (از تنظیمات قابل تنظیم)

#### Twitter Card
•twitter:card, twitter:title, twitter:description, twitter:image, twitter:site

#### JSON-LD Structured Data
•**WebSite schema** در صفحه اصلی (با SearchAction برای جستجوی سایت)
•**BreadcrumbList** در صفحه هر قانون (مسیر: خانه > دسته‌بندی > قانون)
•**Legislation schema** در صفحه هر قانون (با datePublished, description, about)

#### robots.txt
•مسیر /robots.txt اضافه شد
•Disallow برای مسیرهای ادمین، API، autocomplete، query stringها
•Sitemap: به نقشه سایت اشاره می‌کند

#### sitemap.xml
•مسیر /sitemap.xml اضافه شد
•شامل:
- صفحه اصلی (priority 1.0)
- صفحات استاتیک (categories, timeline, compare, tags, about, contact)
- همه قوانین منتشرشده (priority 0.8)
- **URLهای مستقیم هر ماده قانونی**: /law/{slug}/article/{N} (priority 0.5)
- همه دسته‌بندی‌ها (priority 0.6)
- همه برچسب‌ها (priority 0.4)
•هر URL دارای <lastmod>, <changefreq>, <priority>

#### URLهای دوستدار سئو برای مواد قانونی
•مسیر جدید: /law/{slug}/article/{N} (مثلاً /law/mandatory-vehicle-insurance-law/article/1)
•این مسیر با **301 Moved Permanently** به /law/{slug}#article-N تغییر مسیر می‌دهد
•مزیت: موتورهای جستجو هر ماده را به‌عنوان یک URL مجزا ایندکس می‌کنند
•وقتی کاربر روی لینک کلیک کند، به همان ماده خاص اسکرول می‌شود

#### ادغام Google Search Console
•در /admin/settings → بخش «تنظیمات سئو و گوگل»:
- فیلد Google Search Console verification — کد تأیید مالکیت
- فیلد Google Analytics 4 — شناسه اندازه‌گیری (G-XXXXXXXX)
- فیلد OpenGraph default image — تصویر پیش‌فرض برای اشتراک‌گذاری
- فیلد Twitter handle — @username
- فیلد Keywords — کلمات کلیدی پیش‌فرض
•نمایش لینک‌های /robots.txt و /sitemap.xml برای ثبت در Search Console

#### Google Analytics 4
•وقتی شناسه G-XXXXXXXX وارد شد، اسکریپت gtag.js به‌صورت خودکار در همه صفحات اضافه می‌شود
•anonymize_ip: true برای رعایت حریم خصوصی کاربران (GDPR)

نتایج تست

| Test | Result |
|------|--------|
| Article count in MySQL | ✓ CONCAT() works |
| Mobile action buttons (icon-only at 375px) | ✓ 5 labels hidden |
| Tooltip on click | ✓ Shows for 2s |
| Font-size A+ | 15.2px → 16.8px ✓ |
| TOC sticky position after pin | static → sticky ✓ |
| Title on law page | <title>قانون ... · دیوان قانون</title> ✓ |
| Canonical URL | <link rel="canonical"> ✓ |
| JSON-LD BreadcrumbList | ✓ ۳ levels (خانه/دسته/قانون) |
| JSON-LD Legislation | ✓ With datePublished |
| robots.txt | ✓ 200 OK with sitemap link |
| sitemap.xml | ✓ 630 URLs (laws + articles + categories + tags) |
| Article deep-link /law/slug/article/N | ✓ 301 redirect to #article-N |
| Google Search Console meta | ✓ Renders when set |
| Google Analytics script | ✓ Loads gtag.js when GA ID set |

فایل‌های تغییر یافته

•php-cms/app/Helpers/SEO.php ← **جدید** — کلاس کامل سئو
•php-cms/app/Helpers/Settings.php ← اصلاح || به CONCAT
•php-cms/app/routes_admin.php ← اصلاح || + اضافه شدن SEO settings keys
•php-cms/public/index.php ← robots.txt, sitemap.xml, /law/slug/article/N route
•php-cms/public/update.php ← migration v4.4.0
•php-cms/resources/views/layouts/app.php ← SEO::renderHead() + نسخه ۴.۴.۰
•php-cms/resources/views/home.php ← SEO title + JSON-LD WebSite schema
•php-cms/resources/views/law-detail.php ← SEO title + canonical + JSON-LD + tooltip + font-size + TOC pin
•php-cms/resources/views/partials/article-card.php ← CSS variables for font-size
•php-cms/resources/views/admin/settings.php ← بخش جدید «تنظیمات سئو و گوگل»
•php-cms/Caddyfile ← rewrite rule برای route صحیح
•php-cms/CHANGELOG.md ← لاگ v4.4.0

---

v4.3.0



رفع مشکل شمارش مواد قانونی

•**تعداد مواد قانونی حالا با COUNT(DISTINCT law_id, number) محاسبه می‌شود** — نه COUNT(*).
•مشکل قبلی: وقتی یک قانون را چند بار ایمپورت می‌کردید، ردیف‌های تکراری برای همان شماره ماده ساخته می‌شد و آمار صفحه اصلی را بیشتر از واقعیت نشان می‌داد (مثلاً ۸٬۰۰۰+ به‌جای ۳٬۰۰۰ واقعی).
•حالا آمار صفحه اصلی و /api/stats همیشه تعداد مواد یکتا را نشان می‌دهند.
•روش جدید: App\Helpers\Settings::liveStat($key) — یک نقطه مرکزی برای همه آمار زنده.

ابزار حذف مواد تکراری (Dedupe)

•در صفحه /admin/settings بخش جدید «مدیریت مواد قانونی» اضافه شد:
- نمایش سه عدد: کل ردیف‌های مواد، مواد یکتا (DISTINCT)، ردیف‌های تکراری
- اگر ردیف تکراری وجود داشته باشد، دکمه «حذف مواد تکراری» فعال می‌شود
- با کلیک روی دکمه، ردیف‌های تکراری حذف و جدیدترین نسخه هر ماده نگه داشته می‌شود
- نمایش پیام موفقیت با تعداد ردیف‌های حذف‌شده
•این ابزار برای پاکسازی دیتابیس کافی است (نیازی به SQL دستی نیست).

بهبودهای ویو موبایل (Mobile-First)

طراحی موبایل کامل بازنویسی شد تا تمرکز روی محتوای قانونی باشد و عناصر اضافه حذف شوند:

#### صفحه جزئیات قانون (Law Detail)
•**عنوان قانون**: text-xl sm:text-2xl md:text-4xl (۲۰px در موبایل، ۳۶px در دسکتاپ)
•**breadcrumb**: text-[10px] sm:text-xs (فشرده در موبایل)
•**padding هدر**: py-5 sm:py-8 (کمتر در موبایل)
•**خلاصه قانون**: text-sm sm:text-base leading-6 sm:leading-7 (فونت کوچک‌تر در موبایل)
•**badge دسته‌بندی و قانون منتخب**: کوچک‌تر در موبایل (px-2 sm:px-2.5)
•**متادیتای هدر**: مخفی شدن در موبایل (با hidden sm:inline-flex):
- شماره قانون ($law['number'])
- تعداد بازدید
- تعداد نظرات
•**متادیتای باقی‌مانده در موبایل**: تاریخ تصویب، تعداد مواد، سختی قانون، زمان مطالعه

#### کارت ماده قانونی (article-card)
•**badge شماره ماده**: w-10 h-10 sm:w-12 sm:h-12 md:w-14 md:h-14
- موبایل: ۴۰×۴۰ پیکسل (قبلاً ۴۸×۴۸)
- دسکتاپ: ۵۶×۵۶ پیکسل
- rounded-lg در موبایل، rounded-xl در دسکتاپ
•**padding کارت**: p-4 sm:p-5 md:p-6 (۱۶px در موبایل، قبلاً ۲۰px)
•**عنوان ماده**: text-sm sm:text-base md:text-lg (۱۴px در موبایل، قبلاً ۱۶px)
•**متن ماده**: text-[0.95rem] leading-relaxed sm:text-base sm:leading-loose (فونت کوچک‌تر + line height بهینه)
•**متادیتای کارت ماده**: مخفی شدن در موبایل:
- تعداد واژه‌ها (hidden sm:inline-block)
- تعداد بازدید ماده (hidden sm:inline-flex)
•**دکمه‌های اکشن** (کپی، لینک، اشتراک، چاپ، گزارش، یادداشت، ویرایش):
- **موبایل: فقط آیکون** (متن با hidden sm:inline مخفی می‌شود)
- دسکتاپ: آیکون + متن
- این کار فضای قابل‌توجهی آزاد کرد — موبایل قبلاً ۶ دکمه با متن بود، حالا ۶ آیکون فقط.
- gap: gap-1 sm:gap-2 (فشرده‌تر در موبایل)

نتایج تست موبایل (Viewport 375px — iPhone SE)

| سناریو | قبل | بعد |
|--------|-----|-----|
| اندازه badge شماره ماده | ۴۸×۴۸ | ۴۰×۴۰ ✓ |
| padding کارت ماده | ۲۰px | ۱۶px ✓ |
| اندازه فونت عنوان ماده | ۱۶px | ۱۴px ✓ |
| اندازه فونت عنوان قانون | ۳۲-۳۶px | ۲۰px ✓ |
| دکمه‌های اکشن در موبایل | آیکون + متن | فقط آیکون ✓ |
| متادیتای هدر قانون در موبایل | همه نمایش داده می‌شد | شماره قانون + بازدید + نظرات مخفی ✓ |
| متادیتای کارت ماده در موبایل | واژه + دقیقه + سختی + بازدید | فقط دقیقه + سختی ✓ |
| اسکرول افقی | وجود داشت | حذف شد ✓ |

فایل‌های تغییر یافته

•php-cms/app/Helpers/Settings.php — اضافه شدن liveStat(), liveArticleCount() و سایر متدهای live
•php-cms/app/routes_admin.php — اضافه شدن مسیر POST /admin/articles/dedupe
•php-cms/public/index.php — استفاده از Settings::liveStat() در /api/stats
•php-cms/resources/views/admin/settings.php — بخش جدید «مدیریت مواد قانونی» + JS dedupe
•php-cms/resources/views/home.php — استفاده از Settings::liveStat() + کلاس‌های responsive
•php-cms/resources/views/law-detail.php — همه کلاس‌های sm: برای موبایل
•php-cms/resources/views/partials/article-card.php — badge کوچک‌تر، آیکون-فقط در موبایل
•php-cms/resources/views/layouts/app.php — نسخه ۴.۳.۰

---

v4.2.0



آمار پویا و قابل کنترل صفحه اصلی


**تغییرات کلیدی:** آمار صفحه اصلی حالا کاملاً پویا، زنده و قابل کنترل از تنظیمات است.

#### ۱. آمار زنده از دیتابیس
•تعداد قوانین، مواد و سایر آمار به‌صورت **لایو** از دیتابیس خوانده می‌شوند
•با افزودن/حذف/تغییر وضعیت قانون، آمار در رفرش بعدی به‌روز می‌شود
•تعداد مواد قانونی دقیقاً با ستون «مواد» پنل ادمین مطابقت دارد (WHERE number > 0)

#### ۲. اعداد تقریبی (اختیاری)
•نمایش اعداد به‌صورت گرد شده با + برای حفظ حریم خصوصی
- 538 → 540+
- 1,243 → 1,200+
- 8,183 → 8,200+
•اعداد زیر ۱۰۰ دقیق نمایش داده می‌شوند
•از تنظیمات قابل خاموش/روشن کردن است

#### ۳. کنترل کامل بلوک‌های آماری
•در صفحه /admin/settings بخش جدید «آمار صفحه اصلی» اضافه شد
•۶ بلوک آماری قابل کنترل:
- ✅ قوانین
- ✅ مواد قانونی
- ✅ دسته‌بندی‌ها
- ✅ **کاربران** ← قابل غیرفعال‌سازی برای حفظ حریم خصوصی
- ☐ برچسب‌ها (جدید)
- ☐ بازدید کل (جدید)
•وقتی بلوکی غیرفعال می‌شود:
- از صفحه اصلی حذف می‌شود
- گرید به‌طور خودکار تنظیم می‌شود (۴/۳/۲ ستونی)
- از خروجی /api/stats هم حذف می‌شود (نشت جلوگیری می‌شود)

#### ۴. کلاس App\Helpers\Settings (جدید)
•کلاس متمرکز برای خواندن/نوشتن تنظیمات با کش درون‌حافظه‌ای
•متدهای نوع‌دار (getBool, getInt)
•منطق آمار تقریبی و visibility در یک جا

رفع باگ

•رفع باگ array_search === false که باعث می‌شد بلوک «قوانین» در انتها نمایش داده شود
•حذف نشت تعداد کاربران از API عمومی وقتی بلوک کاربران خاموش است

---

v4.1.0



هوش مصنوعی

•تفسیر هوش مصنوعی مواد قانونی به زبان ساده (پنل مدیریت + نمایش عمومی)
•چتبات پرسش‌پاسخ هوش مصنوعی در صفحه هر قانون
•داشبورد مدیریت تفسیر با پردازش دسته‌ای
•شاخص سختی قانون (۱-۵) با الگوریتم محتوا‌محور
•badge سختی هر ماده به‌صورت مستقل
•مرتب‌سازی نتایج جستجو بر اساس سختی
•نمایش badge سختی روی کارت‌های نتایج جستجو

تجربه کاربری

•نوار پیشرفت مطالعه در بالای صفحه قانون
•ویجت «مواد کلیدی» (۵ ماده پرمحور هر قانون)
•ویجت «پربازدیدترین مواد» در صفحه اصلی
•tracking بازدید هر ماده با IntersectionObserver
•autocomplete جستجوی زنده در هدر
•تاریخچه جستجو (localStorage)
•فیلترهای پیشرفته جمع‌شونده در جستجو
•دکمه‌های اشتراک و چاپ هر ماده
•skeleton loading هنگام بارگذاری مواد بیشتر
•اسکرول افقی برطرف شد (overflow-x: clip)

قابلیت‌های کاربری

•دنبال کردن قانون (follow) + نوتیفیکیشن به‌روزرسانی
•ذخیره سریع (dropdown در هدر با badge تعداد)
•یادداشت شخصی روی هر ماده
•ویرایش inline مواد توسط ادمین
•پنل پیام‌های تماس با parse و پاسخ ایمیل
•حالت تاریک خودکار (auto/light/dark با تشخیص سیستم)
•نمایش مقدمه قانون با ساختار و تیترها

پنل مدیریت

•داشبورد با آمار هوش مصنوعی (پوشش تفسیر + پرسش‌پاسخ)
•فید آخرین پرسش‌های کاربران در داشبورد
•لیست پربازدیدترین مواد در داشبورد
•پنل پیام‌های تماس اختصاصی
•ایمپورت قوانین از منبع رسمی با ساختار کامل
•دکمه‌های سریع دسترسی به تفسیر و پیام‌ها

صفحه اصلی

•ویجت هوش مصنوعی (پوشش تفسیر + آخرین پرسش‌ها)
•ویجت پربازدیدترین مواد قانونی
•کارت‌های دسته‌بندی با آیکون‌های متنوع و رنگ‌بندی متفاوت
•افکت‌های hover چندلایه روی کارت‌ها

رفع باگ

•رفع اسکرول افقی ریز در همه صفحات
•رفع خطای ۵۰۰ صفحه تماس با ما
•رفع خطای Fatal در مسیرهای /install
•ماده ۱ دیگر در ایمپورت قالب نمی‌شود
•مقدمه قانون با تیترهای ساختاریافته نمایش داده می‌شود

---

v2.4.0



•پشتیبانی از بخش‌بندی قوانین (بخش اول، فصل اول و...)
•نمایش بخش‌ها در فهرست مواد (TOC) به‌صورت تیتر
•رفع خطای بارگذاری مواد بیشتر (AJAX)
•اصلاح نمایش اعداد زیرهم (۱- ۲- ۳-)
•حذف منابع خارجی از نمایش عمومی

v2.0.0



•پشتیبانی از ساب‌دایرکتوری
•سازگاری MySQL و SQLite
•جستجو و فیلتر در پنل مدیریت
•چیدمان بلوکی/لیستی قوانین
•ویرایش دسته‌بندی‌ها
•جستجوی پیشرفته
•ابزار مقایسه قوانین
•نمایش زمان‌خط قوانین
•سیستم تگ
•قانون روز
•خروجی citation
•REST API
•PWA
•حالت تاریک

v1.0.0



•ساختار پایه
•پنل مدیریت
•طراحی RTL