- دکمههای CTA: بازگشت به ButtonLink شیشهای (اصلی با دایرهٔ مسی، ثانویه مات)
- کارت شناور آمار (badge_value/badge_label) که UI v1 حذف کرده بود برگشت —
فیلدهایش در کشوی «تنظیمات هیرو» دوباره معنا دارند
- Button.tsx که قبلاً بازگردانده شده بود دوباره استفاده میشود
- دکمهٔ تغییر زبان: کپسول بزرگ دوزبانه → دکمهٔ کوچک آیکون+متن (طرح قبلی)
- ساختار صفحهٔ جزئیات پروژه: بازگشت به چیدمان قبلی (دیتابیسمحور بود و میماند)
- قالب پرسشوپاسخ: بازگشت به چیدمان دوستونه (تیتر کنار آکاردئون)
توجه: بخشی از UI v1 (fatemeh) عمداً برگردانده شده به درخواست تیم UI؛
بقیهٔ تغییرات آن کامیت سر جایش است. ویرایشپذیری دیتابیسمحور پروژهها
و دکمهٔ ویرایش، روی همین ساختار قدیمی دوباره اعمال شدهاند.
- page-heroes به فهرست موجودیتهای پنل اضافه شد و PageHero یک دکمهٔ واضح
«عنوان، سرآغاز و تصویر هیروی این صفحه» گرفت (پیشتر فقط ویرایش درجای
نامرئی روی خود متن بود).
- صفحهٔ پروژهها و صفحهٔ جزئیات پروژه حالا از دیتابیس خوانده میشوند
(فایل استاتیک projectsData فقط جانشین دیتابیس خالی/اسلاگهای قدیمی است) —
پیشتر ویرایش پنل روی این دو صفحه اصلاً نمایش داده نمیشد.
- روی لیست پروژهها دکمهٔ ویرایش/جابهجایی/حذف و «افزودن پروژه» اضافه شد و
روی صفحهٔ جزئیات هر پروژه دکمهٔ ویرایش همان پروژه.
- کپشن: قاعدهٔ وسطچینِ .article-body figcaption با قاعدههای [data-dir=...] برای
راست/چپچین بازنویسی میشد و عملاً وسطچین نمیشد؛ figcaption از آن فهرستها
برداشته شد. متن کپشن در ویرایشگر هم وسطچین شد تا با خروجی سایت یکی باشد.
- نام تصویر: نامی که پیش از بارگذاری نوشته میشود، حالا همان Alt تصویر میشود
(پیشتر نام فایل مبنا بود و باید دستی در جعبهٔ زیر تصویر اصلاح میشد).
- فهرست مطالب: H3 با ps-4 فقط ۴ پیکسل بیشتر از H2 تورفتگی داشت (عملاً نامرئی)؛
حالا ps-6 با فونت یک پله کوچکتر.
پیشنمایش خصوصی دو بار احراز هویت میخواست (Basic Auth لبه + ورود خود پنل) و
هر origin (www/apex/.ir) هم پرسش جداگانهای داشت؛ نتیجه سردرگمی تیم.
حالا روترهای /admin و /api میدلور preview-auth ندارند (noindex میماند) و
پنل با همان ورود خودش کار میکند؛ صفحات عمومی همچنان خصوصیاند.
docker compose مقادیر .env را خودش تفسیر میکند؛ هش htpasswd شامل $apr1$...
است و بدون کوتیشن، $apr1 و بخشهای بعدی بهعنوان متغیر خالی جایگزین میشدند
(برچسب تبدیل به preview:/OBoRS/... میشد) و پیشنمایش خصوصی هرگز رمز را
نمیپذیرفت. حالا env_set مقدارهای دارای $ را تککوتیشن میگذارد و env_get
کوتیشن را برمیدارد.
بدون آن، psycopg3 تاپل برمیگرداند و row["model"] خطای
«tuple indices must be integers or slices, not str» میداد؛ نتیجه:
«Initial index sync failed» و unavailable ماندن چت با وجود امبد موفق.
- content.py: ستون desc در SQL بدون کوتیشن بود و PostgreSQL آن را کلمهٔ کلیدی
میگیرد؛ نتیجه: «Initial index sync failed: syntax error at or near "desc"»
در استارت و غیرقابل استفاده ماندن چت تا reindex. حالا "desc" کوتیشن شده.
- Dockerfile: با اینکه سرور GPU ندارد، pip نسخهٔ CUDA تورچ را از PyPI میگرفت
(ایمیج ۹.۷GB با کتابخانههای nvidia). اول torch از ایندکس CPU نصب میشود.
نمونهٔ OpenPanel موجود (stats.*) با یک پروژهٔ دوم برای این سایت استفاده میشود؛
VITE_OPENPANEL_URL/VITE_OPENPANEL_CLIENT_ID در زمان بیلد تزریق میشوند و در
نبودشان همهچیز بیاثر است. API عمومی track() تغییر نکرده و مسیر Umami هم
برای عقبنشینی دستنخورده مانده.
- gen-env.sh: rand با دو آرگومان صدا زده میشد ولی فقط $1 را میخواند؛
openssl rand -hex بدون تعداد بایت خروجی خالی و کد ۰ میدهد، پس fallback
هرگز اجرا نمیشد و .env با رازهای خالی ساخته میشد. حالا تعداد بایت
رعایت میشود و اگر مقداری خالی بماند، اسکریپت با خطا متوقف میشود.
- preview-mode.sh: python روی اوبونتو ۲۴.۰۴ وجود ندارد (فقط python3).